30 class ImportNode: |
30 class ImportNode: |
31 """ |
31 """ |
32 Class representing an import or import from node. |
32 Class representing an import or import from node. |
33 """ |
33 """ |
34 |
34 |
35 def __init__(self, appNames, astNode, checker): |
35 def __init__(self, appNames, astNode, checker, sortIgnoringStyle, sortFromFirst): |
36 """ |
36 """ |
37 Constructor |
37 Constructor |
38 |
38 |
39 @param appNames list of application package names |
39 @param appNames list of application package names |
40 @type list of str |
40 @type list of str |
41 @param astNode reference to the ast node |
41 @param astNode reference to the ast node |
42 @type ast.AST |
42 @type ast.AST |
43 @param checker reference to the checker object |
43 @param checker reference to the checker object |
44 @type ImportsChecker |
44 @type ImportsChecker |
|
45 @param sortIgnoringStyle flag indicating to sort ignoring the import style |
|
46 @type bool |
|
47 @param sortFromFirst flag indicating to sort from imports before straight ones |
|
48 @type bool |
45 @exception ImportNodeError raised to indicate an invalid node was |
49 @exception ImportNodeError raised to indicate an invalid node was |
46 given to this class |
50 given to this class |
47 """ |
51 """ |
48 if not isinstance(astNode, (ast.Import, ast.ImportFrom)): |
52 if not isinstance(astNode, (ast.Import, ast.ImportFrom)): |
49 raise ImportNodeError("Node type {0} not recognized".format(type(astNode))) |
53 raise ImportNodeError("Node type {0} not recognized".format(type(astNode))) |
56 if isinstance(astNode, ast.Import): |
60 if isinstance(astNode, ast.Import): |
57 self.nodeType = NodeTypeEnum.IMPORT |
61 self.nodeType = NodeTypeEnum.IMPORT |
58 names = astNode.names |
62 names = astNode.names |
59 |
63 |
60 self.moduleName = names[0].name |
64 self.moduleName = names[0].name |
|
65 self.asImport = bool(names[0].asname) |
61 level = 0 |
66 level = 0 |
62 |
67 |
63 elif isinstance(astNode, ast.ImportFrom): |
68 elif isinstance(astNode, ast.ImportFrom): |
64 module = astNode.module |
69 module = astNode.module |
65 self.moduleName = "" if module is None else module |
70 self.moduleName = "" if module is None else module |
68 names = [n.name for n in astNode.names] |
73 names = [n.name for n in astNode.names] |
69 expectedNames = checker.sorted(names, key=checker.moduleKey) |
74 expectedNames = checker.sorted(names, key=checker.moduleKey) |
70 if names != expectedNames: |
75 if names != expectedNames: |
71 self.error = (self.node, "I202", ", ".join(expectedNames)) |
76 self.error = (self.node, "I202", ", ".join(expectedNames)) |
72 level = astNode.level |
77 level = astNode.level |
|
78 |
|
79 self.asImport = any(n.asname for n in astNode.names) |
73 |
80 |
74 if self.moduleName == "__future__": |
81 if self.moduleName == "__future__": |
75 group = GroupEnum.FUTURE |
82 group = GroupEnum.FUTURE |
76 elif self.moduleName.split(".")[0] in checker.getStandardModules(): |
83 elif self.moduleName.split(".")[0] in checker.getStandardModules(): |
77 group = GroupEnum.STDLIB |
84 group = GroupEnum.STDLIB |
85 ): |
92 ): |
86 group = GroupEnum.APPLICATION |
93 group = GroupEnum.APPLICATION |
87 break |
94 break |
88 |
95 |
89 if group == GroupEnum.STDLIB: |
96 if group == GroupEnum.STDLIB: |
90 self.sorter = group, self.nodeType, self.moduleName |
97 self.sorter = ( |
|
98 (group, -self.nodeType, self.moduleName) |
|
99 if sortFromFirst |
|
100 else (group, self.nodeType, self.moduleName) |
|
101 ) |
91 else: |
102 else: |
92 m = self.moduleName |
103 m = self.moduleName |
93 dotIndex = m.find(".") |
104 dotIndex = m.find(".") |
94 topName = m if dotIndex == -1 else m[:dotIndex] |
105 topName = m if dotIndex == -1 else m[:dotIndex] |
95 self.sorter = group, level, topName, self.nodeType, m |
106 |
|
107 if sortIgnoringStyle: |
|
108 self.sorter = group, level, topName, self.nodeType, m |
|
109 elif sortFromFirst: |
|
110 self.sorter = group, level, -self.nodeType, topName, m |
|
111 else: |
|
112 self.sorter = group, level, self.nodeType, topName, m |
96 |
113 |
97 def __eq__(self, other): |
114 def __eq__(self, other): |
98 """ |
115 """ |
99 Special method implementing the equality operator. |
116 Special method implementing the equality operator. |
100 |
117 |