diff --git a/fawltydeps/main.py b/fawltydeps/main.py index 789f6e12..be29757e 100644 --- a/fawltydeps/main.py +++ b/fawltydeps/main.py @@ -27,7 +27,7 @@ from fawltydeps import extract_imports from fawltydeps.check import compare_imports_to_dependencies from fawltydeps.extract_declared_dependencies import extract_declared_dependencies -from fawltydeps.settings import Action, Settings +from fawltydeps.settings import Action, OutputFormat, Settings from fawltydeps.types import ( ArgParseError, DeclaredDependency, @@ -177,7 +177,7 @@ def main() -> int: except ArgParseError as exc: return parser.error(exc.msg) # exit code 2 - if settings.json_output: + if settings.output_format == OutputFormat.JSON: analysis.print_json(sys.stdout) else: analysis.print_human_readable(sys.stdout, details=settings.verbosity > 0) diff --git a/fawltydeps/settings.py b/fawltydeps/settings.py index 8e65894d..7431a47f 100644 --- a/fawltydeps/settings.py +++ b/fawltydeps/settings.py @@ -67,6 +67,13 @@ class Action(OrderedEnum): REPORT_UNUSED = "check_unused" +class OutputFormat(OrderedEnum): + """Output formats provided by the FawltyDeps application.""" + + HUMAN_READABLE = "human_readable" + JSON = "json" + + def parse_path_or_stdin(arg: str) -> PathOrSpecial: """Convert --code argument into Path or "".""" if arg == "-": @@ -91,7 +98,7 @@ class Settings(BaseSettings): # type: ignore actions: Set[Action] = {Action.REPORT_UNDECLARED, Action.REPORT_UNUSED} code: PathOrSpecial = Path(".") deps: Path = Path(".") - json_output: bool = False + output_format: OutputFormat = OutputFormat.HUMAN_READABLE ignore_undeclared: Set[str] = set() ignore_unused: Set[str] = set() verbosity: int = 0 @@ -216,8 +223,9 @@ def populate_parser_options(cls, parser: argparse._ActionsContainer) -> None: ) parser.add_argument( "--json", - dest="json_output", - action="store_true", + dest="output_format", + action="store_const", + const="json", help="Generate JSON output instead of a human-readable report", ) parser.add_argument( diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index 1e2054cd..2d5e5bd4 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -155,7 +155,7 @@ def test_list_imports_json__from_py_file__prints_imports_from_file(write_tmp_fil "actions": ["list_imports"], "code": f"{tmp_path}/myfile.py", "deps": ".", - "json_output": True, + "output_format": "json", "ignore_undeclared": [], "ignore_unused": [], "verbosity": 0, @@ -295,7 +295,7 @@ def test_list_deps_json__dir__prints_deps_from_requirements_txt( "actions": ["list_deps"], "code": ".", "deps": f"{tmp_path}", - "json_output": True, + "output_format": "json", "ignore_undeclared": [], "ignore_unused": [], "verbosity": 0, @@ -472,7 +472,7 @@ def test_check_json__simple_project__can_report_both_undeclared_and_unused( "actions": ["check_undeclared", "check_unused"], "code": f"{tmp_path}", "deps": f"{tmp_path}", - "json_output": True, + "output_format": "json", "ignore_undeclared": [], "ignore_unused": [], "verbosity": 0, diff --git a/tests/test_settings.py b/tests/test_settings.py index f6f1b22f..ddf3a722 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -8,7 +8,7 @@ from pydantic import ValidationError from pydantic.env_settings import SettingsError # pylint: disable=no-name-in-module -from fawltydeps.settings import Action, Settings +from fawltydeps.settings import Action, OutputFormat, Settings if sys.version_info >= (3, 11): from tomllib import TOMLDecodeError # pylint: disable=no-member @@ -19,7 +19,7 @@ actions={Action.REPORT_UNDECLARED, Action.REPORT_UNUSED}, code=Path("."), deps=Path("."), - json_output=False, + output_format=OutputFormat.HUMAN_READABLE, ignore_undeclared=set(), ignore_unused=set(), verbosity=0,