55
66from twyn .base .constants import (
77 SELECTOR_METHOD_MAPPING ,
8- AvailableLoggingLevels ,
98 SelectorMethod ,
109)
1110from twyn .base .utils import normalize_packages
2221)
2322
2423logger = logging .getLogger ("twyn" )
24+ logger .addHandler (logging .NullHandler ())
2525
2626
2727def check_dependencies (
2828 selector_method : Union [SelectorMethod , None ] = None ,
2929 config_file : Optional [str ] = None ,
3030 dependency_file : Optional [str ] = None ,
3131 dependencies : Optional [set [str ]] = None ,
32- verbosity : AvailableLoggingLevels = AvailableLoggingLevels .none ,
3332 use_cache : Optional [bool ] = True ,
34- use_track : bool = False ,
33+ show_progress_bar : bool = False ,
3534 load_config_from_file : bool = False ,
3635) -> TyposquatCheckResultList :
37- """Check if dependencies could be typosquats."""
38- config = get_config (
36+ """
37+ Check if the provided dependencies are potential typosquats of trusted packages.
38+
39+ This function analyzes a set of dependencies and determines if any of them are likely typosquats
40+ (i.e., malicious or mistaken variants) of popular or trusted packages, using configurable methods
41+ and references.
42+
43+ Args:
44+ selector_method (Union[SelectorMethod, None], optional): The method used to select candidate typosquat matches.
45+ config_file (Optional[str], optional): Path to a configuration file to load settings from.
46+ dependency_file (Optional[str], optional): Path to a file containing the list of dependencies to check.
47+ dependencies (Optional[set[str]], optional): A set of dependency names to check. If not provided, dependencies are loaded from the dependency_file.
48+ use_cache (Optional[bool], optional): Whether to use cached data for package references and results. Defaults to True.
49+ show_progress_bar (bool, optional): Whether to display a progress bar during processing. Defaults to False.
50+ load_config_from_file (bool, optional): Whether to load configuration from the specified config_file. Defaults to False.
51+
52+ Returns:
53+ TyposquatCheckResultList: A list of results indicating which dependencies, if any, are suspected typosquats.
54+ """
55+ config = _get_config (
3956 load_config_from_file = load_config_from_file ,
4057 config_file = config_file ,
41- verbosity = verbosity ,
4258 selector_method = selector_method ,
4359 dependency_file = dependency_file ,
4460 use_cache = use_cache ,
4561 )
4662
47- _set_logging_level (config .logging_level )
48-
4963 cache_handler = CacheHandler () if config .use_cache else None
5064
5165 trusted_packages = TrustedPackages (
5266 names = TopPyPiReference (source = config .pypi_reference , cache_handler = cache_handler ).get_packages (),
5367 algorithm = EditDistance (),
54- selector = get_candidate_selector (config .selector_method ),
68+ selector = _get_candidate_selector (config .selector_method ),
5569 threshold_class = SimilarityThreshold ,
5670 )
5771 normalized_allowlist_packages = normalize_packages (config .allowlist )
58- dependencies = dependencies if dependencies else get_parsed_dependencies_from_file (config .dependency_file )
72+ dependencies = dependencies if dependencies else _get_parsed_dependencies_from_file (config .dependency_file )
5973 normalized_dependencies = normalize_packages (dependencies )
6074
6175 typos_list = TyposquatCheckResultList ()
6276 dependencies_list = (
63- track (normalized_dependencies , description = "Processing..." ) if use_track else normalized_dependencies
77+ track (normalized_dependencies , description = "Processing..." ) if show_progress_bar else normalized_dependencies
6478 )
6579 for dependency in dependencies_list :
6680 if dependency in normalized_allowlist_packages :
@@ -74,10 +88,9 @@ def check_dependencies(
7488 return typos_list
7589
7690
77- def get_config (
91+ def _get_config (
7892 load_config_from_file : bool ,
7993 config_file : Optional [str ],
80- verbosity : AvailableLoggingLevels ,
8194 selector_method : Union [SelectorMethod , None ],
8295 dependency_file : Optional [str ],
8396 use_cache : Optional [bool ],
@@ -87,26 +100,20 @@ def get_config(
87100 else :
88101 config_file_handler = None
89102 return ConfigHandler (config_file_handler ).resolve_config (
90- verbosity = verbosity ,
91103 selector_method = selector_method ,
92104 dependency_file = dependency_file ,
93105 use_cache = use_cache ,
94106 )
95107
96108
97- def _set_logging_level (logging_level : AvailableLoggingLevels ) -> None :
98- logger .setLevel (logging_level .value )
99- logger .debug ("Logging level: %s" , logging_level .value )
100-
101-
102- def get_candidate_selector (selector_method_name : str ) -> AbstractSelector :
109+ def _get_candidate_selector (selector_method_name : str ) -> AbstractSelector :
103110 logger .debug ("Selector method received %s" , selector_method_name )
104111 selector_method = SELECTOR_METHOD_MAPPING [selector_method_name ]()
105112 logger .debug ("Instantiated %s selector" , selector_method )
106113 return selector_method
107114
108115
109- def get_parsed_dependencies_from_file (dependency_file : Optional [str ] = None ) -> set [str ]:
116+ def _get_parsed_dependencies_from_file (dependency_file : Optional [str ] = None ) -> set [str ]:
110117 dependency_parser = DependencySelector (dependency_file ).get_dependency_parser ()
111118 dependencies = dependency_parser .parse ()
112119 logger .debug ("Successfully parsed local dependencies file." )
0 commit comments