python-semantic-release 9.20.0__tar.gz → 9.21.1__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 (210) hide show
  1. {python_semantic_release-9.20.0/src/python_semantic_release.egg-info → python_semantic_release-9.21.1}/PKG-INFO +6 -5
  2. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/automatic-releases/github-actions.rst +144 -29
  3. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/configuration.rst +5 -5
  4. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/pyproject.toml +6 -6
  5. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1/src/python_semantic_release.egg-info}/PKG-INFO +6 -5
  6. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/python_semantic_release.egg-info/entry_points.txt +1 -0
  7. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/python_semantic_release.egg-info/requires.txt +3 -3
  8. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/__init__.py +3 -1
  9. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/remote_hvcs_base.py +14 -4
  10. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/test_main.py +26 -1
  11. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_bitbucket.py +23 -0
  12. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_gitea.py +23 -0
  13. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_github.py +23 -0
  14. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_gitlab.py +23 -0
  15. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/AUTHORS.rst +0 -0
  16. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/LICENSE +0 -0
  17. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/MANIFEST.in +0 -0
  18. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/README.rst +0 -0
  19. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/Makefile +0 -0
  20. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/algorithm.rst +0 -0
  21. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/automatic-releases/cronjobs.rst +0 -0
  22. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/automatic-releases/index.rst +0 -0
  23. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/automatic-releases/travis.rst +0 -0
  24. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/changelog_templates.rst +0 -0
  25. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/commands.rst +0 -0
  26. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/commit_parsing.rst +0 -0
  27. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/conf.py +0 -0
  28. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/contributing.rst +0 -0
  29. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/contributors.rst +0 -0
  30. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/index.rst +0 -0
  31. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/make.bat +0 -0
  32. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/migrating_from_v7.rst +0 -0
  33. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/multibranch_releases.rst +0 -0
  34. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/psr_changelog.rst +0 -0
  35. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/strict_mode.rst +0 -0
  36. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/docs/troubleshooting.rst +0 -0
  37. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/setup.cfg +0 -0
  38. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/python_semantic_release.egg-info/SOURCES.txt +0 -0
  39. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/python_semantic_release.egg-info/dependency_links.txt +0 -0
  40. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/python_semantic_release.egg-info/top_level.txt +0 -0
  41. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/__main__.py +0 -0
  42. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/changelog/__init__.py +0 -0
  43. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/changelog/context.py +0 -0
  44. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/changelog/release_history.py +0 -0
  45. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/changelog/template.py +0 -0
  46. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/__init__.py +0 -0
  47. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/changelog_writer.py +0 -0
  48. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/cli_context.py +0 -0
  49. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/__init__.py +0 -0
  50. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/changelog.py +0 -0
  51. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/generate_config.py +0 -0
  52. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/main.py +0 -0
  53. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/publish.py +0 -0
  54. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/commands/version.py +0 -0
  55. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/config.py +0 -0
  56. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/const.py +0 -0
  57. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/github_actions_output.py +0 -0
  58. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/masking_filter.py +0 -0
  59. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/cli/util.py +0 -0
  60. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/__init__.py +0 -0
  61. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/_base.py +0 -0
  62. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/angular.py +0 -0
  63. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/conventional.py +0 -0
  64. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/emoji.py +0 -0
  65. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/scipy.py +0 -0
  66. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/tag.py +0 -0
  67. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/token.py +0 -0
  68. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/commit_parser/util.py +0 -0
  69. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/const.py +0 -0
  70. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/changelog_header.md.j2 +0 -0
  71. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/changelog_init.md.j2 +0 -0
  72. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/changelog_update.md.j2 +0 -0
  73. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/changes.md.j2 +0 -0
  74. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/first_release.md.j2 +0 -0
  75. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/macros.md.j2 +0 -0
  76. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/unreleased_changes.md.j2 +0 -0
  77. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.components/versioned_changes.md.j2 +0 -0
  78. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/.release_notes.md.j2 +0 -0
  79. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/md/CHANGELOG.md.j2 +0 -0
  80. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/changelog_header.rst.j2 +0 -0
  81. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/changelog_init.rst.j2 +0 -0
  82. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/changelog_update.rst.j2 +0 -0
  83. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/changes.rst.j2 +0 -0
  84. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/first_release.rst.j2 +0 -0
  85. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/macros.rst.j2 +0 -0
  86. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/unreleased_changes.rst.j2 +0 -0
  87. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/.components/versioned_changes.rst.j2 +0 -0
  88. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/data/templates/angular/rst/CHANGELOG.rst.j2 +0 -0
  89. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/enums.py +0 -0
  90. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/errors.py +0 -0
  91. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/gitproject.py +0 -0
  92. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/globals.py +0 -0
  93. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/helpers.py +0 -0
  94. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/__init__.py +0 -0
  95. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/_base.py +0 -0
  96. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/bitbucket.py +0 -0
  97. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/gitea.py +0 -0
  98. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/github.py +0 -0
  99. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/gitlab.py +0 -0
  100. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/token_auth.py +0 -0
  101. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/hvcs/util.py +0 -0
  102. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/py.typed +0 -0
  103. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/__init__.py +0 -0
  104. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/algorithm.py +0 -0
  105. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declaration.py +0 -0
  106. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declarations/__init__.py +0 -0
  107. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declarations/enum.py +0 -0
  108. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declarations/i_version_replacer.py +0 -0
  109. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declarations/pattern.py +0 -0
  110. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/declarations/toml.py +0 -0
  111. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/translator.py +0 -0
  112. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/src/semantic_release/version/version.py +0 -0
  113. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/__init__.py +0 -0
  114. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/conftest.py +0 -0
  115. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/const.py +0 -0
  116. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/__init__.py +0 -0
  117. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_changelog/__init__.py +0 -0
  118. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_changelog/test_changelog.py +0 -0
  119. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_changelog/test_changelog_custom_parser.py +0 -0
  120. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_changelog/test_changelog_parsing.py +0 -0
  121. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_changelog/test_changelog_release_notes.py +0 -0
  122. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_config/__init__.py +0 -0
  123. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_config/test_generate_config.py +0 -0
  124. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_publish/__init__.py +0 -0
  125. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_publish/test_publish.py +0 -0
  126. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/__init__.py +0 -0
  127. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/__init__.py +0 -0
  128. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/conftest.py +0 -0
  129. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/git_flow/__init__.py +0 -0
  130. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_1_channel.py +0 -0
  131. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_2_channels.py +0 -0
  132. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_3_channels.py +0 -0
  133. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_4_channels.py +0 -0
  134. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/github_flow/__init__.py +0 -0
  135. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_1_channel.py +0 -0
  136. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_2_channels.py +0 -0
  137. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/trunk_based_dev/__init__.py +0 -0
  138. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk.py +0 -0
  139. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support.py +0 -0
  140. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support_w_prereleases.py +0 -0
  141. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_w_prereleases.py +0 -0
  142. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version.py +0 -0
  143. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_build.py +0 -0
  144. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_bump.py +0 -0
  145. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_changelog.py +0 -0
  146. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_changelog_custom_commit_msg.py +0 -0
  147. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_github_actions.py +0 -0
  148. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_print.py +0 -0
  149. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_release_notes.py +0 -0
  150. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_stamp.py +0 -0
  151. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/cmd_version/test_version_strict.py +0 -0
  152. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/conftest.py +0 -0
  153. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/e2e/test_help.py +0 -0
  154. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/__init__.py +0 -0
  155. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/commit_parsers.py +0 -0
  156. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/example_project.py +0 -0
  157. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/git_repo.py +0 -0
  158. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/__init__.py +0 -0
  159. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/git_flow/__init__.py +0 -0
  160. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/git_flow/repo_w_1_release_channel.py +0 -0
  161. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/git_flow/repo_w_2_release_channels.py +0 -0
  162. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/git_flow/repo_w_3_release_channels.py +0 -0
  163. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/git_flow/repo_w_4_release_channels.py +0 -0
  164. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/github_flow/__init__.py +0 -0
  165. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/github_flow/repo_w_default_release.py +0 -0
  166. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/github_flow/repo_w_release_channels.py +0 -0
  167. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/repo_initial_commit.py +0 -0
  168. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/__init__.py +0 -0
  169. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support.py +0 -0
  170. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support_w_prereleases.py +0 -0
  171. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/repo_w_no_tags.py +0 -0
  172. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/repo_w_prereleases.py +0 -0
  173. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/repos/trunk_based_dev/repo_w_tags.py +0 -0
  174. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/fixtures/scipy.py +0 -0
  175. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/__init__.py +0 -0
  176. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/conftest.py +0 -0
  177. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/__init__.py +0 -0
  178. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/__init__.py +0 -0
  179. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/conftest.py +0 -0
  180. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_changelog_context.py +0 -0
  181. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_default_changelog.py +0 -0
  182. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_release_history.py +0 -0
  183. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_release_notes.py +0 -0
  184. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_template.py +0 -0
  185. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/changelog/test_template_render.py +0 -0
  186. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/__init__.py +0 -0
  187. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/test_config.py +0 -0
  188. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/test_github_actions_output.py +0 -0
  189. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/test_masking_filter.py +0 -0
  190. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/test_util.py +0 -0
  191. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/cli/test_version.py +0 -0
  192. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/__init__.py +0 -0
  193. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/test_conventional.py +0 -0
  194. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/test_emoji.py +0 -0
  195. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/test_parsed_commit.py +0 -0
  196. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/test_scipy.py +0 -0
  197. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/commit_parser/test_util.py +0 -0
  198. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/__init__.py +0 -0
  199. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test__base.py +0 -0
  200. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_token_auth.py +0 -0
  201. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/hvcs/test_util.py +0 -0
  202. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/test_helpers.py +0 -0
  203. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/__init__.py +0 -0
  204. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/declarations/__init__.py +0 -0
  205. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/declarations/test_pattern_declaration.py +0 -0
  206. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/declarations/test_toml_declaration.py +0 -0
  207. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/test_algorithm.py +0 -0
  208. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/test_translator.py +0 -0
  209. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/unit/semantic_release/version/test_version.py +0 -0
  210. {python_semantic_release-9.20.0 → python_semantic_release-9.21.1}/tests/util.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: python-semantic-release
3
- Version: 9.20.0
3
+ Version: 9.21.1
4
4
  Summary: Automatic Semantic Versioning for Python projects
5
5
  Author-email: Rolf Erik Lekang <me@rolflekang.com>
6
6
  License: MIT
@@ -26,12 +26,12 @@ Requires-Dist: click-option-group~=0.5
26
26
  Requires-Dist: gitpython~=3.0
27
27
  Requires-Dist: requests~=2.25
28
28
  Requires-Dist: jinja2~=3.1
29
- Requires-Dist: python-gitlab~=4.0
29
+ Requires-Dist: python-gitlab<6.0.0,>=4.0.0
30
30
  Requires-Dist: tomlkit~=0.11
31
31
  Requires-Dist: dotty-dict~=1.3
32
32
  Requires-Dist: importlib-resources~=6.0
33
33
  Requires-Dist: pydantic~=2.0
34
- Requires-Dist: rich~=13.0
34
+ Requires-Dist: rich~=14.0
35
35
  Requires-Dist: shellingham~=1.5
36
36
  Requires-Dist: Deprecated~=1.2
37
37
  Provides-Extra: build
@@ -49,7 +49,7 @@ Requires-Dist: freezegun~=1.5; extra == "test"
49
49
  Requires-Dist: pyyaml~=6.0; extra == "test"
50
50
  Requires-Dist: pytest~=8.3; extra == "test"
51
51
  Requires-Dist: pytest-clarity~=1.0; extra == "test"
52
- Requires-Dist: pytest-cov~=5.0; extra == "test"
52
+ Requires-Dist: pytest-cov<7.0.0,>=5.0.0; extra == "test"
53
53
  Requires-Dist: pytest-env~=1.0; extra == "test"
54
54
  Requires-Dist: pytest-lazy-fixtures~=1.1.1; extra == "test"
55
55
  Requires-Dist: pytest-mock~=3.0; extra == "test"
@@ -67,6 +67,7 @@ Requires-Dist: mypy==1.15.0; extra == "mypy"
67
67
  Requires-Dist: types-Deprecated~=1.2; extra == "mypy"
68
68
  Requires-Dist: types-requests~=2.32.0; extra == "mypy"
69
69
  Requires-Dist: types-pyyaml~=6.0; extra == "mypy"
70
+ Dynamic: license-file
70
71
 
71
72
  Python Semantic Release
72
73
  ***********************
@@ -337,7 +337,7 @@ before the :ref:`version <cmd-version>` subcommand.
337
337
 
338
338
  .. code:: yaml
339
339
 
340
- - uses: python-semantic-release/python-semantic-release@v9.19.1
340
+ - uses: python-semantic-release/python-semantic-release@v9.21.0
341
341
  with:
342
342
  root_options: "-vv --noop"
343
343
 
@@ -576,7 +576,7 @@ before the :ref:`publish <cmd-publish>` subcommand.
576
576
 
577
577
  .. code:: yaml
578
578
 
579
- - uses: python-semantic-release/publish-action@v9.19.1
579
+ - uses: python-semantic-release/publish-action@v9.21.0
580
580
  with:
581
581
  root_options: "-vv --noop"
582
582
 
@@ -643,7 +643,7 @@ Examples
643
643
  Common Workflow Example
644
644
  -----------------------
645
645
 
646
- The following is a common workflow example that uses both the Python Semantic Release Action
646
+ The following is a simple common workflow example that uses both the Python Semantic Release Action
647
647
  and the Python Semantic Release Publish Action. This workflow will run on every push to the
648
648
  ``main`` branch and will create a new release upon a successful version determination. If a
649
649
  version is released, the workflow will then publish the package to PyPI and upload the package
@@ -661,51 +661,100 @@ to the GitHub Release Assets as well.
661
661
  jobs:
662
662
  release:
663
663
  runs-on: ubuntu-latest
664
- concurrency: release
664
+ concurrency:
665
+ group: ${{ github.workflow }}-release-${{ github.ref_name }}
666
+ cancel-in-progress: false
665
667
 
666
668
  permissions:
667
669
  id-token: write
668
670
  contents: write
669
671
 
670
672
  steps:
671
- # Note: we need to checkout the repository at the workflow sha in case during the workflow
672
- # the branch was updated. To keep PSR working with the configured release branches,
673
- # we force a checkout of the desired release branch but at the workflow sha HEAD.
674
- - name: Setup | Checkout Repository at workflow sha
673
+ # Note: We checkout the repository at the branch that triggered the workflow
674
+ # with the entire history to ensure to match PSR's release branch detection
675
+ # and history evaluation.
676
+ # However, we forcefully reset the branch to the workflow sha because it is
677
+ # possible that the branch was updated while the workflow was running. This
678
+ # prevents accidentally releasing un-evaluated changes.
679
+ - name: Setup | Checkout Repository on Release Branch
675
680
  uses: actions/checkout@v4
676
681
  with:
682
+ ref: ${{ github.ref_name }}
677
683
  fetch-depth: 0
678
- ref: ${{ github.sha }}
679
684
 
680
- - name: Setup | Force correct release branch on workflow sha
685
+ - name: Setup | Force release branch to be at workflow sha
681
686
  run: |
682
- git checkout -B ${{ github.ref_name }} ${{ github.sha }}
687
+ git reset --hard ${{ github.sha }}
688
+
689
+ - name: Evaluate | Verify upstream has NOT changed
690
+ # Last chance to abort before causing an error as another PR/push was applied to
691
+ # the upstream branch while this workflow was running. This is important
692
+ # because we are committing a version change (--commit). You may omit this step
693
+ # if you have 'commit: false' in your configuration.
694
+ #
695
+ # You may consider moving this to a repo script and call it from this step instead
696
+ # of writing it in-line.
697
+ shell: bash
698
+ run: |
699
+ set +o pipefail
700
+
701
+ UPSTREAM_BRANCH_NAME="$(git status -sb | head -n 1 | cut -d' ' -f2 | grep -E '\.{3}' | cut -d'.' -f4)"
702
+ printf '%s\n' "Upstream branch name: $UPSTREAM_BRANCH_NAME"
703
+
704
+ set -o pipefail
705
+
706
+ if [ -z "$UPSTREAM_BRANCH_NAME" ]; then
707
+ printf >&2 '%s\n' "::error::Unable to determine upstream branch name!"
708
+ exit 1
709
+ fi
710
+
711
+ git fetch "${UPSTREAM_BRANCH_NAME%%/*}"
712
+
713
+ if ! UPSTREAM_SHA="$(git rev-parse "$UPSTREAM_BRANCH_NAME")"; then
714
+ printf >&2 '%s\n' "::error::Unable to determine upstream branch sha!"
715
+ exit 1
716
+ fi
717
+
718
+ HEAD_SHA="$(git rev-parse HEAD)"
719
+
720
+ if [ "$HEAD_SHA" != "$UPSTREAM_SHA" ]; then
721
+ printf >&2 '%s\n' "[HEAD SHA] $HEAD_SHA != $UPSTREAM_SHA [UPSTREAM SHA]"
722
+ printf >&2 '%s\n' "::error::Upstream has changed, aborting release..."
723
+ exit 1
724
+ fi
725
+
726
+ printf '%s\n' "Verified upstream branch has not changed, continuing with release..."
683
727
 
684
728
  - name: Action | Semantic Version Release
685
729
  id: release
686
730
  # Adjust tag with desired version if applicable.
687
- uses: python-semantic-release/python-semantic-release@v9.19.1
731
+ uses: python-semantic-release/python-semantic-release@v9.21.0
688
732
  with:
689
733
  github_token: ${{ secrets.GITHUB_TOKEN }}
690
734
  git_committer_name: "github-actions"
691
735
  git_committer_email: "actions@users.noreply.github.com"
692
736
 
693
- - name: Publish | Upload package to PyPI
694
- uses: pypa/gh-action-pypi-publish@v1
695
- if: steps.release.outputs.released == 'true'
696
-
697
737
  - name: Publish | Upload to GitHub Release Assets
698
- uses: python-semantic-release/publish-action@v9.19.1
738
+ uses: python-semantic-release/publish-action@v9.21.0
699
739
  if: steps.release.outputs.released == 'true'
700
740
  with:
701
741
  github_token: ${{ secrets.GITHUB_TOKEN }}
702
742
  tag: ${{ steps.release.outputs.tag }}
703
743
 
744
+ - name: Publish | Upload package to PyPI
745
+ uses: pypa/gh-action-pypi-publish@SHA1_HASH # vX.X.X
746
+ if: steps.release.outputs.released == 'true'
747
+
704
748
  .. important::
705
749
  The `concurrency`_ directive is used on the job to prevent race conditions of more than
706
750
  one release job in the case if there are multiple pushes to ``main`` in a short period
707
751
  of time.
708
752
 
753
+ Secondly the *Evaluate | Verify upstream has NOT changed* step is used to ensure that the
754
+ upstream branch has not changed while the workflow was running. This is important because
755
+ we are committing a version change (``commit: true``) and there might be a push collision
756
+ that would cause undesired behavior. Review Issue `#1201`_ for more detailed information.
757
+
709
758
  .. warning::
710
759
  You must set ``fetch-depth`` to 0 when using ``actions/checkout@v4``, since
711
760
  Python Semantic Release needs access to the full history to build a changelog
@@ -721,6 +770,7 @@ to the GitHub Release Assets as well.
721
770
  case, you will also need to pass the new token to ``actions/checkout`` (as
722
771
  the ``token`` input) in order to gain push access.
723
772
 
773
+ .. _#1201: https://github.com/python-semantic-release/python-semantic-release/issues/1201
724
774
  .. _concurrency: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idconcurrency
725
775
 
726
776
  Version Overrides Example
@@ -744,7 +794,7 @@ The equivalent GitHub Action configuration would be:
744
794
 
745
795
  - name: Action | Semantic Version Release
746
796
  # Adjust tag with desired version if applicable.
747
- uses: python-semantic-release/python-semantic-release@v9.19.1
797
+ uses: python-semantic-release/python-semantic-release@v9.21.0
748
798
  with:
749
799
  github_token: ${{ secrets.GITHUB_TOKEN }}
750
800
  force: patch
@@ -766,19 +816,84 @@ For multiple packages, you would need to run the action multiple times, to relea
766
816
  each project. The following example demonstrates how to release two projects in
767
817
  a monorepo.
768
818
 
819
+ Remember that for each release of each submodule you will then need to handle publishing
820
+ each package separately as well. This is dependent on the result of your build commands.
821
+ In the example below, we assume a simple ``build`` module command to build a ``sdist``
822
+ and wheel artifacts into the submodule's ``dist`` directory.
823
+
769
824
  The ``directory`` input directive is also available for the Python Semantic Release
770
825
  Publish Action.
771
826
 
772
827
  .. code:: yaml
773
828
 
774
- - name: Release Project 1
775
- uses: python-semantic-release/python-semantic-release@v9.19.1
776
- with:
777
- directory: ./project1
778
- github_token: ${{ secrets.GITHUB_TOKEN }}
779
-
780
- - name: Release Project 2
781
- uses: python-semantic-release/python-semantic-release@v9.19.1
782
- with:
783
- directory: ./project2
784
- github_token: ${{ secrets.GITHUB_TOKEN }}
829
+ jobs:
830
+
831
+ release:
832
+
833
+ env:
834
+ SUBMODULE_1_DIR: project1
835
+ SUBMODULE_2_DIR: project2
836
+
837
+ steps:
838
+
839
+ # ------------------------------------------------------------------- #
840
+ # Note the use of different IDs to distinguish which submodule was #
841
+ # identified to be released. The subsequent actions then reference #
842
+ # their specific release ID to determine if a release occurred. #
843
+ # ------------------------------------------------------------------- #
844
+
845
+ - name: Release submodule 1
846
+ id: release-submod-1
847
+ uses: python-semantic-release/python-semantic-release@v9.21.0
848
+ with:
849
+ directory: ${{ env.SUBMODULE_1_DIR }}
850
+ github_token: ${{ secrets.GITHUB_TOKEN }}
851
+
852
+ - name: Release submodule 2
853
+ id: release-submod-2
854
+ uses: python-semantic-release/python-semantic-release@v9.21.0
855
+ with:
856
+ directory: ${{ env.SUBMODULE_2_DIR }}
857
+ github_token: ${{ secrets.GITHUB_TOKEN }}
858
+
859
+ # ------------------------------------------------------------------- #
860
+ # For each submodule, you will have to publish the package separately #
861
+ # and only attempt to publish if the release for that submodule was #
862
+ # deemed a release (and the release was successful). #
863
+ # ------------------------------------------------------------------- #
864
+
865
+ - name: Publish | Upload package 1 to GitHub Release Assets
866
+ uses: python-semantic-release/publish-action@v9.21.0
867
+ if: steps.release-submod-1.outputs.released == 'true'
868
+ with:
869
+ directory: ${{ env.SUBMODULE_1_DIR }}
870
+ github_token: ${{ secrets.GITHUB_TOKEN }}
871
+ tag: ${{ steps.release-submod-1.outputs.tag }}
872
+
873
+ - name: Publish | Upload package 2 to GitHub Release Assets
874
+ uses: python-semantic-release/publish-action@v9.21.0
875
+ if: steps.release-submod-2.outputs.released == 'true'
876
+ with:
877
+ directory: ${{ env.SUBMODULE_2_DIR }}
878
+ github_token: ${{ secrets.GITHUB_TOKEN }}
879
+ tag: ${{ steps.release-submod-2.outputs.tag }}
880
+
881
+ # ------------------------------------------------------------------- #
882
+ # Python Semantic Release is not responsible for publishing your #
883
+ # python artifacts to PyPI. Use the official PyPA publish action #
884
+ # instead. The following steps are an example but is not guaranteed #
885
+ # to work as the action is not maintained by the #
886
+ # python-semantic-release team. #
887
+ # ------------------------------------------------------------------- #
888
+
889
+ - name: Publish | Upload package 1 to PyPI
890
+ uses: pypa/gh-action-pypi-publish@SHA1_HASH # vX.X.X
891
+ if: steps.release-submod-1.outputs.released == 'true'
892
+ with:
893
+ packages-dir: ${{ format('{}/dist', env.SUBMODULE_1_DIR) }}
894
+
895
+ - name: Publish | Upload package 2 to PyPI
896
+ uses: pypa/gh-action-pypi-publish@SHA1_HASH # vX.X.X
897
+ if: steps.release-submod-2.outputs.released == 'true'
898
+ with:
899
+ packages-dir: ${{ format('{}/dist', env.SUBMODULE_2_DIR) }}
@@ -1209,9 +1209,9 @@ within the TOML file, which is more accurate than a pattern replace.
1209
1209
  The ``version_toml`` option is commonly used to update the version number in the project
1210
1210
  definition file: ``pyproject.toml`` as seen in the example below.
1211
1211
 
1212
- As of ${NEW_RELEASE_TAG}, the ``version_toml`` option accepts a colon-separated definition
1212
+ As of v9.20.0, the ``version_toml`` option accepts a colon-separated definition
1213
1213
  with either 2 or 3 parts. The 2-part definition includes the file path and the version
1214
- parameter (in dot-notation). Newly with ${NEW_RELEASE_TAG}, it also accepts an optional
1214
+ parameter (in dot-notation). Newly with v9.20.0, it also accepts an optional
1215
1215
  3rd part to allow configuration of the format type.
1216
1216
 
1217
1217
  **Available Format Types**
@@ -1271,9 +1271,9 @@ The ``version_variables`` configuration option is a list of string definitions
1271
1271
  that defines where the version number should be updated in the repository, when
1272
1272
  a new version is released.
1273
1273
 
1274
- As of ${NEW_RELEASE_TAG}, the ``version_variables`` option accepts a
1274
+ As of v9.20.0, the ``version_variables`` option accepts a
1275
1275
  colon-separated definition with either 2 or 3 parts. The 2-part definition includes
1276
- the file path and the variable name. Newly with ${NEW_RELEASE_TAG}, it also accepts
1276
+ the file path and the variable name. Newly with v9.20.0, it also accepts
1277
1277
  an optional 3rd part to allow configuration of the format type.
1278
1278
 
1279
1279
  **Available Format Types**
@@ -1283,7 +1283,7 @@ an optional 3rd part to allow configuration of the format type.
1283
1283
 
1284
1284
  If the format type is not specified, it will default to the number format.
1285
1285
 
1286
- Prior to ${NEW_RELEASE_TAG}, PSR only supports entries with the first 2-parts
1286
+ Prior to v9.20.0, PSR only supports entries with the first 2-parts
1287
1287
  as the tag format type was not available and would only replace numeric
1288
1288
  version numbers.
1289
1289
 
@@ -1,12 +1,12 @@
1
1
  # Ref: https://packaging.python.org/en/latest/specifications/declaring-project-metadata/
2
2
  # and https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
3
3
  [build-system]
4
- requires = ["setuptools ~= 75.3.0", "wheel ~= 0.42"]
4
+ requires = ["setuptools >= 75.3.0, < 81.0.0", "wheel ~= 0.42"]
5
5
  build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "python-semantic-release"
9
- version = "9.20.0"
9
+ version = "9.21.1"
10
10
  description = "Automatic Semantic Versioning for Python projects"
11
11
  requires-python = ">=3.8"
12
12
  license = { text = "MIT" }
@@ -28,17 +28,18 @@ dependencies = [
28
28
  "gitpython ~= 3.0",
29
29
  "requests ~= 2.25",
30
30
  "jinja2 ~= 3.1",
31
- "python-gitlab ~= 4.0",
31
+ "python-gitlab >= 4.0.0, < 6.0.0",
32
32
  "tomlkit ~= 0.11",
33
33
  "dotty-dict ~= 1.3",
34
34
  "importlib-resources ~= 6.0",
35
35
  "pydantic ~= 2.0",
36
- "rich ~= 13.0",
36
+ "rich ~= 14.0",
37
37
  "shellingham ~= 1.5",
38
38
  "Deprecated ~= 1.2", # Backport of deprecated decorator for python 3.8
39
39
  ]
40
40
 
41
41
  [project.scripts]
42
+ python-semantic-release = "semantic_release.__main__:main"
42
43
  semantic-release = "semantic_release.__main__:main"
43
44
  psr = "semantic_release.__main__:main"
44
45
 
@@ -67,7 +68,7 @@ test = [
67
68
  "pyyaml ~= 6.0",
68
69
  "pytest ~= 8.3",
69
70
  "pytest-clarity ~= 1.0",
70
- "pytest-cov ~= 5.0",
71
+ "pytest-cov >= 5.0.0, < 7.0.0",
71
72
  "pytest-env ~= 1.0",
72
73
  "pytest-lazy-fixtures ~= 1.1.1",
73
74
  "pytest-mock ~= 3.0",
@@ -411,7 +412,6 @@ build_command = """
411
412
  python -m build .
412
413
  """
413
414
  major_on_zero = true
414
- version_variables = ["src/semantic_release/__init__.py:__version__"]
415
415
  version_toml = ["pyproject.toml:project.version"]
416
416
 
417
417
  [tool.semantic_release.changelog]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: python-semantic-release
3
- Version: 9.20.0
3
+ Version: 9.21.1
4
4
  Summary: Automatic Semantic Versioning for Python projects
5
5
  Author-email: Rolf Erik Lekang <me@rolflekang.com>
6
6
  License: MIT
@@ -26,12 +26,12 @@ Requires-Dist: click-option-group~=0.5
26
26
  Requires-Dist: gitpython~=3.0
27
27
  Requires-Dist: requests~=2.25
28
28
  Requires-Dist: jinja2~=3.1
29
- Requires-Dist: python-gitlab~=4.0
29
+ Requires-Dist: python-gitlab<6.0.0,>=4.0.0
30
30
  Requires-Dist: tomlkit~=0.11
31
31
  Requires-Dist: dotty-dict~=1.3
32
32
  Requires-Dist: importlib-resources~=6.0
33
33
  Requires-Dist: pydantic~=2.0
34
- Requires-Dist: rich~=13.0
34
+ Requires-Dist: rich~=14.0
35
35
  Requires-Dist: shellingham~=1.5
36
36
  Requires-Dist: Deprecated~=1.2
37
37
  Provides-Extra: build
@@ -49,7 +49,7 @@ Requires-Dist: freezegun~=1.5; extra == "test"
49
49
  Requires-Dist: pyyaml~=6.0; extra == "test"
50
50
  Requires-Dist: pytest~=8.3; extra == "test"
51
51
  Requires-Dist: pytest-clarity~=1.0; extra == "test"
52
- Requires-Dist: pytest-cov~=5.0; extra == "test"
52
+ Requires-Dist: pytest-cov<7.0.0,>=5.0.0; extra == "test"
53
53
  Requires-Dist: pytest-env~=1.0; extra == "test"
54
54
  Requires-Dist: pytest-lazy-fixtures~=1.1.1; extra == "test"
55
55
  Requires-Dist: pytest-mock~=3.0; extra == "test"
@@ -67,6 +67,7 @@ Requires-Dist: mypy==1.15.0; extra == "mypy"
67
67
  Requires-Dist: types-Deprecated~=1.2; extra == "mypy"
68
68
  Requires-Dist: types-requests~=2.32.0; extra == "mypy"
69
69
  Requires-Dist: types-pyyaml~=6.0; extra == "mypy"
70
+ Dynamic: license-file
70
71
 
71
72
  Python Semantic Release
72
73
  ***********************
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  psr = semantic_release.__main__:main
3
+ python-semantic-release = semantic_release.__main__:main
3
4
  semantic-release = semantic_release.__main__:main
@@ -3,12 +3,12 @@ click-option-group~=0.5
3
3
  gitpython~=3.0
4
4
  requests~=2.25
5
5
  jinja2~=3.1
6
- python-gitlab~=4.0
6
+ python-gitlab<6.0.0,>=4.0.0
7
7
  tomlkit~=0.11
8
8
  dotty-dict~=1.3
9
9
  importlib-resources~=6.0
10
10
  pydantic~=2.0
11
- rich~=13.0
11
+ rich~=14.0
12
12
  shellingham~=1.5
13
13
  Deprecated~=1.2
14
14
 
@@ -40,7 +40,7 @@ freezegun~=1.5
40
40
  pyyaml~=6.0
41
41
  pytest~=8.3
42
42
  pytest-clarity~=1.0
43
- pytest-cov~=5.0
43
+ pytest-cov<7.0.0,>=5.0.0
44
44
  pytest-env~=1.0
45
45
  pytest-lazy-fixtures~=1.1.1
46
46
  pytest-mock~=3.0
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import importlib.metadata
6
+
5
7
  from semantic_release.commit_parser import (
6
8
  CommitParser,
7
9
  ParsedCommit,
@@ -24,7 +26,7 @@ from semantic_release.version import (
24
26
  tags_and_versions,
25
27
  )
26
28
 
27
- __version__ = "9.20.0"
29
+ __version__ = importlib.metadata.version(f"python_{__package__}".replace("_", "-"))
28
30
 
29
31
  __all__ = [
30
32
  "CommitParser",
@@ -95,10 +95,15 @@ class RemoteHvcsBase(HvcsBase, metaclass=ABCMeta):
95
95
  query: str | None = None,
96
96
  fragment: str | None = None,
97
97
  ) -> str:
98
- # Ensure any path prefix is transfered but not doubled up on the derived url
98
+ # Ensure any path prefix is transferred but not doubled up on the derived url
99
+ normalized_path = (
100
+ f"{self.hvcs_domain.path}/{path}"
101
+ if self.hvcs_domain.path and not path.startswith(self.hvcs_domain.path)
102
+ else path
103
+ )
99
104
  return self._derive_url(
100
105
  self.hvcs_domain,
101
- path=f"{self.hvcs_domain.path or ''}/{path.lstrip(self.hvcs_domain.path)}",
106
+ path=normalized_path,
102
107
  auth=auth,
103
108
  query=query,
104
109
  fragment=fragment,
@@ -123,10 +128,15 @@ class RemoteHvcsBase(HvcsBase, metaclass=ABCMeta):
123
128
  query: str | None = None,
124
129
  fragment: str | None = None,
125
130
  ) -> str:
126
- # Ensure any api path prefix is transfered but not doubled up on the derived api url
131
+ # Ensure any api path prefix is transferred but not doubled up on the derived api url
132
+ normalized_endpoint = (
133
+ f"{self.api_url.path}/{endpoint}"
134
+ if self.api_url.path and not endpoint.startswith(self.api_url.path)
135
+ else endpoint
136
+ )
127
137
  return self._derive_url(
128
138
  self.api_url,
129
- path=f"{self.api_url.path or ''}/{endpoint.lstrip(self.api_url.path)}",
139
+ path=normalized_endpoint,
130
140
  auth=auth,
131
141
  query=query,
132
142
  fragment=fragment,
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import subprocess
4
5
  from pathlib import Path
5
6
  from textwrap import dedent
6
7
  from typing import TYPE_CHECKING
@@ -12,7 +13,7 @@ from pytest_lazy_fixtures.lazy_fixture import lf as lazy_fixture
12
13
  from semantic_release import __version__
13
14
  from semantic_release.cli.commands.main import main
14
15
 
15
- from tests.const import MAIN_PROG_NAME, VERSION_SUBCMD
16
+ from tests.const import MAIN_PROG_NAME, SUCCESS_EXIT_CODE, VERSION_SUBCMD
16
17
  from tests.fixtures.repos import repo_w_no_tags_conventional_commits
17
18
  from tests.util import assert_exit_code, assert_successful_exit_code
18
19
 
@@ -25,6 +26,30 @@ if TYPE_CHECKING:
25
26
  from tests.fixtures.git_repo import BuiltRepoResult
26
27
 
27
28
 
29
+ @pytest.mark.parametrize(
30
+ "project_script_name",
31
+ [
32
+ "python-semantic-release",
33
+ "semantic-release",
34
+ "psr",
35
+ ],
36
+ )
37
+ def test_entrypoint_scripts(project_script_name: str):
38
+ # Setup
39
+ command = str.join(" ", [project_script_name, "--version"])
40
+ expected_output = f"semantic-release, version {__version__}\n"
41
+
42
+ # Act
43
+ proc = subprocess.run( # noqa: S602, PLW1510
44
+ command, shell=True, text=True, capture_output=True
45
+ )
46
+
47
+ # Evaluate
48
+ assert SUCCESS_EXIT_CODE == proc.returncode # noqa: SIM300
49
+ assert expected_output == proc.stdout
50
+ assert not proc.stderr
51
+
52
+
28
53
  def test_main_prints_version_and_exits(cli_runner: CliRunner):
29
54
  cli_cmd = [MAIN_PROG_NAME, "--version"]
30
55
 
@@ -301,6 +301,29 @@ def test_commit_hash_url(default_bitbucket_client: Bitbucket):
301
301
  assert expected_url == default_bitbucket_client.commit_hash_url(sha)
302
302
 
303
303
 
304
+ def test_commit_hash_url_w_custom_server():
305
+ """
306
+ Test the commit hash URL generation for a self-hosted Bitbucket server with prefix.
307
+
308
+ ref: https://github.com/python-semantic-release/python-semantic-release/issues/1204
309
+ """
310
+ sha = "244f7e11bcb1e1ce097db61594056bc2a32189a0"
311
+ expected_url = "{server}/{owner}/{repo}/commits/{sha}".format(
312
+ server=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
313
+ owner="foo",
314
+ repo=EXAMPLE_REPO_NAME,
315
+ sha=sha,
316
+ )
317
+
318
+ with mock.patch.dict(os.environ, {}, clear=True):
319
+ actual_url = Bitbucket(
320
+ remote_url=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo/foo/{EXAMPLE_REPO_NAME}.git",
321
+ hvcs_domain=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
322
+ ).commit_hash_url(sha)
323
+
324
+ assert expected_url == actual_url
325
+
326
+
304
327
  @pytest.mark.parametrize("pr_number", (666, "666", "#666"))
305
328
  def test_pull_request_url(default_bitbucket_client: Bitbucket, pr_number: int | str):
306
329
  expected_url = "{server}/{owner}/{repo}/pull-requests/{pr_number}".format(
@@ -203,6 +203,29 @@ def test_commit_hash_url(default_gitea_client: Gitea):
203
203
  assert expected_url == default_gitea_client.commit_hash_url(sha)
204
204
 
205
205
 
206
+ def test_commit_hash_url_w_custom_server():
207
+ """
208
+ Test the commit hash URL generation for a self-hosted Bitbucket server with prefix.
209
+
210
+ ref: https://github.com/python-semantic-release/python-semantic-release/issues/1204
211
+ """
212
+ sha = "244f7e11bcb1e1ce097db61594056bc2a32189a0"
213
+ expected_url = "{server}/{owner}/{repo}/commit/{sha}".format(
214
+ server=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
215
+ owner="foo",
216
+ repo=EXAMPLE_REPO_NAME,
217
+ sha=sha,
218
+ )
219
+
220
+ with mock.patch.dict(os.environ, {}, clear=True):
221
+ actual_url = Gitea(
222
+ remote_url=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo/foo/{EXAMPLE_REPO_NAME}.git",
223
+ hvcs_domain=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
224
+ ).commit_hash_url(sha)
225
+
226
+ assert expected_url == actual_url
227
+
228
+
206
229
  @pytest.mark.parametrize("issue_number", (666, "666", "#666"))
207
230
  def test_issue_url(default_gitea_client: Gitea, issue_number: int | str):
208
231
  expected_url = "{server}/{owner}/{repo}/issues/{issue_number}".format(
@@ -375,6 +375,29 @@ def test_commit_hash_url(default_gh_client: Github):
375
375
  assert expected_url == default_gh_client.commit_hash_url(sha)
376
376
 
377
377
 
378
+ def test_commit_hash_url_w_custom_server():
379
+ """
380
+ Test the commit hash URL generation for a self-hosted Bitbucket server with prefix.
381
+
382
+ ref: https://github.com/python-semantic-release/python-semantic-release/issues/1204
383
+ """
384
+ sha = "244f7e11bcb1e1ce097db61594056bc2a32189a0"
385
+ expected_url = "{server}/{owner}/{repo}/commit/{sha}".format(
386
+ server=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
387
+ owner="foo",
388
+ repo=EXAMPLE_REPO_NAME,
389
+ sha=sha,
390
+ )
391
+
392
+ with mock.patch.dict(os.environ, {}, clear=True):
393
+ actual_url = Github(
394
+ remote_url=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo/foo/{EXAMPLE_REPO_NAME}.git",
395
+ hvcs_domain=f"https://{EXAMPLE_HVCS_DOMAIN}/projects/demo-foo",
396
+ ).commit_hash_url(sha)
397
+
398
+ assert expected_url == actual_url
399
+
400
+
378
401
  @pytest.mark.parametrize("issue_number", (666, "666", "#666"))
379
402
  def test_issue_url(default_gh_client: Github, issue_number: str | int):
380
403
  expected_url = "{server}/{owner}/{repo}/issues/{issue_num}".format(