444 for n in imports[1:]: |
444 for n in imports[1:]: |
445 if n.error is not None: |
445 if n.error is not None: |
446 errors.append(n.error) |
446 errors.append(n.error) |
447 |
447 |
448 if n == p: |
448 if n == p: |
449 if ( |
449 if self.__args.get("CombinedAsImports", False) or ( |
450 self.__args.get("CombinedAsImports", False) |
450 not n.asImport and not p.asImport |
451 or (not n.asImport and not p.asImport) |
|
452 ): |
451 ): |
453 errors.append((n.node, "I203", str(p), str(n))) |
452 errors.append((n.node, "I203", str(p), str(n))) |
454 elif n < p: |
453 elif n < p: |
455 errors.append((n.node, "I201", str(n), str(p))) |
454 errors.append((n.node, "I201", str(n), str(p))) |
456 |
455 |
511 actualList.append(el.s) |
510 actualList.append(el.s) |
512 else: |
511 else: |
513 # Can't handle anything that isn't a string literal |
512 # Can't handle anything that isn't a string literal |
514 return None |
513 return None |
515 |
514 |
516 expectedList = self.sorted(actualList, key=self.moduleKey) |
515 expectedList = self.sorted( |
|
516 actualList, |
|
517 key=lambda k: self.moduleKey(k, subImports=True), |
|
518 ) |
517 if expectedList != actualList: |
519 if expectedList != actualList: |
518 return (node, "I204", ", ".join(expectedList)) |
520 return (node, "I204", ", ".join(expectedList)) |
519 |
521 |
520 return None |
522 return None |
521 |
523 |
580 @return key for natural sorting |
582 @return key for natural sorting |
581 @rtype list of str or int |
583 @rtype list of str or int |
582 """ |
584 """ |
583 return [self.__atoi(c) for c in re.split(r"(\d+)", text)] |
585 return [self.__atoi(c) for c in re.split(r"(\d+)", text)] |
584 |
586 |
585 def moduleKey(self, moduleName): |
587 def moduleKey(self, moduleName, subImports=False): |
586 """ |
588 """ |
587 Public method to generate a key for the given module name. |
589 Public method to generate a key for the given module name. |
588 |
590 |
589 @param moduleName module name |
591 @param moduleName module name |
590 @type str |
592 @type str |
|
593 @param subImports flag indicating a sub import like in |
|
594 'from foo import bar, baz' (defaults to False) |
|
595 @type bool (optional) |
591 @return generated key |
596 @return generated key |
592 @rtype str |
597 @rtype str |
593 """ |
598 """ |
594 prefix = "" |
599 prefix = "" |
595 |
600 |
596 if moduleName.isupper() and len(moduleName) > 1: |
601 if subImports: |
597 prefix = "A" |
602 if moduleName.isupper() and len(moduleName) > 1: |
598 elif moduleName[0:1].isupper(): |
603 prefix = "A" |
599 prefix = "B" |
604 elif moduleName[0:1].isupper(): |
600 else: |
605 prefix = "B" |
601 prefix = "C" |
606 else: |
|
607 prefix = "C" |
602 if not self.__sortCaseSensitive: |
608 if not self.__sortCaseSensitive: |
603 moduleName = moduleName.lower() |
609 moduleName = moduleName.lower() |
604 |
610 |
605 return f"{prefix}{moduleName}" |
611 return f"{prefix}{moduleName}" |
606 |
612 |