python-gitlab 4.10.0__tar.gz → 4.11.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/CHANGELOG.md +38 -0
  2. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/PKG-INFO +3 -1
  3. python_gitlab-4.11.1/docs/api-usage-graphql.rst +52 -0
  4. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api-usage.rst +4 -4
  5. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/cli-usage.rst +3 -3
  6. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/pipelines_and_jobs.rst +1 -1
  7. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/index.rst +1 -0
  8. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/__init__.py +2 -1
  9. python_gitlab-4.11.1/gitlab/_backends/graphql.py +24 -0
  10. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/_version.py +1 -1
  11. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/client.py +118 -47
  12. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/utils.py +91 -2
  13. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/members.py +4 -2
  14. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/pyproject.toml +1 -0
  15. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/PKG-INFO +3 -1
  16. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/SOURCES.txt +5 -0
  17. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/requires.txt +3 -0
  18. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements-lint.txt +4 -3
  19. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements-test.txt +2 -1
  20. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements.txt +2 -0
  21. python_gitlab-4.11.1/tests/functional/api/test_graphql.py +20 -0
  22. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/set_token.rb +1 -1
  23. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/install/test_install.py +1 -1
  24. python_gitlab-4.11.1/tests/unit/test_graphql.py +60 -0
  25. python_gitlab-4.11.1/tests/unit/test_retry.py +41 -0
  26. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/AUTHORS +0 -0
  27. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/COPYING +0 -0
  28. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/MANIFEST.in +0 -0
  29. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/README.rst +0 -0
  30. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/Makefile +0 -0
  31. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/__init__.py +0 -0
  32. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/_static/js/gitter.js +0 -0
  33. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api/gitlab.rst +0 -0
  34. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api/gitlab.v4.rst +0 -0
  35. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api-levels.rst +0 -0
  36. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api-objects.rst +0 -0
  37. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/api-usage-advanced.rst +0 -0
  38. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/changelog.md +0 -0
  39. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/cli-examples.rst +0 -0
  40. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/cli-objects.rst +0 -0
  41. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/conf.py +0 -0
  42. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/ext/__init__.py +0 -0
  43. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/ext/docstrings.py +0 -0
  44. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/ext/manager_tmpl.j2 +0 -0
  45. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/faq.rst +0 -0
  46. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/access_requests.rst +0 -0
  47. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/appearance.rst +0 -0
  48. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/applications.rst +0 -0
  49. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/badges.rst +0 -0
  50. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/boards.rst +0 -0
  51. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/branches.rst +0 -0
  52. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/bulk_imports.rst +0 -0
  53. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/ci_lint.rst +0 -0
  54. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/cluster_agents.rst +0 -0
  55. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/clusters.rst +0 -0
  56. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/commits.rst +0 -0
  57. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/deploy_keys.rst +0 -0
  58. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/deploy_tokens.rst +0 -0
  59. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/deployments.rst +0 -0
  60. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/discussions.rst +0 -0
  61. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/draft_notes.rst +0 -0
  62. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/emojis.rst +0 -0
  63. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/environments.rst +0 -0
  64. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/epics.rst +0 -0
  65. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/events.rst +0 -0
  66. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/features.rst +0 -0
  67. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/geo_nodes.rst +0 -0
  68. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/group_access_tokens.rst +0 -0
  69. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/groups.rst +0 -0
  70. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/invitations.rst +0 -0
  71. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/issues.rst +0 -0
  72. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/iterations.rst +0 -0
  73. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/job_token_scope.rst +0 -0
  74. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/keys.rst +0 -0
  75. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/labels.rst +0 -0
  76. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/merge_request_approvals.rst +0 -0
  77. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/merge_requests.rst +0 -0
  78. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/merge_trains.rst +0 -0
  79. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/messages.rst +0 -0
  80. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/milestones.rst +0 -0
  81. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/namespaces.rst +0 -0
  82. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/notes.rst +0 -0
  83. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/notifications.rst +0 -0
  84. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/packages.rst +0 -0
  85. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/pagesdomains.rst +0 -0
  86. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/personal_access_tokens.rst +0 -0
  87. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/project_access_tokens.rst +0 -0
  88. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/projects.rst +0 -0
  89. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/protected_branches.rst +0 -0
  90. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/protected_container_repositories.rst +0 -0
  91. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/protected_environments.rst +0 -0
  92. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/protected_packages.rst +0 -0
  93. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/releases.rst +0 -0
  94. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/remote_mirrors.rst +0 -0
  95. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/repositories.rst +0 -0
  96. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/repository_tags.rst +0 -0
  97. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/resource_groups.rst +0 -0
  98. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/runners.rst +0 -0
  99. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/search.rst +0 -0
  100. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/secure_files.rst +0 -0
  101. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/settings.rst +0 -0
  102. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/sidekiq.rst +0 -0
  103. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/snippets.rst +0 -0
  104. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/statistics.rst +0 -0
  105. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/system_hooks.rst +0 -0
  106. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/templates.rst +0 -0
  107. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/todos.rst +0 -0
  108. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/topics.rst +0 -0
  109. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/users.rst +0 -0
  110. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/variables.rst +0 -0
  111. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/gl_objects/wikis.rst +0 -0
  112. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/make.bat +0 -0
  113. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/docs/release-notes.rst +0 -0
  114. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/__main__.py +0 -0
  115. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/_backends/__init__.py +0 -0
  116. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/_backends/protocol.py +0 -0
  117. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/_backends/requests_backend.py +0 -0
  118. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/base.py +0 -0
  119. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/cli.py +0 -0
  120. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/config.py +0 -0
  121. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/const.py +0 -0
  122. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/exceptions.py +0 -0
  123. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/mixins.py +0 -0
  124. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/py.typed +0 -0
  125. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/types.py +0 -0
  126. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/__init__.py +0 -0
  127. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/cli.py +0 -0
  128. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/__init__.py +0 -0
  129. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/access_requests.py +0 -0
  130. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/appearance.py +0 -0
  131. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/applications.py +0 -0
  132. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/artifacts.py +0 -0
  133. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/audit_events.py +0 -0
  134. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/award_emojis.py +0 -0
  135. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/badges.py +0 -0
  136. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/boards.py +0 -0
  137. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/branches.py +0 -0
  138. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/broadcast_messages.py +0 -0
  139. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/bulk_imports.py +0 -0
  140. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/ci_lint.py +0 -0
  141. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/cluster_agents.py +0 -0
  142. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/clusters.py +0 -0
  143. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/commits.py +0 -0
  144. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/container_registry.py +0 -0
  145. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/custom_attributes.py +0 -0
  146. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/deploy_keys.py +0 -0
  147. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/deploy_tokens.py +0 -0
  148. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/deployments.py +0 -0
  149. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/discussions.py +0 -0
  150. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/draft_notes.py +0 -0
  151. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/environments.py +0 -0
  152. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/epics.py +0 -0
  153. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/events.py +0 -0
  154. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/export_import.py +0 -0
  155. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/features.py +0 -0
  156. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/files.py +0 -0
  157. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/geo_nodes.py +0 -0
  158. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/group_access_tokens.py +0 -0
  159. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/groups.py +0 -0
  160. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/hooks.py +0 -0
  161. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/integrations.py +0 -0
  162. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/invitations.py +0 -0
  163. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/issues.py +0 -0
  164. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/iterations.py +0 -0
  165. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/job_token_scope.py +0 -0
  166. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/jobs.py +0 -0
  167. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/keys.py +0 -0
  168. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/labels.py +0 -0
  169. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/ldap.py +0 -0
  170. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/merge_request_approvals.py +0 -0
  171. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/merge_requests.py +0 -0
  172. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/merge_trains.py +0 -0
  173. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/milestones.py +0 -0
  174. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/namespaces.py +0 -0
  175. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/notes.py +0 -0
  176. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/notification_settings.py +0 -0
  177. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/package_protection_rules.py +0 -0
  178. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/packages.py +0 -0
  179. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/pages.py +0 -0
  180. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/personal_access_tokens.py +0 -0
  181. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/pipelines.py +0 -0
  182. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/project_access_tokens.py +0 -0
  183. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/projects.py +0 -0
  184. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/push_rules.py +0 -0
  185. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/registry_protection_rules.py +0 -0
  186. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/releases.py +0 -0
  187. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/repositories.py +0 -0
  188. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/resource_groups.py +0 -0
  189. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/reviewers.py +0 -0
  190. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/runners.py +0 -0
  191. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/secure_files.py +0 -0
  192. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/service_accounts.py +0 -0
  193. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/settings.py +0 -0
  194. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/sidekiq.py +0 -0
  195. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/snippets.py +0 -0
  196. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/statistics.py +0 -0
  197. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/tags.py +0 -0
  198. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/templates.py +0 -0
  199. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/todos.py +0 -0
  200. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/topics.py +0 -0
  201. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/triggers.py +0 -0
  202. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/users.py +0 -0
  203. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/variables.py +0 -0
  204. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/gitlab/v4/objects/wikis.py +0 -0
  205. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/dependency_links.txt +0 -0
  206. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/entry_points.txt +0 -0
  207. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/python_gitlab.egg-info/top_level.txt +0 -0
  208. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements-docker.txt +0 -0
  209. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements-docs.txt +0 -0
  210. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/requirements-precommit.txt +0 -0
  211. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/setup.cfg +0 -0
  212. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/__init__.py +0 -0
  213. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/conftest.py +0 -0
  214. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/__init__.py +0 -0
  215. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/__init__.py +0 -0
  216. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_boards.py +0 -0
  217. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_branches.py +0 -0
  218. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_bulk_imports.py +0 -0
  219. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_current_user.py +0 -0
  220. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_deploy_keys.py +0 -0
  221. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_deploy_tokens.py +0 -0
  222. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_epics.py +0 -0
  223. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_gitlab.py +0 -0
  224. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_groups.py +0 -0
  225. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_import_export.py +0 -0
  226. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_issues.py +0 -0
  227. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_keys.py +0 -0
  228. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_lazy_objects.py +0 -0
  229. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_merge_requests.py +0 -0
  230. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_packages.py +0 -0
  231. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_project_job_token_scope.py +0 -0
  232. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_projects.py +0 -0
  233. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_push_rules.py +0 -0
  234. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_registry.py +0 -0
  235. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_releases.py +0 -0
  236. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_repository.py +0 -0
  237. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_services.py +0 -0
  238. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_snippets.py +0 -0
  239. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_statistics.py +0 -0
  240. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_topics.py +0 -0
  241. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_users.py +0 -0
  242. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_variables.py +0 -0
  243. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/api/test_wikis.py +0 -0
  244. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/__init__.py +0 -0
  245. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/conftest.py +0 -0
  246. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli.py +0 -0
  247. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_artifacts.py +0 -0
  248. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_packages.py +0 -0
  249. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_projects.py +0 -0
  250. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_repository.py +0 -0
  251. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_resource_access_tokens.py +0 -0
  252. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_users.py +0 -0
  253. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_v4.py +0 -0
  254. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/cli/test_cli_variables.py +0 -0
  255. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/conftest.py +0 -0
  256. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/ee-test.py +0 -0
  257. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/.env +0 -0
  258. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/__init__.py +0 -0
  259. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/avatar.png +0 -0
  260. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/create_license.rb +0 -0
  261. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/docker-compose.yml +0 -0
  262. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/docker.py +0 -0
  263. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/invalid_auth.cfg +0 -0
  264. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/fixtures/invalid_version.cfg +0 -0
  265. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/functional/helpers.py +0 -0
  266. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/smoke/__init__.py +0 -0
  267. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/smoke/test_dists.py +0 -0
  268. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/__init__.py +0 -0
  269. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/_backends/__init__.py +0 -0
  270. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/_backends/test_requests_backend.py +0 -0
  271. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/base/test_rest_manager.py +0 -0
  272. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/base/test_rest_object.py +0 -0
  273. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/conftest.py +0 -0
  274. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/helpers.py +0 -0
  275. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/meta/__init__.py +0 -0
  276. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/meta/test_ensure_type_hints.py +0 -0
  277. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/meta/test_imports.py +0 -0
  278. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/meta/test_mro.py +0 -0
  279. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/mixins/__init__.py +0 -0
  280. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/mixins/test_meta_mixins.py +0 -0
  281. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/mixins/test_mixin_methods.py +0 -0
  282. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/mixins/test_object_mixins_attributes.py +0 -0
  283. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/__init__.py +0 -0
  284. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/conftest.py +0 -0
  285. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_appearance.py +0 -0
  286. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_applications.py +0 -0
  287. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_audit_events.py +0 -0
  288. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_badges.py +0 -0
  289. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_bridges.py +0 -0
  290. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_bulk_imports.py +0 -0
  291. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_ci_lint.py +0 -0
  292. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_cluster_agents.py +0 -0
  293. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_commits.py +0 -0
  294. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_deploy_tokens.py +0 -0
  295. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_deployments.py +0 -0
  296. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_draft_notes.py +0 -0
  297. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_environments.py +0 -0
  298. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_group_access_tokens.py +0 -0
  299. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_groups.py +0 -0
  300. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_hooks.py +0 -0
  301. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_invitations.py +0 -0
  302. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_issues.py +0 -0
  303. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_iterations.py +0 -0
  304. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_job_artifacts.py +0 -0
  305. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_job_token_scope.py +0 -0
  306. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_jobs.py +0 -0
  307. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_keys.py +0 -0
  308. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_members.py +0 -0
  309. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_merge_request_pipelines.py +0 -0
  310. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_merge_requests.py +0 -0
  311. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_merge_trains.py +0 -0
  312. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_package_protection_rules.py +0 -0
  313. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_packages.py +0 -0
  314. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_personal_access_tokens.py +0 -0
  315. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_pipeline_schedules.py +0 -0
  316. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_pipelines.py +0 -0
  317. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_project_access_tokens.py +0 -0
  318. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_project_import_export.py +0 -0
  319. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_project_merge_request_approvals.py +0 -0
  320. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_project_statistics.py +0 -0
  321. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_projects.py +0 -0
  322. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_registry_protection_rules.py +0 -0
  323. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_registry_repositories.py +0 -0
  324. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_releases.py +0 -0
  325. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_remote_mirrors.py +0 -0
  326. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_repositories.py +0 -0
  327. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_resource_groups.py +0 -0
  328. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_resource_iteration_events.py +0 -0
  329. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_resource_label_events.py +0 -0
  330. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_resource_milestone_events.py +0 -0
  331. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_resource_state_events.py +0 -0
  332. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_runners.py +0 -0
  333. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_secure_files.py +0 -0
  334. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_services.py +0 -0
  335. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_snippets.py +0 -0
  336. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_statistics.py +0 -0
  337. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_submodules.py +0 -0
  338. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_todos.py +0 -0
  339. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_topics.py +0 -0
  340. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_users.py +0 -0
  341. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/objects/test_variables.py +0 -0
  342. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_cli.py +0 -0
  343. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_config.py +0 -0
  344. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_exceptions.py +0 -0
  345. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_gitlab.py +0 -0
  346. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_gitlab_auth.py +0 -0
  347. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_gitlab_http_methods.py +0 -0
  348. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_types.py +0 -0
  349. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tests/unit/test_utils.py +0 -0
  350. {python_gitlab-4.10.0 → python_gitlab-4.11.1}/tox.ini +0 -0
@@ -1,5 +1,43 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v4.11.1 (2024-09-13)
4
+
5
+ ### Fix
6
+
7
+ * fix(client): ensure type evaluations are postponed ([`b41b2de`](https://github.com/python-gitlab/python-gitlab/commit/b41b2de8884c2dc8c8be467f480c7161db6a1c87))
8
+
9
+ ## v4.11.0 (2024-09-13)
10
+
11
+ ### Chore
12
+
13
+ * chore(pre-commit): add deps ([`fe5e608`](https://github.com/python-gitlab/python-gitlab/commit/fe5e608bc6cc04863bd4d1d9dbe101fffd88e954))
14
+
15
+ * chore(deps): update all non-major dependencies ([`fac8bf9`](https://github.com/python-gitlab/python-gitlab/commit/fac8bf9f3e2a0218f96337536d08dec9991bfc1a))
16
+
17
+ * chore(deps): update dependency types-setuptools to v74 ([`bdfaddb`](https://github.com/python-gitlab/python-gitlab/commit/bdfaddb89ae7ba351bd3a21c6cecc528772db4de))
18
+
19
+ * chore(deps): update all non-major dependencies ([`88c7529`](https://github.com/python-gitlab/python-gitlab/commit/88c75297377dd1f1106b5bc673946cebd563e0a1))
20
+
21
+ ### Documentation
22
+
23
+ * docs(objects): fix typo in get latest pipeline ([`b9f5c12`](https://github.com/python-gitlab/python-gitlab/commit/b9f5c12d3ba6ca4e4321a81e7610d03fb4440c02))
24
+
25
+ ### Feature
26
+
27
+ * feat(client): make retries configurable in GraphQL ([`145870e`](https://github.com/python-gitlab/python-gitlab/commit/145870e628ed3b648a0a29fc551a6f38469b684a))
28
+
29
+ * feat(client): add retry handling to GraphQL client ([`8898c38`](https://github.com/python-gitlab/python-gitlab/commit/8898c38b97ed36d9ff8f2f20dee27ef1448b9f83))
30
+
31
+ * feat(api): add exclusive GET attrs for /projects/:id/members ([`e637808`](https://github.com/python-gitlab/python-gitlab/commit/e637808bcb74498438109d7ed352071ebaa192d5))
32
+
33
+ * feat: add a minimal GraphQL client ([`d6b1b0a`](https://github.com/python-gitlab/python-gitlab/commit/d6b1b0a962bbf0f4e0612067fc075dbdcbb772f8))
34
+
35
+ * feat(api): add exclusive GET attrs for /groups/:id/members ([`d44ddd2`](https://github.com/python-gitlab/python-gitlab/commit/d44ddd2b00d78bb87ff6a4776e64e05e0c1524e1))
36
+
37
+ ### Refactor
38
+
39
+ * refactor(client): move retry logic into utility ([`3235c48`](https://github.com/python-gitlab/python-gitlab/commit/3235c48328c2866f7d46597ba3c0c2488e6c375c))
40
+
3
41
  ## v4.10.0 (2024-08-28)
4
42
 
5
43
  ### 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.1
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.1"
@@ -1,8 +1,9 @@
1
1
  """Wrapper for the GitLab API."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import os
4
6
  import re
5
- import time
6
7
  from typing import (
7
8
  Any,
8
9
  BinaryIO,
@@ -25,6 +26,19 @@ import gitlab.const
25
26
  import gitlab.exceptions
26
27
  from gitlab import _backends, utils
27
28
 
29
+ try:
30
+ import gql
31
+ import gql.transport.exceptions
32
+ import graphql
33
+ import httpx
34
+
35
+ from ._backends.graphql import GitlabTransport
36
+
37
+ _GQL_INSTALLED = True
38
+ except ImportError: # pragma: no cover
39
+ _GQL_INSTALLED = False
40
+
41
+
28
42
  REDIRECT_MSG = (
29
43
  "python-gitlab detected a {status_code} ({reason!r}) redirection. You must update "
30
44
  "your GitLab URL to the correct URL to avoid issues. The redirection was from: "
@@ -89,7 +103,7 @@ class Gitlab:
89
103
  self._api_version = str(api_version)
90
104
  self._server_version: Optional[str] = None
91
105
  self._server_revision: Optional[str] = None
92
- self._base_url = self._get_base_url(url)
106
+ self._base_url = utils.get_base_url(url)
93
107
  self._url = f"{self._base_url}/api/v{api_version}"
94
108
  #: Timeout to use for requests to gitlab server
95
109
  self.timeout = timeout
@@ -557,18 +571,6 @@ class Gitlab:
557
571
  "verify": self.ssl_verify,
558
572
  }
559
573
 
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
574
  def _build_url(self, path: str) -> str:
573
575
  """Returns the full url from path.
574
576
 
@@ -718,7 +720,12 @@ class Gitlab:
718
720
  send_data = self._backend.prepare_send_data(files, post_data, raw)
719
721
  opts["headers"]["Content-type"] = send_data.content_type
720
722
 
721
- cur_retries = 0
723
+ retry = utils.Retry(
724
+ max_retries=max_retries,
725
+ obey_rate_limit=obey_rate_limit,
726
+ retry_transient_errors=retry_transient_errors,
727
+ )
728
+
722
729
  while True:
723
730
  try:
724
731
  result = self._backend.http_request(
@@ -733,14 +740,8 @@ class Gitlab:
733
740
  **opts,
734
741
  )
735
742
  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)
743
+ if retry.handle_retry():
742
744
  continue
743
-
744
745
  raise
745
746
 
746
747
  self._check_redirects(result.response)
@@ -748,31 +749,10 @@ class Gitlab:
748
749
  if 200 <= result.status_code < 300:
749
750
  return result.response
750
751
 
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
752
+ if retry.handle_retry_on_status(
753
+ result.status_code, result.headers, result.reason
754
+ ):
755
+ continue
776
756
 
777
757
  error_message = result.content
778
758
  try:
@@ -1296,3 +1276,94 @@ class GitlabList:
1296
1276
  return self.next()
1297
1277
 
1298
1278
  raise StopIteration
1279
+
1280
+
1281
+ class GraphQL:
1282
+ def __init__(
1283
+ self,
1284
+ url: Optional[str] = None,
1285
+ *,
1286
+ token: Optional[str] = None,
1287
+ ssl_verify: Union[bool, str] = True,
1288
+ client: Optional[httpx.Client] = None,
1289
+ timeout: Optional[float] = None,
1290
+ user_agent: str = gitlab.const.USER_AGENT,
1291
+ fetch_schema_from_transport: bool = False,
1292
+ max_retries: int = 10,
1293
+ obey_rate_limit: bool = True,
1294
+ retry_transient_errors: bool = False,
1295
+ ) -> None:
1296
+ if not _GQL_INSTALLED:
1297
+ raise ImportError(
1298
+ "The GraphQL client could not be initialized because "
1299
+ "the gql dependencies are not installed. "
1300
+ "Install them with 'pip install python-gitlab[graphql]'"
1301
+ )
1302
+ self._base_url = utils.get_base_url(url)
1303
+ self._timeout = timeout
1304
+ self._token = token
1305
+ self._url = f"{self._base_url}/api/graphql"
1306
+ self._user_agent = user_agent
1307
+ self._ssl_verify = ssl_verify
1308
+ self._max_retries = max_retries
1309
+ self._obey_rate_limit = obey_rate_limit
1310
+ self._retry_transient_errors = retry_transient_errors
1311
+
1312
+ opts = self._get_client_opts()
1313
+ self._http_client = client or httpx.Client(**opts)
1314
+ self._transport = GitlabTransport(self._url, client=self._http_client)
1315
+ self._client = gql.Client(
1316
+ transport=self._transport,
1317
+ fetch_schema_from_transport=fetch_schema_from_transport,
1318
+ )
1319
+ self._gql = gql.gql
1320
+
1321
+ def __enter__(self) -> "GraphQL":
1322
+ return self
1323
+
1324
+ def __exit__(self, *args: Any) -> None:
1325
+ self._http_client.close()
1326
+
1327
+ def _get_client_opts(self) -> Dict[str, Any]:
1328
+ headers = {"User-Agent": self._user_agent}
1329
+
1330
+ if self._token:
1331
+ headers["Authorization"] = f"Bearer {self._token}"
1332
+
1333
+ return {
1334
+ "headers": headers,
1335
+ "timeout": self._timeout,
1336
+ "verify": self._ssl_verify,
1337
+ }
1338
+
1339
+ def execute(
1340
+ self, request: Union[str, graphql.Source], *args: Any, **kwargs: Any
1341
+ ) -> Any:
1342
+ parsed_document = self._gql(request)
1343
+ retry = utils.Retry(
1344
+ max_retries=self._max_retries,
1345
+ obey_rate_limit=self._obey_rate_limit,
1346
+ retry_transient_errors=self._retry_transient_errors,
1347
+ )
1348
+
1349
+ while True:
1350
+ try:
1351
+ result = self._client.execute(parsed_document, *args, **kwargs)
1352
+ except gql.transport.exceptions.TransportServerError as e:
1353
+ if retry.handle_retry_on_status(
1354
+ status_code=e.code, headers=self._transport.response_headers
1355
+ ):
1356
+ continue
1357
+
1358
+ if e.code == 401:
1359
+ raise gitlab.exceptions.GitlabAuthenticationError(
1360
+ response_code=e.code,
1361
+ error_message=str(e),
1362
+ )
1363
+
1364
+ raise gitlab.exceptions.GitlabHttpError(
1365
+ response_code=e.code,
1366
+ error_message=str(e),
1367
+ )
1368
+
1369
+ 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.1
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