summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Crosley <timothy.crosley@gmail.com>2021-03-13 18:41:15 -0800
committerTimothy Crosley <timothy.crosley@gmail.com>2021-03-13 18:41:15 -0800
commitd09acd0974847314278e18c92db13950555e0ae9 (patch)
treefa257afc2d1e3194d3b0cce2bc926f3e56c19a86
parent31e4fde04d00627977a27b8e083d562b61e2e608 (diff)
downloadisort-d09acd0974847314278e18c92db13950555e0ae9.tar.gz
Resolve #1684: Add support for --extend-skip and --extend-skip-glob
-rw-r--r--CHANGELOG.md1
-rw-r--r--isort/main.py20
-rw-r--r--isort/settings.py28
-rw-r--r--tests/unit/test_main.py2
4 files changed, 45 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ce9f022..b0107444 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ Find out more about isort's release policy [here](https://pycqa.github.io/isort/
- Implemented #1669: Parallel (`-j`) now defaults to number of CPU cores if no value is provided.
- Implemented #1668: Added a safeguard against accidental usage against /.
- 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`.
- 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 38d9a4bb..5ed22cc2 100644
--- a/isort/main.py
+++ b/isort/main.py
@@ -311,7 +311,7 @@ def _build_arg_parser() -> argparse.ArgumentParser:
target_group.add_argument(
"-s",
"--skip",
- help="Files that sort imports should skip over. If you want to skip multiple "
+ help="Files that isort should skip over. If you want to skip multiple "
"files you should specify twice: --skip file1 --skip file2. Values can be "
"file names, directory names or file paths. To skip all files in a nested path "
"use --skip-glob.",
@@ -319,9 +319,25 @@ def _build_arg_parser() -> argparse.ArgumentParser:
action="append",
)
target_group.add_argument(
+ "--extend-skip",
+ help="Extends --skip to add additional files that isort should skip over. "
+ "If you want to skip multiple "
+ "files you should specify twice: --skip file1 --skip file2. Values can be "
+ "file names, directory names or file paths. To skip all files in a nested path "
+ "use --skip-glob.",
+ dest="extend_skip",
+ action="append",
+ )
+ target_group.add_argument(
"--sg",
"--skip-glob",
- help="Files that sort imports should skip over.",
+ help="Files that isort should skip over.",
+ dest="skip_glob",
+ action="append",
+ )
+ target_group.add_argument(
+ "--extend-skip-glob",
+ help="Additional files that isort should skip over (extending --skip-glob).",
dest="skip_glob",
action="append",
)
diff --git a/isort/settings.py b/isort/settings.py
index e5293772..a62c27bf 100644
--- a/isort/settings.py
+++ b/isort/settings.py
@@ -121,7 +121,9 @@ class _Config:
py_version: str = "3"
force_to_top: FrozenSet[str] = frozenset()
skip: FrozenSet[str] = DEFAULT_SKIP
+ extend_skip: FrozenSet[str] = frozenset()
skip_glob: FrozenSet[str] = frozenset()
+ extend_skip_glob: FrozenSet[str] = frozenset()
skip_gitignore: bool = False
line_length: int = 79
wrap_length: int = 0
@@ -267,6 +269,8 @@ class Config(_Config):
):
self._known_patterns: Optional[List[Tuple[Pattern[str], str]]] = None
self._section_comments: Optional[Tuple[str, ...]] = None
+ self._skips: Optional[FrozenSet[str]] = None
+ self._skip_globs: Optional[FrozenSet[str]] = None
if config:
config_vars = vars(config).copy()
@@ -274,6 +278,8 @@ class Config(_Config):
config_vars["py_version"] = config_vars["py_version"].replace("py", "")
config_vars.pop("_known_patterns")
config_vars.pop("_section_comments")
+ config_vars.pop("_skips")
+ config_vars.pop("_skip_globs")
super().__init__(**config_vars) # type: ignore
return
@@ -521,7 +527,7 @@ class Config(_Config):
if normalized_path[1:2] == ":":
normalized_path = normalized_path[2:]
- for skip_path in self.skip:
+ for skip_path in self.skips:
if posixpath.abspath(normalized_path) == posixpath.abspath(
skip_path.replace("\\", "/")
):
@@ -529,11 +535,11 @@ class Config(_Config):
position = os.path.split(file_name)
while position[1]:
- if position[1] in self.skip:
+ if position[1] in self.skips:
return True
position = os.path.split(position[0])
- for glob in self.skip_glob:
+ for glob in self.skip_globs:
if fnmatch.fnmatch(file_name, glob) or fnmatch.fnmatch("/" + file_name, glob):
return True
@@ -574,6 +580,22 @@ class Config(_Config):
self._section_comments = tuple(f"# {heading}" for heading in self.import_headings.values())
return self._section_comments
+ @property
+ def skips(self) -> FrozenSet[str]:
+ if self._skips is not None:
+ return self._skips
+
+ self._skips = self.skip.union(self.extend_skip)
+ return self._skips
+
+ @property
+ def skip_globs(self) -> FrozenSet[str]:
+ if self._skip_globs is not None:
+ return self._skip_globs
+
+ self._skip_globs = self.skip_glob.union(self.extend_skip_glob)
+ return self._skip_globs
+
def _parse_known_pattern(self, pattern: str) -> List[str]:
"""Expand pattern if identified as a directory and return found sub packages"""
if pattern.endswith(os.path.sep):
diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py
index eb197090..86f62db3 100644
--- a/tests/unit/test_main.py
+++ b/tests/unit/test_main.py
@@ -326,7 +326,7 @@ import a
import b
"""
)
- main.main([str(tmpdir), "--skip", "skip.py", "--check"])
+ main.main([str(tmpdir), "--extend-skip", "skip.py", "--check"])
# without filter options passed in should successfully sort files
main.main([str(python_file), str(should_skip), "--verbose", "--atomic"])