Skip to content

Commit

Permalink
add setter for version on ProjectPackage
Browse files Browse the repository at this point in the history
This enables support for dynamically setting the package version
(e.g., from a plugin)

Resolves: python-poetry/poetry#5493
  • Loading branch information
bcavagnolo committed Aug 24, 2022
1 parent 4456c52 commit 853f2d5
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 7 deletions.
20 changes: 13 additions & 7 deletions src/poetry/core/packages/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ def __init__(
"""
Creates a new in memory package.
"""
from poetry.core.semver.version import Version
from poetry.core.version.markers import AnyMarker

super().__init__(
Expand All @@ -79,12 +78,7 @@ def __init__(
features=features,
)

if not isinstance(version, Version):
self._version = Version.parse(version)
self._pretty_version = pretty_version or version
else:
self._version = version
self._pretty_version = pretty_version or self._version.text
self._set_version(version, pretty_version)

self.description = ""

Expand Down Expand Up @@ -216,6 +210,18 @@ def all_requires(
for dependency in group.dependencies
]

def _set_version(
self, version: str | Version, pretty_version: str | None = None
) -> None:
from poetry.core.semver.version import Version

if not isinstance(version, Version):
self._version = Version.parse(version)
self._pretty_version = pretty_version or version
else:
self._version = version
self._pretty_version = pretty_version or self._version.text

def _get_author(self) -> dict[str, str | None]:
if not self._authors:
return {"name": None, "email": None}
Expand Down
12 changes: 12 additions & 0 deletions src/poetry/core/packages/project_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,15 @@ def python_versions(self, value: str) -> None:
create_nested_marker("python_version", self._python_constraint)
)

@property
def version(self) -> Version:
# override version to make it settable
return super().version

@version.setter
def version(self, value: str | Version) -> None:
self._set_version(value)

@property
def urls(self) -> dict[str, str]:
urls = super().urls
Expand All @@ -71,5 +80,8 @@ def urls(self) -> dict[str, str]:

return urls

def __hash__(self) -> int:
raise TypeError("ProjectPackage is not hashable")

def build_should_generate_setup(self) -> bool:
return self.build_config.get("generate-setup-file", True)
23 changes: 23 additions & 0 deletions tests/packages/test_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
from poetry.core.packages.directory_dependency import DirectoryDependency
from poetry.core.packages.file_dependency import FileDependency
from poetry.core.packages.package import Package
from poetry.core.packages.project_package import ProjectPackage
from poetry.core.packages.url_dependency import URLDependency
from poetry.core.packages.vcs_dependency import VCSDependency
from poetry.core.semver.version import Version


@pytest.fixture()
Expand Down Expand Up @@ -540,3 +542,24 @@ def test_python_versions_are_normalized() -> None:
== 'python_version > "3.6" and python_version <= "3.10"'
)
assert str(package.python_constraint) == ">=3.7,<3.11"


def test_cannot_update_package_version() -> None:
package = Package("foo", "1.2.3")
with pytest.raises(AttributeError):
package.version = "1.2.4" # type: ignore[misc,assignment]


def test_project_package_version_update_string() -> None:
package = ProjectPackage("foo", "1.2.3")
# TODO: I could use some help deciding what to do about mypy here. The
# setter accepts both str and Version, even though the property is always a
# Version.
package.version = "1.2.4" # type: ignore[assignment]
assert package.version.text == "1.2.4"


def test_project_package_version_update_version() -> None:
package = ProjectPackage("foo", "1.2.3")
package.version = Version.parse("1.2.4")
assert package.version.text == "1.2.4"

0 comments on commit 853f2d5

Please sign in to comment.