python-gitlab 8.1.0__tar.gz → 8.3.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 (379) hide show
  1. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/CHANGELOG.md +32 -0
  2. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/PKG-INFO +1 -1
  3. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api-objects.rst +4 -1
  4. python_gitlab-8.1.0/docs/gl_objects/features.rst → python_gitlab-8.3.0/docs/gl_objects/gitlab_features.rst +9 -4
  5. python_gitlab-8.3.0/docs/gl_objects/project_feature_flag_user_lists.rst +51 -0
  6. python_gitlab-8.3.0/docs/gl_objects/project_feature_flags.rst +63 -0
  7. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/projects.rst +38 -0
  8. python_gitlab-8.3.0/docs/gl_objects/service_accounts.rst +153 -0
  9. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/_version.py +1 -1
  10. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/client.py +2 -0
  11. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/mixins.py +9 -1
  12. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/types.py +37 -3
  13. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/utils.py +9 -1
  14. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/__init__.py +2 -0
  15. python_gitlab-8.3.0/gitlab/v4/objects/feature_flag_user_lists.py +27 -0
  16. python_gitlab-8.3.0/gitlab/v4/objects/feature_flags.py +106 -0
  17. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/merge_request_approvals.py +7 -1
  18. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/projects.py +6 -0
  19. python_gitlab-8.3.0/gitlab/v4/objects/service_accounts.py +155 -0
  20. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/variables.py +50 -7
  21. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/PKG-INFO +1 -1
  22. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/SOURCES.txt +13 -1
  23. python_gitlab-8.3.0/requirements-lint.txt +14 -0
  24. python_gitlab-8.3.0/requirements-precommit.txt +1 -0
  25. python_gitlab-8.3.0/requirements-test.txt +13 -0
  26. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/requirements.txt +1 -1
  27. python_gitlab-8.3.0/tests/functional/api/test_project_feature_flag_user_lists.py +56 -0
  28. python_gitlab-8.3.0/tests/functional/api/test_project_feature_flags.py +127 -0
  29. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_variables.py +36 -0
  30. python_gitlab-8.3.0/tests/functional/cli/test_cli_project_feature_flag_user_lists.py +120 -0
  31. python_gitlab-8.3.0/tests/functional/cli/test_cli_project_feature_flags.py +203 -0
  32. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/.env +1 -1
  33. python_gitlab-8.3.0/tests/unit/objects/test_project_feature_flag_user_lists.py +30 -0
  34. python_gitlab-8.3.0/tests/unit/objects/test_project_feature_flags.py +35 -0
  35. python_gitlab-8.3.0/tests/unit/objects/test_service_accounts.py +592 -0
  36. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_types.py +38 -1
  37. python_gitlab-8.1.0/gitlab/v4/objects/service_accounts.py +0 -20
  38. python_gitlab-8.1.0/requirements-lint.txt +0 -14
  39. python_gitlab-8.1.0/requirements-precommit.txt +0 -1
  40. python_gitlab-8.1.0/requirements-test.txt +0 -13
  41. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/AUTHORS +0 -0
  42. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/COPYING +0 -0
  43. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/MANIFEST.in +0 -0
  44. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/README.rst +0 -0
  45. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/Makefile +0 -0
  46. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/__init__.py +0 -0
  47. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/_static/js/gitter.js +0 -0
  48. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api/gitlab.rst +0 -0
  49. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api/gitlab.v4.rst +0 -0
  50. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api-levels.rst +0 -0
  51. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api-usage-advanced.rst +0 -0
  52. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api-usage-graphql.rst +0 -0
  53. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/api-usage.rst +0 -0
  54. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/changelog.md +0 -0
  55. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/cli-examples.rst +0 -0
  56. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/cli-objects.rst +0 -0
  57. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/cli-usage.rst +0 -0
  58. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/conf.py +0 -0
  59. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/ext/__init__.py +0 -0
  60. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/ext/docstrings.py +0 -0
  61. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/ext/manager_tmpl.j2 +0 -0
  62. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/faq.rst +0 -0
  63. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/access_requests.rst +0 -0
  64. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/appearance.rst +0 -0
  65. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/applications.rst +0 -0
  66. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/badges.rst +0 -0
  67. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/boards.rst +0 -0
  68. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/branches.rst +0 -0
  69. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/bulk_imports.rst +0 -0
  70. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/ci_lint.rst +0 -0
  71. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/cluster_agents.rst +0 -0
  72. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/clusters.rst +0 -0
  73. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/commits.rst +0 -0
  74. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/deploy_keys.rst +0 -0
  75. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/deploy_tokens.rst +0 -0
  76. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/deployments.rst +0 -0
  77. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/discussions.rst +0 -0
  78. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/draft_notes.rst +0 -0
  79. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/emojis.rst +0 -0
  80. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/environments.rst +0 -0
  81. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/epics.rst +0 -0
  82. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/events.rst +0 -0
  83. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/geo_nodes.rst +0 -0
  84. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/group_access_tokens.rst +0 -0
  85. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/groups.rst +0 -0
  86. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/invitations.rst +0 -0
  87. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/issues.rst +0 -0
  88. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/iterations.rst +0 -0
  89. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/job_token_scope.rst +0 -0
  90. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/keys.rst +0 -0
  91. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/labels.rst +0 -0
  92. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/member_roles.rst +0 -0
  93. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/merge_request_approvals.rst +0 -0
  94. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/merge_requests.rst +0 -0
  95. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/merge_trains.rst +0 -0
  96. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/messages.rst +0 -0
  97. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/milestones.rst +0 -0
  98. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/namespaces.rst +0 -0
  99. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/notes.rst +0 -0
  100. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/notifications.rst +0 -0
  101. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/packages.rst +0 -0
  102. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/pagesdomains.rst +0 -0
  103. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/personal_access_tokens.rst +0 -0
  104. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/pipelines_and_jobs.rst +0 -0
  105. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/project_access_tokens.rst +0 -0
  106. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/protected_branches.rst +0 -0
  107. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/protected_container_repositories.rst +0 -0
  108. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/protected_environments.rst +0 -0
  109. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/protected_packages.rst +0 -0
  110. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/pull_mirror.rst +0 -0
  111. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/releases.rst +0 -0
  112. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/remote_mirrors.rst +0 -0
  113. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/repositories.rst +0 -0
  114. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/repository_tags.rst +0 -0
  115. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/resource_groups.rst +0 -0
  116. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/runners.rst +0 -0
  117. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/search.rst +0 -0
  118. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/secure_files.rst +0 -0
  119. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/settings.rst +0 -0
  120. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/sidekiq.rst +0 -0
  121. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/snippets.rst +0 -0
  122. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/statistics.rst +0 -0
  123. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/status_checks.rst +0 -0
  124. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/system_hooks.rst +0 -0
  125. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/templates.rst +0 -0
  126. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/todos.rst +0 -0
  127. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/topics.rst +0 -0
  128. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/users.rst +0 -0
  129. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/variables.rst +0 -0
  130. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/gl_objects/wikis.rst +0 -0
  131. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/index.rst +0 -0
  132. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/make.bat +0 -0
  133. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/docs/release-notes.rst +0 -0
  134. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/__init__.py +0 -0
  135. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/__main__.py +0 -0
  136. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/_backends/__init__.py +0 -0
  137. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/_backends/graphql.py +0 -0
  138. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/_backends/protocol.py +0 -0
  139. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/_backends/requests_backend.py +0 -0
  140. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/base.py +0 -0
  141. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/cli.py +0 -0
  142. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/config.py +0 -0
  143. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/const.py +0 -0
  144. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/exceptions.py +0 -0
  145. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/py.typed +0 -0
  146. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/__init__.py +0 -0
  147. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/cli.py +0 -0
  148. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/access_requests.py +0 -0
  149. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/appearance.py +0 -0
  150. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/applications.py +0 -0
  151. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/artifacts.py +0 -0
  152. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/audit_events.py +0 -0
  153. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/award_emojis.py +0 -0
  154. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/badges.py +0 -0
  155. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/boards.py +0 -0
  156. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/branches.py +0 -0
  157. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/broadcast_messages.py +0 -0
  158. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/bulk_imports.py +0 -0
  159. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/ci_lint.py +0 -0
  160. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/cluster_agents.py +0 -0
  161. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/clusters.py +0 -0
  162. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/commits.py +0 -0
  163. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/container_registry.py +0 -0
  164. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/custom_attributes.py +0 -0
  165. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/deploy_keys.py +0 -0
  166. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/deploy_tokens.py +0 -0
  167. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/deployments.py +0 -0
  168. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/discussions.py +0 -0
  169. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/draft_notes.py +0 -0
  170. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/environments.py +0 -0
  171. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/epics.py +0 -0
  172. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/events.py +0 -0
  173. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/export_import.py +0 -0
  174. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/features.py +0 -0
  175. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/files.py +0 -0
  176. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/geo_nodes.py +0 -0
  177. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/group_access_tokens.py +0 -0
  178. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/groups.py +0 -0
  179. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/hooks.py +0 -0
  180. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/integrations.py +0 -0
  181. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/invitations.py +0 -0
  182. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/issues.py +0 -0
  183. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/iterations.py +0 -0
  184. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/job_token_scope.py +0 -0
  185. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/jobs.py +0 -0
  186. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/keys.py +0 -0
  187. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/labels.py +0 -0
  188. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/ldap.py +0 -0
  189. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/member_roles.py +0 -0
  190. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/members.py +0 -0
  191. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/merge_requests.py +0 -0
  192. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/merge_trains.py +0 -0
  193. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/milestones.py +0 -0
  194. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/namespaces.py +0 -0
  195. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/notes.py +0 -0
  196. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/notification_settings.py +0 -0
  197. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/package_protection_rules.py +0 -0
  198. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/packages.py +0 -0
  199. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/pages.py +0 -0
  200. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/personal_access_tokens.py +0 -0
  201. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/pipelines.py +0 -0
  202. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/project_access_tokens.py +0 -0
  203. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/push_rules.py +0 -0
  204. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/registry_protection_repository_rules.py +0 -0
  205. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/registry_protection_rules.py +0 -0
  206. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/releases.py +0 -0
  207. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/repositories.py +0 -0
  208. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/resource_groups.py +0 -0
  209. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/reviewers.py +0 -0
  210. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/runners.py +0 -0
  211. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/secure_files.py +0 -0
  212. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/settings.py +0 -0
  213. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/sidekiq.py +0 -0
  214. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/snippets.py +0 -0
  215. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/statistics.py +0 -0
  216. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/status_checks.py +0 -0
  217. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/tags.py +0 -0
  218. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/templates.py +0 -0
  219. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/todos.py +0 -0
  220. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/topics.py +0 -0
  221. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/triggers.py +0 -0
  222. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/users.py +0 -0
  223. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/gitlab/v4/objects/wikis.py +0 -0
  224. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/pyproject.toml +0 -0
  225. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/dependency_links.txt +0 -0
  226. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/entry_points.txt +0 -0
  227. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/requires.txt +0 -0
  228. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/python_gitlab.egg-info/top_level.txt +0 -0
  229. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/requirements-docker.txt +0 -0
  230. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/requirements-docs.txt +0 -0
  231. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/setup.cfg +0 -0
  232. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/__init__.py +0 -0
  233. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/conftest.py +0 -0
  234. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/__init__.py +0 -0
  235. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/__init__.py +0 -0
  236. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_boards.py +0 -0
  237. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_branches.py +0 -0
  238. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_bulk_imports.py +0 -0
  239. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_current_user.py +0 -0
  240. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_deploy_keys.py +0 -0
  241. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_deploy_tokens.py +0 -0
  242. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_epics.py +0 -0
  243. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_gitlab.py +0 -0
  244. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_graphql.py +0 -0
  245. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_groups.py +0 -0
  246. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_import_export.py +0 -0
  247. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_issues.py +0 -0
  248. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_keys.py +0 -0
  249. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_lazy_objects.py +0 -0
  250. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_member_roles.py +0 -0
  251. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_merge_requests.py +0 -0
  252. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_packages.py +0 -0
  253. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_project_job_token_scope.py +0 -0
  254. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_projects.py +0 -0
  255. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_push_rules.py +0 -0
  256. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_registry.py +0 -0
  257. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_releases.py +0 -0
  258. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_repository.py +0 -0
  259. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_services.py +0 -0
  260. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_snippets.py +0 -0
  261. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_statistics.py +0 -0
  262. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_topics.py +0 -0
  263. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_users.py +0 -0
  264. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/api/test_wikis.py +0 -0
  265. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/__init__.py +0 -0
  266. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/conftest.py +0 -0
  267. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli.py +0 -0
  268. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_artifacts.py +0 -0
  269. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_files.py +0 -0
  270. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_packages.py +0 -0
  271. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_projects.py +0 -0
  272. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_repository.py +0 -0
  273. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_resource_access_tokens.py +0 -0
  274. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_users.py +0 -0
  275. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_v4.py +0 -0
  276. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/cli/test_cli_variables.py +0 -0
  277. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/conftest.py +0 -0
  278. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/ee-test.py +0 -0
  279. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/__init__.py +0 -0
  280. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/avatar.png +0 -0
  281. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/create_license.rb +0 -0
  282. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/docker-compose.yml +0 -0
  283. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/docker.py +0 -0
  284. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/invalid_auth.cfg +0 -0
  285. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/invalid_version.cfg +0 -0
  286. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/fixtures/set_token.rb +0 -0
  287. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/functional/helpers.py +0 -0
  288. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/install/test_install.py +0 -0
  289. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/smoke/__init__.py +0 -0
  290. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/smoke/test_dists.py +0 -0
  291. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/__init__.py +0 -0
  292. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/_backends/__init__.py +0 -0
  293. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/_backends/test_requests_backend.py +0 -0
  294. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/base/test_rest_manager.py +0 -0
  295. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/base/test_rest_object.py +0 -0
  296. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/conftest.py +0 -0
  297. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/helpers.py +0 -0
  298. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/meta/__init__.py +0 -0
  299. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/meta/test_abstract_attrs.py +0 -0
  300. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/meta/test_imports.py +0 -0
  301. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/meta/test_mro.py +0 -0
  302. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/mixins/__init__.py +0 -0
  303. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/mixins/test_meta_mixins.py +0 -0
  304. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/mixins/test_mixin_methods.py +0 -0
  305. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/mixins/test_object_mixins_attributes.py +0 -0
  306. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/__init__.py +0 -0
  307. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/conftest.py +0 -0
  308. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_appearance.py +0 -0
  309. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_applications.py +0 -0
  310. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_audit_events.py +0 -0
  311. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_badges.py +0 -0
  312. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_bridges.py +0 -0
  313. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_bulk_imports.py +0 -0
  314. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_ci_lint.py +0 -0
  315. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_cluster_agents.py +0 -0
  316. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_commits.py +0 -0
  317. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_deploy_tokens.py +0 -0
  318. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_deployments.py +0 -0
  319. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_draft_notes.py +0 -0
  320. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_environments.py +0 -0
  321. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_group_access_tokens.py +0 -0
  322. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_group_merge_request_approvals.py +0 -0
  323. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_groups.py +0 -0
  324. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_hooks.py +0 -0
  325. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_invitations.py +0 -0
  326. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_issues.py +0 -0
  327. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_iterations.py +0 -0
  328. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_job_artifacts.py +0 -0
  329. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_job_token_scope.py +0 -0
  330. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_jobs.py +0 -0
  331. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_keys.py +0 -0
  332. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_member_roles.py +0 -0
  333. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_members.py +0 -0
  334. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_merge_request_pipelines.py +0 -0
  335. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_merge_requests.py +0 -0
  336. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_merge_trains.py +0 -0
  337. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_package_protection_rules.py +0 -0
  338. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_packages.py +0 -0
  339. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_personal_access_tokens.py +0 -0
  340. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_pipeline_schedules.py +0 -0
  341. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_pipelines.py +0 -0
  342. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_project_access_tokens.py +0 -0
  343. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_project_import_export.py +0 -0
  344. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_project_merge_request_approvals.py +0 -0
  345. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_project_statistics.py +0 -0
  346. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_projects.py +0 -0
  347. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_pull_mirror.py +0 -0
  348. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_registry_protection_rules.py +0 -0
  349. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_registry_repositories.py +0 -0
  350. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_releases.py +0 -0
  351. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_remote_mirrors.py +0 -0
  352. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_repositories.py +0 -0
  353. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_resource_groups.py +0 -0
  354. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_resource_iteration_events.py +0 -0
  355. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_resource_label_events.py +0 -0
  356. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_resource_milestone_events.py +0 -0
  357. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_resource_state_events.py +0 -0
  358. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_runners.py +0 -0
  359. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_secure_files.py +0 -0
  360. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_services.py +0 -0
  361. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_snippets.py +0 -0
  362. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_statistics.py +0 -0
  363. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_status_checks.py +0 -0
  364. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_submodules.py +0 -0
  365. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_templates.py +0 -0
  366. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_todos.py +0 -0
  367. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_topics.py +0 -0
  368. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_users.py +0 -0
  369. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/objects/test_variables.py +0 -0
  370. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_cli.py +0 -0
  371. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_config.py +0 -0
  372. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_exceptions.py +0 -0
  373. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_gitlab.py +0 -0
  374. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_gitlab_auth.py +0 -0
  375. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_gitlab_http_methods.py +0 -0
  376. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_graphql.py +0 -0
  377. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_retry.py +0 -0
  378. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tests/unit/test_utils.py +0 -0
  379. {python_gitlab-8.1.0 → python_gitlab-8.3.0}/tox.ini +0 -0
@@ -2,6 +2,38 @@
2
2
 
3
3
  All versions below are listed in reverse chronological order.
4
4
 
5
+ ## v8.3.0 (2026-04-28)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **api**: Update CI/CD variable create and update attributes
10
+ ([`849301b`](https://github.com/python-gitlab/python-gitlab/commit/849301b830b0d4f76ab85ffa3f39b22a6e628df9))
11
+
12
+ - **mixins**: Register service account token classes in RotateMixin CLI actions
13
+ ([`2cf430b`](https://github.com/python-gitlab/python-gitlab/commit/2cf430b9c55c88f1d43fd31122a022dda0a88700))
14
+
15
+ ### Features
16
+
17
+ - **api**: Add full service account support at instance, group, and project level
18
+ ([`feb6ced`](https://github.com/python-gitlab/python-gitlab/commit/feb6cedeffa75ef386ef13a3226bc07bcb396f61))
19
+
20
+
21
+ ## v8.2.0 (2026-03-28)
22
+
23
+ ### Documentation
24
+
25
+ - **testing**: Document passing pytest options during local development
26
+ ([`e6669f9`](https://github.com/python-gitlab/python-gitlab/commit/e6669f96d662d310109afa4a61fe8dabbd780a4e))
27
+
28
+ ### Features
29
+
30
+ - **api**: Add support for project feature flags and feature flag user lists
31
+ ([`be68285`](https://github.com/python-gitlab/python-gitlab/commit/be68285793f35afc10a72b59da3fb24429631f54))
32
+
33
+ - **projects**: Add optional parameter to set approval rule on all protected branches.
34
+ ([`8d76028`](https://github.com/python-gitlab/python-gitlab/commit/8d76028a1ae3554527291dc98e6be041ff089ec5))
35
+
36
+
5
37
  ## v8.1.0 (2026-02-28)
6
38
 
7
39
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-gitlab
3
- Version: 8.1.0
3
+ Version: 8.3.0
4
4
  Summary: The python wrapper for the GitLab REST and GraphQL APIs.
5
5
  Author-email: Gauvain Pocentek <gauvain@pocentek.net>
6
6
  Maintainer-email: John Villalovos <john@sodarock.com>, Max Wittig <max.wittig@siemens.com>, Nejc Habjan <nejc.habjan@siemens.com>, Roger Meier <r.meier@siemens.com>
@@ -24,7 +24,7 @@ API examples
24
24
  gl_objects/environments
25
25
  gl_objects/events
26
26
  gl_objects/epics
27
- gl_objects/features
27
+ gl_objects/gitlab_features
28
28
  gl_objects/geo_nodes
29
29
  gl_objects/groups
30
30
  gl_objects/group_access_tokens
@@ -49,6 +49,8 @@ API examples
49
49
  gl_objects/pipelines_and_jobs
50
50
  gl_objects/projects
51
51
  gl_objects/project_access_tokens
52
+ gl_objects/project_feature_flags
53
+ gl_objects/project_feature_flag_user_lists
52
54
  gl_objects/protected_branches
53
55
  gl_objects/protected_container_repositories
54
56
  gl_objects/protected_environments
@@ -62,6 +64,7 @@ API examples
62
64
  gl_objects/resource_groups
63
65
  gl_objects/search
64
66
  gl_objects/secure_files
67
+ gl_objects/service_accounts
65
68
  gl_objects/settings
66
69
  gl_objects/snippets
67
70
  gl_objects/statistics
@@ -1,6 +1,11 @@
1
- ##############
2
- Features flags
3
- ##############
1
+ ################################
2
+ GitLab Development Feature Flags
3
+ ################################
4
+
5
+ .. note::
6
+
7
+ This API is for managing GitLab's internal development feature flags and requires administrator access.
8
+ For project-level feature flags, see :doc:`project_feature_flags`.
4
9
 
5
10
  Reference
6
11
  ---------
@@ -29,4 +34,4 @@ Create or set a feature::
29
34
 
30
35
  Delete a feature::
31
36
 
32
- feature.delete()
37
+ feature.delete()
@@ -0,0 +1,51 @@
1
+ ###############################
2
+ Project Feature Flag User Lists
3
+ ###############################
4
+
5
+ Reference
6
+ ---------
7
+
8
+ * v4 API:
9
+
10
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagUserList`
11
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagUserListManager`
12
+ + :attr:`gitlab.v4.objects.Project.feature_flags_user_lists`
13
+
14
+ * GitLab API: https://docs.gitlab.com/api/feature_flag_user_lists
15
+
16
+ Examples
17
+ --------
18
+
19
+ List user lists::
20
+
21
+ user_lists = project.feature_flags_user_lists.list()
22
+
23
+ Get a user list::
24
+
25
+ user_list = project.feature_flags_user_lists.get(list_iid)
26
+
27
+ Create a user list::
28
+
29
+ user_list = project.feature_flags_user_lists.create({
30
+ 'name': 'my_user_list',
31
+ 'user_xids': 'user1,user2,user3'
32
+ })
33
+
34
+ Update a user list::
35
+
36
+ user_list.name = 'updated_list_name'
37
+ user_list.user_xids = 'user1,user2'
38
+ user_list.save()
39
+
40
+ Delete a user list::
41
+
42
+ user_list.delete()
43
+
44
+ Search for a user list::
45
+
46
+ user_lists = project.feature_flags_user_lists.list(search='my_list')
47
+
48
+ See also
49
+ --------
50
+
51
+ * :doc:`project_feature_flags`
@@ -0,0 +1,63 @@
1
+ #####################
2
+ Project Feature Flags
3
+ #####################
4
+
5
+ Reference
6
+ ---------
7
+
8
+ * v4 API:
9
+
10
+ + :class:`gitlab.v4.objects.ProjectFeatureFlag`
11
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagManager`
12
+ + :attr:`gitlab.v4.objects.Project.feature_flags`
13
+
14
+ * GitLab API: https://docs.gitlab.com/api/feature_flags
15
+
16
+ Examples
17
+ --------
18
+
19
+ List feature flags::
20
+
21
+ flags = project.feature_flags.list()
22
+
23
+ Get a feature flag::
24
+
25
+ flag = project.feature_flags.get('my_feature_flag')
26
+
27
+ Create a feature flag::
28
+
29
+ flag = project.feature_flags.create({'name': 'my_feature_flag', 'version': 'new_version_flag'})
30
+
31
+ Create a feature flag with strategies::
32
+
33
+ flag = project.feature_flags.create({
34
+ 'name': 'my_complex_flag',
35
+ 'version': 'new_version_flag',
36
+ 'strategies': [{
37
+ 'name': 'userWithId',
38
+ 'parameters': {'userIds': 'user1,user2'}
39
+ }]
40
+ })
41
+
42
+ Update a feature flag::
43
+
44
+ flag.description = 'Updated description'
45
+ flag.save()
46
+
47
+ Rename a feature flag::
48
+
49
+ # You can rename a flag by changing its name attribute and calling save()
50
+ flag.name = 'new_flag_name'
51
+ flag.save()
52
+
53
+ # Alternatively, you can use the manager's update method
54
+ project.feature_flags.update('old_flag_name', {'name': 'new_flag_name'})
55
+
56
+ Delete a feature flag::
57
+
58
+ flag.delete()
59
+
60
+ See also
61
+ --------
62
+
63
+ * :doc:`project_feature_flag_user_lists`
@@ -409,6 +409,44 @@ Search projects by custom attribute::
409
409
  project.customattributes.set('type', 'internal')
410
410
  gl.projects.list(custom_attributes={'type': 'internal'}, get_all=True)
411
411
 
412
+ Project feature flags
413
+ =====================
414
+
415
+ Reference
416
+ ---------
417
+
418
+ * v4 API:
419
+
420
+ + :class:`gitlab.v4.objects.ProjectFeatureFlag`
421
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagManager`
422
+ + :attr:`gitlab.v4.objects.Project.feature_flags`
423
+
424
+ * GitLab API: https://docs.gitlab.com/api/feature_flags
425
+
426
+ Examples
427
+ --------
428
+
429
+ See :doc:`project_feature_flags`.
430
+
431
+ Project feature flag user lists
432
+ ===============================
433
+
434
+ Reference
435
+ ---------
436
+
437
+ * v4 API:
438
+
439
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagUserList`
440
+ + :class:`gitlab.v4.objects.ProjectFeatureFlagUserListManager`
441
+ + :attr:`gitlab.v4.objects.Project.feature_flags_user_lists`
442
+
443
+ * GitLab API: https://docs.gitlab.com/api/feature_flag_user_lists
444
+
445
+ Examples
446
+ --------
447
+
448
+ See :doc:`project_feature_flag_user_lists`.
449
+
412
450
  Project files
413
451
  =============
414
452
 
@@ -0,0 +1,153 @@
1
+ ################
2
+ Service Accounts
3
+ ################
4
+
5
+ References
6
+ ----------
7
+
8
+ * v4 API:
9
+
10
+ + :class:`gitlab.v4.objects.ServiceAccount`
11
+ + :class:`gitlab.v4.objects.ServiceAccountManager`
12
+ + :class:`gitlab.v4.objects.GroupServiceAccount`
13
+ + :class:`gitlab.v4.objects.GroupServiceAccountManager`
14
+ + :class:`gitlab.v4.objects.GroupServiceAccountAccessToken`
15
+ + :class:`gitlab.v4.objects.GroupServiceAccountAccessTokenManager`
16
+ + :class:`gitlab.v4.objects.ProjectServiceAccount`
17
+ + :class:`gitlab.v4.objects.ProjectServiceAccountManager`
18
+ + :class:`gitlab.v4.objects.ProjectServiceAccountAccessToken`
19
+ + :class:`gitlab.v4.objects.ProjectServiceAccountAccessTokenManager`
20
+
21
+ * GitLab API: https://docs.gitlab.com/api/service_accounts/
22
+
23
+ Instance service accounts
24
+ -------------------------
25
+
26
+ List instance service accounts::
27
+
28
+ accounts = gl.service_accounts.list()
29
+
30
+ Create an instance service account::
31
+
32
+ sa = gl.service_accounts.create({})
33
+ # with optional attributes
34
+ sa = gl.service_accounts.create({"name": "my-bot", "username": "my-bot", "email": "my-bot@example.com"})
35
+
36
+ Update an instance service account::
37
+
38
+ gl.service_accounts.update(sa.id, {"name": "renamed-bot"})
39
+ # or via the object
40
+ sa.name = "renamed-bot"
41
+ sa.save()
42
+
43
+ Group service accounts
44
+ ----------------------
45
+
46
+ List group service accounts::
47
+
48
+ accounts = group.service_accounts.list()
49
+
50
+ Create a group service account::
51
+
52
+ sa = group.service_accounts.create({})
53
+ # with optional attributes
54
+ sa = group.service_accounts.create({"name": "ci-bot", "username": "ci-bot"})
55
+
56
+ Update a group service account::
57
+
58
+ group.service_accounts.update(sa.id, {"name": "renamed-bot"})
59
+ # or via the object
60
+ sa.name = "renamed-bot"
61
+ sa.save()
62
+
63
+ Delete a group service account::
64
+
65
+ group.service_accounts.delete(sa.id)
66
+ # or via the object
67
+ sa.delete()
68
+
69
+ Group service account personal access tokens
70
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71
+
72
+ List tokens for a group service account::
73
+
74
+ tokens = sa.access_tokens.list()
75
+
76
+ Create a token for a group service account::
77
+
78
+ token = sa.access_tokens.create({
79
+ "name": "ci-token",
80
+ "scopes": ["api"],
81
+ "expires_at": "2026-01-01",
82
+ })
83
+ print(token.token)
84
+
85
+ Rotate a token::
86
+
87
+ token.rotate()
88
+ print(token.token)
89
+ # or directly using a token ID
90
+ new_token = sa.access_tokens.rotate(token.id)
91
+ print(new_token["token"])
92
+
93
+ Revoke a token::
94
+
95
+ sa.access_tokens.delete(token.id)
96
+ # or via the object
97
+ token.delete()
98
+
99
+ Project service accounts
100
+ ------------------------
101
+
102
+ List project service accounts::
103
+
104
+ accounts = project.service_accounts.list()
105
+
106
+ Create a project service account::
107
+
108
+ sa = project.service_accounts.create({})
109
+ # with optional attributes
110
+ sa = project.service_accounts.create({"name": "ci-bot", "username": "ci-bot"})
111
+
112
+ Update a project service account::
113
+
114
+ project.service_accounts.update(sa.id, {"name": "renamed-bot"})
115
+ # or via the object
116
+ sa.name = "renamed-bot"
117
+ sa.save()
118
+
119
+ Delete a project service account::
120
+
121
+ project.service_accounts.delete(sa.id)
122
+ # or via the object
123
+ sa.delete()
124
+
125
+ Project service account personal access tokens
126
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
+
128
+ List tokens for a project service account::
129
+
130
+ tokens = sa.access_tokens.list()
131
+
132
+ Create a token for a project service account::
133
+
134
+ token = sa.access_tokens.create({
135
+ "name": "ci-token",
136
+ "scopes": ["read_repository"],
137
+ "expires_at": "2026-01-01",
138
+ })
139
+ print(token.token)
140
+
141
+ Rotate a token::
142
+
143
+ token.rotate()
144
+ print(token.token)
145
+ # or directly using a token ID
146
+ new_token = sa.access_tokens.rotate(token.id)
147
+ print(new_token["token"])
148
+
149
+ Revoke a token::
150
+
151
+ sa.access_tokens.delete(token.id)
152
+ # or via the object
153
+ token.delete()
@@ -3,4 +3,4 @@ __copyright__ = "Copyright 2013-2019 Gauvain Pocentek, 2019-2023 python-gitlab t
3
3
  __email__ = "gauvainpocentek@gmail.com"
4
4
  __license__ = "LGPL3"
5
5
  __title__ = "python-gitlab"
6
- __version__ = "8.1.0"
6
+ __version__ = "8.3.0"
@@ -211,6 +211,8 @@ class Gitlab:
211
211
  """See :class:`~gitlab.v4.objects.PersonalAccessTokenManager`"""
212
212
  self.topics = objects.TopicManager(self)
213
213
  """See :class:`~gitlab.v4.objects.TopicManager`"""
214
+ self.service_accounts = objects.ServiceAccountManager(self)
215
+ """See :class:`~gitlab.v4.objects.ServiceAccountManager`"""
214
216
  self.statistics = objects.ApplicationStatisticsManager(self)
215
217
  """See :class:`~gitlab.v4.objects.ApplicationStatisticsManager`"""
216
218
 
@@ -619,6 +619,8 @@ class RotateMixin(base.RESTManager[base.TObjCls]):
619
619
  "PersonalAccessTokenManager",
620
620
  "GroupAccessTokenManager",
621
621
  "ProjectAccessTokenManager",
622
+ "GroupServiceAccountAccessTokenManager",
623
+ "ProjectServiceAccountAccessTokenManager",
622
624
  ),
623
625
  optional=("expires_at",),
624
626
  )
@@ -656,7 +658,13 @@ class ObjectRotateMixin(_RestObjectBase):
656
658
  manager: base.RESTManager[Any]
657
659
 
658
660
  @cli.register_custom_action(
659
- cls_names=("PersonalAccessToken", "GroupAccessToken", "ProjectAccessToken"),
661
+ cls_names=(
662
+ "PersonalAccessToken",
663
+ "GroupAccessToken",
664
+ "ProjectAccessToken",
665
+ "GroupServiceAccountAccessToken",
666
+ "ProjectServiceAccountAccessToken",
667
+ ),
660
668
  optional=("expires_at",),
661
669
  )
662
670
  @exc.on_http_error(exc.GitlabRotateError)
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
+ import json
4
5
  from typing import Any, TYPE_CHECKING
5
6
 
7
+ from gitlab import exceptions
8
+
6
9
 
7
10
  @dataclasses.dataclass(frozen=True)
8
11
  class RequiredOptional:
@@ -36,6 +39,13 @@ class RequiredOptional:
36
39
 
37
40
 
38
41
  class GitlabAttribute:
42
+ # Used in utils._transform_types() to decide if we should call get_for_api()
43
+ # on the attribute when transform_data is False (e.g. for POST/PUT/PATCH).
44
+ #
45
+ # This allows us to force transformation of data even when sending JSON bodies,
46
+ # which is useful for types like CommaSeparatedStringAttribute.
47
+ transform_in_body = False
48
+
39
49
  def __init__(self, value: Any = None) -> None:
40
50
  self._value = value
41
51
 
@@ -49,6 +59,16 @@ class GitlabAttribute:
49
59
  return (key, self._value)
50
60
 
51
61
 
62
+ class JsonAttribute(GitlabAttribute):
63
+ def set_from_cli(self, cli_value: str) -> None:
64
+ try:
65
+ self._value = json.loads(cli_value)
66
+ except (ValueError, TypeError) as e:
67
+ raise exceptions.GitlabParsingError(
68
+ f"Could not parse JSON data: {e}"
69
+ ) from e
70
+
71
+
52
72
  class _ListArrayAttribute(GitlabAttribute):
53
73
  """Helper class to support `list` / `array` types."""
54
74
 
@@ -82,9 +102,23 @@ class ArrayAttribute(_ListArrayAttribute):
82
102
 
83
103
 
84
104
  class CommaSeparatedListAttribute(_ListArrayAttribute):
85
- """For values which are sent to the server as a Comma Separated Values
86
- (CSV) string. We allow them to be specified as a list and we convert it
87
- into a CSV"""
105
+ """
106
+ For values which are sent to the server as a Comma Separated Values (CSV) string
107
+ in query parameters (GET), but as a list/array in JSON bodies (POST/PUT).
108
+ """
109
+
110
+
111
+ class CommaSeparatedStringAttribute(_ListArrayAttribute):
112
+ """
113
+ For values which are sent to the server as a Comma Separated Values (CSV) string.
114
+ Unlike CommaSeparatedListAttribute, this type ensures the value is converted
115
+ to a string even in JSON bodies (POST/PUT requests).
116
+ """
117
+
118
+ # Used in utils._transform_types() to ensure the value is converted to a string
119
+ # via get_for_api() even when transform_data is False (e.g. for POST/PUT/PATCH).
120
+ # This is needed because some APIs require a CSV string instead of a JSON array.
121
+ transform_in_body = True
88
122
 
89
123
 
90
124
  class LowercaseStringAttribute(GitlabAttribute):
@@ -198,7 +198,15 @@ def _transform_types(
198
198
  files[attr_name] = (key, data.pop(attr_name))
199
199
  continue
200
200
 
201
- if not transform_data:
201
+ # If transform_data is False, it means we are preparing data for a JSON body
202
+ # (POST/PUT/PATCH). In this case, we normally skip transformation because
203
+ # most types (like ArrayAttribute) only need transformation for query
204
+ # parameters (GET).
205
+ #
206
+ # However, some types (like CommaSeparatedStringAttribute) need to be
207
+ # transformed even in JSON bodies (e.g. converting a list to a CSV string).
208
+ # The 'transform_in_body' flag on the attribute class controls this behavior.
209
+ if not transform_data and not gitlab_attribute.transform_in_body:
202
210
  continue
203
211
 
204
212
  if isinstance(gitlab_attribute, types.GitlabAttribute):
@@ -24,6 +24,8 @@ from .environments import *
24
24
  from .epics import *
25
25
  from .events import *
26
26
  from .export_import import *
27
+ from .feature_flag_user_lists import *
28
+ from .feature_flags import *
27
29
  from .features import *
28
30
  from .files import *
29
31
  from .geo_nodes import *
@@ -0,0 +1,27 @@
1
+ """
2
+ GitLab API:
3
+ https://docs.gitlab.com/api/feature_flag_user_lists
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from gitlab import types
9
+ from gitlab.base import RESTObject
10
+ from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
11
+ from gitlab.types import RequiredOptional
12
+
13
+ __all__ = ["ProjectFeatureFlagUserList", "ProjectFeatureFlagUserListManager"]
14
+
15
+
16
+ class ProjectFeatureFlagUserList(SaveMixin, ObjectDeleteMixin, RESTObject):
17
+ _id_attr = "iid"
18
+
19
+
20
+ class ProjectFeatureFlagUserListManager(CRUDMixin[ProjectFeatureFlagUserList]):
21
+ _path = "/projects/{project_id}/feature_flags_user_lists"
22
+ _obj_cls = ProjectFeatureFlagUserList
23
+ _from_parent_attrs = {"project_id": "id"}
24
+ _create_attrs = RequiredOptional(required=("name", "user_xids"))
25
+ _update_attrs = RequiredOptional(optional=("name", "user_xids"))
26
+ _list_filters = ("search",)
27
+ _types = {"user_xids": types.CommaSeparatedStringAttribute}
@@ -0,0 +1,106 @@
1
+ """
2
+ GitLab API:
3
+ https://docs.gitlab.com/api/feature_flags
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from typing import Any
9
+
10
+ from gitlab import types, utils
11
+ from gitlab.base import RESTObject
12
+ from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
13
+ from gitlab.types import RequiredOptional
14
+
15
+ __all__ = ["ProjectFeatureFlag", "ProjectFeatureFlagManager"]
16
+
17
+
18
+ class ProjectFeatureFlag(SaveMixin, ObjectDeleteMixin, RESTObject):
19
+ _id_attr = "name"
20
+ manager: ProjectFeatureFlagManager
21
+
22
+ def _get_save_url_id(self) -> str | int | None:
23
+ """Get the ID used to construct the API URL for the save operation.
24
+
25
+ For renames, this must be the *original* name of the flag. For other
26
+ updates, it is the current name.
27
+ """
28
+ if self._id_attr in self._updated_attrs:
29
+ # If the name is being changed, use the original name for the URL.
30
+ obj_id = self._attrs.get(self._id_attr)
31
+ if isinstance(obj_id, str):
32
+ return utils.EncodedId(obj_id)
33
+ return obj_id
34
+ return self.encoded_id
35
+
36
+ def save(self, **kwargs: Any) -> dict[str, Any] | None:
37
+ """Save the changes made to the object to the server.
38
+
39
+ This is the standard method to use when updating a feature flag object
40
+ that you have already retrieved.
41
+
42
+ It is overridden here to correctly handle renaming. When `name` is
43
+ changed, the API requires the *original* name in the URL, and this
44
+ method provides it.
45
+
46
+ Args:
47
+ **kwargs: Extra options to send to the server (e.g. sudo)
48
+
49
+ Returns:
50
+ The new object data (*not* a RESTObject)
51
+
52
+ Raises:
53
+ GitlabAuthenticationError: If authentication is not correct
54
+ GitlabUpdateError: If the server cannot perform the request
55
+ """
56
+ updated_data = self._get_updated_data()
57
+ if not updated_data:
58
+ return None
59
+
60
+ obj_id = self._get_save_url_id()
61
+ server_data = self.manager.update(obj_id, updated_data, **kwargs)
62
+ self._update_attrs(server_data)
63
+ return server_data
64
+
65
+
66
+ class ProjectFeatureFlagManager(CRUDMixin[ProjectFeatureFlag]):
67
+ _path = "/projects/{project_id}/feature_flags"
68
+ _obj_cls = ProjectFeatureFlag
69
+ _from_parent_attrs = {"project_id": "id"}
70
+ _create_attrs = RequiredOptional(
71
+ required=("name",), optional=("version", "description", "active", "strategies")
72
+ )
73
+ _update_attrs = RequiredOptional(
74
+ # new_name is used for renaming via CLI and mapped to 'name' in update()
75
+ optional=("name", "new_name", "description", "active", "strategies")
76
+ )
77
+ _list_filters = ("scope",)
78
+ _types = {"strategies": types.JsonAttribute}
79
+
80
+ def update(
81
+ self,
82
+ id: str | int | None = None,
83
+ new_data: dict[str, Any] | None = None,
84
+ **kwargs: Any,
85
+ ) -> dict[str, Any]:
86
+ """Update a Project Feature Flag.
87
+
88
+ This is a lower-level method called by `ProjectFeatureFlag.save()` and
89
+ is also used directly by the CLI.
90
+
91
+ The `new_name` parameter is a special case to support renaming via the
92
+ CLI (`--new-name`). It is converted to the `name` parameter that the
93
+ GitLab API expects in the request body.
94
+
95
+ Args:
96
+ id: The current name of the feature flag.
97
+ new_data: The dictionary of attributes to update.
98
+ **kwargs: Extra options to send to the server (e.g. sudo)
99
+ """
100
+ # Avoid mutating the caller-provided new_data dict by working on a copy.
101
+ data = dict(new_data or {})
102
+ # When used via CLI, we have 'new_name' to distinguish from the ID 'name'.
103
+ # When used via .save(), the object passes 'name' directly in new_data.
104
+ if "new_name" in data:
105
+ data["name"] = data.pop("new_name")
106
+ return super().update(id, data, **kwargs)