diff options
author | Timothy Crosley <timothy.crosley@gmail.com> | 2021-03-13 18:41:15 -0800 |
---|---|---|
committer | Timothy Crosley <timothy.crosley@gmail.com> | 2021-03-13 18:41:15 -0800 |
commit | d09acd0974847314278e18c92db13950555e0ae9 (patch) | |
tree | fa257afc2d1e3194d3b0cce2bc926f3e56c19a86 | |
parent | 31e4fde04d00627977a27b8e083d562b61e2e608 (diff) | |
download | isort-d09acd0974847314278e18c92db13950555e0ae9.tar.gz |
Resolve #1684: Add support for --extend-skip and --extend-skip-glob
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | isort/main.py | 20 | ||||
-rw-r--r-- | isort/settings.py | 28 | ||||
-rw-r--r-- | tests/unit/test_main.py | 2 |
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"]) |