Skip to content

Commit e0d7b93

Browse files
authored
refactor: small refactoring changes (#251)
1 parent 125ef2e commit e0d7b93

20 files changed

Lines changed: 120 additions & 88 deletions

justfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ alias t := test
1212
help:
1313
just --list --unsorted
1414

15-
# Cleans all artifacts generated while running this project, including the virtualenv.
15+
# Create a new venv with all the dependencies groups
1616
venv:
1717
@if ! {{ venv-exists }}; \
1818
then \
19-
uv sync --frozen --group dev; \
19+
uv sync --frozen --all-groups; \
2020
fi
2121

2222
# Cleans all artifacts generated while running this project, including the virtualenv.

pyproject.toml

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,16 @@ dev = [
4949
"pytest<9.0.0,>=7.1.3",
5050
"mypy<1.17,>=0.982",
5151
"pytest-cov<7,>=4",
52+
53+
"ruff<0.12.4,>=0.5.1",
54+
"types-requests<3.0.0.0,>=2.32.4.20250611",
55+
]
56+
local = [
5257
"ipdb<1.0.0,>=0.13.9",
5358
"commitizen<5.0,>=2.38",
5459
"pdbpp<1.0.0,>=0.11.6",
55-
"ruff<0.12.4,>=0.5.1",
56-
"types-requests<3.0.0.0,>=2.32.4.20250611",
5760
]
5861

59-
6062
[build-system]
6163
requires = ["hatchling"]
6264
build-backend = "hatchling.build"
@@ -66,26 +68,41 @@ target-version = "py39"
6668
line-length = 120
6769

6870
src = ["twyn", "tests"]
69-
7071
[tool.ruff.lint]
7172
select = [
72-
"C9", # mccabe
73-
"E", # pycodestyle error
74-
"W", # pycodestyle warning
75-
"F", # pyflakes
76-
"B", # bugbear
77-
"D", # pydocstyle
78-
"I", # isort
79-
"C4", # comprehensions
80-
"SIM", # simplify
81-
"N", # pep8-naming
82-
"TRY", # tryceratops
73+
"B", # flake8-bugbear
74+
"C", # mccabe
75+
"E", # pycodestyle
76+
"W", # pycodestyle warnings
77+
"F", # pyflakes
78+
"I", # isort
79+
"B", # bugbear
80+
"D", # pydocstyle
81+
"I", # isort
82+
"C4", # comprehensions
83+
"SIM", # simplify
84+
"N", # pep8-naming
85+
"TRY", # tryceratops
86+
"UP", # pyupgrade
87+
"PT", # pytest-style
88+
"TCH", # type-checking
89+
"PL", # pylint
90+
"G", # logging format
91+
"TID", # tidy-imports
8392
]
84-
8593
ignore = [
86-
'D1', # pydocstyle enforcement of docstrings everywhere
87-
'TRY003', # tryceratops too noisy
88-
"E501", # line length (black handles it)
94+
"E501", # line-length (enforced by black instead)
95+
'D1', # pydocstyle enforces docstrings everywhere
96+
'TRY003', # tryceratops rule not useful
97+
"PLR0913", # pylint rule not useful
98+
"B008", # checks for function calls in default function arguments.
99+
'D206', # conflicts with formatter
100+
'W191', # conflicts with formatter
101+
'D203', # conflicts with formatter
102+
'D211', # conflicts with formatter
103+
'D212', # conflicts with formatter
104+
'UP031', # allow strings formated with %s
105+
'PLR2004' # magic value
89106
]
90107

91108
[tool.ruff.lint.pydocstyle]

src/twyn/base/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import enum
44
from typing import TYPE_CHECKING
55

6-
import twyn.dependency_parser as dependency_parser
6+
from twyn import dependency_parser
77
from twyn.trusted_packages import selectors
88

99
if TYPE_CHECKING:

src/twyn/config/config_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def add_package_to_allowlist(self, package_name: str) -> None:
8484

8585
config.allowlist.add(package_name)
8686
self._write_config(toml, config)
87-
logger.info(f"Package '{package_name}' successfully added to allowlist")
87+
logger.info("Package '%s' successfully added to allowlist", package_name)
8888

8989
def remove_package_from_allowlist(self, package_name: str) -> None:
9090
"""Remove a package from the allowlist configuration in the toml file."""
@@ -95,7 +95,7 @@ def remove_package_from_allowlist(self, package_name: str) -> None:
9595

9696
config.allowlist.remove(package_name)
9797
self._write_config(toml, config)
98-
logger.info(f"Package '{package_name}' successfully removed from allowlist")
98+
logger.info("Package '%s' successfully removed from allowlist", package_name)
9999

100100
def _get_read_config(self, toml: TOMLDocument) -> ReadTwynConfiguration:
101101
"""Read the twyn configuration from a provided toml document."""

src/twyn/dependency_parser/dependency_selector.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def __init__(self, dependency_file: Optional[str] = None) -> None:
1616
self.dependency_file = dependency_file or ""
1717

1818
@staticmethod
19-
def _raise_for_selected_parsers(parsers) -> None:
19+
def _raise_for_selected_parsers(parsers: list[type[AbstractParser]]) -> None:
2020
if len(parsers) > 1:
2121
raise MultipleParsersError
2222

@@ -45,7 +45,7 @@ def get_dependency_file_parser_from_file_name(
4545
return parsers[0]
4646

4747
def get_dependency_parser(self) -> AbstractParser:
48-
logger.debug(f"Dependency file: {self.dependency_file}")
48+
logger.debug("Dependency file: %s", self.dependency_file)
4949

5050
if self.dependency_file:
5151
logger.debug("Dependency file provided. Assigning a parser.")
@@ -56,6 +56,6 @@ def get_dependency_parser(self) -> AbstractParser:
5656
dependency_file_parser = self.auto_detect_dependency_file_parser()
5757
file_parser = dependency_file_parser()
5858

59-
logger.debug(f"Assigned {file_parser} parser for local dependencies file.")
59+
logger.debug("Assigned %s parser for local dependencies file.", file_parser)
6060

6161
return file_parser

src/twyn/dependency_parser/lock_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@
1111
import tomli as tomllib
1212

1313

14-
class LockParser(AbstractParser):
15-
"""Parser for poetry.lock and uv.lock files."""
14+
class TomlLockParser(AbstractParser):
15+
"""Parser for TOML-based lock files."""
1616

1717
def parse(self) -> set[str]:
1818
"""Parse dependencies names and map them to a set."""
1919
data = tomllib.loads(self._read())
2020
return {dependency["name"] for dependency in data["package"]}
2121

2222

23-
class PoetryLockParser(LockParser):
23+
class PoetryLockParser(TomlLockParser):
2424
"""Parser for poetry.lock files."""
2525

2626
def __init__(self, file_path: str = filetypes.poetry_lock) -> None:
2727
super().__init__(file_path)
2828

2929

30-
class UvLockParser(LockParser):
30+
class UvLockParser(TomlLockParser):
3131
"""Parser for uv.lock files."""
3232

3333
def __init__(self, file_path: str = UV_LOCK) -> None:

src/twyn/dependency_parser/requirements_txt_parser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
"""Parser for requirements.txt dependencies."""
22

3+
from typing import TYPE_CHECKING
4+
35
from dparse import filetypes, parse
4-
from dparse.dependencies import Dependency, DependencyFile
56

67
from twyn.dependency_parser.abstract_parser import AbstractParser
78

9+
if TYPE_CHECKING:
10+
from dparse.dependencies import Dependency, DependencyFile
11+
812

913
class RequirementsTxtParser(AbstractParser):
1014
"""Parser for requirements.txt dependencies."""

src/twyn/main.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ def check_dependencies(
5757
errors: list[TyposquatCheckResult] = []
5858
for dependency in track(normalized_dependencies, description="Processing..."):
5959
if dependency in normalized_allowlist_packages:
60-
logger.info(f"Dependency {dependency} is in the allowlist")
60+
logger.info("Dependency %s is in the allowlist", dependency)
6161
continue
6262

63-
logger.info(f"Analyzing {dependency}")
63+
logger.info("Analyzing %s", dependency)
6464
if dependency not in trusted_packages and (typosquat_results := trusted_packages.get_typosquat(dependency)):
6565
errors.append(typosquat_results)
6666

@@ -79,14 +79,13 @@ def check_dependencies(
7979

8080
def _set_logging_level(logging_level: AvailableLoggingLevels) -> None:
8181
logger.setLevel(logging_level.value)
82-
logger.debug(f"Logging level: {logging_level.value}")
82+
logger.debug("Logging level: %s", logging_level.value)
8383

8484

8585
def get_candidate_selector(selector_method_name: str) -> AbstractSelector:
86-
logger.debug(f"Selector method received {selector_method_name}")
87-
selector_method_name = selector_method_name
86+
logger.debug("Selector method received %s", selector_method_name)
8887
selector_method = SELECTOR_METHOD_MAPPING[selector_method_name]()
89-
logger.debug(f"Instantiated {selector_method} selector")
88+
logger.debug("Instantiated %s selector", selector_method)
9089
return selector_method
9190

9291

src/twyn/similarity/algorithm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def __init__(self, max: float) -> None:
2727
def from_name(cls, name: str) -> SimilarityThreshold:
2828
name_length = len(name)
2929
if name_length <= cls.LENGTH_CUTOFF:
30-
logger.debug(f"max length of {cls.MAX_FOR_SHORT_WORDS} selected for {name}")
30+
logger.debug("max length of %s selected for %s", cls.MAX_FOR_SHORT_WORDS, name)
3131
return cls(max=cls.MAX_FOR_SHORT_WORDS)
32-
logger.debug(f"max length of {cls.MAX_FOR_LONG_WORDS} selected for {name}")
32+
logger.debug("max length of {cls.MAX_FOR_LONG_WORDS} selected for %s", name)
3333
return cls(max=cls.MAX_FOR_LONG_WORDS) # we allow more typos if the name is longer
3434

3535
def is_inside_threshold(self, value: float) -> bool:

src/twyn/trusted_packages/references.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def _download(self) -> dict[str, Any]:
4040
except requests.exceptions.JSONDecodeError as err:
4141
raise InvalidJSONError from err
4242

43-
logger.debug(f"Successfully downloaded trusted packages list from {self.source}")
43+
logger.debug("Successfully downloaded trusted packages list from %s", self.source)
4444

4545
return packages_json
4646

0 commit comments

Comments
 (0)