Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-poetry-dynamic-versioning for openSUSE:Factory checked in at 2024-07-01 11:21:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-poetry-dynamic-versioning (Old) and /work/SRC/openSUSE:Factory/.python-poetry-dynamic-versioning.new.18349 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-poetry-dynamic-versioning" Mon Jul 1 11:21:35 2024 rev:4 rq:1184134 version:1.4.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-poetry-dynamic-versioning/python-poetry-dynamic-versioning.changes 2024-05-08 11:42:32.394913605 +0200 +++ /work/SRC/openSUSE:Factory/.python-poetry-dynamic-versioning.new.18349/python-poetry-dynamic-versioning.changes 2024-07-01 11:22:22.567442398 +0200 @@ -1,0 +2,7 @@ +Sun Jun 30 20:01:26 UTC 2024 - Dirk Müller <dmuel...@suse.com> + +- update to 1.4.0: + * The plugin now supports Poetry's upcoming PEP-621 + functionality. + +------------------------------------------------------------------- Old: ---- poetry_dynamic_versioning-1.3.0.tar.gz New: ---- poetry_dynamic_versioning-1.4.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-poetry-dynamic-versioning.spec ++++++ --- /var/tmp/diff_new_pack.FzNjqZ/_old 2024-07-01 11:22:24.135499149 +0200 +++ /var/tmp/diff_new_pack.FzNjqZ/_new 2024-07-01 11:22:24.151499727 +0200 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-poetry-dynamic-versioning -Version: 1.3.0 +Version: 1.4.0 Release: 0 Summary: Plugin for Poetry to enable dynamic versioning based on VCS tags License: MIT ++++++ poetry_dynamic_versioning-1.3.0.tar.gz -> poetry_dynamic_versioning-1.4.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/CHANGELOG.md new/poetry_dynamic_versioning-1.4.0/CHANGELOG.md --- old/poetry_dynamic_versioning-1.3.0/CHANGELOG.md 2024-04-30 05:20:45.549694000 +0200 +++ new/poetry_dynamic_versioning-1.4.0/CHANGELOG.md 2024-06-17 23:51:59.444518600 +0200 @@ -1,3 +1,26 @@ +## v1.4.0 (2024-06-17) + +* Added: + * The plugin now supports Poetry's upcoming PEP-621 functionality. + More info here: https://github.com/python-poetry/poetry/issues/3332 + + If your pyproject.toml defines `tool.poetry.name`, + then the plugin will preserve its existing behavior. + + However, if your pyproject.toml: + + * does not define `tool.poetry.name` + * defines `project.name` + * defines `project.dynamic` to include `"version"` + * does not define `project.version` + + ...then the plugin will enable its PEP-621 functionality. + + Because PEP-621 support is not yet released and finalized in Poetry itself, + it is also subject to change in the plugin. + + ([Prototyped by edgarrmondragon](https://github.com/mtkennerly/poetry-dynamic-versioning/pull/181)) + ## v1.3.0 (2024-04-29) * Added: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/PKG-INFO new/poetry_dynamic_versioning-1.4.0/PKG-INFO --- old/poetry_dynamic_versioning-1.3.0/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 +++ new/poetry_dynamic_versioning-1.4.0/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: poetry-dynamic-versioning -Version: 1.3.0 +Version: 1.4.0 Summary: Plugin for Poetry to enable dynamic versioning based on VCS tags Home-page: https://github.com/mtkennerly/poetry-dynamic-versioning License: MIT diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/__init__.py new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/__init__.py --- old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/__init__.py 2024-04-30 05:16:33.488901600 +0200 +++ new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/__init__.py 2024-06-18 00:02:36.863616000 +0200 @@ -8,6 +8,7 @@ import subprocess import sys import textwrap +from enum import Enum from importlib import import_module from pathlib import Path from typing import Mapping, MutableMapping, Optional, Sequence, Tuple, Union @@ -118,17 +119,26 @@ pass +class _Mode(Enum): + Classic = "classic" + Pep621 = "pep621" + + class _ProjectState: def __init__( self, path: Path, - original_version: str, + original_version: Optional[str], version: str, + mode: _Mode, + dynamic_index: Optional[int], substitutions: Optional[MutableMapping[Path, str]] = None, ) -> None: self.path = path self.original_version = original_version self.version = version + self.mode = mode + self.dynamic_index = dynamic_index self.substitutions = ( {} if substitutions is None else substitutions ) # type: MutableMapping[Path, str] @@ -590,11 +600,21 @@ def _apply_version( - version: str, instance: Version, config: _Config, pyproject_path: Path, retain: bool = False + name: str, + version: str, + instance: Version, + config: _Config, + pyproject_path: Path, + mode: _Mode, + retain: bool = False, ) -> None: pyproject = tomlkit.parse(pyproject_path.read_bytes().decode("utf-8")) - pyproject["tool"]["poetry"]["version"] = version # type: ignore + if mode == _Mode.Classic: + pyproject["tool"]["poetry"]["version"] = version # type: ignore + elif mode == _Mode.Pep621: + pyproject["project"]["dynamic"].remove("version") # type: ignore + pyproject["project"]["version"] = version # type: ignore # Disable the plugin in case we're building a source distribution, # which won't have access to the VCS info at install time. @@ -604,8 +624,6 @@ pyproject_path.write_bytes(tomlkit.dumps(pyproject).encode("utf-8")) - name = pyproject["tool"]["poetry"]["name"] # type: ignore - for file_name, file_info in config["files"].items(): full_file = pyproject_path.parent.joinpath(file_name) @@ -635,19 +653,12 @@ def _get_and_apply_version( - name: Optional[str] = None, - original: Optional[str] = None, pyproject: Optional[Mapping] = None, pyproject_path: Optional[Path] = None, retain: bool = False, force: bool = False, - # fmt: off - io: bool = True - # fmt: on + io: bool = True, ) -> Optional[str]: - if name is not None and name in _state.projects: - return name - if pyproject_path is None: pyproject_path = _get_pyproject_path() if pyproject_path is None: @@ -656,11 +667,32 @@ if pyproject is None: pyproject = tomlkit.parse(pyproject_path.read_bytes().decode("utf-8")) - if name is None or original is None: + classic = ( + "tool" in pyproject + and "poetry" in pyproject["tool"] + and "name" in pyproject["tool"]["poetry"] + ) + pep621 = ( + "project" in pyproject + and "name" in pyproject["project"] + and "dynamic" in pyproject["project"] + and "version" in pyproject["project"]["dynamic"] + and "version" not in pyproject["project"] + ) + + if classic: name = pyproject["tool"]["poetry"]["name"] original = pyproject["tool"]["poetry"]["version"] - if name in _state.projects: - return name + dynamic_index = None + elif pep621: + name = pyproject["project"]["name"] + original = pyproject["project"].get("version") + dynamic_index = pyproject["project"]["dynamic"].index("version") + else: + return name if name in _state.projects else None + + if name in _state.projects: + return name config = _get_config(pyproject) if not config["enable"] and not force: @@ -674,11 +706,20 @@ finally: os.chdir(str(initial_dir)) - # Condition will always be true, but it makes Mypy happy. - if name is not None and original is not None: - _state.projects[name] = _ProjectState(pyproject_path, original, version) + if classic and name is not None and original is not None: + mode = _Mode.Classic + _state.projects[name] = _ProjectState( + pyproject_path, original, version, mode, dynamic_index + ) + if io: + _apply_version(name, version, instance, config, pyproject_path, mode, retain) + elif pep621 and name is not None: + mode = _Mode.Pep621 + _state.projects[name] = _ProjectState( + pyproject_path, original, version, mode, dynamic_index + ) if io: - _apply_version(version, instance, config, pyproject_path, retain) + _apply_version(name, version, instance, config, pyproject_path, mode, retain) return name @@ -704,7 +745,15 @@ # Reread pyproject.toml in case the substitutions affected it. pyproject = tomlkit.parse(state.path.read_bytes().decode("utf-8")) - pyproject["tool"]["poetry"]["version"] = state.original_version # type: ignore + if state.mode == _Mode.Classic: + if state.original_version is not None: + pyproject["tool"]["poetry"]["version"] = state.original_version # type: ignore + elif state.mode == _Mode.Pep621: + if state.dynamic_index is not None: + index = state.dynamic_index + pyproject["project"]["dynamic"].insert(index, "version") # type: ignore + if "version" in pyproject["project"]: # type: ignore + pyproject["project"].pop("version") # type: ignore if not retain and not _state.cli_mode: pyproject["tool"]["poetry-dynamic-versioning"]["enable"] = True # type: ignore diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/patch.py new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/patch.py --- old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/patch.py 2023-08-21 04:56:59.654177000 +0200 +++ new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/patch.py 2024-06-17 23:45:11.043510400 +0200 @@ -24,8 +24,6 @@ if not _state.cli_mode: name = _get_and_apply_version( - name=instance.local_config["name"], - original=instance.local_config["version"], pyproject=instance.pyproject.data, pyproject_path=_get_pyproject_path_from_poetry(instance.pyproject), ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/plugin.py new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/plugin.py --- old/poetry_dynamic_versioning-1.3.0/poetry_dynamic_versioning/plugin.py 2024-02-09 22:33:20.484435000 +0100 +++ new/poetry_dynamic_versioning-1.4.0/poetry_dynamic_versioning/plugin.py 2024-06-17 23:45:11.044512500 +0200 @@ -82,8 +82,6 @@ # fmt: on ) -> None: name = _get_and_apply_version( - name=poetry.local_config["name"], - original=poetry.local_config["version"], pyproject=poetry.pyproject.data, pyproject_path=_get_pyproject_path_from_poetry(poetry.pyproject), retain=retain, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/pyproject.toml new/poetry_dynamic_versioning-1.4.0/pyproject.toml --- old/poetry_dynamic_versioning-1.3.0/pyproject.toml 2024-04-30 05:20:50.199022300 +0200 +++ new/poetry_dynamic_versioning-1.4.0/pyproject.toml 2024-06-17 23:52:03.505818100 +0200 @@ -1,6 +1,6 @@ [tool.poetry] name = "poetry-dynamic-versioning" -version = "1.3.0" +version = "1.4.0" description = "Plugin for Poetry to enable dynamic versioning based on VCS tags" license = "MIT" authors = ["Matthew T. Kennerly <mtkenne...@gmail.com>"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/tests/project-pep621/project_pep621/__init__.py new/poetry_dynamic_versioning-1.4.0/tests/project-pep621/project_pep621/__init__.py --- old/poetry_dynamic_versioning-1.3.0/tests/project-pep621/project_pep621/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/poetry_dynamic_versioning-1.4.0/tests/project-pep621/project_pep621/__init__.py 2024-06-17 23:45:11.044512500 +0200 @@ -0,0 +1 @@ +__version__ = "0.0.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/tests/project-pep621/pyproject.toml new/poetry_dynamic_versioning-1.4.0/tests/project-pep621/pyproject.toml --- old/poetry_dynamic_versioning-1.3.0/tests/project-pep621/pyproject.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/poetry_dynamic_versioning-1.4.0/tests/project-pep621/pyproject.toml 2024-06-17 23:45:11.045522500 +0200 @@ -0,0 +1,15 @@ +[project] +name = "project-pep621" +dynamic = ["version"] + +[tool.poetry] +# The plugin itself doesn't need this, but Poetry does: +# https://github.com/python-poetry/poetry-core/blob/c80dcc53793316104862d2c3ac888dde3c263b08/tests/test_factory.py#L39-L42 +version = "0.0.0" + +[tool.poetry-dynamic-versioning] +enable = true + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/poetry_dynamic_versioning-1.3.0/tests/test_integration.py new/poetry_dynamic_versioning-1.4.0/tests/test_integration.py --- old/poetry_dynamic_versioning-1.3.0/tests/test_integration.py 2023-12-02 08:59:50.665171100 +0100 +++ new/poetry_dynamic_versioning-1.4.0/tests/test_integration.py 2024-06-17 23:45:11.045522500 +0200 @@ -7,6 +7,7 @@ from pathlib import Path from typing import Optional, Sequence, Tuple +import dunamai import pytest import tomlkit @@ -16,6 +17,10 @@ DUMMY_DIST = DUMMY / "dist" DUMMY_PYPROJECT = DUMMY / "pyproject.toml" +DUMMY_PEP621 = ROOT / "tests" / "project-pep621" +DUMMY_PEP621_DIST = DUMMY_PEP621 / "dist" +DUMMY_PEP621_PYPROJECT = DUMMY_PEP621 / "pyproject.toml" + DUMMY_VERSION = "0.0.999" DEPENDENCY_DYNAMIC_VERSION = "0.0.888" @@ -74,11 +79,12 @@ @pytest.fixture(autouse=True) def before_each(): - run(f"git checkout -- {DUMMY.as_posix()}") - delete(DUMMY / "dist") - delete(DUMMY / "poetry.lock") - for file in DUMMY.glob("*.whl"): - delete(file) + for project in [DUMMY, DUMMY_PEP621]: + run(f"git checkout -- {project.as_posix()}") + delete(project / "dist") + delete(project / "poetry.lock") + for file in project.glob("*.whl"): + delete(file) def test_plugin_enabled(): @@ -123,7 +129,10 @@ def test_keep_pyproject_modifications(): package = "cachy" # Using --optional to avoid actually installing the package - run(f"poetry add --optional {package}", where=DUMMY) + if "USE_PEP621" in os.environ: + run(f"poetry add --optional main {package}", where=DUMMY) + else: + run(f"poetry add --optional {package}", where=DUMMY) # Make sure pyproject.toml contains the new package dependency data = DUMMY_PYPROJECT.read_bytes().decode("utf-8") assert package in data @@ -267,3 +276,46 @@ # Just skip it for now. if "CI" not in os.environ: assert "poetry-dynamic-versioning" in out + + +@pytest.mark.skipif("USE_PEP621" not in os.environ, reason="Requires Poetry with PEP-621 support") +def test_pep621_with_dynamic_version(): + version = dunamai.Version.from_git().serialize() + + run("poetry-dynamic-versioning", where=DUMMY_PEP621) + pyproject = tomlkit.parse(DUMMY_PEP621_PYPROJECT.read_bytes().decode("utf-8")) + assert pyproject["project"]["version"] == version + assert "version" not in pyproject["project"]["dynamic"] + assert f'__version__ = "{version}"' in ( + DUMMY_PEP621 / "project_pep621" / "__init__.py" + ).read_bytes().decode("utf-8") + + +@pytest.mark.skipif("USE_PEP621" not in os.environ, reason="Requires Poetry with PEP-621 support") +def test_pep621_with_dynamic_version_and_cleanup(): + version = dunamai.Version.from_git().serialize() + + run("poetry build", where=DUMMY_PEP621) + pyproject = tomlkit.parse(DUMMY_PEP621_PYPROJECT.read_bytes().decode("utf-8")) + assert "version" not in pyproject["project"] + assert "version" in pyproject["project"]["dynamic"] + assert '__version__ = "0.0.0"' in ( + DUMMY_PEP621 / "project_pep621" / "__init__.py" + ).read_bytes().decode("utf-8") + + artifact = next(DUMMY_PEP621_DIST.glob("*.whl")) + assert f"-{version}-" in artifact.name + + +@pytest.mark.skipif("USE_PEP621" not in os.environ, reason="Requires Poetry with PEP-621 support") +def test_pep621_without_dynamic_version(): + pyproject = tomlkit.parse(DUMMY_PEP621_PYPROJECT.read_bytes().decode("utf-8")) + pyproject["project"]["dynamic"] = [] + DUMMY_PEP621_PYPROJECT.write_bytes(tomlkit.dumps(pyproject).encode("utf-8")) + + run("poetry-dynamic-versioning", codes=[1], where=DUMMY_PEP621) + pyproject = tomlkit.parse(DUMMY_PEP621_PYPROJECT.read_bytes().decode("utf-8")) + assert "version" not in pyproject["project"] + assert '__version__ = "0.0.0"' in ( + DUMMY_PEP621 / "project_pep621" / "__init__.py" + ).read_bytes().decode("utf-8")