57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
import operator
|
|
from typing import TYPE_CHECKING
|
|
|
|
from deptry.violations import (
|
|
DEP001MissingDependenciesFinder,
|
|
DEP002UnusedDependenciesFinder,
|
|
DEP003TransitiveDependenciesFinder,
|
|
DEP004MisplacedDevDependenciesFinder,
|
|
DEP005StandardLibraryDependenciesFinder,
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
from collections.abc import Mapping
|
|
|
|
from deptry.dependency import Dependency
|
|
from deptry.module import ModuleLocations
|
|
from deptry.violations import Violation, ViolationsFinder
|
|
|
|
|
|
_VIOLATIONS_FINDERS: tuple[type[ViolationsFinder], ...] = (
|
|
DEP001MissingDependenciesFinder,
|
|
DEP002UnusedDependenciesFinder,
|
|
DEP003TransitiveDependenciesFinder,
|
|
DEP004MisplacedDevDependenciesFinder,
|
|
DEP005StandardLibraryDependenciesFinder,
|
|
)
|
|
|
|
|
|
def find_violations(
|
|
imported_modules_with_locations: list[ModuleLocations],
|
|
dependencies: list[Dependency],
|
|
ignore: tuple[str, ...],
|
|
per_rule_ignores: Mapping[str, tuple[str, ...]],
|
|
standard_library_modules: frozenset[str],
|
|
) -> list[Violation]:
|
|
violations = []
|
|
|
|
for violation_finder in _VIOLATIONS_FINDERS:
|
|
if violation_finder.violation.error_code not in ignore:
|
|
violations.extend(
|
|
violation_finder(
|
|
imported_modules_with_locations=imported_modules_with_locations,
|
|
dependencies=dependencies,
|
|
ignored_modules=per_rule_ignores.get(violation_finder.violation.error_code, ()),
|
|
standard_library_modules=standard_library_modules,
|
|
).find()
|
|
)
|
|
return _get_sorted_violations(violations)
|
|
|
|
|
|
def _get_sorted_violations(violations: list[Violation]) -> list[Violation]:
|
|
return sorted(
|
|
violations, key=operator.attrgetter("location.file", "location.line", "location.column", "error_code")
|
|
)
|