160 self.__error(node.lineno - 1, node.col_offset, reason) |
160 self.__error(node.lineno - 1, node.col_offset, reason) |
161 |
161 |
162 ####################################################################### |
162 ####################################################################### |
163 ## Tidy imports |
163 ## Tidy imports |
164 ## |
164 ## |
165 ## adapted from: flake8-tidy-imports v4.8.0 |
165 ## adapted from: flake8-tidy-imports v4.10.0 |
166 ####################################################################### |
166 ####################################################################### |
167 |
167 |
168 def __tidyImports(self): |
168 def __tidyImports(self): |
169 """ |
169 """ |
170 Private method to check various other import related topics. |
170 Private method to check various other import related topics. |
243 else: |
243 else: |
244 fromName, importedName = alias.name.rsplit(".", 1) |
244 fromName, importedName = alias.name.rsplit(".", 1) |
245 |
245 |
246 if importedName == alias.asname: |
246 if importedName == alias.asname: |
247 if fromName: |
247 if fromName: |
248 rewritten = "from {0} import {1}".format(fromName, importedName) |
248 rewritten = f"from {fromName} import {importedName}" |
249 else: |
249 else: |
250 rewritten = "import {0}".format(importedName) |
250 rewritten = f"import {importedName}" |
251 |
251 |
252 self.__error(node.lineno - 1, node.col_offset, "I901", rewritten) |
252 self.__error(node.lineno - 1, node.col_offset, "I901", rewritten) |
253 |
253 |
254 elif isinstance(node, ast.ImportFrom): |
254 elif isinstance(node, ast.ImportFrom): |
255 for alias in node.names: |
255 for alias in node.names: |
256 if alias.name == alias.asname: |
256 if alias.name == alias.asname: |
257 rewritten = "from {0} import {1}".format(node.module, alias.name) |
257 rewritten = f"from {node.module} import {alias.name}" |
258 |
258 |
259 self.__error(node.lineno - 1, node.col_offset, "I901", rewritten) |
259 self.__error(node.lineno - 1, node.col_offset, "I901", rewritten) |
260 |
260 |
261 def __isModuleBanned(self, moduleName): |
261 def __isModuleBanned(self, moduleName): |
262 """ |
262 """ |
291 Private method to check import of banned modules. |
291 Private method to check import of banned modules. |
292 |
292 |
293 @param node reference to the node to be checked |
293 @param node reference to the node to be checked |
294 @type ast.AST |
294 @type ast.AST |
295 """ |
295 """ |
296 if not bool(self.__bannedModules): |
296 if ( |
|
297 not bool(self.__bannedModules) |
|
298 and not bool(self.__bannedUnstructuredPatterns) |
|
299 and not bool(self.__bannedStructuredPatterns) |
|
300 ): |
|
301 # nothing to check |
297 return |
302 return |
298 |
303 |
299 if isinstance(node, ast.Import): |
304 if isinstance(node, ast.Import): |
300 moduleNames = [alias.name for alias in node.names] |
305 moduleNames = [alias.name for alias in node.names] |
301 elif isinstance(node, ast.ImportFrom): |
306 elif isinstance(node, ast.ImportFrom): |
327 |
332 |
328 @param node reference to the node to be checked |
333 @param node reference to the node to be checked |
329 @type ast.AST |
334 @type ast.AST |
330 """ |
335 """ |
331 if not self.__banRelativeImports: |
336 if not self.__banRelativeImports: |
|
337 # nothing to check |
332 return |
338 return |
333 |
339 |
334 elif self.__banRelativeImports == "parents": |
340 elif self.__banRelativeImports == "parents": |
335 minNodeLevel = 1 |
341 minNodeLevel = 1 |
336 msgCode = "I903" |
342 msgCode = "I903" |
337 else: |
343 else: |
338 minNodeLevel = 0 |
344 minNodeLevel = 0 |
339 msgCode = "I904" |
345 msgCode = "I904" |
340 |
346 |
341 if ( |
347 if ( |
342 self.__banRelativeImports |
348 isinstance(node, ast.ImportFrom) |
343 and isinstance(node, ast.ImportFrom) |
|
344 and node.level > minNodeLevel |
349 and node.level > minNodeLevel |
345 ): |
350 ): |
346 self.__error(node.lineno - 1, node.col_offset, msgCode) |
351 self.__error(node.lineno - 1, node.col_offset, msgCode) |