Skip to content

Commit

Permalink
refactor: subclass violation for each error type
Browse files Browse the repository at this point in the history
  • Loading branch information
mkniewallner committed May 6, 2023
1 parent 3e02e69 commit bbf2373
Show file tree
Hide file tree
Showing 22 changed files with 144 additions and 60 deletions.
2 changes: 1 addition & 1 deletion deptry/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
from deptry.dependency import Dependency
from deptry.dependency_getter.base import DependenciesExtract
from deptry.module import Module
from deptry.violation import Violation
from deptry.violations import Violation


@dataclass
Expand Down
2 changes: 1 addition & 1 deletion deptry/issues_finder/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
if TYPE_CHECKING:
from deptry.dependency import Dependency
from deptry.module import Module
from deptry.violation import Violation
from deptry.violations import Violation


@dataclass
Expand Down
7 changes: 4 additions & 3 deletions deptry/issues_finder/misplaced_dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
from typing import TYPE_CHECKING

from deptry.issues_finder.base import IssuesFinder
from deptry.violation import Violation
from deptry.violations import MisplacedDevDependencyViolation

if TYPE_CHECKING:
from deptry.module import Module
from deptry.violations import Violation


@dataclass
Expand All @@ -27,14 +28,14 @@ def find(self) -> list[Violation]:
In that case, it's added under module.dev_top_levels. _get_package_name is added for these edge-cases.
"""
logging.debug("\nScanning for incorrect development dependencies...")
misplaced_dev_dependencies = []
misplaced_dev_dependencies: list[Violation] = []

for module in self.imported_modules:
logging.debug(f"Scanning module {module.name}...")
corresponding_package_name = self._get_package_name(module)

if corresponding_package_name and self._is_development_dependency(module, corresponding_package_name):
misplaced_dev_dependencies.append(Violation(self.__class__, module))
misplaced_dev_dependencies.append(MisplacedDevDependencyViolation(module))

return misplaced_dev_dependencies

Expand Down
7 changes: 4 additions & 3 deletions deptry/issues_finder/missing.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
from typing import TYPE_CHECKING

from deptry.issues_finder.base import IssuesFinder
from deptry.violation import Violation
from deptry.violations import MissingDependencyViolation

if TYPE_CHECKING:
from deptry.module import Module
from deptry.violations import Violation


@dataclass
Expand All @@ -19,13 +20,13 @@ class MissingDependenciesFinder(IssuesFinder):

def find(self) -> list[Violation]:
logging.debug("\nScanning for missing dependencies...")
missing_dependencies = []
missing_dependencies: list[Violation] = []

for module in self.imported_modules:
logging.debug(f"Scanning module {module.name}...")

if self._is_missing(module):
missing_dependencies.append(Violation(self.__class__, module))
missing_dependencies.append(MissingDependencyViolation(module))

return missing_dependencies

Expand Down
7 changes: 4 additions & 3 deletions deptry/issues_finder/obsolete.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
from typing import TYPE_CHECKING

from deptry.issues_finder.base import IssuesFinder
from deptry.violation import Violation
from deptry.violations import ObsoleteDependencyViolation

if TYPE_CHECKING:
from deptry.dependency import Dependency
from deptry.violations import Violation


@dataclass
Expand All @@ -25,13 +26,13 @@ class ObsoleteDependenciesFinder(IssuesFinder):

def find(self) -> list[Violation]:
logging.debug("\nScanning for obsolete dependencies...")
obsolete_dependencies = []
obsolete_dependencies: list[Violation] = []

for dependency in self.dependencies:
logging.debug(f"Scanning module {dependency.name}...")

if self._is_obsolete(dependency):
obsolete_dependencies.append(Violation(self.__class__, dependency))
obsolete_dependencies.append(ObsoleteDependencyViolation(dependency))

return obsolete_dependencies

Expand Down
7 changes: 4 additions & 3 deletions deptry/issues_finder/transitive.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
from typing import TYPE_CHECKING

from deptry.issues_finder.base import IssuesFinder
from deptry.violation import Violation
from deptry.violations import TransitiveDependencyViolation

if TYPE_CHECKING:
from deptry.module import Module
from deptry.violations import Violation


@dataclass
Expand All @@ -26,14 +27,14 @@ class TransitiveDependenciesFinder(IssuesFinder):

def find(self) -> list[Violation]:
logging.debug("\nScanning for transitive dependencies...")
transitive_dependencies = []
transitive_dependencies: list[Violation] = []

for module in self.imported_modules:
logging.debug(f"Scanning module {module.name}...")

if self._is_transitive(module):
# `self._is_transitive` only returns `True` if the package is not None.
transitive_dependencies.append(Violation(self.__class__, module))
transitive_dependencies.append(TransitiveDependencyViolation(module))

return transitive_dependencies

Expand Down
2 changes: 1 addition & 1 deletion deptry/reporters/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from deptry.violation import Violation
from deptry.violations import Violation


@dataclass
Expand Down
5 changes: 2 additions & 3 deletions deptry/reporters/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import json
from dataclasses import dataclass

from deptry.issues_finder.transitive import TransitiveDependenciesFinder
from deptry.module import Module
from deptry.reporters.base import Reporter
from deptry.violations import TransitiveDependencyViolation


@dataclass
Expand All @@ -19,7 +18,7 @@ def report(self) -> None:
output[issue_type] = [
(
violation.issue.package
if isinstance(violation.issue, Module) and violation.issue_type is TransitiveDependenciesFinder
if isinstance(violation, TransitiveDependencyViolation)
else violation.issue.name
)
for violation in violations
Expand Down
2 changes: 1 addition & 1 deletion deptry/reporters/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from deptry.reporters.base import Reporter

if TYPE_CHECKING:
from deptry.violation import Violation
from deptry.violations import Violation


@dataclass
Expand Down
15 changes: 15 additions & 0 deletions deptry/violations/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from __future__ import annotations

from deptry.violations.base import Violation
from deptry.violations.misplaced_dev import MisplacedDevDependencyViolation
from deptry.violations.missing import MissingDependencyViolation
from deptry.violations.obsolete import ObsoleteDependencyViolation
from deptry.violations.transitive import TransitiveDependencyViolation

__all__ = (
"MisplacedDevDependencyViolation",
"MissingDependencyViolation",
"ObsoleteDependencyViolation",
"TransitiveDependencyViolation",
"Violation",
)
5 changes: 2 additions & 3 deletions deptry/violation.py → deptry/violations/base.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from __future__ import annotations

from abc import ABC
from dataclasses import dataclass
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from deptry.dependency import Dependency
from deptry.issues_finder.base import IssuesFinder
from deptry.module import Module


@dataclass
class Violation:
issue_type: type[IssuesFinder]
class Violation(ABC):
issue: Dependency | Module
14 changes: 14 additions & 0 deletions deptry/violations/misplaced_dev.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from deptry.violations import Violation

if TYPE_CHECKING:
from deptry.module import Module


@dataclass
class MisplacedDevDependencyViolation(Violation):
issue: Module
14 changes: 14 additions & 0 deletions deptry/violations/missing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from deptry.violations import Violation

if TYPE_CHECKING:
from deptry.module import Module


@dataclass
class MissingDependencyViolation(Violation):
issue: Module
14 changes: 14 additions & 0 deletions deptry/violations/obsolete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from deptry.violations import Violation

if TYPE_CHECKING:
from deptry.dependency import Dependency


@dataclass
class ObsoleteDependencyViolation(Violation):
issue: Dependency
14 changes: 14 additions & 0 deletions deptry/violations/transitive.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from deptry.violations import Violation

if TYPE_CHECKING:
from deptry.module import Module


@dataclass
class TransitiveDependencyViolation(Violation):
issue: Module
4 changes: 2 additions & 2 deletions tests/unit/issues_finder/test_misplaced_dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from deptry.dependency import Dependency
from deptry.issues_finder.misplaced_dev import MisplacedDevDependenciesFinder
from deptry.module import Module
from deptry.violation import Violation
from deptry.violations import MisplacedDevDependencyViolation


def test_simple() -> None:
Expand All @@ -15,4 +15,4 @@ def test_simple() -> None:

deps = MisplacedDevDependenciesFinder(imported_modules=modules, dependencies=dependencies).find()

assert deps == [Violation(MisplacedDevDependenciesFinder, module_foo)]
assert deps == [MisplacedDevDependencyViolation(module_foo)]
4 changes: 2 additions & 2 deletions tests/unit/issues_finder/test_missing.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from deptry.dependency import Dependency
from deptry.issues_finder.missing import MissingDependenciesFinder
from deptry.module import ModuleBuilder
from deptry.violation import Violation
from deptry.violations import MissingDependencyViolation


def test_simple() -> None:
Expand All @@ -15,7 +15,7 @@ def test_simple() -> None:

deps = MissingDependenciesFinder(imported_modules=modules, dependencies=dependencies).find()

assert deps == [Violation(MissingDependenciesFinder, module_foobar)]
assert deps == [MissingDependencyViolation(module_foobar)]


def test_local_module() -> None:
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/issues_finder/test_obsolete.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from deptry.dependency import Dependency
from deptry.issues_finder.obsolete import ObsoleteDependenciesFinder
from deptry.module import ModuleBuilder
from deptry.violation import Violation
from deptry.violations import ObsoleteDependencyViolation


def test_simple() -> None:
Expand All @@ -15,7 +15,7 @@ def test_simple() -> None:

deps = ObsoleteDependenciesFinder(imported_modules=modules, dependencies=dependencies).find()

assert deps == [Violation(ObsoleteDependenciesFinder, dependency_toml)]
assert deps == [ObsoleteDependencyViolation(dependency_toml)]


def test_simple_with_ignore() -> None:
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/issues_finder/test_transitive.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from deptry.issues_finder.transitive import TransitiveDependenciesFinder
from deptry.module import ModuleBuilder
from deptry.violation import Violation
from deptry.violations import TransitiveDependencyViolation

if TYPE_CHECKING:
from deptry.dependency import Dependency
Expand All @@ -20,7 +20,7 @@ def test_simple() -> None:

deps = TransitiveDependenciesFinder(imported_modules=modules, dependencies=dependencies).find()

assert deps == [Violation(TransitiveDependenciesFinder, module_platformdirs)]
assert deps == [TransitiveDependencyViolation(module_platformdirs)]


def test_simple_with_ignore() -> None:
Expand Down
19 changes: 10 additions & 9 deletions tests/unit/reporters/test_json_reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,25 @@
from pathlib import Path

from deptry.dependency import Dependency
from deptry.issues_finder.misplaced_dev import MisplacedDevDependenciesFinder
from deptry.issues_finder.missing import MissingDependenciesFinder
from deptry.issues_finder.obsolete import ObsoleteDependenciesFinder
from deptry.issues_finder.transitive import TransitiveDependenciesFinder
from deptry.module import Module
from deptry.reporters import JSONReporter
from deptry.violation import Violation
from deptry.violations import (
MisplacedDevDependencyViolation,
MissingDependencyViolation,
ObsoleteDependencyViolation,
TransitiveDependencyViolation,
)
from tests.utils import run_within_dir


def test_simple(tmp_path: Path) -> None:
with run_within_dir(tmp_path):
JSONReporter(
{
"missing": [Violation(MissingDependenciesFinder, Module("foo", package="foo_package"))],
"obsolete": [Violation(ObsoleteDependenciesFinder, Dependency("foo", Path("pyproject.toml")))],
"transitive": [Violation(TransitiveDependenciesFinder, Module("foo", package="foo_package"))],
"misplaced_dev": [Violation(MisplacedDevDependenciesFinder, Module("foo", package="foo_package"))],
"missing": [MissingDependencyViolation(Module("foo", package="foo_package"))],
"obsolete": [ObsoleteDependencyViolation(Dependency("foo", Path("pyproject.toml")))],
"transitive": [TransitiveDependencyViolation(Module("foo", package="foo_package"))],
"misplaced_dev": [MisplacedDevDependencyViolation(Module("foo", package="foo_package"))],
},
"output.json",
).report()
Expand Down
Loading

0 comments on commit bbf2373

Please sign in to comment.