Skip to content

Commit 233168b

Browse files
authored
fix: Properly annotate check_dependencies's selector_method arg (#287)
1 parent 3d4a991 commit 233168b

5 files changed

Lines changed: 38 additions & 25 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,10 @@ To clear the cache, run:
207207
```python
208208
from twyn import check_dependencies
209209

210-
typos = check_dependencies("all")
210+
typos = check_dependencies()
211211

212212
for typo in typos.errors:
213213
print(f"Dependency:{typo.dependency}")
214214
print(f"Did you mean any of [{','.join(typo.similars)}]")
215215

216-
```
216+
```

src/twyn/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ def run(
117117

118118
try:
119119
possible_typos = check_dependencies(
120+
selector_method=selector_method,
120121
dependencies=set(dependency) or None,
121122
config_file=config,
122123
dependency_file=dependency_file,
123-
selector_method=selector_method,
124124
verbosity=verbosity,
125125
use_cache=not no_cache,
126126
use_track=False if json else not no_track,

src/twyn/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import Optional
2+
from typing import Optional, Union
33

44
from rich.progress import track
55

@@ -26,7 +26,7 @@
2626

2727

2828
def check_dependencies(
29-
selector_method: SelectorMethod,
29+
selector_method: Union[SelectorMethod, None] = None,
3030
config_file: Optional[str] = None,
3131
dependency_file: Optional[str] = None,
3232
dependencies: Optional[set[str]] = None,

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
@contextmanager
1010
def create_tmp_file(path: Path, data: str) -> Iterator[str]:
11+
path.parent.mkdir(parents=True, exist_ok=True)
1112
path.write_text(data)
1213
yield str(path)
1314

tests/main/test_main.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from pathlib import Path
2+
from typing import Any, Union
13
from unittest.mock import Mock, patch
24

35
import pytest
@@ -93,10 +95,10 @@ class TestCheckDependencies:
9395
)
9496
def test_options_priorities_assignation(
9597
self,
96-
cli_config,
97-
file_config,
98-
expected_resolved_config,
99-
):
98+
cli_config: dict[str, Any],
99+
file_config: dict[str, Any],
100+
expected_resolved_config: TwynConfiguration,
101+
) -> None:
100102
"""
101103
Checks that the configuration values are picked accordingly to the priority they have.
102104
@@ -133,7 +135,12 @@ def test_options_priorities_assignation(
133135
(AvailableLoggingLevels.none, "debug", AvailableLoggingLevels.debug),
134136
],
135137
)
136-
def test_logging_level(self, passed_logging_level, config, logging_level):
138+
def test_logging_level(
139+
self,
140+
passed_logging_level: AvailableLoggingLevels,
141+
config: Union[str, None],
142+
logging_level: AvailableLoggingLevels,
143+
) -> None:
137144
log_level = _get_logging_level(
138145
cli_verbosity=passed_logging_level,
139146
config_logging_level=config,
@@ -143,8 +150,8 @@ def test_logging_level(self, passed_logging_level, config, logging_level):
143150
@patch("twyn.main.get_parsed_dependencies_from_file")
144151
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
145152
def test_check_dependencies_detects_typosquats(
146-
self, mock_get_packages_from_cache, mock_get_parsed_dependencies_from_file
147-
):
153+
self, mock_get_packages_from_cache: Mock, mock_get_parsed_dependencies_from_file: Mock
154+
) -> None:
148155
mock_get_parsed_dependencies_from_file.return_value = {"my-package"}
149156
mock_get_packages_from_cache.return_value = {"mypackage"}
150157
error = check_dependencies(
@@ -159,7 +166,9 @@ def test_check_dependencies_detects_typosquats(
159166
)
160167

161168
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
162-
def test_check_dependencies_with_input_from_cli_detects_typosquats(self, mock_get_packages_from_cache):
169+
def test_check_dependencies_with_input_from_cli_detects_typosquats(
170+
self, mock_get_packages_from_cache: Mock
171+
) -> None:
163172
mock_get_packages_from_cache.return_value = {"mypackage"}
164173
error = check_dependencies(
165174
config_file=None,
@@ -174,10 +183,9 @@ def test_check_dependencies_with_input_from_cli_detects_typosquats(self, mock_ge
174183

175184
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
176185
def test_check_dependencies_with_input_loads_file_from_different_location(
177-
self, mock_get_packages_from_cache, tmp_path, tmpdir
186+
self, mock_get_packages_from_cache: Mock, tmp_path: Path
178187
) -> None:
179188
mock_get_packages_from_cache.return_value = {"mypackage"}
180-
tmpdir.mkdir("fake-dir")
181189
tmp_file = tmp_path / "fake-dir" / "requirements.txt"
182190
with create_tmp_file(tmp_file, "mypackag"):
183191
error = check_dependencies(
@@ -192,7 +200,9 @@ def test_check_dependencies_with_input_loads_file_from_different_location(
192200
)
193201

194202
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
195-
def test_check_dependencies_with_input_from_cli_accepts_multiple_dependencies(self, mock_get_packages_from_cache):
203+
def test_check_dependencies_with_input_from_cli_accepts_multiple_dependencies(
204+
self, mock_get_packages_from_cache: Mock
205+
) -> None:
196206
mock_get_packages_from_cache.return_value = {"requests", "mypackage"}
197207

198208
error = check_dependencies(
@@ -209,8 +219,8 @@ def test_check_dependencies_with_input_from_cli_accepts_multiple_dependencies(se
209219
@patch("twyn.main.TopPyPiReference")
210220
@patch("twyn.main.get_parsed_dependencies_from_file")
211221
def test_check_dependencies_ignores_package_in_allowlist(
212-
self, mock_get_parsed_dependencies_from_file, mock_top_pypi_reference
213-
):
222+
self, mock_get_parsed_dependencies_from_file: Mock, mock_top_pypi_reference: Mock
223+
) -> None:
214224
mock_top_pypi_reference.return_value.get_packages.return_value = {"mypackage"}
215225
mock_get_parsed_dependencies_from_file.return_value = {"my-package"}
216226

@@ -255,7 +265,7 @@ def test_check_dependencies_ignores_package_in_allowlist(
255265
],
256266
)
257267
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
258-
def test_normalize_package(self, mock_get_packages_from_cache, package_name):
268+
def test_normalize_package(self, mock_get_packages_from_cache: Mock, package_name: Mock) -> None:
259269
mock_get_packages_from_cache.return_value = {"requests", "mypackage"}
260270
error = check_dependencies(
261271
config_file=None,
@@ -274,8 +284,8 @@ def test_normalize_package(self, mock_get_packages_from_cache, package_name):
274284
@patch("twyn.main.get_parsed_dependencies_from_file")
275285
@patch("twyn.trusted_packages.references.TopPyPiReference._get_packages_from_cache")
276286
def test_check_dependencies_does_not_error_on_same_package(
277-
self, mock_get_packages_from_cache, mock_get_parsed_dependencies_from_file, package_name
278-
):
287+
self, mock_get_packages_from_cache: Mock, mock_get_parsed_dependencies_from_file: Mock, package_name: Mock
288+
) -> None:
279289
mock_get_parsed_dependencies_from_file.return_value = {package_name}
280290
mock_get_packages_from_cache.return_value = {"my-package"}
281291
error = check_dependencies(
@@ -289,7 +299,7 @@ def test_check_dependencies_does_not_error_on_same_package(
289299

290300
@patch("twyn.dependency_parser.dependency_selector.DependencySelector.get_dependency_parser")
291301
@patch("twyn.dependency_parser.requirements_txt_parser.RequirementsTxtParser.parse")
292-
def test_get_parsed_dependencies_from_file(self, mock_parse: Mock, mock_get_dependency_parser: Mock):
302+
def test_get_parsed_dependencies_from_file(self, mock_parse: Mock, mock_get_dependency_parser: Mock) -> None:
293303
mock_get_dependency_parser.return_value = RequirementsTxtParser()
294304
mock_parse.return_value = {"boto3"}
295305
assert get_parsed_dependencies_from_file() == {"boto3"}
@@ -302,14 +312,16 @@ def test_track_is_disabled_by_default_when_used_as_package(
302312
mock_top_pypi_reference.return_value.get_packages.return_value = {"mypackage"}
303313
mock_get_parsed_dependencies_from_file.return_value = {"my-package"}
304314
with patch("twyn.main.track") as m_track:
305-
check_dependencies("all")
315+
check_dependencies()
306316
assert m_track.call_count == 0
307317

308318
@patch("twyn.main.TopPyPiReference")
309319
@patch("twyn.main.get_parsed_dependencies_from_file")
310-
def test_track_is_shown_when_enabled(self, mock_get_parsed_dependencies_from_file, mock_top_pypi_reference) -> None:
320+
def test_track_is_shown_when_enabled(
321+
self, mock_get_parsed_dependencies_from_file: Mock, mock_top_pypi_reference: Mock
322+
) -> None:
311323
mock_top_pypi_reference.return_value.get_packages.return_value = {"mypackage"}
312324
mock_get_parsed_dependencies_from_file.return_value = {"my-package"}
313325
with patch("twyn.main.track") as m_track:
314-
check_dependencies("all", use_track=True)
326+
check_dependencies(use_track=True)
315327
assert m_track.call_count == 1

0 commit comments

Comments
 (0)