summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Edmund Crosley <timothy.crosley@gmail.com>2021-03-17 00:40:12 -0700
committerGitHub <noreply@github.com>2021-03-17 00:40:12 -0700
commit359c105a85d51167d2938581d1665f04d2fc5e1e (patch)
tree7d832ee0a328cb55fe759fe4b20bde5a1fe0176b
parent9042488762e10137fd535601d9f433f1e3920dad (diff)
parentcb896cd47962034f681171d3eced45a82f0ddf0b (diff)
downloadisort-359c105a85d51167d2938581d1665f04d2fc5e1e.tar.gz
Merge pull request #1693 from PyCQA/issue/1645
Issue/1645
-rw-r--r--CHANGELOG.md1
-rw-r--r--isort/main.py6
-rw-r--r--isort/output.py6
-rw-r--r--isort/settings.py1
-rw-r--r--isort/sorting.py6
-rw-r--r--tests/unit/test_ticketed_features.py30
6 files changed, 47 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53271c10..72bebd8c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ Find out more about isort's release policy [here](https://pycqa.github.io/isort/
- Implemented #1638 / #1644: Provide a flag `--overwrite-in-place` to ensure same file handle is used after sorting.
- Implemented #1684: Added support for extending skips with `--extend-skip` and `--extend-skip-glob`.
- Implemented #1688: Auto identification and skipping of some invalid import statements.
+ - Implemented #1645: Ability to reverse the import sorting order.
- Documented #1685: Skip doesn't support plain directory names, but skip_glob does.
### 5.7.0 December 30th 2020
diff --git a/isort/main.py b/isort/main.py
index 5ed22cc2..d16626f5 100644
--- a/isort/main.py
+++ b/isort/main.py
@@ -562,6 +562,12 @@ def _build_arg_parser() -> argparse.ArgumentParser:
action="store_true",
help="Reverse order of relative imports.",
)
+ output_group.add_argument(
+ "--reverse-sort",
+ dest="reverse_sort",
+ action="store_true",
+ help="Reverses the ordering of imports.",
+ )
inline_args_group.add_argument(
"--sl",
"--force-single-line-imports",
diff --git a/isort/output.py b/isort/output.py
index 6b340108..ee7406ca 100644
--- a/isort/output.py
+++ b/isort/output.py
@@ -54,12 +54,15 @@ def sorted_imports(
key=lambda key: sorting.module_key(
key, config, section_name=section, straight_import=True
),
+ reverse=config.reverse_sort,
)
from_modules = parsed.imports[section]["from"]
if not config.only_sections:
from_modules = sorting.naturally(
- from_modules, key=lambda key: sorting.module_key(key, config, section_name=section)
+ from_modules,
+ key=lambda key: sorting.module_key(key, config, section_name=section),
+ reverse=config.reverse_sort,
)
straight_imports = _with_straight_imports(
@@ -233,6 +236,7 @@ def _with_from_imports(
config.force_alphabetical_sort_within_sections,
section_name=section,
),
+ reverse=config.reverse_sort,
)
if remove_imports:
from_imports = [
diff --git a/isort/settings.py b/isort/settings.py
index a62c27bf..dc3754ef 100644
--- a/isort/settings.py
+++ b/isort/settings.py
@@ -210,6 +210,7 @@ class _Config:
honor_case_in_force_sorted_sections: bool = False
sort_relative_in_force_sorted_sections: bool = False
overwrite_in_place: bool = False
+ reverse_sort: bool = False
def __post_init__(self):
py_version = self.py_version
diff --git a/isort/sorting.py b/isort/sorting.py
index 2cfe60bf..e8c355ba 100644
--- a/isort/sorting.py
+++ b/isort/sorting.py
@@ -96,7 +96,9 @@ def section_key(line: str, config: Config) -> str:
return f"{section}{len(line) if config.length_sort else ''}{line}"
-def naturally(to_sort: Iterable[str], key: Optional[Callable[[str], Any]] = None) -> List[str]:
+def naturally(
+ to_sort: Iterable[str], key: Optional[Callable[[str], Any]] = None, reverse: bool = False
+) -> List[str]:
"""Returns a naturally sorted list"""
if key is None:
key_callback = _natural_keys
@@ -105,7 +107,7 @@ def naturally(to_sort: Iterable[str], key: Optional[Callable[[str], Any]] = None
def key_callback(text: str) -> List[Any]:
return _natural_keys(key(text)) # type: ignore
- return sorted(to_sort, key=key_callback)
+ return sorted(to_sort, key=key_callback, reverse=reverse)
def _atoi(text: str) -> Any:
diff --git a/tests/unit/test_ticketed_features.py b/tests/unit/test_ticketed_features.py
index dddb31bc..6bed59a6 100644
--- a/tests/unit/test_ticketed_features.py
+++ b/tests/unit/test_ticketed_features.py
@@ -1029,3 +1029,33 @@ from package2 imprt and_its_gone
from package3 import also_ok
"""
)
+
+
+def test_isort_allows_reversing_sort_order_issue_1645():
+ """isort allows reversing the sort order for those who prefer Z or longer imports first.
+ see: https://github.com/PyCQA/isort/issues/1688
+ """
+ assert (
+ isort.code(
+ """
+from xxx import (
+ g,
+ hi,
+ def,
+ abcd,
+)
+""",
+ profile="black",
+ reverse_sort=True,
+ length_sort=True,
+ line_length=20,
+ )
+ == """
+from xxx import (
+ abcd,
+ def,
+ hi,
+ g,
+)
+"""
+ )