diff --git a/src/twyn/cli.py b/src/twyn/cli.py index 03510b4..e5ca089 100644 --- a/src/twyn/cli.py +++ b/src/twyn/cli.py @@ -76,6 +76,12 @@ def entry_point() -> None: default=False, help="Disable use of the trusted packages cache. Always fetch from the source.", ) +@click.option( + "--no-track", + is_flag=True, + default=False, + help="Do not show the progress bar while processing packages.", +) def run( config: str, dependency_file: Optional[str], @@ -84,6 +90,7 @@ def run( v: bool, vv: bool, no_cache: bool, + no_track: bool, ) -> int: if v and vv: raise click.UsageError( @@ -113,6 +120,7 @@ def run( selector_method=selector_method, verbosity=verbosity, use_cache=not no_cache, + use_track=not no_track, ) except TwynError as e: raise CliError(e.message) from e diff --git a/src/twyn/main.py b/src/twyn/main.py index 7e9b311..ced0d4e 100644 --- a/src/twyn/main.py +++ b/src/twyn/main.py @@ -32,6 +32,7 @@ def check_dependencies( dependencies: Optional[set[str]] = None, verbosity: AvailableLoggingLevels = AvailableLoggingLevels.none, use_cache: bool = True, + use_track: bool = False, ) -> list[TyposquatCheckResult]: """Check if dependencies could be typosquats.""" config_file_handler = FileHandler(config_file or DEFAULT_PROJECT_TOML_FILE) @@ -52,7 +53,10 @@ def check_dependencies( normalized_dependencies = normalize_packages(dependencies) errors: list[TyposquatCheckResult] = [] - for dependency in track(normalized_dependencies, description="Processing..."): + dependencies_list = ( + track(normalized_dependencies, description="Processing...") if use_track else normalized_dependencies + ) + for dependency in dependencies_list: if dependency in normalized_allowlist_packages: logger.info("Dependency %s is in the allowlist", dependency) continue diff --git a/tests/main/test_cli.py b/tests/main/test_cli.py index cd5cc7d..1a6841c 100644 --- a/tests/main/test_cli.py +++ b/tests/main/test_cli.py @@ -89,6 +89,7 @@ def test_click_arguments_dependency_file(self, mock_check_dependencies): selector_method="first-letter", verbosity=AvailableLoggingLevels.debug, use_cache=True, + use_track=True, ) ] @@ -111,6 +112,7 @@ def test_click_arguments_dependency_file_in_different_path(self, mock_check_depe selector_method=None, verbosity=AvailableLoggingLevels.none, use_cache=True, + use_track=True, ) ] @@ -132,6 +134,7 @@ def test_click_arguments_single_dependency_cli(self, mock_check_dependencies): selector_method=None, verbosity=AvailableLoggingLevels.none, use_cache=True, + use_track=True, ) ] @@ -165,6 +168,7 @@ def test_click_arguments_multiple_dependencies(self, mock_check_dependencies): selector_method=None, verbosity=AvailableLoggingLevels.none, use_cache=True, + use_track=True, ) ] @@ -181,6 +185,7 @@ def test_click_arguments_default(self, mock_check_dependencies): dependencies=None, verbosity=AvailableLoggingLevels.none, use_cache=True, + use_track=True, ) ] diff --git a/tests/main/test_main.py b/tests/main/test_main.py index c6b3a1d..b7bc19d 100644 --- a/tests/main/test_main.py +++ b/tests/main/test_main.py @@ -283,3 +283,23 @@ def test_get_parsed_dependencies_from_file(self, mock_parse: Mock, mock_get_depe mock_get_dependency_parser.return_value = RequirementsTxtParser() mock_parse.return_value = {"boto3"} assert get_parsed_dependencies_from_file() == {"boto3"} + + @patch("twyn.main.TopPyPiReference") + @patch("twyn.main.get_parsed_dependencies_from_file") + def test_track_is_disabled_by_default_when_used_as_package( + self, mock_get_parsed_dependencies_from_file, mock_top_pypi_reference + ) -> None: + mock_top_pypi_reference.return_value.get_packages.return_value = {"mypackage"} + mock_get_parsed_dependencies_from_file.return_value = {"my-package"} + with patch("twyn.main.track") as m_track: + check_dependencies("all") + assert m_track.call_count == 0 + + @patch("twyn.main.TopPyPiReference") + @patch("twyn.main.get_parsed_dependencies_from_file") + def test_track_is_shown_when_enabled(self, mock_get_parsed_dependencies_from_file, mock_top_pypi_reference) -> None: + mock_top_pypi_reference.return_value.get_packages.return_value = {"mypackage"} + mock_get_parsed_dependencies_from_file.return_value = {"my-package"} + with patch("twyn.main.track") as m_track: + check_dependencies("all", use_track=True) + assert m_track.call_count == 1