python-semantic-release icon indicating copy to clipboard operation
python-semantic-release copied to clipboard

Version variable is not changed when using PEP440 specification

Open lukasbehammer opened this issue 1 year ago • 8 comments

Bug Report

Description

If the version variable includes a pre-release segment , post-release segment or development segment (PEP440 / PyPA Version Specifiers), the version is not getting updated.

Expected behavior

Version variable gets updated to new version if a release is made.

Actual behavior

Version variable stays the same and does not get updated if a release is made.

Environment

  • Operating System (w/ version): Windows 11 (local), Ubuntu (GitHub Actions Runner)
  • Python version: 3.11.9
  • Pip version: 24.0
  • Semantic-release version: 9.8.6
  • Build tool (w/ version): meson-python 0.16.0
pip freeze
alabaster==0.7.16
annotated-types==0.7.0
anyio==4.3.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==2.4.1
async-lru==2.0.4
attrs==23.2.0
Babel==2.15.0
backports.tarfile==1.2.0
beautifulsoup4==4.12.3
bleach==6.1.0
build==1.2.1
cachetools==5.3.3
certifi==2024.2.2
cffi==1.16.0
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.3.2
click==8.1.7
click-option-group==0.5.6
colorama==0.4.6
comm==0.2.2
contourpy==1.2.1
coverage==7.5.1
cycler==0.12.1
debugpy==1.8.1
decorator==5.1.1
defusedxml==0.7.1
distlib==0.3.8
docutils==0.21.2
dotty-dict==1.3.1
executing==2.0.1
fastjsonschema==2.19.1
filelock==3.14.0
fonttools==4.51.0
fqdn==1.5.1
fsspec==2024.5.0
furo==2024.5.6
gitdb==4.0.11
GitPython==3.1.43
h11==0.14.0
httpcore==1.0.5
httpx==0.27.0
identify==2.5.36
idna==3.7
imageio==2.34.1
imagesize==1.4.1
importlib_metadata==8.0.0
importlib_resources==6.4.0
iniconfig==2.0.0
intel-openmp==2021.4.0
ipykernel==6.29.4
ipython==8.24.0
ipywidgets==8.1.2
isoduration==20.11.0
jaraco.classes==3.4.0
jaraco.context==5.3.0
jaraco.functools==4.0.1
jedi==0.19.1
Jinja2==3.1.4
json5==0.9.25
jsonpointer==2.4
jsonschema==4.22.0
jsonschema-specifications==2023.12.1
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.10.0
jupyter-lsp==2.2.5
jupyter_client==8.6.1
jupyter_core==5.7.2
jupyter_server==2.14.0
jupyter_server_terminals==0.5.3
jupyterlab==4.2.0
jupyterlab_pygments==0.3.0
jupyterlab_server==2.27.1
jupyterlab_widgets==3.0.10
keyring==25.2.1
kiwisolver==1.4.5
lazy_loader==0.4
lxml==5.3.0
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.9.0
matplotlib-inline==0.1.7
mdurl==0.1.2
meson==1.4.0
meson-python==0.16.0
mistune==3.0.2
mkl==2021.4.0
more-itertools==10.3.0
mpmath==1.3.0
mypy==1.10.0
mypy-extensions==1.0.0
nbclient==0.10.0
nbconvert==7.16.4
nbformat==5.10.4
nest-asyncio==1.6.0
networkx==3.3
nh3==0.2.17
nibabel==5.2.1
nodeenv==1.8.0
notebook==7.2.0
notebook_shim==0.2.4
numpy==1.26.4
overrides==7.7.0
packaging==24.0
pandocfilters==1.5.1
parso==0.8.4
pillow==10.3.0
piq==0.8.0
pkginfo==1.10.0
platformdirs==4.2.2
pluggy==1.5.0
pre-commit==3.8.0
prometheus_client==0.20.0
prompt-toolkit==3.0.43
psutil==5.9.8
pure-eval==0.2.2
pycparser==2.22
pydantic==2.8.2
pydantic_core==2.20.1
Pygments==2.18.0
pyparsing==3.1.2
pyproject-api==1.6.1
pyproject-metadata==0.8.0
pyproject_hooks==1.1.0
pytest==8.2.1
pytest-cov==5.0.0
pytest-doctestplus==1.2.1
python-dateutil==2.9.0.post0
python-gitlab==4.9.0
python-json-logger==2.0.7
python-semantic-release==9.8.6
pywin32==306
pywin32-ctypes==0.2.2
pywinpty==2.0.13
PyYAML==6.0.1
pyzmq==26.0.3
qtconsole==5.5.2
QtPy==2.4.1
readme_renderer==43.0
referencing==0.35.1
requests==2.32.1
requests-toolbelt==1.0.0
rfc3339-validator==0.1.4
rfc3986==2.0.0
rfc3986-validator==0.1.1
rich==13.7.1
rpds-py==0.18.1
ruff==0.4.4
scikit-image==0.23.2
scipy==1.13.0
Send2Trash==1.8.3
shellingham==1.5.4
six==1.16.0
smmap==5.0.1
sniffio==1.3.1
snowballstemmer==2.2.0
soupsieve==2.5
Sphinx==7.3.7
sphinx-autobuild==2024.4.16
sphinx-basic-ng==1.0.0b2
sphinx-copybutton==0.5.2
sphinx-github-changelog==1.4.0
sphinx-hoverxref==1.4.0
sphinx-last-updated-by-git==0.3.8
sphinx-notfound-page==1.0.4
sphinxcontrib-applehelp==1.0.8
sphinxcontrib-devhelp==1.0.6
sphinxcontrib-email==0.3.6
sphinxcontrib-htmlhelp==2.0.5
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.7
sphinxcontrib-serializinghtml==1.1.10
sphinxprettysearchresults==0.3.5
stack-data==0.6.3
starlette==0.38.2
sympy==1.12
tbb==2021.12.0
terminado==0.18.1
tifffile==2024.5.10
tinycss2==1.3.0
tomlkit==0.13.0
torch==2.4.0
torchvision==0.19.0
tornado==6.4
tox==4.15.0
tqdm==4.66.5
traitlets==5.14.3
twine==5.1.1
types-python-dateutil==2.9.0.20240316
typing_extensions==4.11.0
uri-template==1.3.0
urllib3==2.2.1
uvicorn==0.30.6
virtualenv==20.26.2
watchfiles==0.23.0
wcwidth==0.2.13
webcolors==1.13
webencodings==0.5.1
websocket-client==1.8.0
websockets==13.0
widgetsnbextension==4.0.10
zipp==3.19.2

git log --oneline --decorate --graph --all -n 50

Configuration

Semantic Release Configuration
# Semantic Release
[tool.semantic_release]
commit_parser = "angular"
logging_use_named_masks = true
allow_zero_version = true
tag_format = "v{version}"
version_variables = ["./src/foo/__init__.py:__version__"]
commit_message = "chore(release): {version}\n\nAutomatically generated by python-semantic-release"

[tool.semantic_release.changelog]
template_dir = "./templates"
changelog_file = "CHANGELOG.md"
exclude_commit_patterns = [".*\\n\\nAutomatically generated by python-semantic-release", "chore: pre-commit autoupdate\n\nAutomatically generated by pre-commit.ci"]

[tool.semantic_release.commit_parser_options]
allowed_types = [
    "build", "chore", "ci", "docs", "feat", "fix",
    "perf", "style", "refactor", "test", "book",
]
minor_types = ["feat"]
patch_types = ["fix", "perf"]

Build System Configuration

GitHub Actions Job Definition
  semantic_release:
    name: Semantic Release
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    permissions:
      id-token: write
      contents: write
    outputs:
      tag: ${{ steps.release.outputs.tag }}
      released: ${{ steps.release.outputs.released }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: main
          submodules: recursive

      - name: Python Semantic Release
        id: release
        uses: python-semantic-release/python-semantic-release@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

Execution Log

semantic-release -vv command
The next version is: 1.11.1! 🚀
           DEBUG    [semantic_release.cli.commands.version] DEBUG version.apply_version_to_source_files: writing version 1.11.1 to      version.py:142
                    source paths ['src\\foo\\__init__.py']                                                                                           
           DEBUG    [semantic_release.version.declaration] DEBUG declaration.content: No content stored, reading from source file    declaration.py:37
                    C:\vIQA_Package\src\foo\__init__.py                                                                                              
           DEBUG    [semantic_release.version.declaration] DEBUG declaration.replace: path='src\\foo\\__init__.py'                 declaration.py:197
                    pattern='(?x)__version__\\s*(:=|[:=])\\s*(?P<quote>[\'\\"])(?P<version>\n    (?P<major>0|[1-9]\\d*)\n    \\.\n                    
                    (?P<minor>0|[1-9]\\d*)\n    \\.\n    (?P<patch>0|[1-9]\\d*)\n                                                                     
                    (?:-(?P<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*                   
                    ))?\n    (?:\\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?\n    )(?P=quote)' num_matches=0                            
Skipping build due to --skip-build flag
           INFO     [semantic_release.cli.github_actions_output] INFO github_actions_output.write_if_possible: not writing github_actions_output.py:71
                    GitHub Actions output, as no file specified

Additional context

For my Python package I use two branches: A main branch with the code for releases and a dev branch for current feature development. If I start a new feature on the dev branch I manually set __version__ in __init__.py to x.x.xdevx according to PEP440. Automatic dev and post releases with python-semantic-release were even better, but that's a different topic (Maybe I'll write a seperate issue later, about how this could be incorporated without loosing the generalization as discussed in #455. After pushing to the dev branch a github action gets triggered, but no release is made (this is right at the moment, no release should be made on the dev branch). After testing of the feature, the main branch gets rebased on the dev branch (or dev gets pulled into main) and after pushing the GitHub Action is triggered again, this time on the main branch. A release is made, so my other jobs (uploading to PyPI, GitHub releases etc.) are also triggered. The problem is if the push still contains the dev version in __init__.py, which is likely, the file doesn't get updated. Because there's also no error the action proceeds with the build (the files have the wrong version in the filename and __init__.py) and get uploaded to PyPI with this false version (I have no version checking in between, because all other jobs pass and I rely on python-semantic-release to determine the right version). I tested this behavior on the GitHub Actions runner in my repository https://github.com/3dct/vIQA as well as locally. For a quick minimal example:

Build a sample package with some commits, set the __version__ in __init__.py to e.g. 1.1.1dev1 and run semantic-release -vv version --patch --no-commit --no-tag --no-push --no-vcs-release --skip-build --no-changelog, so only the init.py should be changed.

Possible solution

Based on the DEBUG text I suppose such PEP440 segments aren't covered by the regex pattern. Adding them shouldn't be a big problem. I can maybe have a look into it. Also there should be an Exception/Error or at least a loud warning, that the version variable didn't get changed. Currently this is only viewable in the --vv Debug mode.

lukasbehammer avatar Sep 03 '24 16:09 lukasbehammer

Hi @lukasbehammer, thank you for your writeup and detail.

Currently, PEP440 specifications are not supported for version determination from tags on the repository (#455), that is why the tags are ignored.

This issue I believe is a feature request for handling the replacement of PEP440 version values via the version_variables specification. This would likely be handled with added support for PEP440.

I don't consider this a bug, as PSR purposefully does not replace the version because the regex used is looking for a SemVer compliant version value and when it sees the PEP440 version (the semver standard and PEP440 standards disagree on pre, post release identifier syntax), PSR assumes this is not the version variable I'm expected to replace so do nothing.

codejedi365 avatar Sep 06 '24 17:09 codejedi365

It has been 60 days since the last update on this confirmed issue. @python-semantic-release/team can you provide an update on the status of this issue?

github-actions[bot] avatar Nov 06 '24 07:11 github-actions[bot]

Still need to work on the current PR, trying to complete my current set of updates before going all in on this.

codejedi365 avatar Nov 10 '24 17:11 codejedi365

It has been 60 days since the last update on this confirmed issue. @python-semantic-release/team can you provide an update on the status of this issue?

github-actions[bot] avatar Jan 11 '25 07:01 github-actions[bot]

In development

codejedi365 avatar Jan 11 '25 18:01 codejedi365

It has been 60 days since the last update on this confirmed issue. @python-semantic-release/team can you provide an update on the status of this issue?

github-actions[bot] avatar Mar 13 '25 07:03 github-actions[bot]

Still in development, although progress has stalled a bit

codejedi365 avatar Apr 20 '25 07:04 codejedi365

It has been 60 days since the last update on this confirmed issue. @python-semantic-release/team can you provide an update on the status of this issue?

github-actions[bot] avatar Jun 19 '25 07:06 github-actions[bot]