python-semantic-release 10.4.1__tar.gz → 10.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/PKG-INFO +11 -9
  2. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/api/commands.rst +12 -0
  3. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/automatic-releases/github-actions.rst +29 -63
  4. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration-guides/uv_integration.rst +0 -3
  5. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration.rst +60 -12
  6. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/pyproject.toml +20 -10
  7. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/python_semantic_release.egg-info/SOURCES.txt +4 -0
  8. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/changelog/context.py +1 -1
  9. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/version.py +72 -10
  10. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/config.py +4 -1
  11. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/masking_filter.py +1 -3
  12. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/errors.py +16 -0
  13. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/gitproject.py +163 -20
  14. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declarations/pattern.py +2 -2
  15. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/translator.py +23 -5
  16. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/version.py +9 -0
  17. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_1_channel.py +5 -0
  18. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_2_channels.py +5 -0
  19. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_3_channels.py +5 -0
  20. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_4_channels.py +5 -0
  21. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_1_channel.py +5 -0
  22. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_1_channel_branch_update_merge.py +5 -0
  23. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_2_channels.py +5 -0
  24. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/test_monorepo_1_channel.py +5 -0
  25. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/test_monorepo_2_channels.py +5 -0
  26. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk.py +5 -0
  27. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support.py +5 -0
  28. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support_w_prereleases.py +5 -0
  29. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_w_prereleases.py +5 -0
  30. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev_monorepo/test_monorepo_trunk.py +5 -0
  31. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version.py +11 -0
  32. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_build.py +10 -0
  33. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_bump.py +93 -0
  34. python_semantic_release-10.5.0/tests/e2e/cmd_version/test_version_partial_tag.py +346 -0
  35. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_print.py +15 -0
  36. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_release_notes.py +4 -0
  37. python_semantic_release-10.5.0/tests/e2e/cmd_version/test_version_shallow.py +306 -0
  38. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_stamp.py +1 -0
  39. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_strict.py +2 -0
  40. python_semantic_release-10.5.0/tests/e2e/cmd_version/test_version_upstream_check.py +283 -0
  41. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/conftest.py +21 -0
  42. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/git_repo.py +61 -1
  43. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/git_monorepo.py +14 -1
  44. python_semantic_release-10.5.0/tests/unit/semantic_release/test_gitproject.py +288 -0
  45. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/declarations/test_pattern_declaration.py +53 -0
  46. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/test_algorithm.py +43 -50
  47. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/LICENSE +0 -0
  48. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/MANIFEST.in +0 -0
  49. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/README.rst +0 -0
  50. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/Makefile +0 -0
  51. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/changelog_templates.rst +0 -0
  52. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/commit_parsing.rst +0 -0
  53. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/getting_started.rst +0 -0
  54. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/index.rst +0 -0
  55. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/installation.rst +0 -0
  56. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/multibranch_releases.rst +0 -0
  57. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/concepts/strict_mode.rst +0 -0
  58. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/conf.py +0 -0
  59. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/automatic-releases/cronjobs.rst +0 -0
  60. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/automatic-releases/index.rst +0 -0
  61. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/automatic-releases/travis.rst +0 -0
  62. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration-guides/index.rst +0 -0
  63. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration-guides/monorepos-ex-easy-before-release.png +0 -0
  64. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration-guides/monorepos-ex-easy-post-release.png +0 -0
  65. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/configuration-guides/monorepos.rst +0 -0
  66. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/configuration/index.rst +0 -0
  67. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/contributing/contributing_guide.rst +0 -0
  68. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/contributing/index.rst +0 -0
  69. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/index.rst +0 -0
  70. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/make.bat +0 -0
  71. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/misc/psr_changelog.rst +0 -0
  72. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/misc/troubleshooting.rst +0 -0
  73. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/upgrading/08-upgrade.rst +0 -0
  74. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/upgrading/09-upgrade.rst +0 -0
  75. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/upgrading/10-upgrade.rst +0 -0
  76. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/docs/upgrading/index.rst +0 -0
  77. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/setup.cfg +0 -0
  78. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/__init__.py +0 -0
  79. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/__main__.py +0 -0
  80. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/changelog/__init__.py +0 -0
  81. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/changelog/release_history.py +0 -0
  82. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/changelog/template.py +0 -0
  83. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/__init__.py +0 -0
  84. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/changelog_writer.py +0 -0
  85. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/cli_context.py +0 -0
  86. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/__init__.py +0 -0
  87. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/changelog.py +0 -0
  88. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/generate_config.py +0 -0
  89. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/main.py +0 -0
  90. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/commands/publish.py +0 -0
  91. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/const.py +0 -0
  92. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/github_actions_output.py +0 -0
  93. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/cli/util.py +0 -0
  94. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/__init__.py +0 -0
  95. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/_base.py +0 -0
  96. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/angular.py +0 -0
  97. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/conventional/__init__.py +0 -0
  98. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/conventional/options.py +0 -0
  99. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/conventional/options_monorepo.py +0 -0
  100. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/conventional/parser.py +0 -0
  101. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/conventional/parser_monorepo.py +0 -0
  102. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/emoji.py +0 -0
  103. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/scipy.py +0 -0
  104. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/tag.py +0 -0
  105. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/token.py +0 -0
  106. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/commit_parser/util.py +0 -0
  107. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/const.py +0 -0
  108. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/changelog_header.md.j2 +0 -0
  109. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/changelog_init.md.j2 +0 -0
  110. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/changelog_update.md.j2 +0 -0
  111. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/changes.md.j2 +0 -0
  112. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/first_release.md.j2 +0 -0
  113. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/macros.md.j2 +0 -0
  114. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/unreleased_changes.md.j2 +0 -0
  115. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.components/versioned_changes.md.j2 +0 -0
  116. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/.release_notes.md.j2 +0 -0
  117. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/md/CHANGELOG.md.j2 +0 -0
  118. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/changelog_header.rst.j2 +0 -0
  119. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/changelog_init.rst.j2 +0 -0
  120. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/changelog_update.rst.j2 +0 -0
  121. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/changes.rst.j2 +0 -0
  122. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/first_release.rst.j2 +0 -0
  123. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/macros.rst.j2 +0 -0
  124. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/unreleased_changes.rst.j2 +0 -0
  125. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/.components/versioned_changes.rst.j2 +0 -0
  126. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/data/templates/conventional/rst/CHANGELOG.rst.j2 +0 -0
  127. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/enums.py +0 -0
  128. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/globals.py +0 -0
  129. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/helpers.py +0 -0
  130. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/__init__.py +0 -0
  131. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/_base.py +0 -0
  132. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/bitbucket.py +0 -0
  133. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/gitea.py +0 -0
  134. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/github.py +0 -0
  135. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/gitlab.py +0 -0
  136. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/remote_hvcs_base.py +0 -0
  137. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/token_auth.py +0 -0
  138. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/hvcs/util.py +0 -0
  139. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/py.typed +0 -0
  140. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/__init__.py +0 -0
  141. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/algorithm.py +0 -0
  142. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declaration.py +0 -0
  143. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declarations/__init__.py +0 -0
  144. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declarations/enum.py +0 -0
  145. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declarations/i_version_replacer.py +0 -0
  146. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/src/semantic_release/version/declarations/toml.py +0 -0
  147. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/__init__.py +0 -0
  148. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/conftest.py +0 -0
  149. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/const.py +0 -0
  150. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/__init__.py +0 -0
  151. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_changelog/__init__.py +0 -0
  152. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_changelog/test_changelog.py +0 -0
  153. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_changelog/test_changelog_custom_parser.py +0 -0
  154. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_changelog/test_changelog_parsing.py +0 -0
  155. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_changelog/test_changelog_release_notes.py +0 -0
  156. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_config/__init__.py +0 -0
  157. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_config/test_generate_config.py +0 -0
  158. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_publish/__init__.py +0 -0
  159. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_publish/test_publish.py +0 -0
  160. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/__init__.py +0 -0
  161. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/__init__.py +0 -0
  162. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/conftest.py +0 -0
  163. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/git_flow/__init__.py +0 -0
  164. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow/__init__.py +0 -0
  165. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/__init__.py +0 -0
  166. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev/__init__.py +0 -0
  167. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/bump_version/trunk_based_dev_monorepo/__init__.py +0 -0
  168. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_changelog.py +0 -0
  169. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_changelog_custom_commit_msg.py +0 -0
  170. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/cmd_version/test_version_github_actions.py +0 -0
  171. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/test_help.py +0 -0
  172. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/e2e/test_main.py +0 -0
  173. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/__init__.py +0 -0
  174. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/commit_parsers.py +0 -0
  175. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/example_project.py +0 -0
  176. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/__init__.py +0 -0
  177. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/example_monorepo.py +0 -0
  178. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/github_flow/__init__.py +0 -0
  179. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/github_flow/monorepo_w_default_release.py +0 -0
  180. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/github_flow/monorepo_w_release_channels.py +0 -0
  181. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/trunk_based_dev/__init__.py +0 -0
  182. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/monorepos/trunk_based_dev/monorepo_w_tags.py +0 -0
  183. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/__init__.py +0 -0
  184. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/git_flow/__init__.py +0 -0
  185. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/git_flow/repo_w_1_release_channel.py +0 -0
  186. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/git_flow/repo_w_2_release_channels.py +0 -0
  187. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/git_flow/repo_w_3_release_channels.py +0 -0
  188. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/git_flow/repo_w_4_release_channels.py +0 -0
  189. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/github_flow/__init__.py +0 -0
  190. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/github_flow/repo_w_default_release.py +0 -0
  191. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/github_flow/repo_w_default_release_w_branch_update_merge.py +0 -0
  192. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/github_flow/repo_w_release_channels.py +0 -0
  193. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/repo_initial_commit.py +0 -0
  194. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/__init__.py +0 -0
  195. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support.py +0 -0
  196. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support_w_prereleases.py +0 -0
  197. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/repo_w_no_tags.py +0 -0
  198. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/repo_w_prereleases.py +0 -0
  199. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/repos/trunk_based_dev/repo_w_tags.py +0 -0
  200. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/fixtures/scipy.py +0 -0
  201. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/__init__.py +0 -0
  202. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/conftest.py +0 -0
  203. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/__init__.py +0 -0
  204. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/__init__.py +0 -0
  205. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/conftest.py +0 -0
  206. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_changelog_context.py +0 -0
  207. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_default_changelog.py +0 -0
  208. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_release_history.py +0 -0
  209. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_release_notes.py +0 -0
  210. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_template.py +0 -0
  211. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/changelog/test_template_render.py +0 -0
  212. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/__init__.py +0 -0
  213. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/test_config.py +0 -0
  214. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/test_github_actions_output.py +0 -0
  215. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/test_masking_filter.py +0 -0
  216. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/test_util.py +0 -0
  217. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/cli/test_version.py +0 -0
  218. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/__init__.py +0 -0
  219. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/test_conventional.py +0 -0
  220. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/test_emoji.py +0 -0
  221. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/test_parsed_commit.py +0 -0
  222. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/test_scipy.py +0 -0
  223. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/commit_parser/test_util.py +0 -0
  224. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/__init__.py +0 -0
  225. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test__base.py +0 -0
  226. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_bitbucket.py +0 -0
  227. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_gitea.py +0 -0
  228. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_github.py +0 -0
  229. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_gitlab.py +0 -0
  230. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_token_auth.py +0 -0
  231. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/hvcs/test_util.py +0 -0
  232. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/test_helpers.py +0 -0
  233. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/__init__.py +0 -0
  234. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/declarations/__init__.py +0 -0
  235. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/declarations/test_toml_declaration.py +0 -0
  236. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/test_translator.py +0 -0
  237. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/unit/semantic_release/version/test_version.py +0 -0
  238. {python_semantic_release-10.4.1 → python_semantic_release-10.5.0}/tests/util.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-semantic-release
3
- Version: 10.4.1
3
+ Version: 10.5.0
4
4
  Summary: Automatic Semantic Versioning for Python projects
5
- Author-email: Rolf Erik Lekang <me@rolflekang.com>
5
+ Author-email: Rolf Erik Lekang <me@rolflekang.com>, codejedi365 <codejedi365@gmail.com>
6
6
  License: MIT
7
7
  Project-URL: changelog, https://github.com/python-semantic-release/python-semantic-release/blob/master/CHANGELOG.md
8
8
  Project-URL: documentation, https://python-semantic-release.readthedocs.io
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Requires-Python: ~=3.8
21
22
  Description-Content-Type: text/x-rst
22
23
  License-File: LICENSE
@@ -26,7 +27,7 @@ Requires-Dist: gitpython~=3.0
26
27
  Requires-Dist: requests~=2.25
27
28
  Requires-Dist: jinja2~=3.1
28
29
  Requires-Dist: python-gitlab<7.0.0,>=4.0.0
29
- Requires-Dist: tomlkit~=0.11
30
+ Requires-Dist: tomlkit~=0.13.0
30
31
  Requires-Dist: dotty-dict~=1.3
31
32
  Requires-Dist: importlib-resources~=6.0
32
33
  Requires-Dist: pydantic~=2.0
@@ -35,11 +36,12 @@ Requires-Dist: shellingham~=1.5
35
36
  Requires-Dist: Deprecated~=1.2
36
37
  Provides-Extra: build
37
38
  Requires-Dist: build~=1.2; extra == "build"
39
+ Requires-Dist: tomlkit~=0.13.0; extra == "build"
38
40
  Provides-Extra: docs
39
- Requires-Dist: Sphinx~=6.0; extra == "docs"
40
- Requires-Dist: sphinxcontrib-apidoc==0.5.0; extra == "docs"
41
+ Requires-Dist: Sphinx~=7.4; extra == "docs"
42
+ Requires-Dist: sphinxcontrib-apidoc==0.6.0; extra == "docs"
41
43
  Requires-Dist: sphinx-autobuild==2024.2.4; extra == "docs"
42
- Requires-Dist: furo~=2024.1; extra == "docs"
44
+ Requires-Dist: furo~=2025.9; extra == "docs"
43
45
  Provides-Extra: test
44
46
  Requires-Dist: coverage[toml]~=7.0; extra == "test"
45
47
  Requires-Dist: filelock~=3.15; extra == "test"
@@ -48,9 +50,9 @@ Requires-Dist: freezegun~=1.5; extra == "test"
48
50
  Requires-Dist: pyyaml~=6.0; extra == "test"
49
51
  Requires-Dist: pytest~=8.3; extra == "test"
50
52
  Requires-Dist: pytest-clarity~=1.0; extra == "test"
51
- Requires-Dist: pytest-cov<7.0.0,>=5.0.0; extra == "test"
53
+ Requires-Dist: pytest-cov<8.0.0,>=5.0.0; extra == "test"
52
54
  Requires-Dist: pytest-env~=1.0; extra == "test"
53
- Requires-Dist: pytest-lazy-fixtures~=1.1.1; extra == "test"
55
+ Requires-Dist: pytest-lazy-fixtures~=1.4; extra == "test"
54
56
  Requires-Dist: pytest-mock~=3.0; extra == "test"
55
57
  Requires-Dist: pytest-order~=1.3; extra == "test"
56
58
  Requires-Dist: pytest-pretty~=1.2; extra == "test"
@@ -58,7 +60,7 @@ Requires-Dist: pytest-xdist~=3.0; extra == "test"
58
60
  Requires-Dist: responses~=0.25.0; extra == "test"
59
61
  Requires-Dist: requests-mock~=1.10; extra == "test"
60
62
  Provides-Extra: dev
61
- Requires-Dist: pre-commit~=3.5; extra == "dev"
63
+ Requires-Dist: pre-commit~=4.3; extra == "dev"
62
64
  Requires-Dist: tox~=4.11; extra == "dev"
63
65
  Requires-Dist: ruff==0.6.1; extra == "dev"
64
66
  Provides-Extra: mypy
@@ -118,6 +118,18 @@ By default (in order):
118
118
 
119
119
  #. Create a release in the remote VCS for this tag (if supported)
120
120
 
121
+ .. note::
122
+
123
+ Before pushing changes to the remote (step 6), Python Semantic Release automatically
124
+ verifies that the upstream branch has not changed since the commit that triggered
125
+ the release. This prevents push conflicts when another commit was made to the
126
+ upstream branch while the release was being prepared. If the upstream branch has
127
+ changed, the command will exit with an error, and you will need to pull the latest
128
+ changes and run the command again.
129
+
130
+ This verification only occurs when committing changes (``--commit``). If you are
131
+ running with ``--no-commit``, the verification will not be performed.
132
+
121
133
  All of these steps can be toggled on or off using the command line options
122
134
  described below. Some of the steps rely on others, so some options may implicitly
123
135
  disable others.
@@ -875,72 +875,32 @@ to the GitHub Release Assets as well.
875
875
  contents: write
876
876
 
877
877
  steps:
878
- # Note: We checkout the repository at the branch that triggered the workflow
879
- # with the entire history to ensure to match PSR's release branch detection
880
- # and history evaluation.
881
- # However, we forcefully reset the branch to the workflow sha because it is
882
- # possible that the branch was updated while the workflow was running. This
883
- # prevents accidentally releasing un-evaluated changes.
878
+ # Note: We checkout the repository at the branch that triggered the workflow.
879
+ # Python Semantic Release will automatically convert shallow clones to full clones
880
+ # if needed to ensure proper history evaluation. However, we forcefully reset the
881
+ # branch to the workflow sha because it is possible that the branch was updated
882
+ # while the workflow was running, which prevents accidentally releasing un-evaluated
883
+ # changes.
884
884
  - name: Setup | Checkout Repository on Release Branch
885
885
  uses: actions/checkout@v4
886
886
  with:
887
887
  ref: ${{ github.ref_name }}
888
- fetch-depth: 0
889
888
 
890
889
  - name: Setup | Force release branch to be at workflow sha
891
890
  run: |
892
891
  git reset --hard ${{ github.sha }}
893
892
 
894
- - name: Evaluate | Verify upstream has NOT changed
895
- # Last chance to abort before causing an error as another PR/push was applied to
896
- # the upstream branch while this workflow was running. This is important
897
- # because we are committing a version change (--commit). You may omit this step
898
- # if you have 'commit: false' in your configuration.
899
- #
900
- # You may consider moving this to a repo script and call it from this step instead
901
- # of writing it in-line.
902
- shell: bash
903
- run: |
904
- set +o pipefail
905
-
906
- UPSTREAM_BRANCH_NAME="$(git status -sb | head -n 1 | awk -F '\\.\\.\\.' '{print $2}' | cut -d ' ' -f1)"
907
- printf '%s\n' "Upstream branch name: $UPSTREAM_BRANCH_NAME"
908
-
909
- set -o pipefail
910
-
911
- if [ -z "$UPSTREAM_BRANCH_NAME" ]; then
912
- printf >&2 '%s\n' "::error::Unable to determine upstream branch name!"
913
- exit 1
914
- fi
915
-
916
- git fetch "${UPSTREAM_BRANCH_NAME%%/*}"
917
-
918
- if ! UPSTREAM_SHA="$(git rev-parse "$UPSTREAM_BRANCH_NAME")"; then
919
- printf >&2 '%s\n' "::error::Unable to determine upstream branch sha!"
920
- exit 1
921
- fi
922
-
923
- HEAD_SHA="$(git rev-parse HEAD)"
924
-
925
- if [ "$HEAD_SHA" != "$UPSTREAM_SHA" ]; then
926
- printf >&2 '%s\n' "[HEAD SHA] $HEAD_SHA != $UPSTREAM_SHA [UPSTREAM SHA]"
927
- printf >&2 '%s\n' "::error::Upstream has changed, aborting release..."
928
- exit 1
929
- fi
930
-
931
- printf '%s\n' "Verified upstream branch has not changed, continuing with release..."
932
-
933
893
  - name: Action | Semantic Version Release
934
894
  id: release
935
895
  # Adjust tag with desired version if applicable.
936
- uses: python-semantic-release/python-semantic-release@v10.4.1
896
+ uses: python-semantic-release/python-semantic-release@v10.5.0
937
897
  with:
938
898
  github_token: ${{ secrets.GITHUB_TOKEN }}
939
899
  git_committer_name: "github-actions"
940
900
  git_committer_email: "actions@users.noreply.github.com"
941
901
 
942
902
  - name: Publish | Upload to GitHub Release Assets
943
- uses: python-semantic-release/publish-action@v10.4.1
903
+ uses: python-semantic-release/publish-action@v10.5.0
944
904
  if: steps.release.outputs.released == 'true'
945
905
  with:
946
906
  github_token: ${{ secrets.GITHUB_TOKEN }}
@@ -953,6 +913,9 @@ to the GitHub Release Assets as well.
953
913
  path: dist
954
914
  if-no-files-found: error
955
915
 
916
+ outputs:
917
+ released: ${{ steps.release.outputs.released || 'false' }}
918
+
956
919
  deploy:
957
920
  # 1. Separate out the deploy step from the publish step to run each step at
958
921
  # the least amount of token privilege
@@ -995,16 +958,6 @@ to the GitHub Release Assets as well.
995
958
  one release job in the case if there are multiple pushes to ``main`` in a short period
996
959
  of time.
997
960
 
998
- Secondly the *Evaluate | Verify upstream has NOT changed* step is used to ensure that the
999
- upstream branch has not changed while the workflow was running. This is important because
1000
- we are committing a version change (``commit: true``) and there might be a push collision
1001
- that would cause undesired behavior. Review Issue `#1201`_ for more detailed information.
1002
-
1003
- .. warning::
1004
- You must set ``fetch-depth`` to 0 when using ``actions/checkout@v4``, since
1005
- Python Semantic Release needs access to the full history to build a changelog
1006
- and at least the latest tags to determine the next version.
1007
-
1008
961
  .. warning::
1009
962
  The ``GITHUB_TOKEN`` secret is automatically configured by GitHub, with the
1010
963
  same permissions role as the user who triggered the workflow run. This causes
@@ -1015,6 +968,19 @@ to the GitHub Release Assets as well.
1015
968
  case, you will also need to pass the new token to ``actions/checkout`` (as
1016
969
  the ``token`` input) in order to gain push access.
1017
970
 
971
+ .. note::
972
+ As of $NEW_RELEASE_TAG, Python Semantic Release automatically detects and converts
973
+ shallow clones to full clones when needed. While you can still use ``fetch-depth: 0``
974
+ with ``actions/checkout@v4`` to fetch the full history upfront, it is no longer
975
+ required. If you use the default shallow clone, Python Semantic Release will
976
+ automatically fetch the full history before evaluating commits. If you are using
977
+ an older version of PSR, you will need to unshallow the repository prior to use.
978
+
979
+ .. note::
980
+ As of $NEW_RELEASE_TAG, the verify upstream step is no longer required as it has been
981
+ integrated into PSR directly. If you are using an older version of PSR, you will need
982
+ to review the older documentation for that step. See Issue `#1201`_ for more details.
983
+
1018
984
  .. _#1201: https://github.com/python-semantic-release/python-semantic-release/issues/1201
1019
985
  .. _concurrency: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idconcurrency
1020
986
 
@@ -1039,7 +1005,7 @@ The equivalent GitHub Action configuration would be:
1039
1005
 
1040
1006
  - name: Action | Semantic Version Release
1041
1007
  # Adjust tag with desired version if applicable.
1042
- uses: python-semantic-release/python-semantic-release@v10.4.1
1008
+ uses: python-semantic-release/python-semantic-release@v10.5.0
1043
1009
  with:
1044
1010
  github_token: ${{ secrets.GITHUB_TOKEN }}
1045
1011
  force: patch
@@ -1098,14 +1064,14 @@ Publish Action.
1098
1064
 
1099
1065
  - name: Release submodule 1
1100
1066
  id: release-submod-1
1101
- uses: python-semantic-release/python-semantic-release@v10.4.1
1067
+ uses: python-semantic-release/python-semantic-release@v10.5.0
1102
1068
  with:
1103
1069
  directory: ${{ env.SUBMODULE_1_DIR }}
1104
1070
  github_token: ${{ secrets.GITHUB_TOKEN }}
1105
1071
 
1106
1072
  - name: Release submodule 2
1107
1073
  id: release-submod-2
1108
- uses: python-semantic-release/python-semantic-release@v10.4.1
1074
+ uses: python-semantic-release/python-semantic-release@v10.5.0
1109
1075
  with:
1110
1076
  directory: ${{ env.SUBMODULE_2_DIR }}
1111
1077
  github_token: ${{ secrets.GITHUB_TOKEN }}
@@ -1117,7 +1083,7 @@ Publish Action.
1117
1083
  # ------------------------------------------------------------------- #
1118
1084
 
1119
1085
  - name: Publish | Upload package 1 to GitHub Release Assets
1120
- uses: python-semantic-release/publish-action@v10.4.1
1086
+ uses: python-semantic-release/publish-action@v10.5.0
1121
1087
  if: steps.release-submod-1.outputs.released == 'true'
1122
1088
  with:
1123
1089
  directory: ${{ env.SUBMODULE_1_DIR }}
@@ -1125,7 +1091,7 @@ Publish Action.
1125
1091
  tag: ${{ steps.release-submod-1.outputs.tag }}
1126
1092
 
1127
1093
  - name: Publish | Upload package 2 to GitHub Release Assets
1128
- uses: python-semantic-release/publish-action@v10.4.1
1094
+ uses: python-semantic-release/publish-action@v10.5.0
1129
1095
  if: steps.release-submod-2.outputs.released == 'true'
1130
1096
  with:
1131
1097
  directory: ${{ env.SUBMODULE_2_DIR }}
@@ -161,7 +161,6 @@ look like this:
161
161
  uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
162
162
  with:
163
163
  ref: ${{ github.sha }}
164
- fetch-depth: 0
165
164
 
166
165
  - name: Setup | Force correct release branch on workflow sha
167
166
  run: git checkout -B ${{ github.ref_name }}
@@ -259,7 +258,6 @@ look like this:
259
258
  uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
260
259
  with:
261
260
  ref: ${{ github.ref_name }}
262
- fetch-depth: 0
263
261
 
264
262
  - name: Setup | Force release branch to be at workflow sha
265
263
  run: git reset --hard ${{ github.sha }}
@@ -291,7 +289,6 @@ look like this:
291
289
  env:
292
290
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
293
291
  run: |
294
- bash .github/workflows/verify_upstream.sh
295
292
  uv run semantic-release -v --strict version --skip-build
296
293
  uv run semantic-release publish
297
294
 
@@ -1162,6 +1162,52 @@ from the :ref:`remote.name <config-remote-name>` location of your git repository
1162
1162
 
1163
1163
  ----
1164
1164
 
1165
+ .. _config-add_partial_tags:
1166
+
1167
+ ``add_partial_tags``
1168
+ """"""""""""""""""""
1169
+
1170
+ **Type:** ``bool``
1171
+
1172
+ Specify if partial version tags should be handled when creating a new version. If set to
1173
+ ``true``, a ``major`` and a ``major.minor`` tag will be created or updated, using the format
1174
+ specified in :ref:`tag_format`. If version has build metadata, a ``major.minor.patch`` tag
1175
+ will also be created or updated.
1176
+
1177
+ Partial version tags are **disabled** for pre-release versions.
1178
+
1179
+ **Example**
1180
+
1181
+ .. code-block:: toml
1182
+
1183
+ [semantic_release]
1184
+ tag_format = "v{version}"
1185
+ add_partial_tags = true
1186
+
1187
+ This configuration with the next version of ``1.2.3`` will result in:
1188
+
1189
+ .. code-block:: bash
1190
+
1191
+ git log --decorate --oneline --graph --all
1192
+ # * 4d4cb0a (tag: v1.2.3, tag: v1.2, tag: v1, origin/main, main) 1.2.3
1193
+ # * 3a2b1c0 fix: some bug
1194
+ # * 2b1c0a9 (tag: v1.2.2) 1.2.2
1195
+ # ...
1196
+
1197
+ If build-metadata is used, the next version of ``1.2.3+20251109`` will result in:
1198
+
1199
+ .. code-block:: bash
1200
+
1201
+ git log --decorate --oneline --graph --all
1202
+ # * 4d4cb0a (tag: v1.2.3+20251109, tag: v1.2.3, tag: v1.2, tag: v1, origin/main, main) 1.2.3+20251109
1203
+ # * 3a2b1c0 chore: add partial tags to PSR configuration
1204
+ # * 2b1c0a9 (tag: v1.2.3+20251031) 1.2.3+20251031
1205
+ # ...
1206
+
1207
+ **Default:** ``false``
1208
+
1209
+ ----
1210
+
1165
1211
  .. _config-tag_format:
1166
1212
 
1167
1213
  ``tag_format``
@@ -1170,17 +1216,8 @@ from the :ref:`remote.name <config-remote-name>` location of your git repository
1170
1216
  **Type:** ``str``
1171
1217
 
1172
1218
  Specify the format to be used for the Git tag that will be added to the repo during
1173
- a release invoked via :ref:`cmd-version`. The format string is a regular expression,
1174
- which also must include the format keys below, otherwise an exception will be thrown.
1175
- It *may* include any of the optional format keys, in which case the contents
1176
- described will be formatted into the specified location in the Git tag that is created.
1177
-
1178
- For example, ``"(dev|stg|prod)-v{version}"`` is a valid ``tag_format`` matching tags such
1179
- as:
1180
-
1181
- - ``dev-v1.2.3``
1182
- - ``stg-v0.1.0-rc.1``
1183
- - ``prod-v2.0.0+20230701``
1219
+ a release invoked via :ref:`cmd-version`. The string is used as a template for the tag
1220
+ name, and must include the ``{version}`` format key.
1184
1221
 
1185
1222
  This format will also be used for parsing tags already present in the repository into
1186
1223
  semantic versions; therefore if the tag format changes at some point in the
@@ -1196,6 +1233,13 @@ Format Key Mandatory Contents
1196
1233
 
1197
1234
  Tags which do not match this format will not be considered as versions of your project.
1198
1235
 
1236
+ This is critical for Monorepo projects where the tag format defines which package the
1237
+ version tag belongs to. Generally, the tag format for each package of the monorepo will
1238
+ include the package name as the prefix of the tag format. For example, if the package
1239
+ is named ``pkg1``, the tag format would be ``pkg1-v{version}`` and in the other package
1240
+ ``pkg2``, the tag format would be ``pkg2-v{version}``. This allows PSR to determine
1241
+ which tags to use to determine the version for each package.
1242
+
1199
1243
  **Default:** ``"v{version}"``
1200
1244
 
1201
1245
  ----
@@ -1354,7 +1398,8 @@ The regular expression generated from the ``version_variables`` definition will:
1354
1398
  2. The variable name defined by ``variable`` and the version must be separated by
1355
1399
  an operand symbol (``=``, ``:``, ``:=``, or ``@``). Whitespace is optional around
1356
1400
  the symbol. As of v10.0.0, a double-equals (``==``) operator is also supported
1357
- as a valid operand symbol.
1401
+ as a valid operand symbol. As of $NEW_RELEASE_TAG, PSR can omit all operands as long
1402
+ as there is at least one whitespace character between the variable name and the version.
1358
1403
 
1359
1404
  3. The value of the variable must match a `SemVer`_ regular expression and can be
1360
1405
  enclosed by single (``'``) or double (``"``) quotation marks but they must match. However,
@@ -1410,6 +1455,9 @@ will be matched and replaced by the new version:
1410
1455
  # requirements.txt
1411
1456
  my-package == 1.2.3
1412
1457
 
1458
+ # C-Macro style (no operand only whitespace required)
1459
+ #define VERSION "1.2.3"
1460
+
1413
1461
  .. important::
1414
1462
  The Regular Expression expects a version value to exist in the file to be replaced.
1415
1463
  It cannot be an empty string or a non-semver compliant string. If this is the very
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "python-semantic-release"
9
- version = "10.4.1"
9
+ version = "10.5.0"
10
10
  description = "Automatic Semantic Versioning for Python projects"
11
11
  requires-python = "~= 3.8"
12
12
  license = { text = "MIT" }
@@ -19,9 +19,13 @@ classifiers = [
19
19
  "Programming Language :: Python :: 3.11",
20
20
  "Programming Language :: Python :: 3.12",
21
21
  "Programming Language :: Python :: 3.13",
22
+ "Programming Language :: Python :: 3.14",
22
23
  ]
23
24
  readme = "README.rst"
24
- authors = [{ name = "Rolf Erik Lekang", email = "me@rolflekang.com" }]
25
+ authors = [
26
+ { name = "Rolf Erik Lekang", email = "me@rolflekang.com" },
27
+ { name = "codejedi365", email = "codejedi365@gmail.com" },
28
+ ]
25
29
  dependencies = [
26
30
  "click ~= 8.1.0",
27
31
  "click-option-group ~= 0.5",
@@ -29,7 +33,7 @@ dependencies = [
29
33
  "requests ~= 2.25",
30
34
  "jinja2 ~= 3.1",
31
35
  "python-gitlab >= 4.0.0, < 7.0.0",
32
- "tomlkit ~= 0.11",
36
+ "tomlkit ~= 0.13.0",
33
37
  "dotty-dict ~= 1.3",
34
38
  "importlib-resources ~= 6.0",
35
39
  "pydantic ~= 2.0",
@@ -52,13 +56,14 @@ repository = "http://github.com/python-semantic-release/python-semantic-release.
52
56
 
53
57
  [project.optional-dependencies]
54
58
  build = [
55
- "build ~= 1.2"
59
+ "build ~= 1.2",
60
+ "tomlkit ~= 0.13.0",
56
61
  ]
57
62
  docs = [
58
- "Sphinx ~= 6.0",
59
- "sphinxcontrib-apidoc == 0.5.0",
63
+ "Sphinx ~= 7.4",
64
+ "sphinxcontrib-apidoc == 0.6.0",
60
65
  "sphinx-autobuild == 2024.2.4",
61
- "furo ~= 2024.1",
66
+ "furo ~= 2025.9",
62
67
  ]
63
68
  test = [
64
69
  "coverage[toml] ~= 7.0",
@@ -68,9 +73,9 @@ test = [
68
73
  "pyyaml ~= 6.0",
69
74
  "pytest ~= 8.3",
70
75
  "pytest-clarity ~= 1.0",
71
- "pytest-cov >= 5.0.0, < 7.0.0",
76
+ "pytest-cov >= 5.0.0, < 8.0.0",
72
77
  "pytest-env ~= 1.0",
73
- "pytest-lazy-fixtures ~= 1.1.1",
78
+ "pytest-lazy-fixtures ~= 1.4",
74
79
  "pytest-mock ~= 3.0",
75
80
  "pytest-order ~= 1.3",
76
81
  "pytest-pretty ~= 1.2",
@@ -79,7 +84,7 @@ test = [
79
84
  "requests-mock ~= 1.10",
80
85
  ]
81
86
  dev = [
82
- "pre-commit ~= 3.5",
87
+ "pre-commit ~= 4.3",
83
88
  "tox ~= 4.11",
84
89
  "ruff == 0.6.1"
85
90
  ]
@@ -407,6 +412,11 @@ ignore_names = ["change_to_ex_proj_dir", "init_example_project"]
407
412
  logging_use_named_masks = true
408
413
  commit_parser = "conventional"
409
414
  commit_parser_options = { parse_squash_commits = true, ignore_merge_commits = true }
415
+ commit_message = """\
416
+ chore: release v{version}
417
+
418
+ Automatically generated by python-semantic-release
419
+ """
410
420
  build_command = """
411
421
  python -m pip install -e .[build]
412
422
  python -m build .
@@ -135,10 +135,13 @@ tests/e2e/cmd_version/test_version_bump.py
135
135
  tests/e2e/cmd_version/test_version_changelog.py
136
136
  tests/e2e/cmd_version/test_version_changelog_custom_commit_msg.py
137
137
  tests/e2e/cmd_version/test_version_github_actions.py
138
+ tests/e2e/cmd_version/test_version_partial_tag.py
138
139
  tests/e2e/cmd_version/test_version_print.py
139
140
  tests/e2e/cmd_version/test_version_release_notes.py
141
+ tests/e2e/cmd_version/test_version_shallow.py
140
142
  tests/e2e/cmd_version/test_version_stamp.py
141
143
  tests/e2e/cmd_version/test_version_strict.py
144
+ tests/e2e/cmd_version/test_version_upstream_check.py
142
145
  tests/e2e/cmd_version/bump_version/__init__.py
143
146
  tests/e2e/cmd_version/bump_version/conftest.py
144
147
  tests/e2e/cmd_version/bump_version/git_flow/__init__.py
@@ -193,6 +196,7 @@ tests/fixtures/repos/trunk_based_dev/repo_w_tags.py
193
196
  tests/unit/__init__.py
194
197
  tests/unit/conftest.py
195
198
  tests/unit/semantic_release/__init__.py
199
+ tests/unit/semantic_release/test_gitproject.py
196
200
  tests/unit/semantic_release/test_helpers.py
197
201
  tests/unit/semantic_release/changelog/__init__.py
198
202
  tests/unit/semantic_release/changelog/conftest.py
@@ -119,7 +119,7 @@ def read_file(filepath: str) -> str:
119
119
  return rfd.read()
120
120
 
121
121
  except FileNotFoundError as err:
122
- logging.warning(err)
122
+ logging.warning(str(err))
123
123
  return ""
124
124
 
125
125
 
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING
10
10
  import click
11
11
  import shellingham # type: ignore[import]
12
12
  from click_option_group import MutuallyExclusiveOptionGroup, optgroup
13
- from git import Repo
13
+ from git import GitCommandError, Repo
14
14
  from requests import HTTPError
15
15
 
16
16
  from semantic_release.changelog.release_history import ReleaseHistory
@@ -27,9 +27,14 @@ from semantic_release.const import DEFAULT_SHELL, DEFAULT_VERSION
27
27
  from semantic_release.enums import LevelBump
28
28
  from semantic_release.errors import (
29
29
  BuildDistributionsError,
30
+ DetachedHeadGitError,
30
31
  GitCommitEmptyIndexError,
32
+ GitFetchError,
31
33
  InternalError,
34
+ LocalGitError,
32
35
  UnexpectedResponse,
36
+ UnknownUpstreamBranchError,
37
+ UpstreamBranchChangedError,
33
38
  )
34
39
  from semantic_release.gitproject import GitProject
35
40
  from semantic_release.globals import logger
@@ -75,10 +80,13 @@ def is_forced_prerelease(
75
80
  )
76
81
 
77
82
 
78
- def last_released(repo_dir: Path, tag_format: str) -> tuple[Tag, Version] | None:
83
+ def last_released(
84
+ repo_dir: Path, tag_format: str, add_partial_tags: bool = False
85
+ ) -> tuple[Tag, Version] | None:
79
86
  with Repo(str(repo_dir)) as git_repo:
80
87
  ts_and_vs = tags_and_versions(
81
- git_repo.tags, VersionTranslator(tag_format=tag_format)
88
+ git_repo.tags,
89
+ VersionTranslator(tag_format=tag_format, add_partial_tags=add_partial_tags),
82
90
  )
83
91
 
84
92
  return ts_and_vs[0] if ts_and_vs else None
@@ -449,7 +457,11 @@ def version( # noqa: C901
449
457
  if print_last_released or print_last_released_tag:
450
458
  # TODO: get tag format a better way
451
459
  if not (
452
- last_release := last_released(config.repo_dir, tag_format=config.tag_format)
460
+ last_release := last_released(
461
+ config.repo_dir,
462
+ tag_format=config.tag_format,
463
+ add_partial_tags=config.add_partial_tags,
464
+ )
453
465
  ):
454
466
  logger.warning("No release tags found.")
455
467
  return
@@ -470,6 +482,7 @@ def version( # noqa: C901
470
482
  major_on_zero = runtime.major_on_zero
471
483
  no_verify = runtime.no_git_verify
472
484
  opts = runtime.global_cli_options
485
+ add_partial_tags = config.add_partial_tags
473
486
  gha_output = VersionGitHubActionsOutput(
474
487
  gh_client=hvcs_client if isinstance(hvcs_client, Github) else None,
475
488
  mode=(
@@ -491,6 +504,17 @@ def version( # noqa: C901
491
504
  logger.info("Forcing use of %s as the prerelease token", prerelease_token)
492
505
  translator.prerelease_token = prerelease_token
493
506
 
507
+ # Check if the repository is shallow and unshallow it if necessary
508
+ # This ensures we have the full history for commit analysis
509
+ project = GitProject(
510
+ directory=runtime.repo_dir,
511
+ commit_author=runtime.commit_author,
512
+ credential_masker=runtime.masker,
513
+ )
514
+ if project.is_shallow_clone():
515
+ logger.info("Repository is a shallow clone, converting to full clone...")
516
+ project.git_unshallow(noop=opts.noop)
517
+
494
518
  # Only push if we're committing changes
495
519
  if push_changes and not commit_changes and not create_tag:
496
520
  logger.info("changes will not be pushed because --no-commit disables pushing")
@@ -683,12 +707,6 @@ def version( # noqa: C901
683
707
  license_name="" if not isinstance(license_cfg, str) else license_cfg,
684
708
  )
685
709
 
686
- project = GitProject(
687
- directory=runtime.repo_dir,
688
- commit_author=runtime.commit_author,
689
- credential_masker=runtime.masker,
690
- )
691
-
692
710
  # Preparing for committing changes; we always stage files even if we're not committing them in order to support a two-stage commit
693
711
  project.git_add(paths=all_paths_to_add, noop=opts.noop)
694
712
  if commit_changes:
@@ -727,6 +745,29 @@ def version( # noqa: C901
727
745
  )
728
746
 
729
747
  if commit_changes:
748
+ # Verify that the upstream branch has not changed before pushing
749
+ # This prevents conflicts if another commit was pushed while we were preparing the release
750
+ # We check HEAD~1 because we just made a release commit
751
+ try:
752
+ project.verify_upstream_unchanged(local_ref="HEAD~1", noop=opts.noop)
753
+ except UpstreamBranchChangedError as exc:
754
+ click.echo(str(exc), err=True)
755
+ click.echo(
756
+ "Upstream branch has changed. Please pull the latest changes and try again.",
757
+ err=True,
758
+ )
759
+ ctx.exit(1)
760
+ except (
761
+ DetachedHeadGitError,
762
+ GitCommandError,
763
+ UnknownUpstreamBranchError,
764
+ GitFetchError,
765
+ LocalGitError,
766
+ ) as exc:
767
+ click.echo(str(exc), err=True)
768
+ click.echo("Unable to verify upstream due to error!", err=True)
769
+ ctx.exit(1)
770
+
730
771
  # TODO: integrate into push branch
731
772
  with Repo(str(runtime.repo_dir)) as git_repo:
732
773
  active_branch = git_repo.active_branch.name
@@ -744,6 +785,27 @@ def version( # noqa: C901
744
785
  tag=new_version.as_tag(),
745
786
  noop=opts.noop,
746
787
  )
788
+ # Create or update partial tags for releases
789
+ if add_partial_tags and not prerelease:
790
+ partial_tags = [new_version.as_major_tag(), new_version.as_minor_tag()]
791
+ # If build metadata is set, also retag the version without the metadata
792
+ if build_metadata:
793
+ partial_tags.append(new_version.as_patch_tag())
794
+
795
+ for partial_tag in partial_tags:
796
+ project.git_tag(
797
+ tag_name=partial_tag,
798
+ message=f"{partial_tag} => {new_version.as_tag()}",
799
+ isotimestamp=commit_date.isoformat(),
800
+ noop=opts.noop,
801
+ force=True,
802
+ )
803
+ project.git_push_tag(
804
+ remote_url=remote_url,
805
+ tag=partial_tag,
806
+ noop=opts.noop,
807
+ force=True,
808
+ )
747
809
 
748
810
  # Update GitHub Actions output value now that release has occurred
749
811
  gha_output.released = True
@@ -366,6 +366,7 @@ class RawConfig(BaseModel):
366
366
  remote: RemoteConfig = RemoteConfig()
367
367
  no_git_verify: bool = False
368
368
  tag_format: str = "v{version}"
369
+ add_partial_tags: bool = False
369
370
  publish: PublishConfig = PublishConfig()
370
371
  version_toml: Optional[Tuple[str, ...]] = None
371
372
  version_variables: Optional[Tuple[str, ...]] = None
@@ -827,7 +828,9 @@ class RuntimeContext:
827
828
 
828
829
  # version_translator
829
830
  version_translator = VersionTranslator(
830
- tag_format=raw.tag_format, prerelease_token=branch_config.prerelease_token
831
+ tag_format=raw.tag_format,
832
+ prerelease_token=branch_config.prerelease_token,
833
+ add_partial_tags=raw.add_partial_tags,
831
834
  )
832
835
 
833
836
  build_cmd_env = {}