Skip to content

Commit 5686910

Browse files
authored
refactor: rewrite requirements.txt parser and change the way we read files (#311)
1 parent 9438029 commit 5686910

16 files changed

Lines changed: 104 additions & 58 deletions

File tree

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ maintainers = [
1212
requires-python = "<4,>=3.9"
1313
dependencies = [
1414
"requests<3.0.0,>=2.32.4",
15-
"dparse<1.0.0,>=0.6.4",
1615
"click<9.0.0,>=8.1.8",
1716
"rich<15.0.0,>=14.0.0",
1817
"rapidfuzz<4.0.0,>=2.13.7",

src/twyn/base/utils.py

Whitespace-only changes.

src/twyn/config/config_handler.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pathlib import Path
55
from typing import Any, Optional, Union
66

7-
from tomlkit import TOMLDocument, dumps, parse, table
7+
from tomlkit import TOMLDocument, dumps, load, table
88

99
from twyn.base.constants import (
1010
DEFAULT_PROJECT_TOML_FILE,
@@ -22,7 +22,7 @@
2222
TOMLError,
2323
)
2424
from twyn.file_handler.exceptions import PathNotFoundError
25-
from twyn.file_handler.file_handler import BaseFileHandler
25+
from twyn.file_handler.file_handler import FileHandler
2626

2727
logger = logging.getLogger("twyn")
2828

@@ -54,7 +54,7 @@ class ReadTwynConfiguration:
5454
class ConfigHandler:
5555
"""Manage reading and writing configurations for Twyn."""
5656

57-
def __init__(self, file_handler: Optional[BaseFileHandler] = None) -> None:
57+
def __init__(self, file_handler: Optional[FileHandler] = None) -> None:
5858
self.file_handler = file_handler
5959

6060
def resolve_config(
@@ -160,7 +160,8 @@ def _read_toml(self) -> TOMLDocument:
160160
if not self.file_handler:
161161
raise ConfigFileNotConfiguredError("Config file not configured. Cannot perform read operation.")
162162
try:
163-
return parse(self.file_handler.read())
163+
with self.file_handler.open("rb") as fp:
164+
return load(fp)
164165
except PathNotFoundError:
165166
if self.file_handler.is_handler_of_file(DEFAULT_PROJECT_TOML_FILE):
166167
return TOMLDocument()

src/twyn/dependency_managers/dependency_manager.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
from dataclasses import dataclass
22
from pathlib import Path
33

4-
from dparse import filetypes
5-
64
from twyn.dependency_managers.exceptions import NoMatchingDependencyManagerError
7-
from twyn.dependency_parser.parsers.constants import PACKAGE_LOCK_JSON, UV_LOCK
5+
from twyn.dependency_parser.parsers.constants import PACKAGE_LOCK_JSON, POETRY_LOCK, REQUIREMENTS_TXT, UV_LOCK
86
from twyn.trusted_packages.references import AbstractPackageReference, TopNpmReference, TopPyPiReference
97

108

@@ -32,7 +30,7 @@ def matches_language_name(cls, name: str) -> bool:
3230
class PypiDependencyManager(BaseDependencyManager):
3331
name = "pypi"
3432
trusted_packages_source = TopPyPiReference
35-
dependency_files = {UV_LOCK, filetypes.poetry_lock, filetypes.requirements_txt}
33+
dependency_files = {UV_LOCK, POETRY_LOCK, REQUIREMENTS_TXT}
3634

3735

3836
@dataclass

src/twyn/dependency_parser/lock_parser.py

Whitespace-only changes.

src/twyn/dependency_parser/package_lock_json.py

Whitespace-only changes.

src/twyn/dependency_parser/parsers/abstract_parser.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ def __init__(self, file_path: str) -> None:
2222
def __str__(self) -> str:
2323
return self.__class__.__name__
2424

25-
def _read(self) -> str:
26-
return self.file_handler.read()
27-
2825
def file_exists(self) -> bool:
2926
return self.file_handler.exists()
3027

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
UV_LOCK = "uv.lock"
22
PACKAGE_LOCK_JSON = "package-lock.json"
3+
POETRY_LOCK = "poetry.lock"
4+
REQUIREMENTS_TXT = "requirements.txt"

src/twyn/dependency_parser/parsers/lock_parser.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import sys
22

3-
from dparse import filetypes
4-
53
from twyn.dependency_parser.parsers.abstract_parser import AbstractParser
6-
from twyn.dependency_parser.parsers.constants import UV_LOCK
4+
from twyn.dependency_parser.parsers.constants import POETRY_LOCK, UV_LOCK
75

86
if sys.version_info >= (3, 11):
97
import tomllib
@@ -16,14 +14,14 @@ class TomlLockParser(AbstractParser):
1614

1715
def parse(self) -> set[str]:
1816
"""Parse dependencies names and map them to a set."""
19-
data = tomllib.loads(self._read())
17+
data = tomllib.loads(self.file_handler.read())
2018
return {dependency["name"] for dependency in data["package"]}
2119

2220

2321
class PoetryLockParser(TomlLockParser):
2422
"""Parser for poetry.lock files."""
2523

26-
def __init__(self, file_path: str = filetypes.poetry_lock) -> None:
24+
def __init__(self, file_path: str = POETRY_LOCK) -> None:
2725
super().__init__(file_path)
2826

2927

src/twyn/dependency_parser/parsers/package_lock_json.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def parse(self) -> set[str]:
1414
1515
It supports v1, v2 and v3.
1616
"""
17-
data = json.loads(self._read())
17+
data = json.loads(self.file_handler.read())
1818
result: set[str] = set()
1919

2020
# Handle v1 & v2

0 commit comments

Comments
 (0)