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.
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/CHANGELOG.md +32 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/PKG-INFO +3 -1
- python_gitlab-4.11.0/docs/api-usage-graphql.rst +52 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-usage.rst +4 -4
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-usage.rst +3 -3
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/pipelines_and_jobs.rst +1 -1
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/index.rst +1 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/__init__.py +2 -1
- python_gitlab-4.11.0/gitlab/_backends/graphql.py +24 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_version.py +1 -1
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/client.py +116 -47
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/utils.py +91 -2
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/members.py +4 -2
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/pyproject.toml +1 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/PKG-INFO +3 -1
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/SOURCES.txt +5 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/requires.txt +3 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-lint.txt +4 -3
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-test.txt +2 -1
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements.txt +2 -0
- python_gitlab-4.11.0/tests/functional/api/test_graphql.py +20 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/set_token.rb +1 -1
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/install/test_install.py +1 -1
- python_gitlab-4.11.0/tests/unit/test_graphql.py +60 -0
- python_gitlab-4.11.0/tests/unit/test_retry.py +41 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/AUTHORS +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/COPYING +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/MANIFEST.in +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/README.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/Makefile +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/_static/js/gitter.js +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api/gitlab.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api/gitlab.v4.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-levels.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-objects.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/api-usage-advanced.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/changelog.md +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-examples.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/cli-objects.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/conf.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/docstrings.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/ext/manager_tmpl.j2 +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/faq.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/access_requests.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/appearance.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/applications.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/badges.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/boards.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/branches.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/bulk_imports.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/ci_lint.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/cluster_agents.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/clusters.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/commits.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deploy_keys.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deploy_tokens.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/deployments.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/discussions.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/draft_notes.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/emojis.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/environments.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/epics.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/events.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/features.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/geo_nodes.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/group_access_tokens.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/groups.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/invitations.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/issues.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/iterations.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/job_token_scope.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/keys.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/labels.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_request_approvals.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_requests.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/merge_trains.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/messages.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/milestones.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/namespaces.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/notes.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/notifications.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/packages.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/pagesdomains.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/personal_access_tokens.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/project_access_tokens.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/projects.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_branches.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_container_repositories.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_environments.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/protected_packages.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/releases.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/remote_mirrors.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/repositories.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/repository_tags.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/resource_groups.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/runners.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/search.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/secure_files.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/settings.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/sidekiq.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/snippets.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/statistics.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/system_hooks.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/templates.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/todos.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/topics.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/users.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/variables.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/gl_objects/wikis.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/make.bat +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/docs/release-notes.rst +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/__main__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/protocol.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/_backends/requests_backend.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/base.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/cli.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/config.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/const.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/exceptions.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/mixins.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/py.typed +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/types.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/cli.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/access_requests.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/appearance.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/applications.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/artifacts.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/audit_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/award_emojis.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/badges.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/boards.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/branches.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/broadcast_messages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/bulk_imports.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/ci_lint.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/cluster_agents.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/clusters.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/commits.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/container_registry.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/custom_attributes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deploy_keys.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deploy_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/deployments.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/discussions.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/draft_notes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/environments.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/epics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/export_import.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/features.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/files.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/geo_nodes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/group_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/groups.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/hooks.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/integrations.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/invitations.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/issues.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/iterations.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/job_token_scope.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/jobs.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/keys.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/labels.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/ldap.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_request_approvals.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_requests.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/merge_trains.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/milestones.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/namespaces.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/notes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/notification_settings.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/package_protection_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/packages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/pages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/personal_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/pipelines.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/project_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/projects.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/push_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/registry_protection_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/releases.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/repositories.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/resource_groups.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/reviewers.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/runners.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/secure_files.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/service_accounts.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/settings.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/sidekiq.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/snippets.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/statistics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/tags.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/templates.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/todos.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/topics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/triggers.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/users.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/variables.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/gitlab/v4/objects/wikis.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/dependency_links.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/entry_points.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/python_gitlab.egg-info/top_level.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-docker.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-docs.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/requirements-precommit.txt +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/setup.cfg +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/conftest.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_boards.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_branches.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_bulk_imports.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_current_user.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_deploy_keys.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_deploy_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_epics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_gitlab.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_groups.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_import_export.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_issues.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_keys.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_lazy_objects.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_merge_requests.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_packages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_project_job_token_scope.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_projects.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_push_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_registry.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_releases.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_repository.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_services.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_snippets.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_statistics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_topics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_users.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_variables.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/api/test_wikis.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/conftest.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_artifacts.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_packages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_projects.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_repository.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_resource_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_users.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_v4.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/cli/test_cli_variables.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/conftest.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/ee-test.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/.env +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/avatar.png +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/create_license.rb +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/docker-compose.yml +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/docker.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/invalid_auth.cfg +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/fixtures/invalid_version.cfg +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/functional/helpers.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/smoke/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/smoke/test_dists.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/_backends/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/_backends/test_requests_backend.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/base/test_rest_manager.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/base/test_rest_object.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/conftest.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/helpers.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_ensure_type_hints.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_imports.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/meta/test_mro.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_meta_mixins.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_mixin_methods.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/mixins/test_object_mixins_attributes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/__init__.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/conftest.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_appearance.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_applications.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_audit_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_badges.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_bridges.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_bulk_imports.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_ci_lint.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_cluster_agents.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_commits.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_deploy_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_deployments.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_draft_notes.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_environments.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_group_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_groups.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_hooks.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_invitations.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_issues.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_iterations.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_job_artifacts.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_job_token_scope.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_jobs.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_keys.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_members.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_request_pipelines.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_requests.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_merge_trains.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_package_protection_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_packages.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_personal_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_pipeline_schedules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_pipelines.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_access_tokens.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_import_export.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_merge_request_approvals.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_project_statistics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_projects.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_registry_protection_rules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_registry_repositories.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_releases.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_remote_mirrors.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_repositories.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_groups.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_iteration_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_label_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_milestone_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_resource_state_events.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_runners.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_secure_files.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_services.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_snippets.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_statistics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_submodules.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_todos.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_topics.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_users.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/objects/test_variables.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_cli.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_config.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_exceptions.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab_auth.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_gitlab_http_methods.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_types.py +0 -0
- {python_gitlab-4.10.0 → python_gitlab-4.11.0}/tests/unit/test_utils.py +0 -0
- {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.
|
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
|
-
|
3
|
-
|
1
|
+
##################
|
2
|
+
Using the REST API
|
3
|
+
##################
|
4
4
|
|
5
|
-
python-gitlab only supports GitLab API
|
5
|
+
python-gitlab currently only supports v4 of the GitLab REST API.
|
6
6
|
|
7
7
|
``gitlab.Gitlab`` class
|
8
8
|
=======================
|
@@ -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
|
@@ -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 =
|
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
|
-
|
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
|
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
|
-
|
752
|
-
|
753
|
-
|
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
|
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",
|
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",
|
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",)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: python-gitlab
|
3
|
-
Version: 4.
|
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
|
@@ -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.
|
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.
|
13
|
-
types-setuptools==
|
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.
|
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
|
@@ -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
|