src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportNode.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2021 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a class representing an import or import from node.
8 """
9
10 #
11 # adapted from flake8-alphabetize v0.0.17
12 #
13
14 import ast
15 from functools import total_ordering
16
17 from .ImportsEnums import GroupEnum, NodeTypeEnum
18
19
20 class ImportNodeException(Exception):
21 """
22 Class representing an exception for an invalid import node.
23 """
24 pass
25
26
27 @total_ordering
28 class ImportNode:
29 """
30 Class representing an import or import from node.
31 """
32 def __init__(self, appNames, astNode, checker):
33 """
34 Constructor
35
36 @param appNames list of application package names
37 @type list of str
38 @param astNode reference to the ast node
39 @type ast.AST
40 @param checker reference to the checker object
41 @type ImportsChecker
42 @exception ImportNodeException raised to indicate an invalid node was
43 given to this class
44 """
45 if not isinstance(astNode, (ast.Import, ast.ImportFrom)):
46 raise ImportNodeException(
47 "Node type {0} not recognized".format(type(astNode))
48 )
49
50 self.node = astNode
51 self.error = None
52 level = None
53 group = None
54
55 if isinstance(astNode, ast.Import):
56 self.nodeType = NodeTypeEnum.IMPORT
57 names = astNode.names
58
59 self.moduleName = names[0].name
60 level = 0
61
62 elif isinstance(astNode, ast.ImportFrom):
63 module = astNode.module
64 self.moduleName = "" if module is None else module
65 self.nodeType = NodeTypeEnum.IMPORT_FROM
66
67 names = [n.name for n in astNode.names]
68 expectedNames = sorted(names)
69 if names != expectedNames:
70 self.error = (self.node, "I202", ", ".join(expectedNames))
71 level = astNode.level
72
73 if self.moduleName == "__future__":
74 group = GroupEnum.FUTURE
75 elif self.moduleName in checker.getStandardModules():
76 group = GroupEnum.STDLIB
77 elif level > 0:
78 group = GroupEnum.APPLICATION
79 else:
80 group = GroupEnum.THIRD_PARTY
81 for name in appNames:
82 if (
83 name == self.moduleName or
84 self.moduleName.startswith("{0}.".format(name))
85 ):
86 group = GroupEnum.APPLICATION
87 break
88
89 if group == GroupEnum.STDLIB:
90 self.sorter = group, self.nodeType, self.moduleName
91 else:
92 m = self.moduleName
93 dotIndex = m.find(".")
94 topName = m if dotIndex == -1 else m[:dotIndex]
95 self.sorter = group, level, topName, self.nodeType, m
96
97 def __eq__(self, other):
98 """
99 Special method implementing the equality operator.
100
101 @param other reference to the object to compare
102 @type ImportNode
103 @return flag indicating equality
104 @rtype bool
105 """
106 return self.sorter == other.sorter
107
108 def __lt__(self, other):
109 """
110 Special method implementing the less than operator.
111
112 @param other reference to the object to compare
113 @type ImportNode
114 @return flag indicating a less than situation
115 @rtype bool
116 """
117 return self.sorter < other.sorter
118
119 def __str__(self):
120 """
121 Special method to create a string representation of the instance.
122
123 @return string representation of the instance
124 @rtype str
125 @exception ImportNodeException raised to indicate an invalid node was
126 given to this class
127 """
128 if (
129 self.nodeType not in (NodeTypeEnum.IMPORT,
130 NodeTypeEnum.IMPORT_FROM)
131 ):
132 raise ImportNodeException(
133 "The node type {0} is not recognized.".format(self.nodeType)
134 )
135
136 if self.nodeType == NodeTypeEnum.IMPORT:
137 return "import {0}".format(self.moduleName)
138 elif self.nodeType == NodeTypeEnum.IMPORT_FROM:
139 level = self.node.level
140 levelStr = "" if level == 0 else "." * level
141 names = [
142 n.name + ("" if n.asname is None else
143 " as {0}".format(n.asname))
144 for n in self.node.names
145 ]
146 return "from {0}{1} import {2}".format(
147 levelStr, self.moduleName, ", ".join(names))
148
149 return None

eric ide

mercurial