diff --git a/pyproject.toml b/pyproject.toml index d606cd6ff..14261f29d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,6 +79,7 @@ exclude = "(?x)(^tests/.*/fixtures | ^src/poetry/core/_vendor)" [[tool.mypy.overrides]] module = [ 'jsonschema.*', + 'lark.*', 'setuptools.*', 'tomlkit.*', ] @@ -99,8 +100,6 @@ module = [ 'poetry.core.packages.utils.utils', 'poetry.core.packages.dependency', 'poetry.core.packages.package', - 'poetry.core.packages.project_package', - 'poetry.core.semver.version_range', 'poetry.core.semver.version_union', 'poetry.core.toml.exceptions', 'poetry.core.toml.file', diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index cefc2ff9e..49bfcab41 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -16,9 +16,9 @@ if TYPE_CHECKING: + from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency_group import DependencyGroup from poetry.core.packages.project_package import ProjectPackage - from poetry.core.packages.types import DependencyTypes from poetry.core.poetry import Poetry from poetry.core.spdx.license import License from poetry.core.version.markers import BaseMarker @@ -224,7 +224,7 @@ def create_dependency( constraint: DependencyConstraint, groups: list[str] | None = None, root_dir: Path | None = None, - ) -> DependencyTypes: + ) -> Dependency: from poetry.core.packages.constraints import ( parse_constraint as parse_generic_constraint, ) diff --git a/src/poetry/core/packages/dependency_group.py b/src/poetry/core/packages/dependency_group.py index 5839c109b..dfe36ca8e 100644 --- a/src/poetry/core/packages/dependency_group.py +++ b/src/poetry/core/packages/dependency_group.py @@ -4,27 +4,27 @@ if TYPE_CHECKING: - from poetry.core.packages.types import DependencyTypes + from poetry.core.packages.dependency import Dependency class DependencyGroup: def __init__(self, name: str, optional: bool = False) -> None: self._name: str = name self._optional: bool = optional - self._dependencies: list[DependencyTypes] = [] + self._dependencies: list[Dependency] = [] @property def name(self) -> str: return self._name @property - def dependencies(self) -> list[DependencyTypes]: + def dependencies(self) -> list[Dependency]: return self._dependencies def is_optional(self) -> bool: return self._optional - def add_dependency(self, dependency: DependencyTypes) -> None: + def add_dependency(self, dependency: Dependency) -> None: self._dependencies.append(dependency) def remove_dependency(self, name: str) -> None: diff --git a/src/poetry/core/packages/package.py b/src/poetry/core/packages/package.py index 12f35b2ee..635e0d7f5 100644 --- a/src/poetry/core/packages/package.py +++ b/src/poetry/core/packages/package.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING from typing import Collection from typing import Iterable +from typing import TypeVar from poetry.core.packages.specification import PackageSpecification from poetry.core.packages.utils.utils import create_nested_marker @@ -16,8 +17,8 @@ if TYPE_CHECKING: + from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency_group import DependencyGroup - from poetry.core.packages.types import DependencyTypes from poetry.core.semver.version import Version from poetry.core.semver.version_constraint import VersionConstraint from poetry.core.spdx.license import License @@ -25,6 +26,8 @@ AUTHOR_REGEX = re.compile(r"(?u)^(?P[- .,\w\d'’\"()&]+)(?: <(?P.+?)>)?$") +T = TypeVar("T", bound="Package") + class Package(PackageSpecification): @@ -96,17 +99,17 @@ def __init__( # For compatibility with previous version, we keep the category self.category = "main" - self.files = [] + self.files: list[dict[str, str]] = [] self.optional = False self.classifiers = [] self._python_versions = "*" self._python_constraint = parse_constraint("*") - self._python_marker = AnyMarker() + self._python_marker: BaseMarker = AnyMarker() self.platform = None - self.marker = AnyMarker() + self.marker: BaseMarker = AnyMarker() self.root_dir: Path | None = None @@ -183,7 +186,7 @@ def maintainer_email(self) -> str: return self._get_maintainer()["email"] @property - def requires(self) -> list[DependencyTypes]: + def requires(self) -> list[Dependency]: """ Returns the default dependencies """ @@ -195,7 +198,7 @@ def requires(self) -> list[DependencyTypes]: @property def all_requires( self, - ) -> list[DependencyTypes]: + ) -> list[Dependency]: """ Returns the default dependencies and group dependencies. """ @@ -389,8 +392,8 @@ def dependency_group(self, name: str) -> DependencyGroup: def add_dependency( self, - dependency: DependencyTypes, - ) -> DependencyTypes: + dependency: Dependency, + ) -> Dependency: from poetry.core.packages.dependency_group import DependencyGroup for group_name in dependency.groups: @@ -427,8 +430,8 @@ def without_optional_dependency_groups(self) -> Package: return package def with_dependency_groups( - self, groups: Collection[str], only: bool = False - ) -> Package: + self: T, groups: Collection[str], only: bool = False + ) -> T: """ Returns a clone of the package with the given dependency groups opted in. @@ -445,9 +448,7 @@ def with_dependency_groups( return package - def to_dependency( - self, - ) -> DependencyTypes: + def to_dependency(self) -> Dependency: from pathlib import Path from poetry.core.packages.dependency import Dependency diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index b36985e16..99a6e4e5e 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -8,8 +8,8 @@ if TYPE_CHECKING: - from poetry.core.packages.types import DependencyTypes - from poetry.core.semver.version_constraint import VersionConstraint + from poetry.core.packages.dependency import Dependency + from poetry.core.semver.version import Version from poetry.core.packages.package import Package from poetry.core.packages.utils.utils import create_nested_marker @@ -19,16 +19,16 @@ class ProjectPackage(Package): def __init__( self, name: str, - version: str | VersionConstraint, + version: str | Version, pretty_version: str | None = None, ) -> None: super().__init__(name, version, pretty_version) - self.build_config = {} - self.packages = [] - self.include = [] - self.exclude = [] - self.custom_urls = {} + self.build_config: dict[str, Any] = {} + self.packages: list[dict[str, Any]] = [] + self.include: list[dict[str, Any]] = [] + self.exclude: list[dict[str, Any]] = [] + self.custom_urls: dict[str, str] = {} if self._python_versions == "*": self._python_constraint = parse_constraint("~2.7 || >=3.4") @@ -40,7 +40,7 @@ def build_script(self) -> str | None: def is_root(self) -> bool: return True - def to_dependency(self) -> DependencyTypes: + def to_dependency(self) -> Dependency: dependency = super().to_dependency() dependency.is_root = True @@ -64,7 +64,7 @@ def python_versions(self, value: str) -> None: ) @property - def urls(self) -> dict[str, Any]: + def urls(self) -> dict[str, str]: urls = super().urls urls.update(self.custom_urls) diff --git a/src/poetry/core/packages/types.py b/src/poetry/core/packages/types.py deleted file mode 100644 index 542706038..000000000 --- a/src/poetry/core/packages/types.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING -from typing import Union - - -if TYPE_CHECKING: - from poetry.core.packages.dependency import Dependency - from poetry.core.packages.directory_dependency import DirectoryDependency - from poetry.core.packages.file_dependency import FileDependency - from poetry.core.packages.url_dependency import URLDependency - from poetry.core.packages.vcs_dependency import VCSDependency - - DependencyTypes = Union[ - Dependency, DirectoryDependency, FileDependency, URLDependency, VCSDependency - ] diff --git a/src/poetry/core/py.typed b/src/poetry/core/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/src/poetry/core/pyproject/toml.py b/src/poetry/core/pyproject/toml.py index a59e4c948..e0bc57713 100644 --- a/src/poetry/core/pyproject/toml.py +++ b/src/poetry/core/pyproject/toml.py @@ -8,7 +8,6 @@ from pathlib import Path from tomlkit.container import Container - from tomlkit.items import Item from tomlkit.toml_document import TOMLDocument from poetry.core.pyproject.tables import BuildSystem @@ -60,7 +59,7 @@ def build_system(self) -> BuildSystem: return self._build_system @property - def poetry_config(self) -> Item | Container: + def poetry_config(self) -> Container: from tomlkit.exceptions import NonExistentKey try: diff --git a/src/poetry/core/semver/version.py b/src/poetry/core/semver/version.py index 13fdf10a7..02ad436b1 100644 --- a/src/poetry/core/semver/version.py +++ b/src/poetry/core/semver/version.py @@ -77,7 +77,7 @@ def is_empty(self) -> bool: def is_simple(self) -> bool: return True - def allows(self, version: Version) -> bool: + def allows(self, version: Version | None) -> bool: if version is None: return False diff --git a/src/poetry/core/semver/version_range.py b/src/poetry/core/semver/version_range.py index 7e6e7d8bd..6b32d311b 100644 --- a/src/poetry/core/semver/version_range.py +++ b/src/poetry/core/semver/version_range.py @@ -39,15 +39,15 @@ def __init__( self._include_max = include_max @property - def min(self) -> Version: + def min(self) -> Version | None: return self._min @property - def max(self) -> Version: + def max(self) -> Version | None: return self._max @property - def full_max(self) -> Version: + def full_max(self) -> Version | None: return self._full_max @property @@ -177,6 +177,7 @@ def intersect(self, other: VersionConstraint) -> VersionConstraint: # Because we already verified that the lower range isn't strictly # lower, there must be some overlap. assert intersect_include_min and intersect_include_max + assert intersect_min is not None return intersect_min @@ -267,6 +268,7 @@ def difference(self, other: VersionConstraint) -> VersionConstraint: if not self.allows_any(other): return self + before: VersionConstraint | None if not self.allows_lower(other): before = None elif self.min == other.min: @@ -276,6 +278,7 @@ def difference(self, other: VersionConstraint) -> VersionConstraint: self.min, other.min, self.include_min, not other.include_min ) + after: VersionConstraint | None if not self.allows_higher(other): after = None elif self.max == other.max: @@ -289,6 +292,7 @@ def difference(self, other: VersionConstraint) -> VersionConstraint: return EmptyConstraint() if before is None: + assert after is not None return after if after is None: diff --git a/src/poetry/core/semver/version_range_constraint.py b/src/poetry/core/semver/version_range_constraint.py index 972e41e71..03a431c69 100644 --- a/src/poetry/core/semver/version_range_constraint.py +++ b/src/poetry/core/semver/version_range_constraint.py @@ -13,17 +13,17 @@ class VersionRangeConstraint(VersionConstraint): @property @abstractmethod - def min(self) -> Version: + def min(self) -> Version | None: raise NotImplementedError() @property @abstractmethod - def max(self) -> Version: + def max(self) -> Version | None: raise NotImplementedError() @property @abstractmethod - def full_max(self) -> Version: + def full_max(self) -> Version | None: raise NotImplementedError() @property