RepoPlone 1.0.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 (310) hide show
  1. repoplone-1.0.0/.gitignore +14 -0
  2. repoplone-1.0.0/Makefile +98 -0
  3. repoplone-1.0.0/PKG-INFO +491 -0
  4. repoplone-1.0.0/README.md +452 -0
  5. repoplone-1.0.0/pyproject.toml +182 -0
  6. repoplone-1.0.0/src/repoplone/__init__.py +17 -0
  7. repoplone-1.0.0/src/repoplone/_types/__init__.py +43 -0
  8. repoplone-1.0.0/src/repoplone/_types/package.py +40 -0
  9. repoplone-1.0.0/src/repoplone/_types/pipeline.py +38 -0
  10. repoplone-1.0.0/src/repoplone/_types/repository.py +134 -0
  11. repoplone-1.0.0/src/repoplone/app.py +20 -0
  12. repoplone-1.0.0/src/repoplone/cli.py +75 -0
  13. repoplone-1.0.0/src/repoplone/commands/__init__.py +0 -0
  14. repoplone-1.0.0/src/repoplone/commands/changelog.py +23 -0
  15. repoplone-1.0.0/src/repoplone/commands/dependencies/__init__.py +211 -0
  16. repoplone-1.0.0/src/repoplone/commands/release.py +64 -0
  17. repoplone-1.0.0/src/repoplone/commands/settings.py +102 -0
  18. repoplone-1.0.0/src/repoplone/commands/versions.py +72 -0
  19. repoplone-1.0.0/src/repoplone/defaults.py +4 -0
  20. repoplone-1.0.0/src/repoplone/distributions.py +53 -0
  21. repoplone-1.0.0/src/repoplone/exceptions.py +13 -0
  22. repoplone-1.0.0/src/repoplone/integrations/__init__.py +0 -0
  23. repoplone-1.0.0/src/repoplone/integrations/base.py +46 -0
  24. repoplone-1.0.0/src/repoplone/integrations/make.py +15 -0
  25. repoplone-1.0.0/src/repoplone/integrations/pocompile.py +19 -0
  26. repoplone-1.0.0/src/repoplone/integrations/release_it.py +42 -0
  27. repoplone-1.0.0/src/repoplone/integrations/towncrier.py +50 -0
  28. repoplone-1.0.0/src/repoplone/integrations/uv.py +60 -0
  29. repoplone-1.0.0/src/repoplone/release/__init__.py +0 -0
  30. repoplone-1.0.0/src/repoplone/release/_types.py +12 -0
  31. repoplone-1.0.0/src/repoplone/release/config.py +143 -0
  32. repoplone-1.0.0/src/repoplone/release/pipeline.py +59 -0
  33. repoplone-1.0.0/src/repoplone/release/steps/__init__.py +62 -0
  34. repoplone-1.0.0/src/repoplone/release/steps/backend.py +21 -0
  35. repoplone-1.0.0/src/repoplone/release/steps/changelog.py +22 -0
  36. repoplone-1.0.0/src/repoplone/release/steps/frontend.py +21 -0
  37. repoplone-1.0.0/src/repoplone/release/steps/git.py +20 -0
  38. repoplone-1.0.0/src/repoplone/release/steps/github.py +34 -0
  39. repoplone-1.0.0/src/repoplone/release/steps/local_step.py +80 -0
  40. repoplone-1.0.0/src/repoplone/release/steps/repository.py +41 -0
  41. repoplone-1.0.0/src/repoplone/release/steps/summary.py +17 -0
  42. repoplone-1.0.0/src/repoplone/release/steps/version.py +70 -0
  43. repoplone-1.0.0/src/repoplone/settings/__init__.py +133 -0
  44. repoplone-1.0.0/src/repoplone/settings/default.toml +55 -0
  45. repoplone-1.0.0/src/repoplone/settings/parser.py +30 -0
  46. repoplone-1.0.0/src/repoplone/utils/__init__.py +191 -0
  47. repoplone-1.0.0/src/repoplone/utils/_git.py +78 -0
  48. repoplone-1.0.0/src/repoplone/utils/_github.py +104 -0
  49. repoplone-1.0.0/src/repoplone/utils/_hatch.py +23 -0
  50. repoplone-1.0.0/src/repoplone/utils/_path.py +21 -0
  51. repoplone-1.0.0/src/repoplone/utils/_requests.py +27 -0
  52. repoplone-1.0.0/src/repoplone/utils/changelog.py +149 -0
  53. repoplone-1.0.0/src/repoplone/utils/dependencies/__init__.py +51 -0
  54. repoplone-1.0.0/src/repoplone/utils/dependencies/constraints.py +85 -0
  55. repoplone-1.0.0/src/repoplone/utils/dependencies/frontend.py +158 -0
  56. repoplone-1.0.0/src/repoplone/utils/dependencies/pyproject.py +246 -0
  57. repoplone-1.0.0/src/repoplone/utils/dependencies/versions.py +126 -0
  58. repoplone-1.0.0/src/repoplone/utils/display.py +72 -0
  59. repoplone-1.0.0/src/repoplone/utils/python_release.py +37 -0
  60. repoplone-1.0.0/src/repoplone/utils/release.py +125 -0
  61. repoplone-1.0.0/src/repoplone/utils/settings.py +36 -0
  62. repoplone-1.0.0/src/repoplone/utils/toml.py +26 -0
  63. repoplone-1.0.0/src/repoplone/utils/versions/__init__.py +245 -0
  64. repoplone-1.0.0/src/repoplone/utils/versions/calver.py +29 -0
  65. repoplone-1.0.0/src/repoplone/utils/versions/semver.py +53 -0
  66. repoplone-1.0.0/tests/_resources/fake-addon/CHANGELOG.md +3 -0
  67. repoplone-1.0.0/tests/_resources/fake-addon/backend/CHANGELOG.md +3 -0
  68. repoplone-1.0.0/tests/_resources/fake-addon/backend/README.md +1 -0
  69. repoplone-1.0.0/tests/_resources/fake-addon/backend/news/.changelog_template.jinja +15 -0
  70. repoplone-1.0.0/tests/_resources/fake-addon/backend/news/.gitkeep +1 -0
  71. repoplone-1.0.0/tests/_resources/fake-addon/backend/news/1.feature +1 -0
  72. repoplone-1.0.0/tests/_resources/fake-addon/backend/pyproject.toml +180 -0
  73. repoplone-1.0.0/tests/_resources/fake-addon/backend/src/fake/project/__init__.py +14 -0
  74. repoplone-1.0.0/tests/_resources/fake-addon/backend/version.txt +1 -0
  75. repoplone-1.0.0/tests/_resources/fake-addon/docker-compose.yml +110 -0
  76. repoplone-1.0.0/tests/_resources/fake-addon/frontend/README.md +1 -0
  77. repoplone-1.0.0/tests/_resources/fake-addon/frontend/mrs.developer.json +9 -0
  78. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/.release-it.json +21 -0
  79. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/CHANGELOG.md +3 -0
  80. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/news/.gitkeep +0 -0
  81. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/news/1.feature +1 -0
  82. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  83. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/package.json +57 -0
  84. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/src/index.js +0 -0
  85. repoplone-1.0.0/tests/_resources/fake-addon/frontend/packages/fake-addon/towncrier.toml +33 -0
  86. repoplone-1.0.0/tests/_resources/fake-addon/frontend/pnpm-lock.yaml +32018 -0
  87. repoplone-1.0.0/tests/_resources/fake-addon/frontend/pnpm-workspace.yaml +5 -0
  88. repoplone-1.0.0/tests/_resources/fake-addon/repository.toml +22 -0
  89. repoplone-1.0.0/tests/_resources/fake-addon/version.txt +1 -0
  90. repoplone-1.0.0/tests/_resources/fake-backend-only/CHANGELOG.md +1 -0
  91. repoplone-1.0.0/tests/_resources/fake-backend-only/backend/CHANGELOG.md +1 -0
  92. repoplone-1.0.0/tests/_resources/fake-backend-only/backend/pyproject.toml +13 -0
  93. repoplone-1.0.0/tests/_resources/fake-backend-only/backend/testpkg/__init__.py +1 -0
  94. repoplone-1.0.0/tests/_resources/fake-backend-only/docker-compose.yml +0 -0
  95. repoplone-1.0.0/tests/_resources/fake-backend-only/repository.toml +20 -0
  96. repoplone-1.0.0/tests/_resources/fake-backend-only/version.txt +1 -0
  97. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/CHANGELOG.md +1 -0
  98. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/backend/CHANGELOG.md +1 -0
  99. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/backend/pyproject.toml +13 -0
  100. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/backend/testpkg/__init__.py +0 -0
  101. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/docker-compose.yml +0 -0
  102. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/repository.toml +13 -0
  103. repoplone-1.0.0/tests/_resources/fake-backend-only-no-section/version.txt +1 -0
  104. repoplone-1.0.0/tests/_resources/fake-frontend-only/CHANGELOG.md +1 -0
  105. repoplone-1.0.0/tests/_resources/fake-frontend-only/docker-compose.yml +0 -0
  106. repoplone-1.0.0/tests/_resources/fake-frontend-only/frontend/mrs.developer.json +6 -0
  107. repoplone-1.0.0/tests/_resources/fake-frontend-only/frontend/package.json +1 -0
  108. repoplone-1.0.0/tests/_resources/fake-frontend-only/frontend/packages/fake-frontend-only/CHANGELOG.md +1 -0
  109. repoplone-1.0.0/tests/_resources/fake-frontend-only/frontend/packages/fake-frontend-only/package.json +8 -0
  110. repoplone-1.0.0/tests/_resources/fake-frontend-only/repository.toml +20 -0
  111. repoplone-1.0.0/tests/_resources/fake-frontend-only/version.txt +1 -0
  112. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/CHANGELOG.md +1 -0
  113. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/docker-compose.yml +0 -0
  114. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/frontend/mrs.developer.json +6 -0
  115. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/frontend/packages/fake-frontend-only-no-section/CHANGELOG.md +1 -0
  116. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/frontend/packages/fake-frontend-only-no-section/package.json +8 -0
  117. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/repository.toml +13 -0
  118. repoplone-1.0.0/tests/_resources/fake-frontend-only-no-section/version.txt +1 -0
  119. repoplone-1.0.0/tests/_resources/fake-project/CHANGELOG.md +3 -0
  120. repoplone-1.0.0/tests/_resources/fake-project/backend/CHANGELOG.md +3 -0
  121. repoplone-1.0.0/tests/_resources/fake-project/backend/README.md +1 -0
  122. repoplone-1.0.0/tests/_resources/fake-project/backend/news/.changelog_template.jinja +15 -0
  123. repoplone-1.0.0/tests/_resources/fake-project/backend/news/.gitkeep +1 -0
  124. repoplone-1.0.0/tests/_resources/fake-project/backend/news/1.feature +1 -0
  125. repoplone-1.0.0/tests/_resources/fake-project/backend/pyproject.toml +630 -0
  126. repoplone-1.0.0/tests/_resources/fake-project/backend/src/fake/project/__init__.py +14 -0
  127. repoplone-1.0.0/tests/_resources/fake-project/docker-compose.yml +110 -0
  128. repoplone-1.0.0/tests/_resources/fake-project/frontend/README.md +1 -0
  129. repoplone-1.0.0/tests/_resources/fake-project/frontend/mrs.developer.json +9 -0
  130. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/.release-it.json +21 -0
  131. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/CHANGELOG.md +3 -0
  132. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/news/.gitkeep +0 -0
  133. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/news/1.feature +1 -0
  134. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  135. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/package.json +57 -0
  136. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/src/index.js +0 -0
  137. repoplone-1.0.0/tests/_resources/fake-project/frontend/packages/fake-project/towncrier.toml +33 -0
  138. repoplone-1.0.0/tests/_resources/fake-project/frontend/pnpm-lock.yaml +32018 -0
  139. repoplone-1.0.0/tests/_resources/fake-project/frontend/pnpm-workspace.yaml +5 -0
  140. repoplone-1.0.0/tests/_resources/fake-project/repository.toml +27 -0
  141. repoplone-1.0.0/tests/_resources/fake-project/version.txt +1 -0
  142. repoplone-1.0.0/tests/_resources/fake-project-calver/CHANGELOG.md +3 -0
  143. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/CHANGELOG.md +3 -0
  144. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/README.md +1 -0
  145. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/news/.changelog_template.jinja +15 -0
  146. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/news/.gitkeep +1 -0
  147. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/news/1.feature +1 -0
  148. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/pyproject.toml +630 -0
  149. repoplone-1.0.0/tests/_resources/fake-project-calver/backend/src/fake/project/__init__.py +14 -0
  150. repoplone-1.0.0/tests/_resources/fake-project-calver/docker-compose.yml +110 -0
  151. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/README.md +1 -0
  152. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/mrs.developer.json +9 -0
  153. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/.release-it.json +21 -0
  154. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/CHANGELOG.md +3 -0
  155. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/news/.gitkeep +0 -0
  156. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/news/1.feature +1 -0
  157. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  158. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/package.json +57 -0
  159. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/src/index.js +0 -0
  160. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/packages/fake-project/towncrier.toml +33 -0
  161. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/pnpm-lock.yaml +32018 -0
  162. repoplone-1.0.0/tests/_resources/fake-project-calver/frontend/pnpm-workspace.yaml +5 -0
  163. repoplone-1.0.0/tests/_resources/fake-project-calver/repository.toml +21 -0
  164. repoplone-1.0.0/tests/_resources/fake-project-calver/version.txt +1 -0
  165. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/CHANGELOG.md +3 -0
  166. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/CHANGELOG.md +3 -0
  167. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/README.md +1 -0
  168. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/news/.changelog_template.jinja +15 -0
  169. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/news/.gitkeep +1 -0
  170. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/news/1.feature +1 -0
  171. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/pyproject.toml +616 -0
  172. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/backend/src/fake/project/__init__.py +14 -0
  173. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/docker-compose.yml +110 -0
  174. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/README.md +1 -0
  175. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/mrs.developer.json +9 -0
  176. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/.release-it.json +21 -0
  177. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/CHANGELOG.md +3 -0
  178. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/news/.gitkeep +0 -0
  179. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/news/1.feature +1 -0
  180. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  181. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/package.json +58 -0
  182. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/src/index.js +0 -0
  183. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/packages/fake-project/towncrier.toml +33 -0
  184. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/pnpm-lock.yaml +32024 -0
  185. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/frontend/pnpm-workspace.yaml +5 -0
  186. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/news/+changelog.internal +1 -0
  187. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/news/+refactor.internal +1 -0
  188. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/news/.changelog_template.jinja +15 -0
  189. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/repository.toml +30 -0
  190. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/towncrier.toml +33 -0
  191. repoplone-1.0.0/tests/_resources/fake-project-from-distribution/version.txt +1 -0
  192. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/CHANGELOG.md +3 -0
  193. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/CHANGELOG.md +3 -0
  194. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/README.md +1 -0
  195. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/news/.changelog_template.jinja +15 -0
  196. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/news/.gitkeep +1 -0
  197. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/news/1.feature +1 -0
  198. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/pyproject.toml +629 -0
  199. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/backend/src/fake/project/__init__.py +14 -0
  200. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/docker-compose.yml +110 -0
  201. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/README.md +1 -0
  202. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/mrs.developer.json +9 -0
  203. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/.release-it.json +21 -0
  204. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/CHANGELOG.md +3 -0
  205. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/news/.gitkeep +0 -0
  206. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/news/1.feature +1 -0
  207. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  208. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/package.json +57 -0
  209. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/src/index.js +0 -0
  210. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/packages/fake-project/towncrier.toml +33 -0
  211. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/pnpm-lock.yaml +32018 -0
  212. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/frontend/pnpm-workspace.yaml +5 -0
  213. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/news/+changelog.internal +1 -0
  214. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/news/+refactor.internal +1 -0
  215. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/news/.changelog_template.jinja +15 -0
  216. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/repository.toml +31 -0
  217. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/towncrier.toml +33 -0
  218. repoplone-1.0.0/tests/_resources/fake-project-root-changelog/version.txt +1 -0
  219. repoplone-1.0.0/tests/_resources/fake_distribution/CHANGELOG.md +3 -0
  220. repoplone-1.0.0/tests/_resources/fake_distribution/backend/CHANGELOG.md +3 -0
  221. repoplone-1.0.0/tests/_resources/fake_distribution/backend/README.md +1 -0
  222. repoplone-1.0.0/tests/_resources/fake_distribution/backend/news/.changelog_template.jinja +15 -0
  223. repoplone-1.0.0/tests/_resources/fake_distribution/backend/news/.gitkeep +1 -0
  224. repoplone-1.0.0/tests/_resources/fake_distribution/backend/news/1.feature +1 -0
  225. repoplone-1.0.0/tests/_resources/fake_distribution/backend/pyproject.toml +639 -0
  226. repoplone-1.0.0/tests/_resources/fake_distribution/backend/src/fake/distribution/__init__.py +14 -0
  227. repoplone-1.0.0/tests/_resources/fake_distribution/docker-compose.yml +110 -0
  228. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/mrs.developer.json +9 -0
  229. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/CHANGELOG.md +3 -0
  230. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/news/.gitkeep +0 -0
  231. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/news/1.feature +1 -0
  232. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  233. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/package.json +56 -0
  234. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/packages/fake-distribution/towncrier.toml +33 -0
  235. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/pnpm-lock.yaml +32018 -0
  236. repoplone-1.0.0/tests/_resources/fake_distribution/frontend/pnpm-workspace.yaml +5 -0
  237. repoplone-1.0.0/tests/_resources/fake_distribution/repository.toml +20 -0
  238. repoplone-1.0.0/tests/_resources/fake_distribution/version.txt +1 -0
  239. repoplone-1.0.0/tests/_resources/frontend-base-package/CHANGELOG.md +3 -0
  240. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/CHANGELOG.md +3 -0
  241. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/README.md +1 -0
  242. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/news/.changelog_template.jinja +15 -0
  243. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/news/.gitkeep +1 -0
  244. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/news/1.feature +1 -0
  245. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/pyproject.toml +630 -0
  246. repoplone-1.0.0/tests/_resources/frontend-base-package/backend/src/fake/project/__init__.py +14 -0
  247. repoplone-1.0.0/tests/_resources/frontend-base-package/docker-compose.yml +110 -0
  248. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/README.md +1 -0
  249. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/mrs.developer.json +17 -0
  250. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/.release-it.json +21 -0
  251. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/CHANGELOG.md +3 -0
  252. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/news/.gitkeep +0 -0
  253. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/news/1.feature +1 -0
  254. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/node_modules/@plone/scripts/templates/towncrier_template.jinja +10 -0
  255. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/package.json +59 -0
  256. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/src/index.js +0 -0
  257. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/packages/fake-project/towncrier.toml +33 -0
  258. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/pnpm-lock.yaml +32018 -0
  259. repoplone-1.0.0/tests/_resources/frontend-base-package/frontend/pnpm-workspace.yaml +5 -0
  260. repoplone-1.0.0/tests/_resources/frontend-base-package/repository.toml +28 -0
  261. repoplone-1.0.0/tests/_resources/frontend-base-package/version.txt +1 -0
  262. repoplone-1.0.0/tests/_resources/pyproject/distribution.toml +614 -0
  263. repoplone-1.0.0/tests/_resources/pyproject/package.toml +184 -0
  264. repoplone-1.0.0/tests/_resources/pyproject/project.toml +629 -0
  265. repoplone-1.0.0/tests/_resources/repository_toml/deprecated_100.toml +24 -0
  266. repoplone-1.0.0/tests/_resources/repository_toml/old-compose.toml +24 -0
  267. repoplone-1.0.0/tests/_resources/repository_toml/updated.toml +26 -0
  268. repoplone-1.0.0/tests/_resources/vcr/test_deps_check-dist-1.0.0a12.yaml +153 -0
  269. repoplone-1.0.0/tests/_resources/vcr/test_deps_check-dist-1.0.0a17.yaml +153 -0
  270. repoplone-1.0.0/tests/_resources/vcr/test_deps_check-plone-6.0.13.yaml +1906 -0
  271. repoplone-1.0.0/tests/_resources/vcr/test_deps_check-plone-6.1.0.yaml +1906 -0
  272. repoplone-1.0.0/tests/_resources/vcr/test_deps_upgrade-dist-latest.yaml +287 -0
  273. repoplone-1.0.0/tests/_resources/vcr/test_deps_upgrade-plone-latest.yaml +1016 -0
  274. repoplone-1.0.0/tests/_resources/vcr/test_get_package_constraints-Products.CMFPlone-6.1.0.yaml +1740 -0
  275. repoplone-1.0.0/tests/_resources/vcr/test_get_package_constraints-kitconcept.intranet-1.0.0a17.yaml +382 -0
  276. repoplone-1.0.0/tests/_resources/vcr/test_get_remote_uv_dependencies-8e03368fd61ccedd60ffb389ccf29e78.yaml +277 -0
  277. repoplone-1.0.0/tests/_resources/vcr/test_get_remote_uv_dependencies-e7c92eae272959f78219437527680737.yaml +290 -0
  278. repoplone-1.0.0/tests/commands/changelog/test_changelog.py +33 -0
  279. repoplone-1.0.0/tests/commands/deps/conftest.py +212 -0
  280. repoplone-1.0.0/tests/commands/deps/test_deps.py +75 -0
  281. repoplone-1.0.0/tests/commands/release/test_release.py +191 -0
  282. repoplone-1.0.0/tests/commands/settings/test_release_pipeline_commands.py +119 -0
  283. repoplone-1.0.0/tests/commands/settings/test_settings_dump.py +58 -0
  284. repoplone-1.0.0/tests/commands/test_cli.py +12 -0
  285. repoplone-1.0.0/tests/commands/versions/test_versions.py +48 -0
  286. repoplone-1.0.0/tests/commands/versions/test_versions_calver.py +33 -0
  287. repoplone-1.0.0/tests/conftest.py +247 -0
  288. repoplone-1.0.0/tests/release/test_config.py +138 -0
  289. repoplone-1.0.0/tests/release/test_local_step.py +190 -0
  290. repoplone-1.0.0/tests/release/test_pipeline.py +37 -0
  291. repoplone-1.0.0/tests/release/test_steps.py +63 -0
  292. repoplone-1.0.0/tests/release/test_version_step.py +104 -0
  293. repoplone-1.0.0/tests/settings/test_settings.py +257 -0
  294. repoplone-1.0.0/tests/test_monorepo_variants.py +150 -0
  295. repoplone-1.0.0/tests/utils/changelog/conftest.py +15 -0
  296. repoplone-1.0.0/tests/utils/changelog/test_utils_changelog.py +99 -0
  297. repoplone-1.0.0/tests/utils/dependencies/conftest.py +32 -0
  298. repoplone-1.0.0/tests/utils/dependencies/frontend/test_utils_frontend.py +22 -0
  299. repoplone-1.0.0/tests/utils/dependencies/frontend/test_utils_frontend_base_package.py +73 -0
  300. repoplone-1.0.0/tests/utils/dependencies/test_utils_constraints.py +99 -0
  301. repoplone-1.0.0/tests/utils/dependencies/test_utils_pyproject.py +202 -0
  302. repoplone-1.0.0/tests/utils/test_toml.py +60 -0
  303. repoplone-1.0.0/tests/utils/test_utils_github.py +41 -0
  304. repoplone-1.0.0/tests/utils/test_utils_python_release.py +83 -0
  305. repoplone-1.0.0/tests/utils/test_utils_release.py +97 -0
  306. repoplone-1.0.0/tests/utils/test_utils_settings.py +70 -0
  307. repoplone-1.0.0/tests/utils/versions/test_utils_calver.py +31 -0
  308. repoplone-1.0.0/tests/utils/versions/test_utils_semver.py +63 -0
  309. repoplone-1.0.0/tests/utils/versions/test_utils_versions.py +170 -0
  310. repoplone-1.0.0/uv.lock +1986 -0
@@ -0,0 +1,14 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+ .mypy_cache
9
+ .pytest_cache
10
+ .ruff_cache
11
+ .coverage
12
+
13
+ # Virtual environments
14
+ .venv
@@ -0,0 +1,98 @@
1
+ ### Defensive settings for make:
2
+ # https://tech.davis-hansson.com/p/make/
3
+ SHELL:=bash
4
+ .ONESHELL:
5
+ .SHELLFLAGS:=-xeu -o pipefail -O inherit_errexit -c
6
+ .SILENT:
7
+ .DELETE_ON_ERROR:
8
+ MAKEFLAGS+=--warn-undefined-variables
9
+ MAKEFLAGS+=--no-builtin-rules
10
+
11
+ # We like colors
12
+ # From: https://coderwall.com/p/izxssa/colored-makefile-for-golang-projects
13
+ RED=`tput setaf 1`
14
+ GREEN=`tput setaf 2`
15
+ RESET=`tput sgr0`
16
+ YELLOW=`tput setaf 3`
17
+
18
+ # Python checks
19
+ UV?=uv
20
+
21
+ # installed?
22
+ ifeq (, $(shell which $(UV) ))
23
+ $(error "UV=$(UV) not found in $(PATH)")
24
+ endif
25
+
26
+ BACKEND_FOLDER=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
27
+
28
+ VENV_FOLDER=$(BACKEND_FOLDER)/.venv
29
+ BIN_FOLDER=$(VENV_FOLDER)/bin
30
+
31
+ all: build
32
+
33
+ # Add the following 'help' target to your Makefile
34
+ # And add help text after each target name starting with '\#\#'
35
+ .PHONY: help
36
+ help: ## This help message
37
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
38
+
39
+ $(VENV_FOLDER): ## Install dependencies
40
+ @echo "$(GREEN)==> Install environment$(RESET)"
41
+ @uv sync
42
+
43
+ .PHONY: install
44
+ install: $(VENV_FOLDER) ## Install the project
45
+
46
+ .PHONY: clean
47
+ clean: ## Clean environment
48
+ @echo "$(RED)==> Cleaning environment and build$(RESET)"
49
+ rm -rf $(VENV_FOLDER) .python-version .ruff_cache .pytest_cache uv.lock
50
+
51
+ # QA
52
+ .PHONY: lint
53
+ lint: $(VENV_FOLDER) ## Check code base according to our standards
54
+ @echo "$(GREEN)==> Lint codebase$(RESET)"
55
+ @uvx ruff@latest check --fix --config $(BACKEND_FOLDER)/pyproject.toml
56
+ @uvx pyroma@latest -d .
57
+ @uvx check-python-versions@latest .
58
+ @uv run mypy src
59
+
60
+ .PHONY: format
61
+ format: $(VENV_FOLDER) ## Fix code base according to our standards
62
+ @echo "$(GREEN)==> Format codebase$(RESET)"
63
+ @uvx ruff@latest check --select I --fix --config $(BACKEND_FOLDER)/pyproject.toml
64
+ @uvx ruff@latest format --config $(BACKEND_FOLDER)/pyproject.toml
65
+
66
+ .PHONY: check
67
+ check: format lint ## Check and fix code base according to Plone standards
68
+
69
+ ############################################
70
+ # Tests
71
+ ############################################
72
+ .PHONY: test
73
+ test: $(VENV_FOLDER) ## Test the code with pytest
74
+ @echo "🚀 Testing code: Running pytest"
75
+ @uv run pytest
76
+
77
+ .PHONY: test-coverage
78
+ test-coverage: $(VENV_FOLDER) ## Test the code with pytest
79
+ @echo "🚀 Testing code: Running pytest"
80
+ @uv run pytest --cov=repoplone --cov-report term-missing
81
+
82
+ ############################################
83
+ # Release
84
+ ############################################
85
+ .PHONY: changelog
86
+ changelog: $(VENV_FOLDER) ## Display a draft of the changelog
87
+ @echo "🚀 Display the draft for the changelog"
88
+ @uv run towncrier --draft
89
+
90
+ .PHONY: release
91
+ release: $(VENV_FOLDER) ## Release the package to pypi.org
92
+ @echo "🚀 Release package"
93
+ @uv run prerelease
94
+ @uv run release
95
+ @rm -Rf dist
96
+ @uv build
97
+ @uv publish
98
+ @uv run postrelease
@@ -0,0 +1,491 @@
1
+ Metadata-Version: 2.4
2
+ Name: RepoPlone
3
+ Version: 1.0.0
4
+ Summary: Toolset for Plone mono repo maintainers.
5
+ Project-URL: Documentation, https://github.com/plone/repoplone#readme
6
+ Project-URL: Issues, https://github.com/plone/repoplone/issues
7
+ Project-URL: Source, https://github.com/plone/repoplone
8
+ Author-email: kitconcept GmbH <info@kitconcept.com>, PloneGov-BR <gov@plone.org.br>
9
+ License-Expression: MIT
10
+ Keywords: Plone
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Web Environment
13
+ Classifier: Framework :: Plone
14
+ Classifier: Framework :: Plone :: 6.1
15
+ Classifier: Framework :: Plone :: 6.2
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Requires-Python: >=3.10
25
+ Requires-Dist: dynaconf>=3.2.10
26
+ Requires-Dist: gitpython>=3.1.44
27
+ Requires-Dist: hatch>=1.14.0
28
+ Requires-Dist: hatchling>=1.27.0
29
+ Requires-Dist: mxdev>=4.0.3
30
+ Requires-Dist: packaging>=24.2
31
+ Requires-Dist: pyyaml>=6.0.2
32
+ Requires-Dist: requests>=2.32.3
33
+ Requires-Dist: semver>=3.0.4
34
+ Requires-Dist: tomlkit>=0.13.2
35
+ Requires-Dist: towncrier>=24.8.0
36
+ Requires-Dist: typer>=0.19.2
37
+ Requires-Dist: zest-pocompile>=2.0.0
38
+ Description-Content-Type: text/markdown
39
+
40
+ # RepoPlone
41
+
42
+ <div align="center">
43
+
44
+ [![PyPI](https://img.shields.io/pypi/v/repoplone)](https://pypi.org/project/repoplone/)
45
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/repoplone)](https://pypi.org/project/repoplone/)
46
+ [![PyPI - Wheel](https://img.shields.io/pypi/wheel/repoplone)](https://pypi.org/project/repoplone/)
47
+ [![PyPI - License](https://img.shields.io/pypi/l/repoplone)](https://pypi.org/project/repoplone/)
48
+ [![PyPI - Status](https://img.shields.io/pypi/status/repoplone)](https://pypi.org/project/repoplone/)
49
+
50
+
51
+ [![Code Quality](https://github.com/plone/repoplone/actions/workflows/main.yml/badge.svg)](https://github.com/plone/repoplone/actions/workflows/main.yml)
52
+
53
+ [![GitHub contributors](https://img.shields.io/github/contributors/plone/repoplone)](https://github.com/plone/repoplone)
54
+ [![GitHub Repo stars](https://img.shields.io/github/stars/plone/repoplone?style=social)](https://github.com/plone/repoplone)
55
+
56
+ </div>
57
+
58
+ ## Overview
59
+
60
+ The **RepoPlone** is a tool designed to manage mono repos containing a `repository.toml` configuration file at the repository root.
61
+
62
+ It provides various commands to streamline repository management, versioning, and release processes.
63
+
64
+ ## Setup
65
+
66
+ ### Installation
67
+
68
+ To use the latest version of this tool, run the command:
69
+
70
+ ```sh
71
+ uvx repoplone
72
+ ```
73
+
74
+ ### Authentications
75
+
76
+ #### PyPi
77
+
78
+ We use `uv` to make the release, please make sure authentication is in place by setting the environment variable `UV_PUBLISH_TOKEN`:
79
+
80
+ ```sh
81
+ export UV_PUBLISH_TOKEN=<MYTOKEN>
82
+ ```
83
+
84
+ or by using the `uv auth login pypi.org` command, as explained [here](https://docs.astral.sh/uv/concepts/authentication/cli/#the-uv-auth-cli).
85
+
86
+ #### NPM
87
+
88
+ ```sh
89
+ npm whoami
90
+ ```
91
+
92
+ #### GitHub
93
+
94
+ To add releases to GitHub, you should have an environment variable `GITHUB_TOKEN` set -- with a valid token -- before running this tool.
95
+
96
+ ```sh
97
+ export GITHUB_TOKEN='<token>'
98
+ ```
99
+
100
+ ## Usage
101
+
102
+ ### Prepare the repository
103
+
104
+ Ensure that your monorepo contains a `repository.toml` file. Below is an example of such a configuration:
105
+
106
+ ```toml
107
+ [repository]
108
+ name = "fake-distribution"
109
+ changelog = "CHANGELOG.md"
110
+ version = "version.txt"
111
+ version_format = "semver"
112
+ container_images_prefix = "ghcr.io/collective/fake-distribution"
113
+ compose = ["docker-compose.yml"]
114
+
115
+ [repository.towncrier]
116
+ section = "Project"
117
+ settings = "towncrier.toml"
118
+
119
+ [backend.package]
120
+ name = "fake.distribution"
121
+ path = "backend"
122
+ python_version = "3.13"
123
+ python_versions = ["3.11", "3.12", "3.13"]
124
+ plone_versions = ["6.1", "6.2"]
125
+ changelog = "backend/CHANGELOG.md"
126
+ towncrier_settings = "backend/pyproject.toml"
127
+ base_package = "Products.CMFPlone"
128
+ publish = false
129
+
130
+ [frontend.package]
131
+ name = "fake-distribution"
132
+ path = "frontend/packages/fake-distribution"
133
+ changelog = "frontend/packages/fake-distribution/CHANGELOG.md"
134
+ towncrier_settings = "frontend/packages/fake-distribution/towncrier.toml"
135
+ publish = false
136
+ ```
137
+
138
+ Please refer to [`repository.toml` Specification](#repositorytoml-specification) for more information.
139
+
140
+ ### List Available Commands
141
+ To see all available commands, run:
142
+
143
+ ```bash
144
+ uvx repoplone
145
+ ```
146
+
147
+ ### Check Installed Version
148
+ To check the installed version of the tool, use:
149
+
150
+ ```bash
151
+ uvx repoplone --version
152
+ ```
153
+
154
+ ## Check repository versions
155
+
156
+ ### Current versions
157
+
158
+ List current versions for:
159
+
160
+ - Repository
161
+ - Backend package
162
+ - Frontend package
163
+
164
+ ```bash
165
+ uvx repoplone versions current
166
+ ```
167
+
168
+ ### Next versions
169
+
170
+ Report next version of all components of this repository:
171
+
172
+ - Repository
173
+ - Backend package
174
+ - Frontend package
175
+
176
+ ```bash
177
+ uvx repoplone versions next
178
+ ```
179
+
180
+ ### Dependencies
181
+
182
+ Report version information for major dependencies:
183
+
184
+ - Backend base package
185
+ - Frontend base package
186
+ - Frontend @plone/volto package
187
+
188
+ ```bash
189
+ uvx repoplone versions dependencies
190
+ ```
191
+
192
+ ## Preview Changelog
193
+
194
+ To generate and display the draft changelog, run:
195
+
196
+ ```bash
197
+ uvx repoplone changelog
198
+ ```
199
+
200
+ ## Releasing Monorepo Packages
201
+
202
+ The `release` command creates a new release and accepts the following arguments:
203
+
204
+ #### `desired_version`
205
+
206
+ The desired_version argument defines the new version to be used in the release. It can be a specific version number or a version segment.
207
+
208
+ ##### Semantic Versioning
209
+
210
+ For projects using *Semantic Versioning* -- the default for repoplone --, below is a reference table showing how version segments modify an existing `1.0.0` version:
211
+
212
+ | Segment | New Version |
213
+ |---------|------------|
214
+ | `release` | `1.0.0` |
215
+ | `major` | `2.0.0` |
216
+ | `minor` | `1.1.0` |
217
+ | `micro` / `patch` / `fix` | `1.0.1` |
218
+ | `a` / `alpha` | `1.0.0a0` |
219
+ | `b` / `beta` | `1.0.0b0` |
220
+ | `c` / `rc` / `pre` / `preview` | `1.0.0rc0` |
221
+ | `r` / `rev` / `post` | `1.0.0.post0` |
222
+ | `dev` | `1.0.0.dev0` |
223
+
224
+ If not provided, you will be prompted to select a version from a list of most probable version options:
225
+
226
+ ```
227
+ 01/09 Select the next version
228
+ 1 - 1.0.1 (micro)
229
+ 2 - 1.1.0 (minor)
230
+ 3 - 2.0.0 (release)
231
+ Choose from [1/2/3] (1):
232
+ ```
233
+
234
+ ##### Calendar Versioning
235
+
236
+ For projects that have the value of `version_format` set as `calver`, the `desired_version`, by default, will compute the next available version.
237
+
238
+ Examples:
239
+ | Current Version | Date | Next Version |
240
+ |---------|------------|------------|
241
+ | 20250404.1|2026-02-13|20260213.1|
242
+ | 20260213.1|2026-02-13|20260213.2|
243
+
244
+ #### `--dry-run`
245
+
246
+ Use this flag to simulate the release process without actually publishing the new version.
247
+
248
+ **Example:**
249
+
250
+ ```bash
251
+ uvx repoplone release a
252
+ ```
253
+
254
+ This will create an `alpha` release.
255
+
256
+ ### Configuring the release pipeline
257
+
258
+ By default, repoplone runs a fixed sequence of steps when releasing. Projects
259
+ can override that sequence in `repository.toml` under `[repository.release]`.
260
+
261
+ Built-in step ids: `changelog`, `version`, `repository`, `release_backend`,
262
+ `release_frontend`, `git`, `gh_release`, `bye`. The default order matches
263
+ that list.
264
+
265
+ #### Reordering or omitting built-in steps
266
+
267
+ ```toml
268
+ [repository.release]
269
+ steps = [
270
+ "changelog",
271
+ "version",
272
+ "repository",
273
+ "release_backend",
274
+ "git",
275
+ "bye",
276
+ ]
277
+ ```
278
+
279
+ The example above skips `release_frontend` and `gh_release`.
280
+
281
+ #### Running a project-local hook
282
+
283
+ The `local_step` built-in imports a callable from the project root and runs
284
+ it under the standard step contract:
285
+
286
+ ```python
287
+ def step(step_id, title, settings, state, **kwargs) -> bool:
288
+ ...
289
+ ```
290
+
291
+ Wire it via a registry alias. The alias id is what you put in `steps`:
292
+
293
+ ```toml
294
+ [repository.release]
295
+ steps = ["changelog", "version", "repository", "notify_slack", "git", "bye"]
296
+
297
+ [repository.release.registry.notify_slack]
298
+ title = "Notify internal Slack"
299
+ function = "local_step"
300
+ args = { entrypoint = "scripts.notify:hook", channel = "#releases" }
301
+ ```
302
+
303
+ Repoplone adds the project root to `sys.path` before resolving the
304
+ entrypoint, so a hook at `scripts/notify.py` is reachable as
305
+ `scripts.notify:hook`. Any keys in `args` other than `entrypoint` are
306
+ forwarded to the hook as keyword arguments.
307
+
308
+ > **uvx caveat.** Because `uvx repoplone` runs in an isolated environment,
309
+ > a local hook may only use the standard library plus packages repoplone
310
+ > itself depends on. Third-party packages installed in the project's own
311
+ > environment are *not* available to the hook.
312
+
313
+ `local_step` cannot appear in `steps` directly — it must be wrapped in a
314
+ registry alias that supplies `args.entrypoint`.
315
+
316
+ #### Validating the configuration
317
+
318
+ Before committing a `[repository.release]` change, validate it:
319
+
320
+ ```bash
321
+ uvx repoplone settings sanity-check
322
+ ```
323
+
324
+ This loads the settings and resolves every `local_step` entrypoint. It
325
+ exits non-zero with a precise message if anything fails.
326
+
327
+ To inspect the resolved pipeline:
328
+
329
+ ```bash
330
+ uvx repoplone settings release-steps # human-readable table
331
+ uvx repoplone settings release-steps --json # machine-readable
332
+ ```
333
+
334
+ ---
335
+
336
+ ## Dependencies
337
+
338
+ ### Manage backend's base package
339
+
340
+ The following commands are available exclusively for projects managed by UV and with a base_package set in the `[backend.package]` section of repository.toml.
341
+
342
+ #### Report the base package
343
+ To check which is the current base package, run:
344
+
345
+ ```bash
346
+ uvx repoplone deps info
347
+ ```
348
+
349
+ #### Check version
350
+ To check the current base package version, run:
351
+
352
+ ```bash
353
+ uvx repoplone deps check
354
+ ```
355
+
356
+ #### Upgrade version
357
+
358
+ To upgrade the base package to a specific version, use:
359
+
360
+ ```bash
361
+ uvx repoplone deps upgrade 6.1.1
362
+ ```
363
+
364
+ ## `repository.toml` Specification
365
+
366
+ This section outlines the format and available options for the `repository.toml` file used in the project. Each section is detailed below, along with the available options and their default values.
367
+
368
+ | Section | Option | Description | Example Value | Default Value Source |
369
+ |-----------------------|---------------------------|------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|
370
+ | `repository` | `name` | Name of the repository. | `"collective-addon"` | |
371
+ | | `changelog` | Path to the changelog file. | `"CHANGELOG.md"` | |
372
+ | | `version` | Path to the version file of this repository. | `"version.txt"` | |
373
+ | | `container_images_prefix` | Prefix for container images. We will add the `-backend` and `-frontend` suffixes to generate the final images. | `"ghcr.io/collective/collective-addon"` | |
374
+ | | `compose` | List of Docker Compose files. | `["docker-compose.yml"]` | |
375
+ | | `version_format` | Format of the versioning. | `"semver"` or `"calver"` | |
376
+ | | `issues_url` | URL where issues for this repository are tracked. | `"https://github.com/plone/repoplone/issues"` | Empty by default. When unset and the git `origin` points at GitHub, the value is derived as `https://github.com/<owner>/<repo>/issues`. |
377
+ | `repository.towncrier`| `enabled` | Whether a top-level Towncrier is enabled. | `true` or `false` | Calculated if a section is present in `repository.toml` |
378
+ | | `section` | Section name used by Towncrier. | `"Project"` | |
379
+ | | `settings` | Path to Towncrier settings. | `"towncrier.toml"` | |
380
+ | `backend.package` | `enabled` | Whether the backend package is enabled. | `true` or `false` | Calculated if a section is present in `repository.toml` |
381
+ | | `name` | Name of the backend package. | `"collective.addon"` | |
382
+ | | `path` | Path to the backend package. | `"backend"` | |
383
+ | | `python_version` | Base Python version for the package. (Used in tests) | `"3.11"` | If value is not present in `repository.toml`, repoplone will inspect `pyproject.toml` `project.classifiers` and return the first supported Python version. |
384
+ | | `python_versions` | List of supported Python versions. | `["3.10", "3.11", "3.12"]` | If value is not present in `repository.toml`, repoplone will inspect `pyproject.toml` `project.classifiers` and return all supported Python versions. |
385
+ | | `plone_versions` | List of supported Plone versions. | `["6.0", "6.1"]` | If value is not present in `repository.toml`, repoplone will inspect `pyproject.toml` `project.classifiers` and return all supported Plone versions. |
386
+ | | `changelog` | Path to the changelog for the backend. | `"backend/CHANGELOG.md"` | |
387
+ | | `code_path` | Path to the source code. | `"src/collective/addon"` | |
388
+ | | `towncrier_settings` | Path to Towncrier settings for backend. | `"backend/pyproject.toml"` | |
389
+ | | `publish` | Whether to publish the backend package to PyPI. | `true` or `false` | |
390
+ | `frontend.package` | `enabled` | Whether the frontend package is enabled. | `true` or `false` | Calculated if a section is present in `repository.toml` |
391
+ | | `name` | Name of the frontend package. | `"@plone-collective/volto-addon"` | |
392
+ | | `path` | Path to the frontend package. | `"frontend/packages/volto-addon"` | |
393
+ | | `code_path` | Path to the source code. | `"src"` | |
394
+ | | `changelog` | Path to the changelog for the frontend. | `"frontend/CHANGELOG.md"` | |
395
+ | | `towncrier_settings` | Path to Towncrier settings for frontend. | `"frontend/packages/volto-addon/towncrier.toml"`| |
396
+ | | `publish` | Whether to publish the frontend package to npm. | `true` or `false` | |
397
+
398
+ ## Contribute 🤝
399
+
400
+ We welcome contributions to RepoPlone.
401
+
402
+ You can create an issue in the issue tracker, or contact a maintainer.
403
+
404
+ - [Issue Tracker](https://github.com/plone/repoplone/issues)
405
+ - [Source Code](https://github.com/plone/repoplone/)
406
+
407
+ ### Development requirements
408
+
409
+ - [uv](https://docs.astral.sh/uv/)
410
+
411
+ ### Setup
412
+
413
+ Clone this repository:
414
+
415
+ ```sh
416
+ git clone git@github.com:plone/repoplone.git
417
+ ```
418
+
419
+ Install `UV`, and create a local virtual environment with the following command.
420
+
421
+ ```shell
422
+ make install
423
+ ```
424
+
425
+ ### Run the checked out branch of RepoPlone
426
+
427
+ ```shell
428
+ uv run repoplone
429
+ ```
430
+
431
+ ### Check and format the codebase
432
+
433
+ ```shell
434
+ make check
435
+ ```
436
+
437
+ ### Run tests
438
+
439
+ [`pytest`](https://docs.pytest.org/) is this package's test runner.
440
+
441
+ Run all tests with the following command.
442
+
443
+ ```shell
444
+ make test
445
+ ```
446
+
447
+ Run all tests, but stop on the first error and open a `pdb` session with the following command.
448
+
449
+ ```shell
450
+ uv run pytest -x --pdb
451
+ ```
452
+
453
+ Run only tests that match `test_release_backend` with the following command.
454
+
455
+ ```shell
456
+ uv run pytest -k test_release_backend
457
+ ```
458
+
459
+ Run only tests that match `test_release_backend`, but stop on the first error and open a `pdb` session with the following command.
460
+
461
+ ```shell
462
+ uv run pytest -k test_release_backend -x --pdb
463
+ ```
464
+
465
+ ### Run type checker
466
+
467
+ We use [`mypy`](https://www.mypy-lang.org/) to run static type checking for this codebase.
468
+
469
+ Run the checker with the following command.
470
+
471
+ ```shell
472
+ uv run mypy src
473
+ ```
474
+
475
+
476
+ ## Support 📢
477
+
478
+ For support, questions, or more detailed documentation, visit the [official RepoPlone repository](https://github.com/plone/repoplone).
479
+
480
+
481
+ ## This project is supported by
482
+
483
+ <p align="left">
484
+ <a href="https://plone.org/foundation/">
485
+ <img alt="Plone Foundation Logo" width="200px" src="https://raw.githubusercontent.com/plone/.github/main/plone-foundation.png">
486
+ </a>
487
+ </p>
488
+
489
+ ## License
490
+
491
+ The project is released under the [MIT License](./LICENSE).