gitlabform 6.1.0__tar.gz → 6.2.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 (274) hide show
  1. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/_releases.yml +5 -5
  2. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/build.yml +5 -5
  3. gitlabform-6.2.0/.github/workflows/codecov-upload.yml +104 -0
  4. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/pr-ci-workflow.yml +1 -35
  5. gitlabform-6.2.0/.github/workflows/prs-entrypoint-forks.yml +26 -0
  6. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/prs-entrypoint-main.yml +0 -8
  7. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/static-analysis.yml +2 -2
  8. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/tests-acceptance.yml +32 -23
  9. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/tests-unit.yml +15 -14
  10. {gitlabform-6.1.0 → gitlabform-6.2.0}/PKG-INFO +1 -1
  11. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/changelog.md +22 -0
  12. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/workflows.md +8 -2
  13. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/groups.py +19 -33
  14. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/__init__.py +1 -0
  15. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/core.py +1 -1
  16. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_members_processor.py +4 -11
  17. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/members_processor.py +3 -2
  18. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/util.py +7 -0
  19. {gitlabform-6.1.0 → gitlabform-6.2.0}/pyproject.toml +9 -9
  20. {gitlabform-6.1.0 → gitlabform-6.2.0}/tbump.toml +1 -1
  21. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_subgroups.py +27 -0
  22. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_access_level_transformer.py +31 -0
  23. gitlabform-6.2.0/tests/unit/processors/test_group_members_processor.py +54 -0
  24. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/test_utils.py +13 -1
  25. {gitlabform-6.1.0 → gitlabform-6.2.0}/uv.lock +255 -249
  26. gitlabform-6.1.0/.github/workflows/prs-entrypoint-forks.yml +0 -34
  27. {gitlabform-6.1.0 → gitlabform-6.2.0}/.coveragerc +0 -0
  28. {gitlabform-6.1.0 → gitlabform-6.2.0}/.dockerignore +0 -0
  29. {gitlabform-6.1.0 → gitlabform-6.2.0}/.git-blame-ignore-revs +0 -0
  30. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/CODEOWNERS +0 -0
  31. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  32. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  33. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/question-or-other-issue.md +0 -0
  34. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/README.md +0 -0
  35. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/action.yml +0 -0
  36. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/dependabot.yml +0 -0
  37. {gitlabform-6.1.0 → gitlabform-6.2.0}/.github/workflows/_main.yml +0 -0
  38. {gitlabform-6.1.0 → gitlabform-6.2.0}/.gitignore +0 -0
  39. {gitlabform-6.1.0 → gitlabform-6.2.0}/.lgtm.yml +0 -0
  40. {gitlabform-6.1.0 → gitlabform-6.2.0}/.mypy.ini +0 -0
  41. {gitlabform-6.1.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.png +0 -0
  42. {gitlabform-6.1.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.svg +0 -0
  43. {gitlabform-6.1.0 → gitlabform-6.2.0}/.python-version +0 -0
  44. {gitlabform-6.1.0 → gitlabform-6.2.0}/CONTRIBUTING.md +0 -0
  45. {gitlabform-6.1.0 → gitlabform-6.2.0}/Dockerfile +0 -0
  46. {gitlabform-6.1.0 → gitlabform-6.2.0}/LICENSE +0 -0
  47. {gitlabform-6.1.0 → gitlabform-6.2.0}/README.md +0 -0
  48. {gitlabform-6.1.0 → gitlabform-6.2.0}/codecov.yml +0 -0
  49. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/__init__.py +0 -0
  50. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/common.py +0 -0
  51. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/docker.py +0 -0
  52. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/docs.py +0 -0
  53. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/env.py +0 -0
  54. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/gitlab/await-healthy.sh +0 -0
  55. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/gitlab/gitlab.rb +0 -0
  56. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/gitlab/healthcheck-and-setup.sh +0 -0
  57. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/gitlab/run_gitlab_in_docker.sh +0 -0
  58. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/gitlab/tests.Dockerfile +0 -0
  59. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/infra.py +0 -0
  60. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/main.py +0 -0
  61. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/package.py +0 -0
  62. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/qa.py +0 -0
  63. {gitlabform-6.1.0 → gitlabform-6.2.0}/dev/release.py +0 -0
  64. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/automation.md +0 -0
  65. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/coding_guidelines.md +0 -0
  66. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/implementation_design.md +0 -0
  67. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/index.md +0 -0
  68. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/local_development.md +0 -0
  69. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/contrib/releases.md +0 -0
  70. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/features.md +0 -0
  71. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/Opencast-logo.png +0 -0
  72. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/egnyte-logo.svg +0 -0
  73. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/elastic-path-logo.svg +0 -0
  74. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo-square.png +0 -0
  75. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.png +0 -0
  76. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.svg +0 -0
  77. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/group-ldap-links-provider.png +0 -0
  78. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/liquidlight-logo.svg +0 -0
  79. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/roche-logo.png +0 -0
  80. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/images/stroeer-online-marketing-logo.svg +0 -0
  81. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/index.md +0 -0
  82. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/installation.md +0 -0
  83. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/archive_unarchive.md +0 -0
  84. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/avatar.md +0 -0
  85. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/badges.md +0 -0
  86. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/ci_cd_variables.md +0 -0
  87. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/deploy_keys.md +0 -0
  88. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/files.md +0 -0
  89. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/group_ldap_links.md +0 -0
  90. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/group_saml_links.md +0 -0
  91. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/index.md +0 -0
  92. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/integrations.md +0 -0
  93. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/job_token_scope.md +0 -0
  94. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/labels.md +0 -0
  95. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/members.md +0 -0
  96. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/merge_requests.md +0 -0
  97. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/pipeline_schedules.md +0 -0
  98. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/project_security_settings.md +0 -0
  99. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/project_transfer.md +0 -0
  100. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/protected_branches.md +0 -0
  101. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/protected_environments.md +0 -0
  102. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/push_mirrors.md +0 -0
  103. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/push_rules.md +0 -0
  104. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/resource_groups.md +0 -0
  105. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/settings.md +0 -0
  106. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/tags_protection.md +0 -0
  107. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/reference/webhooks.md +0 -0
  108. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/requirements.md +0 -0
  109. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/running.md +0 -0
  110. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/similar_apps.md +0 -0
  111. {gitlabform-6.1.0 → gitlabform-6.2.0}/docs/upgrade.md +0 -0
  112. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlab-config/config.yml +0 -0
  113. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlab-config/gitlab-config.md +0 -0
  114. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/__init__.py +0 -0
  115. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/__init__.py +0 -0
  116. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/common.py +0 -0
  117. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/core.py +0 -0
  118. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/projects.py +0 -0
  119. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/configuration/transform.py +0 -0
  120. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/constants.py +0 -0
  121. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/commits.py +0 -0
  122. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_badges.py +0 -0
  123. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_ldap_links.py +0 -0
  124. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/groups.py +0 -0
  125. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/merge_requests.py +0 -0
  126. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/pipelines.py +0 -0
  127. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_badges.py +0 -0
  128. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_deploy_keys.py +0 -0
  129. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_merge_requests_approvals.py +0 -0
  130. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_protected_environments.py +0 -0
  131. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/projects.py +0 -0
  132. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/python_gitlab.py +0 -0
  133. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/gitlab/variables.py +0 -0
  134. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/lists/__init__.py +0 -0
  135. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/lists/filter.py +0 -0
  136. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/lists/groups.py +0 -0
  137. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/lists/projects.py +0 -0
  138. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/output.py +0 -0
  139. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/__init__.py +0 -0
  140. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/abstract_processor.py +0 -0
  141. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/application/__init__.py +0 -0
  142. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/application/application_settings_processor.py +0 -0
  143. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/defining_keys.py +0 -0
  144. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/__init__.py +0 -0
  145. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_badges_processor.py +0 -0
  146. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_hooks_processor.py +0 -0
  147. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_labels_processor.py +0 -0
  148. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_ldap_links_processor.py +0 -0
  149. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_protected_branches_processor.py +0 -0
  150. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_push_rules_processor.py +0 -0
  151. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_saml_links_processor.py +0 -0
  152. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_settings_processor.py +0 -0
  153. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_variables_processor.py +0 -0
  154. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/multiple_entities_processor.py +0 -0
  155. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/__init__.py +0 -0
  156. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/badges_processor.py +0 -0
  157. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/branches_processor.py +0 -0
  158. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/deploy_keys_processor.py +0 -0
  159. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/files_processor.py +0 -0
  160. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/hooks_processor.py +0 -0
  161. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/integrations_processor.py +0 -0
  162. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/job_token_scope_processor.py +0 -0
  163. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approval_rules.py +0 -0
  164. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approvals.py +0 -0
  165. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_labels_processor.py +0 -0
  166. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_processor.py +0 -0
  167. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_push_rules_processor.py +0 -0
  168. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_security_settings.py +0 -0
  169. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_settings_processor.py +0 -0
  170. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_variables_processor.py +0 -0
  171. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/remote_mirrors_processor.py +0 -0
  172. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/resource_groups_processor.py +0 -0
  173. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/schedules_processor.py +0 -0
  174. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/project/tags_processor.py +0 -0
  175. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/shared/__init__.py +0 -0
  176. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/shared/protected_environments_processor.py +0 -0
  177. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/__init__.py +0 -0
  178. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/branch_protection.py +0 -0
  179. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/decorators.py +0 -0
  180. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/difference_logger.py +0 -0
  181. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/labels_processor.py +0 -0
  182. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/processors/util/variables_processor.py +0 -0
  183. {gitlabform-6.1.0 → gitlabform-6.2.0}/gitlabform/run.py +0 -0
  184. {gitlabform-6.1.0 → gitlabform-6.2.0}/mkdocs.yml +0 -0
  185. {gitlabform-6.1.0 → gitlabform-6.2.0}/prek.toml +0 -0
  186. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/__init__.py +0 -0
  187. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/__init__.py +0 -0
  188. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/conftest.py +0 -0
  189. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches.py +0 -0
  190. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches_users_case_insensitive.py +0 -0
  191. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_ldap_links.py +0 -0
  192. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_protected_branches.py +0 -0
  193. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_push_rules.py +0 -0
  194. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_saml_links.py +0 -0
  195. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_settings.py +0 -0
  196. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_variables.py +0 -0
  197. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approval_rules.py +0 -0
  198. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approvals_settings.py +0 -0
  199. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_protected_environments.py +0 -0
  200. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_push_rules.py +0 -0
  201. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_tags.py +0 -0
  202. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/__init__.py +0 -0
  203. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_application_settings.py +0 -0
  204. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_archive_project.py +0 -0
  205. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_badges.py +0 -0
  206. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_branches.py +0 -0
  207. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys.py +0 -0
  208. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys_all_projects.py +0 -0
  209. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files.py +0 -0
  210. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files_templates.py +0 -0
  211. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_avatar.py +0 -0
  212. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_badges.py +0 -0
  213. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_hooks.py +0 -0
  214. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_labels.py +0 -0
  215. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_case_insensitive.py +0 -0
  216. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_groups.py +0 -0
  217. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_users.py +0 -0
  218. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_settings.py +0 -0
  219. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_variables.py +0 -0
  220. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_hooks.py +0 -0
  221. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_integrations.py +0 -0
  222. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_job_token_scope.py +0 -0
  223. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members.py +0 -0
  224. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_add_group.py +0 -0
  225. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_enforce.py +0 -0
  226. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_avatar.py +0 -0
  227. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_group_members_case_insensitive.py +0 -0
  228. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_labels.py +0 -0
  229. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_members_case_insensitve.py +0 -0
  230. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_settings.py +0 -0
  231. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_variables.py +0 -0
  232. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_remote_mirrors.py +0 -0
  233. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_resource_groups.py +0 -0
  234. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_running.py +0 -0
  235. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_scheduled_for_deletion_project.py +0 -0
  236. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_schedules.py +0 -0
  237. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_tags.py +0 -0
  238. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_token_from_config.py +0 -0
  239. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_transfer_project.py +0 -0
  240. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_wildcard_patterns.py +0 -0
  241. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_members.py +0 -0
  242. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_settings.py +0 -0
  243. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_members.py +0 -0
  244. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_security_settings.py +0 -0
  245. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_settings.py +0 -0
  246. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/__init__.py +0 -0
  247. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/__init__.py +0 -0
  248. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_case_sensitivity.py +0 -0
  249. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_projects_and_groups.py +0 -0
  250. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_validation.py +0 -0
  251. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_projects_and_groups.py +0 -0
  252. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_skip_groups_skip_projects.py +0 -0
  253. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_subgroups.py +0 -0
  254. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_wildcard_patterns.py +0 -0
  255. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/test_yaml_version.py +0 -0
  256. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_group_transformer.py +0 -0
  257. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_implicit_name_transformer.py +0 -0
  258. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_and_group_transformers.py +0 -0
  259. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_transformer.py +0 -0
  260. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_core.py +0 -0
  261. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_python_gitlab.py +0 -0
  262. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/__init__.py +0 -0
  263. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processor.py +0 -0
  264. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processors.py +0 -0
  265. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_branches_processor.py +0 -0
  266. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_difference_logger.py +0 -0
  267. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_files_processor.py +0 -0
  268. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_group_protected_branches_processor.py +0 -0
  269. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_group_saml_links_processor.py +0 -0
  270. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/processors/test_schedules_processor_extended_cron_pattern.py +0 -0
  271. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/test_access_levels.py +0 -0
  272. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/test_non_empty_configs_provider.py +0 -0
  273. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/test_parse_args.py +0 -0
  274. {gitlabform-6.1.0 → gitlabform-6.2.0}/tests/unit/test_projects_provider.py +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
  target_run_id: ${{ steps.validate.outputs.run_id }}
38
38
  steps:
39
39
  - name: Checkout Code
40
- uses: actions/checkout@v4
40
+ uses: actions/checkout@v7
41
41
 
42
42
  - name: Configure uv environment
43
43
  uses: ./.github/actions/setup-uv-local
@@ -83,12 +83,12 @@ jobs:
83
83
  runs-on: ubuntu-latest
84
84
  steps:
85
85
  - name: Checkout repository
86
- uses: actions/checkout@v6
86
+ uses: actions/checkout@v7
87
87
  with:
88
88
  ref: ${{ needs.prep-release.outputs.semver_tag }}
89
89
  fetch-depth: 2
90
90
  - name: Download built documentation
91
- uses: actions/download-artifact@v4
91
+ uses: actions/download-artifact@v8
92
92
  with:
93
93
  run-id: ${{ needs.prep-release.outputs.target_run_id }}
94
94
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -129,7 +129,7 @@ jobs:
129
129
  id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
130
130
  steps:
131
131
  - name: Checkout repository
132
- uses: actions/checkout@v6
132
+ uses: actions/checkout@v7
133
133
  with:
134
134
  ref: ${{ needs.prep-release.outputs.semver_tag }}
135
135
  fetch-depth: 2
@@ -162,7 +162,7 @@ jobs:
162
162
  # TODO: In a separate PR, optimize docker image build to consume the built package artifact
163
163
  # (package-dist) instead of copying and rebuilding from source if applicable.
164
164
  - name: Checkout repository
165
- uses: actions/checkout@v6
165
+ uses: actions/checkout@v7
166
166
  with:
167
167
  ref: ${{ needs.prep-release.outputs.semver_tag }}
168
168
  - name: Docker metadata
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
18
  - name: Checkout repository
19
- uses: actions/checkout@v6
19
+ uses: actions/checkout@v7
20
20
  with:
21
21
  ref: ${{ inputs.BRANCH_REF }}
22
22
  fetch-depth: 2
@@ -31,7 +31,7 @@ jobs:
31
31
  uv run --no-sync package build
32
32
  uv run --no-sync package verify
33
33
  - name: Upload package distribution
34
- uses: actions/upload-artifact@v4
34
+ uses: actions/upload-artifact@v7
35
35
  with:
36
36
  name: package-dist
37
37
  path: dist/*
@@ -41,7 +41,7 @@ jobs:
41
41
  runs-on: ubuntu-latest
42
42
  steps:
43
43
  - name: Checkout repository
44
- uses: actions/checkout@v6
44
+ uses: actions/checkout@v7
45
45
  with:
46
46
  ref: ${{ inputs.BRANCH_REF }}
47
47
  fetch-depth: 2
@@ -54,7 +54,7 @@ jobs:
54
54
  - name: Build documentation
55
55
  run: uv run --no-sync docs build
56
56
  - name: Upload docs site
57
- uses: actions/upload-artifact@v4
57
+ uses: actions/upload-artifact@v7
58
58
  with:
59
59
  name: docs-site
60
60
  path: site
@@ -70,7 +70,7 @@ jobs:
70
70
  runs-on: ${{ matrix.os }}
71
71
  steps:
72
72
  - name: Checkout repository
73
- uses: actions/checkout@v6
73
+ uses: actions/checkout@v7
74
74
  with:
75
75
  ref: ${{ inputs.BRANCH_REF }}
76
76
  fetch-depth: 2
@@ -0,0 +1,104 @@
1
+ name: "Codecov Upload"
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows:
6
+ - "CI - PRs"
7
+ - "CI - Acceptance Tests"
8
+ types:
9
+ - completed
10
+
11
+ permissions:
12
+ actions: read
13
+ contents: read
14
+
15
+ jobs:
16
+ upload-unit:
17
+ name: "Upload unit coverage (${{ matrix.python-version }})"
18
+ if: ${{ github.event.workflow_run.name == 'CI - PRs' && github.event.workflow_run.event == 'pull_request' }}
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ python-version: ["3.14", "3.12"]
24
+ steps:
25
+ - name: Download coverage artifact
26
+ uses: actions/download-artifact@v8
27
+ with:
28
+ name: coverage-${{ matrix.python-version }}
29
+ run-id: ${{ github.event.workflow_run.id }}
30
+ github-token: ${{ github.token }}
31
+ - name: Read PR metadata
32
+ id: pr
33
+ run: |
34
+ pr=$(jq -r '.pr // empty' pr-info.json)
35
+ sha=$(jq -r '.sha // empty' pr-info.json)
36
+ if [[ "$pr" =~ ^[0-9]+$ ]]; then
37
+ echo "pr=$pr" >> "$GITHUB_OUTPUT"
38
+ fi
39
+ if [[ "$sha" =~ ^[a-f0-9]{40}$ ]]; then
40
+ echo "sha=$sha" >> "$GITHUB_OUTPUT"
41
+ fi
42
+ - name: Upload coverage to Codecov
43
+ uses: Wandalen/wretry.action@v3
44
+ with:
45
+ action: codecov/codecov-action@v3
46
+ with: |
47
+ name: unit-tests-${{ matrix.python-version }}
48
+ flags: unittests
49
+ fail_ci_if_error: true
50
+ token: ${{ secrets.CODECOV_TOKEN }}
51
+ files: coverage.xml
52
+ override_pr: ${{ steps.pr.outputs.pr }}
53
+ override_commit: ${{ steps.pr.outputs.sha }}
54
+ attempt_limit: 5
55
+ attempt_delay: 10000
56
+
57
+ upload-acceptance:
58
+ name: "Upload acceptance coverage (${{ matrix.name }})"
59
+ if: ${{ github.event.workflow_run.name == 'CI - Acceptance Tests' && github.event.workflow_run.event == 'pull_request_target' }}
60
+ runs-on: ubuntu-latest
61
+ strategy:
62
+ fail-fast: false
63
+ matrix:
64
+ include:
65
+ - artifact: coverage-standard-ce
66
+ name: codecov-acceptance-test-standard-ce
67
+ - artifact: coverage-standard-ee
68
+ name: codecov-acceptance-test-standard-ee
69
+ - artifact: coverage-licensed-premium
70
+ name: codecov-acceptance-test-premium
71
+ - artifact: coverage-licensed-ultimate
72
+ name: codecov-acceptance-test-ultimate
73
+ steps:
74
+ - name: Download coverage artifact
75
+ uses: actions/download-artifact@v8
76
+ with:
77
+ name: ${{ matrix.artifact }}
78
+ run-id: ${{ github.event.workflow_run.id }}
79
+ github-token: ${{ github.token }}
80
+ - name: Read PR metadata
81
+ id: pr
82
+ run: |
83
+ pr=$(jq -r '.pr // empty' pr-info.json)
84
+ sha=$(jq -r '.sha // empty' pr-info.json)
85
+ if [[ "$pr" =~ ^[0-9]+$ ]]; then
86
+ echo "pr=$pr" >> "$GITHUB_OUTPUT"
87
+ fi
88
+ if [[ "$sha" =~ ^[a-f0-9]{40}$ ]]; then
89
+ echo "sha=$sha" >> "$GITHUB_OUTPUT"
90
+ fi
91
+ - name: Upload coverage to Codecov
92
+ uses: Wandalen/wretry.action@v3
93
+ with:
94
+ action: codecov/codecov-action@v3
95
+ with: |
96
+ name: ${{ matrix.name }}
97
+ flags: integration
98
+ fail_ci_if_error: true
99
+ token: ${{ secrets.CODECOV_TOKEN }}
100
+ files: coverage.xml
101
+ override_pr: ${{ steps.pr.outputs.pr }}
102
+ override_commit: ${{ steps.pr.outputs.sha }}
103
+ attempt_limit: 5
104
+ attempt_delay: 10000
@@ -1,12 +1,5 @@
1
1
  name: "CI - Build · Lint · Tests"
2
2
 
3
- # Reusable workflow containing the actual CI jobs for pull request validation.
4
- # This file is called by prs-entrypoint.yml and is intentionally separated so that
5
- # event/routing logic stays in the entrypoint while the CI job set remains reusable.
6
-
7
- # This reusable workflow does not receive secrets automatically from the PR event.
8
- # The caller workflow (prs-entrypoint.yml) must explicitly pass secrets when calling it.
9
-
10
3
  on:
11
4
  workflow_call:
12
5
  inputs:
@@ -33,15 +26,6 @@ jobs:
33
26
  uses: ./.github/workflows/tests-unit.yml
34
27
  with:
35
28
  BRANCH_REF: ${{ inputs.BRANCH_REF }}
36
- secrets: inherit
37
-
38
- tests-acceptance:
39
- name: Acceptance Tests
40
- uses: ./.github/workflows/tests-acceptance.yml
41
- with:
42
- BRANCH_REF: ${{ inputs.BRANCH_REF }}
43
- environment: Integrate Pull Request
44
- secrets: inherit
45
29
 
46
30
  analyze:
47
31
  name: Analyze (${{ matrix.language }})
@@ -82,7 +66,7 @@ jobs:
82
66
  # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
83
67
  steps:
84
68
  - name: Checkout repository
85
- uses: actions/checkout@v6
69
+ uses: actions/checkout@v7
86
70
  with:
87
71
  ref: ${{ inputs.BRANCH_REF }}
88
72
 
@@ -92,7 +76,6 @@ jobs:
92
76
  # - name: Setup runtime (example)
93
77
  # uses: actions/setup-example@v1
94
78
 
95
- # Initializes the CodeQL tools for scanning.
96
79
  - name: Initialize CodeQL
97
80
  uses: github/codeql-action/init@v4
98
81
  with:
@@ -105,23 +88,6 @@ jobs:
105
88
  # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
106
89
  # queries: security-extended,security-and-quality
107
90
 
108
- # If the analyze step fails for one of the languages you are analyzing with
109
- # "We were unable to automatically build your code", modify the matrix above
110
- # to set the build mode to "manual" for that language. Then modify this step
111
- # to build your code.
112
- # ℹ️ Command-line programs to run using the OS shell.
113
- # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
114
- - name: Run manual build steps
115
- if: matrix.build-mode == 'manual'
116
- shell: bash
117
- run: |
118
- echo 'If you are using a "manual" build mode for one or more of the' \
119
- 'languages you are analyzing, replace this with the commands to build' \
120
- 'your code, for example:'
121
- echo ' make bootstrap'
122
- echo ' make release'
123
- exit 1
124
-
125
91
  - name: Perform CodeQL Analysis
126
92
  uses: github/codeql-action/analyze@v4
127
93
  with:
@@ -0,0 +1,26 @@
1
+ name: "CI - Acceptance Tests"
2
+
3
+ permissions:
4
+ actions: read
5
+ contents: read
6
+ concurrency:
7
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
8
+ cancel-in-progress: true
9
+
10
+ on:
11
+ pull_request_target:
12
+ branches:
13
+ - main
14
+
15
+ jobs:
16
+ tests-acceptance:
17
+ name: "Acceptance Tests"
18
+ uses: ./.github/workflows/tests-acceptance.yml
19
+ permissions:
20
+ actions: read
21
+ contents: read
22
+ packages: read
23
+ with:
24
+ BRANCH_REF: ${{ github.event.pull_request.head.sha }}
25
+ environment: Integrate Pull Request
26
+ secrets: inherit
@@ -1,13 +1,8 @@
1
1
  name: "CI - PRs"
2
2
 
3
- # This workflow is the entrypoint for pull requests opened from host repository.
4
- # Fork PRs are handled by prs-entrypoint-forks.yml using pull_request_target.
5
- # It forwards the branch SHA and explicit secrets to the reusable workflow.
6
-
7
3
  permissions:
8
4
  actions: read
9
5
  contents: read
10
- pull-requests: write
11
6
  concurrency:
12
7
  group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
13
8
  cancel-in-progress: true
@@ -20,14 +15,11 @@ on:
20
15
  jobs:
21
16
  pr_jobs:
22
17
  name: "Pipeline"
23
- # github.event.pull_request object defined here: https://docs.github.com/en/rest/pulls/pulls?apiVersion=2026-03-10#get-a-pull-request
24
- if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
25
18
  uses: ./.github/workflows/pr-ci-workflow.yml
26
19
  permissions:
27
20
  actions: read
28
21
  contents: read
29
22
  packages: read
30
- pull-requests: write
31
23
  security-events: write
32
24
  with:
33
25
  BRANCH_REF: ${{ github.event.pull_request.head.sha }}
@@ -20,7 +20,7 @@ jobs:
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
22
  - name: Checkout repository
23
- uses: actions/checkout@v6
23
+ uses: actions/checkout@v7
24
24
  with:
25
25
  ref: ${{ inputs.BRANCH_REF }}
26
26
  - name: Configure uv environment
@@ -37,7 +37,7 @@ jobs:
37
37
  check: [black, mypy, bandit]
38
38
  steps:
39
39
  - name: Checkout repository
40
- uses: actions/checkout@v6
40
+ uses: actions/checkout@v7
41
41
  with:
42
42
  ref: ${{ inputs.BRANCH_REF }}
43
43
  fetch-depth: 2
@@ -15,12 +15,9 @@ on:
15
15
  required: false
16
16
  GITLAB_EE_ULTIMATE_LICENSE:
17
17
  required: false
18
- CODECOV_TOKEN:
19
- required: true
20
18
 
21
19
  permissions:
22
20
  contents: read
23
- actions: read # Required by codecov/codecov-action
24
21
 
25
22
  jobs:
26
23
  acceptance-standard:
@@ -32,10 +29,11 @@ jobs:
32
29
  fail-fast: false
33
30
  steps:
34
31
  - name: Checkout repository
35
- uses: actions/checkout@v6
32
+ uses: actions/checkout@v7
36
33
  with:
37
34
  ref: ${{ inputs.BRANCH_REF }}
38
35
  fetch-depth: 2
36
+ allow-unsafe-pr-checkout: true
39
37
  - name: Configure uv environment
40
38
  uses: ./.github/actions/setup-uv-local
41
39
  - name: Install dependencies
@@ -44,16 +42,21 @@ jobs:
44
42
  run: uv run --no-sync gitlab-local up --gitlab-flavor ${{ matrix.flavor }}
45
43
  - name: Run Standard acceptance tests for ${{ matrix.flavor }} flavor
46
44
  run: uv run --no-sync qa test tests/acceptance/standard --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
47
- - name: Upload coverage
48
- uses: Wandalen/wretry.action@v3
45
+ - name: Save PR metadata
46
+ env:
47
+ PR_NUMBER: ${{ github.event.pull_request.number }}
48
+ PR_SHA: ${{ github.event.pull_request.head.sha }}
49
+ run: |
50
+ printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
51
+ - name: Upload coverage artifact
52
+ uses: actions/upload-artifact@v7
49
53
  with:
50
- action: codecov/codecov-action@v3
51
- with: |
52
- name: codecov-acceptance-test-standard-${{ matrix.flavor }}
53
- flags: integration
54
- token: ${{ secrets.CODECOV_TOKEN }}
55
- attempt_limit: 5
56
- attempt_delay: 10000
54
+ name: coverage-standard-${{ matrix.flavor }}
55
+ path: |
56
+ coverage.xml
57
+ pr-info.json
58
+ if-no-files-found: error
59
+ retention-days: 1
57
60
 
58
61
  acceptance-licensed:
59
62
  name: "GitLab ${{ matrix.tier == 'premium' && 'Premium' || 'Ultimate' }}"
@@ -65,10 +68,11 @@ jobs:
65
68
  fail-fast: false
66
69
  steps:
67
70
  - name: Checkout repository
68
- uses: actions/checkout@v6
71
+ uses: actions/checkout@v7
69
72
  with:
70
73
  ref: ${{ inputs.BRANCH_REF }}
71
74
  fetch-depth: 2
75
+ allow-unsafe-pr-checkout: true
72
76
  - name: Configure uv environment
73
77
  uses: ./.github/actions/setup-uv-local
74
78
  - name: Install dependencies
@@ -79,13 +83,18 @@ jobs:
79
83
  run: uv run --no-sync gitlab-local up
80
84
  - name: Run acceptance Tests for ${{ matrix.tier }} features
81
85
  run: uv run --no-sync qa test tests/acceptance/${{ matrix.tier }} --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
82
- - name: Upload coverage
83
- uses: Wandalen/wretry.action@v3
86
+ - name: Save PR metadata
87
+ env:
88
+ PR_NUMBER: ${{ github.event.pull_request.number }}
89
+ PR_SHA: ${{ github.event.pull_request.head.sha }}
90
+ run: |
91
+ printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
92
+ - name: Upload coverage artifact
93
+ uses: actions/upload-artifact@v7
84
94
  with:
85
- action: codecov/codecov-action@v3
86
- with: |
87
- name: codecov-acceptance-test-${{ matrix.tier }}
88
- flags: integration
89
- token: ${{ secrets.CODECOV_TOKEN }}
90
- attempt_limit: 5
91
- attempt_delay: 10000
95
+ name: coverage-licensed-${{ matrix.tier }}
96
+ path: |
97
+ coverage.xml
98
+ pr-info.json
99
+ if-no-files-found: error
100
+ retention-days: 1
@@ -7,9 +7,6 @@ on:
7
7
  BRANCH_REF:
8
8
  type: string
9
9
  required: true
10
- secrets:
11
- CODECOV_TOKEN:
12
- required: true
13
10
 
14
11
  permissions:
15
12
  contents: read
@@ -24,7 +21,7 @@ jobs:
24
21
  python-version: ["3.14", "3.12"]
25
22
  steps:
26
23
  - name: Checkout repository
27
- uses: actions/checkout@v6
24
+ uses: actions/checkout@v7
28
25
  with:
29
26
  ref: ${{ inputs.BRANCH_REF }}
30
27
  fetch-depth: 2
@@ -36,14 +33,18 @@ jobs:
36
33
  run: uv sync --frozen --no-dev --group test
37
34
  - name: Run unit tests
38
35
  run: uv run --no-sync qa test tests/unit --cov=. --cov-report=xml --log-cli-level=WARNING
39
- - name: Upload coverage to Codecov
40
- uses: Wandalen/wretry.action@v3
36
+ - name: Save PR metadata
37
+ env:
38
+ PR_NUMBER: ${{ github.event.pull_request.number }}
39
+ PR_SHA: ${{ github.event.pull_request.head.sha }}
40
+ run: |
41
+ printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
42
+ - name: Upload coverage artifact
43
+ uses: actions/upload-artifact@v7
41
44
  with:
42
- action: codecov/codecov-action@v3
43
- with: |
44
- name: unit-tests-${{ matrix.python-version }}
45
- flags: unittests
46
- fail_ci_if_error: true
47
- token: ${{ secrets.CODECOV_TOKEN }}
48
- attempt_limit: 5
49
- attempt_delay: 10000
45
+ name: coverage-${{ matrix.python-version }}
46
+ path: |
47
+ coverage.xml
48
+ pr-info.json
49
+ if-no-files-found: error
50
+ retention-days: 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitlabform
3
- Version: 6.1.0
3
+ Version: 6.2.0
4
4
  Summary: 🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML
5
5
  Project-URL: Homepage, https://gitlabform.github.io/gitlabform/
6
6
  Project-URL: Repository, https://github.com/gitlabform/gitlabform.git
@@ -6,6 +6,28 @@ For details on how to migrate between major versions, please refer to the [upgra
6
6
 
7
7
  ---
8
8
 
9
+ ## 6.2.0
10
+
11
+ ### Features
12
+
13
+ * Add support for "Security Manager role" [issue: #1329](https://github.com/gitlabform/gitlabform/issues/1329), [#1342](https://github.com/gitlabform/gitlabform/pull/1342). ([rickbrouwer](https://github.com/rickbrouwer))
14
+
15
+ ### Bug Fixes
16
+
17
+ * don't re-validate inherited config in subgroup lookup [#1318](https://github.com/gitlabform/gitlabform/pull/1318). ([rickbrouwer](https://github.com/rickbrouwer))
18
+ * format group member expiry dates [#1349](https://github.com/gitlabform/gitlabform/pull/1349). ([w3lld1](https://github.com/w3lld1))
19
+ * escape regex as a raw string to prevent errors in loges [#1351](https://github.com/gitlabform/gitlabform/pull/1351). ([rickbrouwer](https://github.com/rickbrouwer))
20
+
21
+ ### Documentation
22
+
23
+ * update license renewal instructions (#1358)[https://github.com/gitlabform/gitlabform/pull/1358]. ([rickbrouwer](https://github.com/rickbrouwer))
24
+
25
+ ### Dependencies
26
+
27
+ * Update various dependencies to newer versions.
28
+
29
+ Thanks to all the contributors of this release!
30
+
9
31
  ## 6.1.0
10
32
 
11
33
  ### Features
@@ -16,6 +16,12 @@ only on the main repository.
16
16
 
17
17
  ## License management
18
18
 
19
- Requesting new Premium/Ultimate Licenses is done via GitLab's Contribution to EE process [here](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributing-to-the-gitlab-enterprise-edition-ee).
19
+ Requesting new Premium/Ultimate Licenses is done via GitLab's Contribution to EE process [here](https://handbook.gitlab.com/handbook/marketing/developer-relations/engineering/community-contributors-workflows/#contributing-to-the-gitlab-enterprise-edition-ee).
20
20
 
21
- As a Maintainer, when you receive a new license key, please add/update it to the GitHub Repository Secrets.
21
+ To request a license, create an issue via the [Wider Community Contributor License Request](https://gitlab.com/gitlab-org/developer-relations/contributor-success/team-task/-/issues/new?issuable_template=contributor_ee_license_request) template, and select 'New Request'. Use the following text in the request:
22
+
23
+ > As a Maintainer of GitlabForm, I like to requesting new Premium and Ultimate License for https://github.com/gitlabform/gitlabform.
24
+
25
+ Note that the Premium and Ultimate licenses are sent separately, and there may be some time between receiving them.
26
+
27
+ As a Maintainer, when you receive a new license key, please add/update it to the GitHub Repository Secrets.
@@ -45,11 +45,11 @@ class ConfigurationGroups(ConfigurationCommon, ABC):
45
45
  debug(f"Group {group} is skipped, returning empty config")
46
46
  return {}
47
47
 
48
- common_config = self.get_common_config()
48
+ common_config: dict = self.get_common_config()
49
49
  debug("*Effective* common config: %s", to_str(common_config))
50
50
 
51
51
  if "/" in group:
52
- group_config = self._get_effective_subgroup_config(group)
52
+ group_config = self._get_effective_subgroup_config(group, has_parent_context=bool(common_config))
53
53
  else:
54
54
  group_config = self._get_group_config(group)
55
55
  debug("*Effective* group/subgroup config: %s", to_str(group_config))
@@ -65,7 +65,7 @@ class ConfigurationGroups(ConfigurationCommon, ABC):
65
65
 
66
66
  return effective_config_for_group
67
67
 
68
- def _get_effective_subgroup_config(self, subgroup):
68
+ def _get_effective_subgroup_config(self, subgroup, has_parent_context: bool = False):
69
69
  #
70
70
  # Goes through a subgroups hierarchy, from top to bottom
71
71
  #
@@ -80,40 +80,26 @@ class ConfigurationGroups(ConfigurationCommon, ABC):
80
80
  #
81
81
  # ...where a = merged_config("x", "x/y") and b = merged_config(a, "x/y/z")
82
82
  #
83
+ # ``inherit: false`` on a layer is rejected only when no parent exists above it
84
+ # (no common config and no non-empty accumulated ancestor config).
83
85
 
84
- effective_config = {}
86
+ effective_config: dict = {}
85
87
  elements = subgroup.split("/")
86
- last_element = None
88
+ current_path = None
87
89
  for element in elements:
88
- if not last_element:
89
- effective_config = self._get_group_config(element)
90
- debug("First level config for '%s': %s", element, to_str(effective_config))
91
- last_element = element
90
+ current_path = element if current_path is None else current_path + "/" + element
91
+ current_layer = self._get_group_config(current_path)
92
+ debug("Config for '%s': %s", current_path, to_str(current_layer))
93
+
94
+ has_ancestor_context = has_parent_context or bool(effective_config)
95
+ if current_layer and not has_ancestor_context:
96
+ self._validate_break_inheritance_flag(current_layer, current_path)
97
+
98
+ if not effective_config:
99
+ effective_config = current_layer
92
100
  else:
93
- next_level_subgroup = last_element + "/" + element
94
- next_level_subgroup_config = self._get_group_config(next_level_subgroup)
95
- debug(
96
- "Config for '%s': %s",
97
- next_level_subgroup,
98
- to_str(next_level_subgroup_config),
99
- )
100
-
101
- if effective_config:
102
- self._validate_break_inheritance_flag(effective_config, subgroup)
103
- elif not effective_config and next_level_subgroup_config:
104
- self._validate_break_inheritance_flag(next_level_subgroup_config, next_level_subgroup)
105
-
106
- effective_config = self._merge_configs(
107
- effective_config,
108
- next_level_subgroup_config,
109
- )
110
- debug(
111
- "Merged previous level config for '%s' with config for '%s': %s",
112
- last_element,
113
- next_level_subgroup,
114
- to_str(effective_config),
115
- )
116
- last_element = last_element + "/" + element
101
+ effective_config = self._merge_configs(effective_config, current_layer)
102
+ debug("Effective config at '%s': %s", current_path, to_str(effective_config))
117
103
 
118
104
  return effective_config
119
105
 
@@ -29,6 +29,7 @@ class AccessLevel(enum.IntEnum):
29
29
  GUEST = 10
30
30
  PLANNER = 15 # introduced in GitLab 17.7
31
31
  REPORTER = 20
32
+ SECURITY_MANAGER = 25 # introduced in GitLab 18.4
32
33
  DEVELOPER = 30
33
34
  MAINTAINER = 40
34
35
  OWNER = 50 # only for groups
@@ -117,7 +117,7 @@ class GitLabCore:
117
117
  current_version = "0.0.0"
118
118
 
119
119
  if self.version != "unknown":
120
- sem_ver_regex = "^\d*\.\d*\.\d*"
120
+ sem_ver_regex = r"^\d*\.\d*\.\d*"
121
121
  # Get the pure semantic version from self.version, for example Gitlab will return 18.2.1-ee
122
122
  match = re.search(sem_ver_regex, self.version)
123
123
  if match: