python-gitlab 4.10.0__tar.gz → 4.11.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 (350) hide show
  1. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/CHANGELOG.md +32 -0
  2. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/PKG-INFO +3 -1
  3. python_gitlab-4.11.0/docs/api-usage-graphql.rst +52 -0
  4. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-usage.rst +4 -4
  5. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-usage.rst +3 -3
  6. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/pipelines_and_jobs.rst +1 -1
  7. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/index.rst +1 -0
  8. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/__init__.py +2 -1
  9. python_gitlab-4.11.0/gitlab/_backends/graphql.py +24 -0
  10. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_version.py +1 -1
  11. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/client.py +116 -47
  12. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/utils.py +91 -2
  13. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/members.py +4 -2
  14. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/pyproject.toml +1 -0
  15. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/PKG-INFO +3 -1
  16. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/SOURCES.txt +5 -0
  17. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/requires.txt +3 -0
  18. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-lint.txt +4 -3
  19. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-test.txt +2 -1
  20. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements.txt +2 -0
  21. python_gitlab-4.11.0/tests/functional/api/test_graphql.py +20 -0
  22. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/set_token.rb +1 -1
  23. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/install/test_install.py +1 -1
  24. python_gitlab-4.11.0/tests/unit/test_graphql.py +60 -0
  25. python_gitlab-4.11.0/tests/unit/test_retry.py +41 -0
  26. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/AUTHORS +0 -0
  27. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/COPYING +0 -0
  28. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/MANIFEST.in +0 -0
  29. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/README.rst +0 -0
  30. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/Makefile +0 -0
  31. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/__init__.py +0 -0
  32. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/_static/js/gitter.js +0 -0
  33. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api/gitlab.rst +0 -0
  34. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api/gitlab.v4.rst +0 -0
  35. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-levels.rst +0 -0
  36. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-objects.rst +0 -0
  37. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-usage-advanced.rst +0 -0
  38. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/changelog.md +0 -0
  39. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-examples.rst +0 -0
  40. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-objects.rst +0 -0
  41. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/conf.py +0 -0
  42. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/__init__.py +0 -0
  43. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/docstrings.py +0 -0
  44. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/manager_tmpl.j2 +0 -0
  45. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/faq.rst +0 -0
  46. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/access_requests.rst +0 -0
  47. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/appearance.rst +0 -0
  48. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/applications.rst +0 -0
  49. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/badges.rst +0 -0
  50. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/boards.rst +0 -0
  51. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/branches.rst +0 -0
  52. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/bulk_imports.rst +0 -0
  53. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/ci_lint.rst +0 -0
  54. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/cluster_agents.rst +0 -0
  55. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/clusters.rst +0 -0
  56. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/commits.rst +0 -0
  57. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deploy_keys.rst +0 -0
  58. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deploy_tokens.rst +0 -0
  59. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deployments.rst +0 -0
  60. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/discussions.rst +0 -0
  61. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/draft_notes.rst +0 -0
  62. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/emojis.rst +0 -0
  63. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/environments.rst +0 -0
  64. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/epics.rst +0 -0
  65. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/events.rst +0 -0
  66. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/features.rst +0 -0
  67. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/geo_nodes.rst +0 -0
  68. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/group_access_tokens.rst +0 -0
  69. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/groups.rst +0 -0
  70. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/invitations.rst +0 -0
  71. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/issues.rst +0 -0
  72. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/iterations.rst +0 -0
  73. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/job_token_scope.rst +0 -0
  74. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/keys.rst +0 -0
  75. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/labels.rst +0 -0
  76. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_request_approvals.rst +0 -0
  77. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_requests.rst +0 -0
  78. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_trains.rst +0 -0
  79. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/messages.rst +0 -0
  80. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/milestones.rst +0 -0
  81. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/namespaces.rst +0 -0
  82. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/notes.rst +0 -0
  83. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/notifications.rst +0 -0
  84. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/packages.rst +0 -0
  85. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/pagesdomains.rst +0 -0
  86. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/personal_access_tokens.rst +0 -0
  87. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/project_access_tokens.rst +0 -0
  88. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/projects.rst +0 -0
  89. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_branches.rst +0 -0
  90. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_container_repositories.rst +0 -0
  91. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_environments.rst +0 -0
  92. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_packages.rst +0 -0
  93. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/releases.rst +0 -0
  94. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/remote_mirrors.rst +0 -0
  95. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/repositories.rst +0 -0
  96. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/repository_tags.rst +0 -0
  97. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/resource_groups.rst +0 -0
  98. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/runners.rst +0 -0
  99. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/search.rst +0 -0
  100. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/secure_files.rst +0 -0
  101. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/settings.rst +0 -0
  102. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/sidekiq.rst +0 -0
  103. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/snippets.rst +0 -0
  104. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/statistics.rst +0 -0
  105. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/system_hooks.rst +0 -0
  106. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/templates.rst +0 -0
  107. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/todos.rst +0 -0
  108. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/topics.rst +0 -0
  109. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/users.rst +0 -0
  110. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/variables.rst +0 -0
  111. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/wikis.rst +0 -0
  112. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/make.bat +0 -0
  113. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/release-notes.rst +0 -0
  114. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/__main__.py +0 -0
  115. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/__init__.py +0 -0
  116. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/protocol.py +0 -0
  117. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/requests_backend.py +0 -0
  118. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/base.py +0 -0
  119. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/cli.py +0 -0
  120. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/config.py +0 -0
  121. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/const.py +0 -0
  122. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/exceptions.py +0 -0
  123. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/mixins.py +0 -0
  124. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/py.typed +0 -0
  125. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/types.py +0 -0
  126. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/__init__.py +0 -0
  127. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/cli.py +0 -0
  128. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/__init__.py +0 -0
  129. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/access_requests.py +0 -0
  130. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/appearance.py +0 -0
  131. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/applications.py +0 -0
  132. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/artifacts.py +0 -0
  133. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/audit_events.py +0 -0
  134. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/award_emojis.py +0 -0
  135. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/badges.py +0 -0
  136. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/boards.py +0 -0
  137. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/branches.py +0 -0
  138. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/broadcast_messages.py +0 -0
  139. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/bulk_imports.py +0 -0
  140. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/ci_lint.py +0 -0
  141. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/cluster_agents.py +0 -0
  142. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/clusters.py +0 -0
  143. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/commits.py +0 -0
  144. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/container_registry.py +0 -0
  145. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/custom_attributes.py +0 -0
  146. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deploy_keys.py +0 -0
  147. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deploy_tokens.py +0 -0
  148. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deployments.py +0 -0
  149. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/discussions.py +0 -0
  150. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/draft_notes.py +0 -0
  151. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/environments.py +0 -0
  152. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/epics.py +0 -0
  153. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/events.py +0 -0
  154. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/export_import.py +0 -0
  155. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/features.py +0 -0
  156. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/files.py +0 -0
  157. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/geo_nodes.py +0 -0
  158. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/group_access_tokens.py +0 -0
  159. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/groups.py +0 -0
  160. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/hooks.py +0 -0
  161. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/integrations.py +0 -0
  162. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/invitations.py +0 -0
  163. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/issues.py +0 -0
  164. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/iterations.py +0 -0
  165. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/job_token_scope.py +0 -0
  166. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/jobs.py +0 -0
  167. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/keys.py +0 -0
  168. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/labels.py +0 -0
  169. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/ldap.py +0 -0
  170. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_request_approvals.py +0 -0
  171. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_requests.py +0 -0
  172. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_trains.py +0 -0
  173. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/milestones.py +0 -0
  174. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/namespaces.py +0 -0
  175. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/notes.py +0 -0
  176. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/notification_settings.py +0 -0
  177. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/package_protection_rules.py +0 -0
  178. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/packages.py +0 -0
  179. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/pages.py +0 -0
  180. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/personal_access_tokens.py +0 -0
  181. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/pipelines.py +0 -0
  182. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/project_access_tokens.py +0 -0
  183. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/projects.py +0 -0
  184. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/push_rules.py +0 -0
  185. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/registry_protection_rules.py +0 -0
  186. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/releases.py +0 -0
  187. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/repositories.py +0 -0
  188. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/resource_groups.py +0 -0
  189. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/reviewers.py +0 -0
  190. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/runners.py +0 -0
  191. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/secure_files.py +0 -0
  192. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/service_accounts.py +0 -0
  193. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/settings.py +0 -0
  194. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/sidekiq.py +0 -0
  195. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/snippets.py +0 -0
  196. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/statistics.py +0 -0
  197. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/tags.py +0 -0
  198. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/templates.py +0 -0
  199. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/todos.py +0 -0
  200. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/topics.py +0 -0
  201. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/triggers.py +0 -0
  202. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/users.py +0 -0
  203. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/variables.py +0 -0
  204. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/wikis.py +0 -0
  205. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/dependency_links.txt +0 -0
  206. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/entry_points.txt +0 -0
  207. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/top_level.txt +0 -0
  208. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-docker.txt +0 -0
  209. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-docs.txt +0 -0
  210. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-precommit.txt +0 -0
  211. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/setup.cfg +0 -0
  212. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/__init__.py +0 -0
  213. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/conftest.py +0 -0
  214. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/__init__.py +0 -0
  215. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/__init__.py +0 -0
  216. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_boards.py +0 -0
  217. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_branches.py +0 -0
  218. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_bulk_imports.py +0 -0
  219. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_current_user.py +0 -0
  220. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_deploy_keys.py +0 -0
  221. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_deploy_tokens.py +0 -0
  222. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_epics.py +0 -0
  223. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_gitlab.py +0 -0
  224. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_groups.py +0 -0
  225. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_import_export.py +0 -0
  226. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_issues.py +0 -0
  227. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_keys.py +0 -0
  228. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_lazy_objects.py +0 -0
  229. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_merge_requests.py +0 -0
  230. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_packages.py +0 -0
  231. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_project_job_token_scope.py +0 -0
  232. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_projects.py +0 -0
  233. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_push_rules.py +0 -0
  234. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_registry.py +0 -0
  235. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_releases.py +0 -0
  236. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_repository.py +0 -0
  237. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_services.py +0 -0
  238. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_snippets.py +0 -0
  239. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_statistics.py +0 -0
  240. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_topics.py +0 -0
  241. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_users.py +0 -0
  242. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_variables.py +0 -0
  243. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_wikis.py +0 -0
  244. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/__init__.py +0 -0
  245. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/conftest.py +0 -0
  246. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli.py +0 -0
  247. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_artifacts.py +0 -0
  248. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_packages.py +0 -0
  249. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_projects.py +0 -0
  250. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_repository.py +0 -0
  251. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_resource_access_tokens.py +0 -0
  252. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_users.py +0 -0
  253. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_v4.py +0 -0
  254. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_variables.py +0 -0
  255. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/conftest.py +0 -0
  256. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/ee-test.py +0 -0
  257. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/.env +0 -0
  258. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/__init__.py +0 -0
  259. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/avatar.png +0 -0
  260. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/create_license.rb +0 -0
  261. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/docker-compose.yml +0 -0
  262. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/docker.py +0 -0
  263. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/invalid_auth.cfg +0 -0
  264. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/invalid_version.cfg +0 -0
  265. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/helpers.py +0 -0
  266. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/smoke/__init__.py +0 -0
  267. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/smoke/test_dists.py +0 -0
  268. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/__init__.py +0 -0
  269. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/_backends/__init__.py +0 -0
  270. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/_backends/test_requests_backend.py +0 -0
  271. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/base/test_rest_manager.py +0 -0
  272. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/base/test_rest_object.py +0 -0
  273. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/conftest.py +0 -0
  274. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/helpers.py +0 -0
  275. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/__init__.py +0 -0
  276. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_ensure_type_hints.py +0 -0
  277. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_imports.py +0 -0
  278. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_mro.py +0 -0
  279. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/__init__.py +0 -0
  280. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_meta_mixins.py +0 -0
  281. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_mixin_methods.py +0 -0
  282. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_object_mixins_attributes.py +0 -0
  283. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/__init__.py +0 -0
  284. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/conftest.py +0 -0
  285. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_appearance.py +0 -0
  286. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_applications.py +0 -0
  287. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_audit_events.py +0 -0
  288. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_badges.py +0 -0
  289. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_bridges.py +0 -0
  290. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_bulk_imports.py +0 -0
  291. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_ci_lint.py +0 -0
  292. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_cluster_agents.py +0 -0
  293. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_commits.py +0 -0
  294. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_deploy_tokens.py +0 -0
  295. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_deployments.py +0 -0
  296. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_draft_notes.py +0 -0
  297. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_environments.py +0 -0
  298. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_group_access_tokens.py +0 -0
  299. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_groups.py +0 -0
  300. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_hooks.py +0 -0
  301. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_invitations.py +0 -0
  302. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_issues.py +0 -0
  303. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_iterations.py +0 -0
  304. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_job_artifacts.py +0 -0
  305. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_job_token_scope.py +0 -0
  306. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_jobs.py +0 -0
  307. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_keys.py +0 -0
  308. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_members.py +0 -0
  309. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_request_pipelines.py +0 -0
  310. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_requests.py +0 -0
  311. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_trains.py +0 -0
  312. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_package_protection_rules.py +0 -0
  313. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_packages.py +0 -0
  314. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_personal_access_tokens.py +0 -0
  315. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_pipeline_schedules.py +0 -0
  316. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_pipelines.py +0 -0
  317. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_access_tokens.py +0 -0
  318. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_import_export.py +0 -0
  319. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_merge_request_approvals.py +0 -0
  320. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_statistics.py +0 -0
  321. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_projects.py +0 -0
  322. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_registry_protection_rules.py +0 -0
  323. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_registry_repositories.py +0 -0
  324. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_releases.py +0 -0
  325. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_remote_mirrors.py +0 -0
  326. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_repositories.py +0 -0
  327. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_groups.py +0 -0
  328. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_iteration_events.py +0 -0
  329. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_label_events.py +0 -0
  330. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_milestone_events.py +0 -0
  331. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_state_events.py +0 -0
  332. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_runners.py +0 -0
  333. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_secure_files.py +0 -0
  334. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_services.py +0 -0
  335. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_snippets.py +0 -0
  336. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_statistics.py +0 -0
  337. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_submodules.py +0 -0
  338. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_todos.py +0 -0
  339. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_topics.py +0 -0
  340. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_users.py +0 -0
  341. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_variables.py +0 -0
  342. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_cli.py +0 -0
  343. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_config.py +0 -0
  344. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_exceptions.py +0 -0
  345. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab.py +0 -0
  346. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab_auth.py +0 -0
  347. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab_http_methods.py +0 -0
  348. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_types.py +0 -0
  349. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_utils.py +0 -0
  350. {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tox.ini +0 -0
@@ -1,5 +1,37 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v4.11.0 (2024-09-13)
4
+
5
+ ### Chore
6
+
7
+ * chore(pre-commit): add deps ([`fe5e608`](https://github.com/python-gitlab/python-gitlab/commit/fe5e608bc6cc04863bd4d1d9dbe101fffd88e954))
8
+
9
+ * chore(deps): update all non-major dependencies ([`fac8bf9`](https://github.com/python-gitlab/python-gitlab/commit/fac8bf9f3e2a0218f96337536d08dec9991bfc1a))
10
+
11
+ * chore(deps): update dependency types-setuptools to v74 ([`bdfaddb`](https://github.com/python-gitlab/python-gitlab/commit/bdfaddb89ae7ba351bd3a21c6cecc528772db4de))
12
+
13
+ * chore(deps): update all non-major dependencies ([`88c7529`](https://github.com/python-gitlab/python-gitlab/commit/88c75297377dd1f1106b5bc673946cebd563e0a1))
14
+
15
+ ### Documentation
16
+
17
+ * docs(objects): fix typo in get latest pipeline ([`b9f5c12`](https://github.com/python-gitlab/python-gitlab/commit/b9f5c12d3ba6ca4e4321a81e7610d03fb4440c02))
18
+
19
+ ### Feature
20
+
21
+ * feat(client): make retries configurable in GraphQL ([`145870e`](https://github.com/python-gitlab/python-gitlab/commit/145870e628ed3b648a0a29fc551a6f38469b684a))
22
+
23
+ * feat(client): add retry handling to GraphQL client ([`8898c38`](https://github.com/python-gitlab/python-gitlab/commit/8898c38b97ed36d9ff8f2f20dee27ef1448b9f83))
24
+
25
+ * feat(api): add exclusive GET attrs for /projects/:id/members ([`e637808`](https://github.com/python-gitlab/python-gitlab/commit/e637808bcb74498438109d7ed352071ebaa192d5))
26
+
27
+ * feat: add a minimal GraphQL client ([`d6b1b0a`](https://github.com/python-gitlab/python-gitlab/commit/d6b1b0a962bbf0f4e0612067fc075dbdcbb772f8))
28
+
29
+ * feat(api): add exclusive GET attrs for /groups/:id/members ([`d44ddd2`](https://github.com/python-gitlab/python-gitlab/commit/d44ddd2b00d78bb87ff6a4776e64e05e0c1524e1))
30
+
31
+ ### Refactor
32
+
33
+ * refactor(client): move retry logic into utility ([`3235c48`](https://github.com/python-gitlab/python-gitlab/commit/3235c48328c2866f7d46597ba3c0c2488e6c375c))
34
+
3
35
  ## v4.10.0 (2024-08-28)
4
36
 
5
37
  ### Chore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-gitlab
3
- Version: 4.10.0
3
+ Version: 4.11.0
4
4
  Summary: A python wrapper for the GitLab API
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>
@@ -34,6 +34,8 @@ Provides-Extra: autocompletion
34
34
  Requires-Dist: argcomplete<3,>=1.10.0; extra == "autocompletion"
35
35
  Provides-Extra: yaml
36
36
  Requires-Dist: PyYaml>=6.0.1; extra == "yaml"
37
+ Provides-Extra: graphql
38
+ Requires-Dist: gql[httpx]<4,>=3.5.0; extra == "graphql"
37
39
 
38
40
  python-gitlab
39
41
  =============
@@ -0,0 +1,52 @@
1
+ ############################
2
+ Using the GraphQL API (beta)
3
+ ############################
4
+
5
+ python-gitlab provides basic support for executing GraphQL queries and mutations.
6
+
7
+ .. danger::
8
+
9
+ The GraphQL client is experimental and only provides basic support.
10
+ It does not currently support pagination, obey rate limits,
11
+ or attempt complex retries. You can use it to build simple queries and mutations.
12
+
13
+ It is currently unstable and its implementation may change. You can expect a more
14
+ mature client in one of the upcoming versions.
15
+
16
+ The ``gitlab.GraphQL`` class
17
+ ==================================
18
+
19
+ As with the REST client, you connect to a GitLab instance by creating a ``gitlab.GraphQL`` object:
20
+
21
+ .. code-block:: python
22
+
23
+ import gitlab
24
+
25
+ # anonymous read-only access for public resources (GitLab.com)
26
+ gq = gitlab.GraphQL()
27
+
28
+ # anonymous read-only access for public resources (self-hosted GitLab instance)
29
+ gq = gitlab.GraphQL('https://gitlab.example.com')
30
+
31
+ # personal access token or OAuth2 token authentication (GitLab.com)
32
+ gq = gitlab.GraphQL(token='glpat-JVNSESs8EwWRx5yDxM5q')
33
+
34
+ # personal access token or OAuth2 token authentication (self-hosted GitLab instance)
35
+ gq = gitlab.GraphQL('https://gitlab.example.com', token='glpat-JVNSESs8EwWRx5yDxM5q')
36
+
37
+ Sending queries
38
+ ===============
39
+
40
+ Get the result of a query:
41
+
42
+ .. code-block:: python
43
+
44
+ query = """{
45
+ query {
46
+ currentUser {
47
+ name
48
+ }
49
+ }
50
+ """
51
+
52
+ result = gq.execute(query)
@@ -1,8 +1,8 @@
1
- ############################
2
- Getting started with the API
3
- ############################
1
+ ##################
2
+ Using the REST API
3
+ ##################
4
4
 
5
- python-gitlab only supports GitLab API v4.
5
+ python-gitlab currently only supports v4 of the GitLab REST API.
6
6
 
7
7
  ``gitlab.Gitlab`` class
8
8
  =======================
@@ -1,6 +1,6 @@
1
- ############################
2
- Getting started with the CLI
3
- ############################
1
+ #############
2
+ Using the CLI
3
+ #############
4
4
 
5
5
  ``python-gitlab`` provides a :command:`gitlab` command-line tool to interact
6
6
  with GitLab servers.
@@ -51,7 +51,7 @@ Delete a pipeline::
51
51
 
52
52
  Get latest pipeline::
53
53
 
54
- projet.pipelines.latest(ref="main")
54
+ project.pipelines.latest(ref="main")
55
55
 
56
56
 
57
57
  Triggers
@@ -7,6 +7,7 @@
7
7
  cli-usage
8
8
  api-usage
9
9
  api-usage-advanced
10
+ api-usage-graphql
10
11
  cli-examples
11
12
  api-objects
12
13
  api/gitlab
@@ -27,7 +27,7 @@ from gitlab._version import ( # noqa: F401
27
27
  __title__,
28
28
  __version__,
29
29
  )
30
- from gitlab.client import Gitlab, GitlabList # noqa: F401
30
+ from gitlab.client import Gitlab, GitlabList, GraphQL # noqa: F401
31
31
  from gitlab.exceptions import * # noqa: F401,F403
32
32
 
33
33
  warnings.filterwarnings("default", category=DeprecationWarning, module="^gitlab")
@@ -42,5 +42,6 @@ __all__ = [
42
42
  "__version__",
43
43
  "Gitlab",
44
44
  "GitlabList",
45
+ "GraphQL",
45
46
  ]
46
47
  __all__.extend(gitlab.exceptions.__all__)
@@ -0,0 +1,24 @@
1
+ from typing import Any
2
+
3
+ import httpx
4
+ from gql.transport.httpx import HTTPXTransport
5
+
6
+
7
+ class GitlabTransport(HTTPXTransport):
8
+ """A gql httpx transport that reuses an existing httpx.Client.
9
+ By default, gql's transports do not have a keep-alive session
10
+ and do not enable providing your own session that's kept open.
11
+ This transport lets us provide and close our session on our own
12
+ and provide additional auth.
13
+ For details, see https://github.com/graphql-python/gql/issues/91.
14
+ """
15
+
16
+ def __init__(self, *args: Any, client: httpx.Client, **kwargs: Any):
17
+ super().__init__(*args, **kwargs)
18
+ self.client = client
19
+
20
+ def connect(self) -> None:
21
+ pass
22
+
23
+ def close(self) -> None:
24
+ pass
@@ -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__ = "4.10.0"
6
+ __version__ = "4.11.0"
@@ -2,7 +2,6 @@
2
2
 
3
3
  import os
4
4
  import re
5
- import time
6
5
  from typing import (
7
6
  Any,
8
7
  BinaryIO,
@@ -25,6 +24,19 @@ import gitlab.const
25
24
  import gitlab.exceptions
26
25
  from gitlab import _backends, utils
27
26
 
27
+ try:
28
+ import gql
29
+ import gql.transport.exceptions
30
+ import graphql
31
+ import httpx
32
+
33
+ from ._backends.graphql import GitlabTransport
34
+
35
+ _GQL_INSTALLED = True
36
+ except ImportError: # pragma: no cover
37
+ _GQL_INSTALLED = False
38
+
39
+
28
40
  REDIRECT_MSG = (
29
41
  "python-gitlab detected a {status_code} ({reason!r}) redirection. You must update "
30
42
  "your GitLab URL to the correct URL to avoid issues. The redirection was from: "
@@ -89,7 +101,7 @@ class Gitlab:
89
101
  self._api_version = str(api_version)
90
102
  self._server_version: Optional[str] = None
91
103
  self._server_revision: Optional[str] = None
92
- self._base_url = self._get_base_url(url)
104
+ self._base_url = utils.get_base_url(url)
93
105
  self._url = f"{self._base_url}/api/v{api_version}"
94
106
  #: Timeout to use for requests to gitlab server
95
107
  self.timeout = timeout
@@ -557,18 +569,6 @@ class Gitlab:
557
569
  "verify": self.ssl_verify,
558
570
  }
559
571
 
560
- @staticmethod
561
- def _get_base_url(url: Optional[str] = None) -> str:
562
- """Return the base URL with the trailing slash stripped.
563
- If the URL is a Falsy value, return the default URL.
564
- Returns:
565
- The base URL
566
- """
567
- if not url:
568
- return gitlab.const.DEFAULT_URL
569
-
570
- return url.rstrip("/")
571
-
572
572
  def _build_url(self, path: str) -> str:
573
573
  """Returns the full url from path.
574
574
 
@@ -718,7 +718,12 @@ class Gitlab:
718
718
  send_data = self._backend.prepare_send_data(files, post_data, raw)
719
719
  opts["headers"]["Content-type"] = send_data.content_type
720
720
 
721
- cur_retries = 0
721
+ retry = utils.Retry(
722
+ max_retries=max_retries,
723
+ obey_rate_limit=obey_rate_limit,
724
+ retry_transient_errors=retry_transient_errors,
725
+ )
726
+
722
727
  while True:
723
728
  try:
724
729
  result = self._backend.http_request(
@@ -733,14 +738,8 @@ class Gitlab:
733
738
  **opts,
734
739
  )
735
740
  except (requests.ConnectionError, requests.exceptions.ChunkedEncodingError):
736
- if retry_transient_errors and (
737
- max_retries == -1 or cur_retries < max_retries
738
- ):
739
- wait_time = 2**cur_retries * 0.1
740
- cur_retries += 1
741
- time.sleep(wait_time)
741
+ if retry.handle_retry():
742
742
  continue
743
-
744
743
  raise
745
744
 
746
745
  self._check_redirects(result.response)
@@ -748,31 +747,10 @@ class Gitlab:
748
747
  if 200 <= result.status_code < 300:
749
748
  return result.response
750
749
 
751
- def should_retry() -> bool:
752
- if result.status_code == 429 and obey_rate_limit:
753
- return True
754
-
755
- if not retry_transient_errors:
756
- return False
757
- if result.status_code in gitlab.const.RETRYABLE_TRANSIENT_ERROR_CODES:
758
- return True
759
- if result.status_code == 409 and "Resource lock" in result.reason:
760
- return True
761
-
762
- return False
763
-
764
- if should_retry():
765
- # Response headers documentation:
766
- # https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html#response-headers
767
- if max_retries == -1 or cur_retries < max_retries:
768
- wait_time = 2**cur_retries * 0.1
769
- if "Retry-After" in result.headers:
770
- wait_time = int(result.headers["Retry-After"])
771
- elif "RateLimit-Reset" in result.headers:
772
- wait_time = int(result.headers["RateLimit-Reset"]) - time.time()
773
- cur_retries += 1
774
- time.sleep(wait_time)
775
- continue
750
+ if retry.handle_retry_on_status(
751
+ result.status_code, result.headers, result.reason
752
+ ):
753
+ continue
776
754
 
777
755
  error_message = result.content
778
756
  try:
@@ -1296,3 +1274,94 @@ class GitlabList:
1296
1274
  return self.next()
1297
1275
 
1298
1276
  raise StopIteration
1277
+
1278
+
1279
+ class GraphQL:
1280
+ def __init__(
1281
+ self,
1282
+ url: Optional[str] = None,
1283
+ *,
1284
+ token: Optional[str] = None,
1285
+ ssl_verify: Union[bool, str] = True,
1286
+ client: Optional[httpx.Client] = None,
1287
+ timeout: Optional[float] = None,
1288
+ user_agent: str = gitlab.const.USER_AGENT,
1289
+ fetch_schema_from_transport: bool = False,
1290
+ max_retries: int = 10,
1291
+ obey_rate_limit: bool = True,
1292
+ retry_transient_errors: bool = False,
1293
+ ) -> None:
1294
+ if not _GQL_INSTALLED:
1295
+ raise ImportError(
1296
+ "The GraphQL client could not be initialized because "
1297
+ "the gql dependencies are not installed. "
1298
+ "Install them with 'pip install python-gitlab[graphql]'"
1299
+ )
1300
+ self._base_url = utils.get_base_url(url)
1301
+ self._timeout = timeout
1302
+ self._token = token
1303
+ self._url = f"{self._base_url}/api/graphql"
1304
+ self._user_agent = user_agent
1305
+ self._ssl_verify = ssl_verify
1306
+ self._max_retries = max_retries
1307
+ self._obey_rate_limit = obey_rate_limit
1308
+ self._retry_transient_errors = retry_transient_errors
1309
+
1310
+ opts = self._get_client_opts()
1311
+ self._http_client = client or httpx.Client(**opts)
1312
+ self._transport = GitlabTransport(self._url, client=self._http_client)
1313
+ self._client = gql.Client(
1314
+ transport=self._transport,
1315
+ fetch_schema_from_transport=fetch_schema_from_transport,
1316
+ )
1317
+ self._gql = gql.gql
1318
+
1319
+ def __enter__(self) -> "GraphQL":
1320
+ return self
1321
+
1322
+ def __exit__(self, *args: Any) -> None:
1323
+ self._http_client.close()
1324
+
1325
+ def _get_client_opts(self) -> Dict[str, Any]:
1326
+ headers = {"User-Agent": self._user_agent}
1327
+
1328
+ if self._token:
1329
+ headers["Authorization"] = f"Bearer {self._token}"
1330
+
1331
+ return {
1332
+ "headers": headers,
1333
+ "timeout": self._timeout,
1334
+ "verify": self._ssl_verify,
1335
+ }
1336
+
1337
+ def execute(
1338
+ self, request: Union[str, graphql.Source], *args: Any, **kwargs: Any
1339
+ ) -> Any:
1340
+ parsed_document = self._gql(request)
1341
+ retry = utils.Retry(
1342
+ max_retries=self._max_retries,
1343
+ obey_rate_limit=self._obey_rate_limit,
1344
+ retry_transient_errors=self._retry_transient_errors,
1345
+ )
1346
+
1347
+ while True:
1348
+ try:
1349
+ result = self._client.execute(parsed_document, *args, **kwargs)
1350
+ except gql.transport.exceptions.TransportServerError as e:
1351
+ if retry.handle_retry_on_status(
1352
+ status_code=e.code, headers=self._transport.response_headers
1353
+ ):
1354
+ continue
1355
+
1356
+ if e.code == 401:
1357
+ raise gitlab.exceptions.GitlabAuthenticationError(
1358
+ response_code=e.code,
1359
+ error_message=str(e),
1360
+ )
1361
+
1362
+ raise gitlab.exceptions.GitlabHttpError(
1363
+ response_code=e.code,
1364
+ error_message=str(e),
1365
+ )
1366
+
1367
+ return result
@@ -2,14 +2,26 @@ import dataclasses
2
2
  import email.message
3
3
  import logging
4
4
  import pathlib
5
+ import time
5
6
  import traceback
6
7
  import urllib.parse
7
8
  import warnings
8
- from typing import Any, Callable, Dict, Iterator, Literal, Optional, Tuple, Type, Union
9
+ from typing import (
10
+ Any,
11
+ Callable,
12
+ Dict,
13
+ Iterator,
14
+ Literal,
15
+ MutableMapping,
16
+ Optional,
17
+ Tuple,
18
+ Type,
19
+ Union,
20
+ )
9
21
 
10
22
  import requests
11
23
 
12
- from gitlab import types
24
+ from gitlab import const, types
13
25
 
14
26
 
15
27
  class _StdoutStream:
@@ -17,6 +29,18 @@ class _StdoutStream:
17
29
  print(chunk)
18
30
 
19
31
 
32
+ def get_base_url(url: Optional[str] = None) -> str:
33
+ """Return the base URL with the trailing slash stripped.
34
+ If the URL is a Falsy value, return the default URL.
35
+ Returns:
36
+ The base URL
37
+ """
38
+ if not url:
39
+ return const.DEFAULT_URL
40
+
41
+ return url.rstrip("/")
42
+
43
+
20
44
  def get_content_type(content_type: Optional[str]) -> str:
21
45
  message = email.message.Message()
22
46
  if content_type is not None:
@@ -73,6 +97,71 @@ def response_content(
73
97
  return None
74
98
 
75
99
 
100
+ class Retry:
101
+ def __init__(
102
+ self,
103
+ max_retries: int,
104
+ obey_rate_limit: Optional[bool] = True,
105
+ retry_transient_errors: Optional[bool] = False,
106
+ ) -> None:
107
+ self.cur_retries = 0
108
+ self.max_retries = max_retries
109
+ self.obey_rate_limit = obey_rate_limit
110
+ self.retry_transient_errors = retry_transient_errors
111
+
112
+ def _retryable_status_code(
113
+ self, status_code: Optional[int], reason: str = ""
114
+ ) -> bool:
115
+ if status_code == 429 and self.obey_rate_limit:
116
+ return True
117
+
118
+ if not self.retry_transient_errors:
119
+ return False
120
+ if status_code in const.RETRYABLE_TRANSIENT_ERROR_CODES:
121
+ return True
122
+ if status_code == 409 and "Resource lock" in reason:
123
+ return True
124
+
125
+ return False
126
+
127
+ def handle_retry_on_status(
128
+ self,
129
+ status_code: Optional[int],
130
+ headers: Optional[MutableMapping[str, str]] = None,
131
+ reason: str = "",
132
+ ) -> bool:
133
+ if not self._retryable_status_code(status_code, reason):
134
+ return False
135
+
136
+ if headers is None:
137
+ headers = {}
138
+
139
+ # Response headers documentation:
140
+ # https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html#response-headers
141
+ if self.max_retries == -1 or self.cur_retries < self.max_retries:
142
+ wait_time = 2**self.cur_retries * 0.1
143
+ if "Retry-After" in headers:
144
+ wait_time = int(headers["Retry-After"])
145
+ elif "RateLimit-Reset" in headers:
146
+ wait_time = int(headers["RateLimit-Reset"]) - time.time()
147
+ self.cur_retries += 1
148
+ time.sleep(wait_time)
149
+ return True
150
+
151
+ return False
152
+
153
+ def handle_retry(self) -> bool:
154
+ if self.retry_transient_errors and (
155
+ self.max_retries == -1 or self.cur_retries < self.max_retries
156
+ ):
157
+ wait_time = 2**self.cur_retries * 0.1
158
+ self.cur_retries += 1
159
+ time.sleep(wait_time)
160
+ return True
161
+
162
+ return False
163
+
164
+
76
165
  def _transform_types(
77
166
  data: Dict[str, Any],
78
167
  custom_types: Dict[str, Any],
@@ -37,8 +37,9 @@ class GroupMemberManager(CRUDMixin, RESTManager):
37
37
  _obj_cls = GroupMember
38
38
  _from_parent_attrs = {"group_id": "id"}
39
39
  _create_attrs = RequiredOptional(
40
- required=("access_level", "user_id"),
40
+ required=("access_level",),
41
41
  optional=("expires_at", "tasks_to_be_done"),
42
+ exclusive=("username", "user_id"),
42
43
  )
43
44
  _update_attrs = RequiredOptional(
44
45
  required=("access_level",), optional=("expires_at",)
@@ -101,8 +102,9 @@ class ProjectMemberManager(CRUDMixin, RESTManager):
101
102
  _obj_cls = ProjectMember
102
103
  _from_parent_attrs = {"project_id": "id"}
103
104
  _create_attrs = RequiredOptional(
104
- required=("access_level", "user_id"),
105
+ required=("access_level",),
105
106
  optional=("expires_at", "tasks_to_be_done"),
107
+ exclusive=("username", "user_id"),
106
108
  )
107
109
  _update_attrs = RequiredOptional(
108
110
  required=("access_level",), optional=("expires_at",)
@@ -43,6 +43,7 @@ dynamic = ["version"]
43
43
  [project.optional-dependencies]
44
44
  autocompletion = ["argcomplete>=1.10.0,<3"]
45
45
  yaml = ["PyYaml>=6.0.1"]
46
+ graphql = ["gql[httpx]>=3.5.0,<4"]
46
47
 
47
48
  [project.scripts]
48
49
  gitlab = "gitlab.cli:main"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-gitlab
3
- Version: 4.10.0
3
+ Version: 4.11.0
4
4
  Summary: A python wrapper for the GitLab API
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>
@@ -34,6 +34,8 @@ Provides-Extra: autocompletion
34
34
  Requires-Dist: argcomplete<3,>=1.10.0; extra == "autocompletion"
35
35
  Provides-Extra: yaml
36
36
  Requires-Dist: PyYaml>=6.0.1; extra == "yaml"
37
+ Provides-Extra: graphql
38
+ Requires-Dist: gql[httpx]<4,>=3.5.0; extra == "graphql"
37
39
 
38
40
  python-gitlab
39
41
  =============
@@ -16,6 +16,7 @@ docs/__init__.py
16
16
  docs/api-levels.rst
17
17
  docs/api-objects.rst
18
18
  docs/api-usage-advanced.rst
19
+ docs/api-usage-graphql.rst
19
20
  docs/api-usage.rst
20
21
  docs/changelog.md
21
22
  docs/cli-examples.rst
@@ -113,6 +114,7 @@ gitlab/py.typed
113
114
  gitlab/types.py
114
115
  gitlab/utils.py
115
116
  gitlab/_backends/__init__.py
117
+ gitlab/_backends/graphql.py
116
118
  gitlab/_backends/protocol.py
117
119
  gitlab/_backends/requests_backend.py
118
120
  gitlab/v4/__init__.py
@@ -216,6 +218,7 @@ tests/functional/api/test_deploy_keys.py
216
218
  tests/functional/api/test_deploy_tokens.py
217
219
  tests/functional/api/test_epics.py
218
220
  tests/functional/api/test_gitlab.py
221
+ tests/functional/api/test_graphql.py
219
222
  tests/functional/api/test_groups.py
220
223
  tests/functional/api/test_import_export.py
221
224
  tests/functional/api/test_issues.py
@@ -268,6 +271,8 @@ tests/unit/test_exceptions.py
268
271
  tests/unit/test_gitlab.py
269
272
  tests/unit/test_gitlab_auth.py
270
273
  tests/unit/test_gitlab_http_methods.py
274
+ tests/unit/test_graphql.py
275
+ tests/unit/test_retry.py
271
276
  tests/unit/test_types.py
272
277
  tests/unit/test_utils.py
273
278
  tests/unit/_backends/__init__.py
@@ -4,5 +4,8 @@ requests-toolbelt>=1.0.0
4
4
  [autocompletion]
5
5
  argcomplete<3,>=1.10.0
6
6
 
7
+ [graphql]
8
+ gql[httpx]<4,>=3.5.0
9
+
7
10
  [yaml]
8
11
  PyYaml>=6.0.1
@@ -5,9 +5,10 @@ commitizen==3.29.0
5
5
  flake8==7.1.1
6
6
  isort==5.13.2
7
7
  mypy==1.11.2
8
- pylint==3.2.6
8
+ pylint==3.2.7
9
9
  pytest==8.3.2
10
10
  responses==0.25.3
11
+ respx==0.21.1
11
12
  types-PyYAML==6.0.12.20240808
12
- types-requests==2.32.0.20240712
13
- types-setuptools==73.0.0.20240822
13
+ types-requests==2.32.0.20240907
14
+ types-setuptools==74.1.0.20240907
@@ -1,5 +1,5 @@
1
1
  -r requirements.txt
2
- build==1.2.1
2
+ build==1.2.2
3
3
  coverage==7.6.1
4
4
  pytest-console-scripts==1.4.1
5
5
  pytest-cov==5.0.0
@@ -7,4 +7,5 @@ pytest-github-actions-annotate-failures==0.2.0
7
7
  pytest==8.3.2
8
8
  PyYaml==6.0.2
9
9
  responses==0.25.3
10
+ respx==0.21.1
10
11
  wheel==0.44.0
@@ -1,2 +1,4 @@
1
+ gql==3.5.0
2
+ httpx==0.27.2
1
3
  requests==2.32.3
2
4
  requests-toolbelt==1.0.0
@@ -0,0 +1,20 @@
1
+ import logging
2
+
3
+ import pytest
4
+
5
+ import gitlab
6
+
7
+
8
+ @pytest.fixture
9
+ def gl_gql(gitlab_url: str, gitlab_token: str) -> gitlab.GraphQL:
10
+ logging.info("Instantiating gitlab.GraphQL instance")
11
+ instance = gitlab.GraphQL(gitlab_url, token=gitlab_token)
12
+
13
+ return instance
14
+
15
+
16
+ def test_query_returns_valid_response(gl_gql: gitlab.GraphQL):
17
+ query = "query {currentUser {active}}"
18
+
19
+ response = gl_gql.execute(query)
20
+ assert response["currentUser"]["active"] is True