diff --git a/src/tryceratops/__main__.py b/src/tryceratops/__main__.py index e7efc8e..cd07e29 100644 --- a/src/tryceratops/__main__.py +++ b/src/tryceratops/__main__.py @@ -17,6 +17,9 @@ EXPERIMENTAL_FLAG_OPTION = dict(is_flag=True, help="Whether to enable experimental analyzers.") +AUTOFIX_FLAG_OPTION = dict( + is_flag=True, help="Whether to fix violations (that support it) automatically." +) IGNORE_OPTION = dict( multiple=True, help="A violation to be ignored. e.g. -i TC200 -i TC201", @@ -32,6 +35,7 @@ @click.option("-i", "--ignore", **IGNORE_OPTION) @click.option("-x", "--exclude", **EXCLUDE_OPTION) @click.option("-v", "--verbose", **VERBOSE_OPTION) +@click.option("-a", "--autofix", **AUTOFIX_FLAG_OPTION) @click.version_option(tryceratops.__version__) def entrypoint( dir: Tuple[str], @@ -39,13 +43,14 @@ def entrypoint( ignore: Tuple[str, ...], exclude: Tuple[str, ...], verbose: bool, + autofix: bool, ): pyproj_config = load_config(dir) if pyproj_config: global_filter = GlobalFilter.create_from_config(pyproj_config) - global_filter.overwrite_from_cli(experimental, ignore, exclude) + global_filter.overwrite_from_cli(experimental, ignore, exclude, autofix) else: - global_filter = GlobalFilter(experimental, ignore, exclude) + global_filter = GlobalFilter(experimental, ignore, exclude, autofix) if verbose: logger = logging.getLogger("tryceratops") diff --git a/src/tryceratops/filters.py b/src/tryceratops/filters.py index 74b9b05..4178878 100644 --- a/src/tryceratops/filters.py +++ b/src/tryceratops/filters.py @@ -54,6 +54,7 @@ class GlobalFilter: include_experimental: bool ignore_violations: Iterable[str] exclude_dirs: Iterable[str] + autofix: bool = False def _self_check(self): self.exclude_dirs = [excluded for excluded in self.exclude_dirs if excluded] @@ -86,14 +87,16 @@ def create_from_config(cls, config: PyprojectConfig) -> GlobalFilter: experimental = config.get("experimental", False) ignore = config.get("ignore", []) exclude = config.get("exclude", []) + autofix = config.get("autofix", False) - return cls(experimental, ignore, exclude) + return cls(experimental, ignore, exclude, autofix) def overwrite_from_cli( self, include_experimental: bool, ignore_violations: Iterable[str], exclude_dirs: Iterable[str], + autofix: bool, ): """In case any value is set it overwrites the previous value""" if include_experimental: @@ -105,4 +108,7 @@ def overwrite_from_cli( if exclude_dirs: self.exclude_dirs = exclude_dirs + if autofix: + self.autofix = autofix + self._self_check() diff --git a/src/tryceratops/types.py b/src/tryceratops/types.py index 49bdef2..fee4cbd 100644 --- a/src/tryceratops/types.py +++ b/src/tryceratops/types.py @@ -18,3 +18,4 @@ class PyprojectConfig(TypedDict): exclude: List[str] ignore: List[str] experimental: bool + autofix: bool