python-gitlab 8.1.0__tar.gz → 8.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/CHANGELOG.md +16 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/PKG-INFO +1 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api-objects.rst +3 -1
- python_gitlab-8.1.0/docs/gl_objects/features.rst → python_gitlab-8.2.0/docs/gl_objects/gitlab_features.rst +9 -4
- python_gitlab-8.2.0/docs/gl_objects/project_feature_flag_user_lists.rst +51 -0
- python_gitlab-8.2.0/docs/gl_objects/project_feature_flags.rst +63 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/projects.rst +38 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/_version.py +1 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/types.py +37 -3
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/utils.py +9 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/__init__.py +2 -0
- python_gitlab-8.2.0/gitlab/v4/objects/feature_flag_user_lists.py +27 -0
- python_gitlab-8.2.0/gitlab/v4/objects/feature_flags.py +106 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/merge_request_approvals.py +7 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/projects.py +4 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/PKG-INFO +1 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/SOURCES.txt +11 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements-lint.txt +3 -3
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements-test.txt +3 -3
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements.txt +1 -1
- python_gitlab-8.2.0/tests/functional/api/test_project_feature_flag_user_lists.py +56 -0
- python_gitlab-8.2.0/tests/functional/api/test_project_feature_flags.py +127 -0
- python_gitlab-8.2.0/tests/functional/cli/test_cli_project_feature_flag_user_lists.py +120 -0
- python_gitlab-8.2.0/tests/functional/cli/test_cli_project_feature_flags.py +203 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/.env +1 -1
- python_gitlab-8.2.0/tests/unit/objects/test_project_feature_flag_user_lists.py +30 -0
- python_gitlab-8.2.0/tests/unit/objects/test_project_feature_flags.py +35 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_types.py +38 -1
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/AUTHORS +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/COPYING +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/MANIFEST.in +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/README.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/Makefile +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/_static/js/gitter.js +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api/gitlab.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api/gitlab.v4.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api-levels.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api-usage-advanced.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api-usage-graphql.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/api-usage.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/changelog.md +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/cli-examples.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/cli-objects.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/cli-usage.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/conf.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/ext/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/ext/docstrings.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/ext/manager_tmpl.j2 +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/faq.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/access_requests.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/appearance.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/applications.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/badges.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/boards.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/branches.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/bulk_imports.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/ci_lint.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/cluster_agents.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/clusters.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/commits.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/deploy_keys.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/deploy_tokens.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/deployments.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/discussions.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/draft_notes.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/emojis.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/environments.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/epics.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/events.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/geo_nodes.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/group_access_tokens.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/groups.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/invitations.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/issues.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/iterations.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/job_token_scope.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/keys.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/labels.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/member_roles.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/merge_request_approvals.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/merge_requests.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/merge_trains.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/messages.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/milestones.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/namespaces.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/notes.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/notifications.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/packages.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/pagesdomains.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/personal_access_tokens.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/pipelines_and_jobs.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/project_access_tokens.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/protected_branches.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/protected_container_repositories.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/protected_environments.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/protected_packages.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/pull_mirror.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/releases.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/remote_mirrors.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/repositories.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/repository_tags.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/resource_groups.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/runners.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/search.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/secure_files.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/settings.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/sidekiq.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/snippets.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/statistics.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/status_checks.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/system_hooks.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/templates.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/todos.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/topics.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/users.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/variables.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/gl_objects/wikis.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/index.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/make.bat +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/docs/release-notes.rst +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/__main__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/_backends/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/_backends/graphql.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/_backends/protocol.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/_backends/requests_backend.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/base.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/cli.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/client.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/config.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/const.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/exceptions.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/mixins.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/py.typed +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/cli.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/access_requests.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/appearance.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/applications.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/artifacts.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/audit_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/award_emojis.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/badges.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/boards.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/branches.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/broadcast_messages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/bulk_imports.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/ci_lint.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/cluster_agents.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/clusters.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/commits.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/container_registry.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/custom_attributes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/deploy_keys.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/deploy_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/deployments.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/discussions.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/draft_notes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/environments.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/epics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/export_import.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/features.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/files.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/geo_nodes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/group_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/groups.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/hooks.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/integrations.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/invitations.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/issues.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/iterations.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/job_token_scope.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/jobs.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/keys.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/labels.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/ldap.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/member_roles.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/members.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/merge_requests.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/merge_trains.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/milestones.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/namespaces.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/notes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/notification_settings.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/package_protection_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/packages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/pages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/personal_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/pipelines.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/project_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/push_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/registry_protection_repository_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/registry_protection_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/releases.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/repositories.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/resource_groups.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/reviewers.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/runners.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/secure_files.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/service_accounts.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/settings.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/sidekiq.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/snippets.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/statistics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/status_checks.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/tags.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/templates.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/todos.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/topics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/triggers.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/users.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/variables.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/gitlab/v4/objects/wikis.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/pyproject.toml +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/dependency_links.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/entry_points.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/requires.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/python_gitlab.egg-info/top_level.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements-docker.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements-docs.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/requirements-precommit.txt +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/setup.cfg +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/conftest.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_boards.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_branches.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_bulk_imports.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_current_user.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_deploy_keys.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_deploy_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_epics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_gitlab.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_graphql.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_groups.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_import_export.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_issues.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_keys.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_lazy_objects.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_member_roles.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_merge_requests.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_packages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_project_job_token_scope.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_projects.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_push_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_registry.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_releases.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_repository.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_services.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_snippets.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_statistics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_topics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_users.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_variables.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/api/test_wikis.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/conftest.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_artifacts.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_files.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_packages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_projects.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_repository.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_resource_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_users.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_v4.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/cli/test_cli_variables.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/conftest.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/ee-test.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/avatar.png +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/create_license.rb +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/docker-compose.yml +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/docker.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/invalid_auth.cfg +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/invalid_version.cfg +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/fixtures/set_token.rb +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/functional/helpers.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/install/test_install.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/smoke/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/smoke/test_dists.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/_backends/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/_backends/test_requests_backend.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/base/test_rest_manager.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/base/test_rest_object.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/conftest.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/helpers.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/meta/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/meta/test_abstract_attrs.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/meta/test_imports.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/meta/test_mro.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/mixins/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/mixins/test_meta_mixins.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/mixins/test_mixin_methods.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/mixins/test_object_mixins_attributes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/__init__.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/conftest.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_appearance.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_applications.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_audit_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_badges.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_bridges.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_bulk_imports.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_ci_lint.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_cluster_agents.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_commits.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_deploy_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_deployments.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_draft_notes.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_environments.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_group_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_group_merge_request_approvals.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_groups.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_hooks.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_invitations.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_issues.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_iterations.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_job_artifacts.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_job_token_scope.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_jobs.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_keys.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_member_roles.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_members.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_merge_request_pipelines.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_merge_requests.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_merge_trains.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_package_protection_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_packages.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_personal_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_pipeline_schedules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_pipelines.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_project_access_tokens.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_project_import_export.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_project_merge_request_approvals.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_project_statistics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_projects.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_pull_mirror.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_registry_protection_rules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_registry_repositories.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_releases.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_remote_mirrors.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_repositories.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_resource_groups.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_resource_iteration_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_resource_label_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_resource_milestone_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_resource_state_events.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_runners.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_secure_files.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_services.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_snippets.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_statistics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_status_checks.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_submodules.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_templates.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_todos.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_topics.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_users.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/objects/test_variables.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_cli.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_config.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_exceptions.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_gitlab.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_gitlab_auth.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_gitlab_http_methods.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_graphql.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_retry.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tests/unit/test_utils.py +0 -0
- {python_gitlab-8.1.0 → python_gitlab-8.2.0}/tox.ini +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All versions below are listed in reverse chronological order.
|
|
4
4
|
|
|
5
|
+
## v8.2.0 (2026-03-28)
|
|
6
|
+
|
|
7
|
+
### Documentation
|
|
8
|
+
|
|
9
|
+
- **testing**: Document passing pytest options during local development
|
|
10
|
+
([`e6669f9`](https://github.com/python-gitlab/python-gitlab/commit/e6669f96d662d310109afa4a61fe8dabbd780a4e))
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- **api**: Add support for project feature flags and feature flag user lists
|
|
15
|
+
([`be68285`](https://github.com/python-gitlab/python-gitlab/commit/be68285793f35afc10a72b59da3fb24429631f54))
|
|
16
|
+
|
|
17
|
+
- **projects**: Add optional parameter to set approval rule on all protected branches.
|
|
18
|
+
([`8d76028`](https://github.com/python-gitlab/python-gitlab/commit/8d76028a1ae3554527291dc98e6be041ff089ec5))
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v8.1.0 (2026-02-28)
|
|
6
22
|
|
|
7
23
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-gitlab
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.2.0
|
|
4
4
|
Summary: The python wrapper for the GitLab REST and GraphQL APIs.
|
|
5
5
|
Author-email: Gauvain Pocentek <gauvain@pocentek.net>
|
|
6
6
|
Maintainer-email: John Villalovos <john@sodarock.com>, Max Wittig <max.wittig@siemens.com>, Nejc Habjan <nejc.habjan@siemens.com>, Roger Meier <r.meier@siemens.com>
|
|
@@ -24,7 +24,7 @@ API examples
|
|
|
24
24
|
gl_objects/environments
|
|
25
25
|
gl_objects/events
|
|
26
26
|
gl_objects/epics
|
|
27
|
-
gl_objects/
|
|
27
|
+
gl_objects/gitlab_features
|
|
28
28
|
gl_objects/geo_nodes
|
|
29
29
|
gl_objects/groups
|
|
30
30
|
gl_objects/group_access_tokens
|
|
@@ -49,6 +49,8 @@ API examples
|
|
|
49
49
|
gl_objects/pipelines_and_jobs
|
|
50
50
|
gl_objects/projects
|
|
51
51
|
gl_objects/project_access_tokens
|
|
52
|
+
gl_objects/project_feature_flags
|
|
53
|
+
gl_objects/project_feature_flag_user_lists
|
|
52
54
|
gl_objects/protected_branches
|
|
53
55
|
gl_objects/protected_container_repositories
|
|
54
56
|
gl_objects/protected_environments
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
################################
|
|
2
|
+
GitLab Development Feature Flags
|
|
3
|
+
################################
|
|
4
|
+
|
|
5
|
+
.. note::
|
|
6
|
+
|
|
7
|
+
This API is for managing GitLab's internal development feature flags and requires administrator access.
|
|
8
|
+
For project-level feature flags, see :doc:`project_feature_flags`.
|
|
4
9
|
|
|
5
10
|
Reference
|
|
6
11
|
---------
|
|
@@ -29,4 +34,4 @@ Create or set a feature::
|
|
|
29
34
|
|
|
30
35
|
Delete a feature::
|
|
31
36
|
|
|
32
|
-
feature.delete()
|
|
37
|
+
feature.delete()
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
###############################
|
|
2
|
+
Project Feature Flag User Lists
|
|
3
|
+
###############################
|
|
4
|
+
|
|
5
|
+
Reference
|
|
6
|
+
---------
|
|
7
|
+
|
|
8
|
+
* v4 API:
|
|
9
|
+
|
|
10
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagUserList`
|
|
11
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagUserListManager`
|
|
12
|
+
+ :attr:`gitlab.v4.objects.Project.feature_flags_user_lists`
|
|
13
|
+
|
|
14
|
+
* GitLab API: https://docs.gitlab.com/api/feature_flag_user_lists
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
|
|
19
|
+
List user lists::
|
|
20
|
+
|
|
21
|
+
user_lists = project.feature_flags_user_lists.list()
|
|
22
|
+
|
|
23
|
+
Get a user list::
|
|
24
|
+
|
|
25
|
+
user_list = project.feature_flags_user_lists.get(list_iid)
|
|
26
|
+
|
|
27
|
+
Create a user list::
|
|
28
|
+
|
|
29
|
+
user_list = project.feature_flags_user_lists.create({
|
|
30
|
+
'name': 'my_user_list',
|
|
31
|
+
'user_xids': 'user1,user2,user3'
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
Update a user list::
|
|
35
|
+
|
|
36
|
+
user_list.name = 'updated_list_name'
|
|
37
|
+
user_list.user_xids = 'user1,user2'
|
|
38
|
+
user_list.save()
|
|
39
|
+
|
|
40
|
+
Delete a user list::
|
|
41
|
+
|
|
42
|
+
user_list.delete()
|
|
43
|
+
|
|
44
|
+
Search for a user list::
|
|
45
|
+
|
|
46
|
+
user_lists = project.feature_flags_user_lists.list(search='my_list')
|
|
47
|
+
|
|
48
|
+
See also
|
|
49
|
+
--------
|
|
50
|
+
|
|
51
|
+
* :doc:`project_feature_flags`
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#####################
|
|
2
|
+
Project Feature Flags
|
|
3
|
+
#####################
|
|
4
|
+
|
|
5
|
+
Reference
|
|
6
|
+
---------
|
|
7
|
+
|
|
8
|
+
* v4 API:
|
|
9
|
+
|
|
10
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlag`
|
|
11
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagManager`
|
|
12
|
+
+ :attr:`gitlab.v4.objects.Project.feature_flags`
|
|
13
|
+
|
|
14
|
+
* GitLab API: https://docs.gitlab.com/api/feature_flags
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
|
|
19
|
+
List feature flags::
|
|
20
|
+
|
|
21
|
+
flags = project.feature_flags.list()
|
|
22
|
+
|
|
23
|
+
Get a feature flag::
|
|
24
|
+
|
|
25
|
+
flag = project.feature_flags.get('my_feature_flag')
|
|
26
|
+
|
|
27
|
+
Create a feature flag::
|
|
28
|
+
|
|
29
|
+
flag = project.feature_flags.create({'name': 'my_feature_flag', 'version': 'new_version_flag'})
|
|
30
|
+
|
|
31
|
+
Create a feature flag with strategies::
|
|
32
|
+
|
|
33
|
+
flag = project.feature_flags.create({
|
|
34
|
+
'name': 'my_complex_flag',
|
|
35
|
+
'version': 'new_version_flag',
|
|
36
|
+
'strategies': [{
|
|
37
|
+
'name': 'userWithId',
|
|
38
|
+
'parameters': {'userIds': 'user1,user2'}
|
|
39
|
+
}]
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
Update a feature flag::
|
|
43
|
+
|
|
44
|
+
flag.description = 'Updated description'
|
|
45
|
+
flag.save()
|
|
46
|
+
|
|
47
|
+
Rename a feature flag::
|
|
48
|
+
|
|
49
|
+
# You can rename a flag by changing its name attribute and calling save()
|
|
50
|
+
flag.name = 'new_flag_name'
|
|
51
|
+
flag.save()
|
|
52
|
+
|
|
53
|
+
# Alternatively, you can use the manager's update method
|
|
54
|
+
project.feature_flags.update('old_flag_name', {'name': 'new_flag_name'})
|
|
55
|
+
|
|
56
|
+
Delete a feature flag::
|
|
57
|
+
|
|
58
|
+
flag.delete()
|
|
59
|
+
|
|
60
|
+
See also
|
|
61
|
+
--------
|
|
62
|
+
|
|
63
|
+
* :doc:`project_feature_flag_user_lists`
|
|
@@ -409,6 +409,44 @@ Search projects by custom attribute::
|
|
|
409
409
|
project.customattributes.set('type', 'internal')
|
|
410
410
|
gl.projects.list(custom_attributes={'type': 'internal'}, get_all=True)
|
|
411
411
|
|
|
412
|
+
Project feature flags
|
|
413
|
+
=====================
|
|
414
|
+
|
|
415
|
+
Reference
|
|
416
|
+
---------
|
|
417
|
+
|
|
418
|
+
* v4 API:
|
|
419
|
+
|
|
420
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlag`
|
|
421
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagManager`
|
|
422
|
+
+ :attr:`gitlab.v4.objects.Project.feature_flags`
|
|
423
|
+
|
|
424
|
+
* GitLab API: https://docs.gitlab.com/api/feature_flags
|
|
425
|
+
|
|
426
|
+
Examples
|
|
427
|
+
--------
|
|
428
|
+
|
|
429
|
+
See :doc:`project_feature_flags`.
|
|
430
|
+
|
|
431
|
+
Project feature flag user lists
|
|
432
|
+
===============================
|
|
433
|
+
|
|
434
|
+
Reference
|
|
435
|
+
---------
|
|
436
|
+
|
|
437
|
+
* v4 API:
|
|
438
|
+
|
|
439
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagUserList`
|
|
440
|
+
+ :class:`gitlab.v4.objects.ProjectFeatureFlagUserListManager`
|
|
441
|
+
+ :attr:`gitlab.v4.objects.Project.feature_flags_user_lists`
|
|
442
|
+
|
|
443
|
+
* GitLab API: https://docs.gitlab.com/api/feature_flag_user_lists
|
|
444
|
+
|
|
445
|
+
Examples
|
|
446
|
+
--------
|
|
447
|
+
|
|
448
|
+
See :doc:`project_feature_flag_user_lists`.
|
|
449
|
+
|
|
412
450
|
Project files
|
|
413
451
|
=============
|
|
414
452
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
|
+
import json
|
|
4
5
|
from typing import Any, TYPE_CHECKING
|
|
5
6
|
|
|
7
|
+
from gitlab import exceptions
|
|
8
|
+
|
|
6
9
|
|
|
7
10
|
@dataclasses.dataclass(frozen=True)
|
|
8
11
|
class RequiredOptional:
|
|
@@ -36,6 +39,13 @@ class RequiredOptional:
|
|
|
36
39
|
|
|
37
40
|
|
|
38
41
|
class GitlabAttribute:
|
|
42
|
+
# Used in utils._transform_types() to decide if we should call get_for_api()
|
|
43
|
+
# on the attribute when transform_data is False (e.g. for POST/PUT/PATCH).
|
|
44
|
+
#
|
|
45
|
+
# This allows us to force transformation of data even when sending JSON bodies,
|
|
46
|
+
# which is useful for types like CommaSeparatedStringAttribute.
|
|
47
|
+
transform_in_body = False
|
|
48
|
+
|
|
39
49
|
def __init__(self, value: Any = None) -> None:
|
|
40
50
|
self._value = value
|
|
41
51
|
|
|
@@ -49,6 +59,16 @@ class GitlabAttribute:
|
|
|
49
59
|
return (key, self._value)
|
|
50
60
|
|
|
51
61
|
|
|
62
|
+
class JsonAttribute(GitlabAttribute):
|
|
63
|
+
def set_from_cli(self, cli_value: str) -> None:
|
|
64
|
+
try:
|
|
65
|
+
self._value = json.loads(cli_value)
|
|
66
|
+
except (ValueError, TypeError) as e:
|
|
67
|
+
raise exceptions.GitlabParsingError(
|
|
68
|
+
f"Could not parse JSON data: {e}"
|
|
69
|
+
) from e
|
|
70
|
+
|
|
71
|
+
|
|
52
72
|
class _ListArrayAttribute(GitlabAttribute):
|
|
53
73
|
"""Helper class to support `list` / `array` types."""
|
|
54
74
|
|
|
@@ -82,9 +102,23 @@ class ArrayAttribute(_ListArrayAttribute):
|
|
|
82
102
|
|
|
83
103
|
|
|
84
104
|
class CommaSeparatedListAttribute(_ListArrayAttribute):
|
|
85
|
-
"""
|
|
86
|
-
|
|
87
|
-
|
|
105
|
+
"""
|
|
106
|
+
For values which are sent to the server as a Comma Separated Values (CSV) string
|
|
107
|
+
in query parameters (GET), but as a list/array in JSON bodies (POST/PUT).
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class CommaSeparatedStringAttribute(_ListArrayAttribute):
|
|
112
|
+
"""
|
|
113
|
+
For values which are sent to the server as a Comma Separated Values (CSV) string.
|
|
114
|
+
Unlike CommaSeparatedListAttribute, this type ensures the value is converted
|
|
115
|
+
to a string even in JSON bodies (POST/PUT requests).
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
# Used in utils._transform_types() to ensure the value is converted to a string
|
|
119
|
+
# via get_for_api() even when transform_data is False (e.g. for POST/PUT/PATCH).
|
|
120
|
+
# This is needed because some APIs require a CSV string instead of a JSON array.
|
|
121
|
+
transform_in_body = True
|
|
88
122
|
|
|
89
123
|
|
|
90
124
|
class LowercaseStringAttribute(GitlabAttribute):
|
|
@@ -198,7 +198,15 @@ def _transform_types(
|
|
|
198
198
|
files[attr_name] = (key, data.pop(attr_name))
|
|
199
199
|
continue
|
|
200
200
|
|
|
201
|
-
|
|
201
|
+
# If transform_data is False, it means we are preparing data for a JSON body
|
|
202
|
+
# (POST/PUT/PATCH). In this case, we normally skip transformation because
|
|
203
|
+
# most types (like ArrayAttribute) only need transformation for query
|
|
204
|
+
# parameters (GET).
|
|
205
|
+
#
|
|
206
|
+
# However, some types (like CommaSeparatedStringAttribute) need to be
|
|
207
|
+
# transformed even in JSON bodies (e.g. converting a list to a CSV string).
|
|
208
|
+
# The 'transform_in_body' flag on the attribute class controls this behavior.
|
|
209
|
+
if not transform_data and not gitlab_attribute.transform_in_body:
|
|
202
210
|
continue
|
|
203
211
|
|
|
204
212
|
if isinstance(gitlab_attribute, types.GitlabAttribute):
|
|
@@ -24,6 +24,8 @@ from .environments import *
|
|
|
24
24
|
from .epics import *
|
|
25
25
|
from .events import *
|
|
26
26
|
from .export_import import *
|
|
27
|
+
from .feature_flag_user_lists import *
|
|
28
|
+
from .feature_flags import *
|
|
27
29
|
from .features import *
|
|
28
30
|
from .files import *
|
|
29
31
|
from .geo_nodes import *
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GitLab API:
|
|
3
|
+
https://docs.gitlab.com/api/feature_flag_user_lists
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from gitlab import types
|
|
9
|
+
from gitlab.base import RESTObject
|
|
10
|
+
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
|
|
11
|
+
from gitlab.types import RequiredOptional
|
|
12
|
+
|
|
13
|
+
__all__ = ["ProjectFeatureFlagUserList", "ProjectFeatureFlagUserListManager"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ProjectFeatureFlagUserList(SaveMixin, ObjectDeleteMixin, RESTObject):
|
|
17
|
+
_id_attr = "iid"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ProjectFeatureFlagUserListManager(CRUDMixin[ProjectFeatureFlagUserList]):
|
|
21
|
+
_path = "/projects/{project_id}/feature_flags_user_lists"
|
|
22
|
+
_obj_cls = ProjectFeatureFlagUserList
|
|
23
|
+
_from_parent_attrs = {"project_id": "id"}
|
|
24
|
+
_create_attrs = RequiredOptional(required=("name", "user_xids"))
|
|
25
|
+
_update_attrs = RequiredOptional(optional=("name", "user_xids"))
|
|
26
|
+
_list_filters = ("search",)
|
|
27
|
+
_types = {"user_xids": types.CommaSeparatedStringAttribute}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GitLab API:
|
|
3
|
+
https://docs.gitlab.com/api/feature_flags
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from gitlab import types, utils
|
|
11
|
+
from gitlab.base import RESTObject
|
|
12
|
+
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
|
|
13
|
+
from gitlab.types import RequiredOptional
|
|
14
|
+
|
|
15
|
+
__all__ = ["ProjectFeatureFlag", "ProjectFeatureFlagManager"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ProjectFeatureFlag(SaveMixin, ObjectDeleteMixin, RESTObject):
|
|
19
|
+
_id_attr = "name"
|
|
20
|
+
manager: ProjectFeatureFlagManager
|
|
21
|
+
|
|
22
|
+
def _get_save_url_id(self) -> str | int | None:
|
|
23
|
+
"""Get the ID used to construct the API URL for the save operation.
|
|
24
|
+
|
|
25
|
+
For renames, this must be the *original* name of the flag. For other
|
|
26
|
+
updates, it is the current name.
|
|
27
|
+
"""
|
|
28
|
+
if self._id_attr in self._updated_attrs:
|
|
29
|
+
# If the name is being changed, use the original name for the URL.
|
|
30
|
+
obj_id = self._attrs.get(self._id_attr)
|
|
31
|
+
if isinstance(obj_id, str):
|
|
32
|
+
return utils.EncodedId(obj_id)
|
|
33
|
+
return obj_id
|
|
34
|
+
return self.encoded_id
|
|
35
|
+
|
|
36
|
+
def save(self, **kwargs: Any) -> dict[str, Any] | None:
|
|
37
|
+
"""Save the changes made to the object to the server.
|
|
38
|
+
|
|
39
|
+
This is the standard method to use when updating a feature flag object
|
|
40
|
+
that you have already retrieved.
|
|
41
|
+
|
|
42
|
+
It is overridden here to correctly handle renaming. When `name` is
|
|
43
|
+
changed, the API requires the *original* name in the URL, and this
|
|
44
|
+
method provides it.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
**kwargs: Extra options to send to the server (e.g. sudo)
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
The new object data (*not* a RESTObject)
|
|
51
|
+
|
|
52
|
+
Raises:
|
|
53
|
+
GitlabAuthenticationError: If authentication is not correct
|
|
54
|
+
GitlabUpdateError: If the server cannot perform the request
|
|
55
|
+
"""
|
|
56
|
+
updated_data = self._get_updated_data()
|
|
57
|
+
if not updated_data:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
obj_id = self._get_save_url_id()
|
|
61
|
+
server_data = self.manager.update(obj_id, updated_data, **kwargs)
|
|
62
|
+
self._update_attrs(server_data)
|
|
63
|
+
return server_data
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ProjectFeatureFlagManager(CRUDMixin[ProjectFeatureFlag]):
|
|
67
|
+
_path = "/projects/{project_id}/feature_flags"
|
|
68
|
+
_obj_cls = ProjectFeatureFlag
|
|
69
|
+
_from_parent_attrs = {"project_id": "id"}
|
|
70
|
+
_create_attrs = RequiredOptional(
|
|
71
|
+
required=("name",), optional=("version", "description", "active", "strategies")
|
|
72
|
+
)
|
|
73
|
+
_update_attrs = RequiredOptional(
|
|
74
|
+
# new_name is used for renaming via CLI and mapped to 'name' in update()
|
|
75
|
+
optional=("name", "new_name", "description", "active", "strategies")
|
|
76
|
+
)
|
|
77
|
+
_list_filters = ("scope",)
|
|
78
|
+
_types = {"strategies": types.JsonAttribute}
|
|
79
|
+
|
|
80
|
+
def update(
|
|
81
|
+
self,
|
|
82
|
+
id: str | int | None = None,
|
|
83
|
+
new_data: dict[str, Any] | None = None,
|
|
84
|
+
**kwargs: Any,
|
|
85
|
+
) -> dict[str, Any]:
|
|
86
|
+
"""Update a Project Feature Flag.
|
|
87
|
+
|
|
88
|
+
This is a lower-level method called by `ProjectFeatureFlag.save()` and
|
|
89
|
+
is also used directly by the CLI.
|
|
90
|
+
|
|
91
|
+
The `new_name` parameter is a special case to support renaming via the
|
|
92
|
+
CLI (`--new-name`). It is converted to the `name` parameter that the
|
|
93
|
+
GitLab API expects in the request body.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
id: The current name of the feature flag.
|
|
97
|
+
new_data: The dictionary of attributes to update.
|
|
98
|
+
**kwargs: Extra options to send to the server (e.g. sudo)
|
|
99
|
+
"""
|
|
100
|
+
# Avoid mutating the caller-provided new_data dict by working on a copy.
|
|
101
|
+
data = dict(new_data or {})
|
|
102
|
+
# When used via CLI, we have 'new_name' to distinguish from the ID 'name'.
|
|
103
|
+
# When used via .save(), the object passes 'name' directly in new_data.
|
|
104
|
+
if "new_name" in data:
|
|
105
|
+
data["name"] = data.pop("new_name")
|
|
106
|
+
return super().update(id, data, **kwargs)
|
|
@@ -90,7 +90,13 @@ class ProjectApprovalRuleManager(
|
|
|
90
90
|
_from_parent_attrs = {"project_id": "id"}
|
|
91
91
|
_create_attrs = RequiredOptional(
|
|
92
92
|
required=("name", "approvals_required"),
|
|
93
|
-
optional=(
|
|
93
|
+
optional=(
|
|
94
|
+
"user_ids",
|
|
95
|
+
"group_ids",
|
|
96
|
+
"protected_branch_ids",
|
|
97
|
+
"usernames",
|
|
98
|
+
"applies_to_all_protected_branches",
|
|
99
|
+
),
|
|
94
100
|
)
|
|
95
101
|
|
|
96
102
|
|
|
@@ -49,6 +49,8 @@ from .environments import ( # noqa: F401
|
|
|
49
49
|
)
|
|
50
50
|
from .events import ProjectEventManager # noqa: F401
|
|
51
51
|
from .export_import import ProjectExportManager, ProjectImportManager # noqa: F401
|
|
52
|
+
from .feature_flag_user_lists import ProjectFeatureFlagUserListManager # noqa: F401
|
|
53
|
+
from .feature_flags import ProjectFeatureFlagManager # noqa: F401
|
|
52
54
|
from .files import ProjectFileManager # noqa: F401
|
|
53
55
|
from .hooks import ProjectHookManager # noqa: F401
|
|
54
56
|
from .integrations import ProjectIntegrationManager, ProjectServiceManager # noqa: F401
|
|
@@ -201,6 +203,8 @@ class Project(
|
|
|
201
203
|
environments: ProjectEnvironmentManager
|
|
202
204
|
events: ProjectEventManager
|
|
203
205
|
exports: ProjectExportManager
|
|
206
|
+
feature_flags: ProjectFeatureFlagManager
|
|
207
|
+
feature_flags_user_lists: ProjectFeatureFlagUserListManager
|
|
204
208
|
files: ProjectFileManager
|
|
205
209
|
forks: ProjectForkManager
|
|
206
210
|
generic_packages: GenericPackageManager
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-gitlab
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.2.0
|
|
4
4
|
Summary: The python wrapper for the GitLab REST and GraphQL APIs.
|
|
5
5
|
Author-email: Gauvain Pocentek <gauvain@pocentek.net>
|
|
6
6
|
Maintainer-email: John Villalovos <john@sodarock.com>, Max Wittig <max.wittig@siemens.com>, Nejc Habjan <nejc.habjan@siemens.com>, Roger Meier <r.meier@siemens.com>
|
|
@@ -53,8 +53,8 @@ docs/gl_objects/emojis.rst
|
|
|
53
53
|
docs/gl_objects/environments.rst
|
|
54
54
|
docs/gl_objects/epics.rst
|
|
55
55
|
docs/gl_objects/events.rst
|
|
56
|
-
docs/gl_objects/features.rst
|
|
57
56
|
docs/gl_objects/geo_nodes.rst
|
|
57
|
+
docs/gl_objects/gitlab_features.rst
|
|
58
58
|
docs/gl_objects/group_access_tokens.rst
|
|
59
59
|
docs/gl_objects/groups.rst
|
|
60
60
|
docs/gl_objects/invitations.rst
|
|
@@ -77,6 +77,8 @@ docs/gl_objects/pagesdomains.rst
|
|
|
77
77
|
docs/gl_objects/personal_access_tokens.rst
|
|
78
78
|
docs/gl_objects/pipelines_and_jobs.rst
|
|
79
79
|
docs/gl_objects/project_access_tokens.rst
|
|
80
|
+
docs/gl_objects/project_feature_flag_user_lists.rst
|
|
81
|
+
docs/gl_objects/project_feature_flags.rst
|
|
80
82
|
docs/gl_objects/projects.rst
|
|
81
83
|
docs/gl_objects/protected_branches.rst
|
|
82
84
|
docs/gl_objects/protected_container_repositories.rst
|
|
@@ -149,6 +151,8 @@ gitlab/v4/objects/environments.py
|
|
|
149
151
|
gitlab/v4/objects/epics.py
|
|
150
152
|
gitlab/v4/objects/events.py
|
|
151
153
|
gitlab/v4/objects/export_import.py
|
|
154
|
+
gitlab/v4/objects/feature_flag_user_lists.py
|
|
155
|
+
gitlab/v4/objects/feature_flags.py
|
|
152
156
|
gitlab/v4/objects/features.py
|
|
153
157
|
gitlab/v4/objects/files.py
|
|
154
158
|
gitlab/v4/objects/geo_nodes.py
|
|
@@ -233,6 +237,8 @@ tests/functional/api/test_lazy_objects.py
|
|
|
233
237
|
tests/functional/api/test_member_roles.py
|
|
234
238
|
tests/functional/api/test_merge_requests.py
|
|
235
239
|
tests/functional/api/test_packages.py
|
|
240
|
+
tests/functional/api/test_project_feature_flag_user_lists.py
|
|
241
|
+
tests/functional/api/test_project_feature_flags.py
|
|
236
242
|
tests/functional/api/test_project_job_token_scope.py
|
|
237
243
|
tests/functional/api/test_projects.py
|
|
238
244
|
tests/functional/api/test_push_rules.py
|
|
@@ -252,6 +258,8 @@ tests/functional/cli/test_cli.py
|
|
|
252
258
|
tests/functional/cli/test_cli_artifacts.py
|
|
253
259
|
tests/functional/cli/test_cli_files.py
|
|
254
260
|
tests/functional/cli/test_cli_packages.py
|
|
261
|
+
tests/functional/cli/test_cli_project_feature_flag_user_lists.py
|
|
262
|
+
tests/functional/cli/test_cli_project_feature_flags.py
|
|
255
263
|
tests/functional/cli/test_cli_projects.py
|
|
256
264
|
tests/functional/cli/test_cli_repository.py
|
|
257
265
|
tests/functional/cli/test_cli_resource_access_tokens.py
|
|
@@ -332,6 +340,8 @@ tests/unit/objects/test_personal_access_tokens.py
|
|
|
332
340
|
tests/unit/objects/test_pipeline_schedules.py
|
|
333
341
|
tests/unit/objects/test_pipelines.py
|
|
334
342
|
tests/unit/objects/test_project_access_tokens.py
|
|
343
|
+
tests/unit/objects/test_project_feature_flag_user_lists.py
|
|
344
|
+
tests/unit/objects/test_project_feature_flags.py
|
|
335
345
|
tests/unit/objects/test_project_import_export.py
|
|
336
346
|
tests/unit/objects/test_project_merge_request_approvals.py
|
|
337
347
|
tests/unit/objects/test_project_statistics.py
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
-r requirements.txt
|
|
2
2
|
anyio==4.12.1
|
|
3
3
|
build==1.4.0
|
|
4
|
-
coverage==7.13.
|
|
4
|
+
coverage==7.13.5
|
|
5
5
|
pytest-console-scripts==1.4.1
|
|
6
|
-
pytest-cov==7.
|
|
7
|
-
pytest-github-actions-annotate-failures==0.
|
|
6
|
+
pytest-cov==7.1.0
|
|
7
|
+
pytest-github-actions-annotate-failures==0.4.0
|
|
8
8
|
pytest==9.0.2
|
|
9
9
|
PyYaml==6.0.3
|
|
10
10
|
responses==0.26.0
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from gitlab import exceptions
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.fixture
|
|
7
|
+
def user_list(project, user):
|
|
8
|
+
user_list = project.feature_flags_user_lists.create(
|
|
9
|
+
{"name": "test_user_list", "user_xids": str(user.id)}
|
|
10
|
+
)
|
|
11
|
+
yield user_list
|
|
12
|
+
try:
|
|
13
|
+
user_list.delete()
|
|
14
|
+
except exceptions.GitlabDeleteError:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_create_user_list(project, user):
|
|
19
|
+
user_list = project.feature_flags_user_lists.create(
|
|
20
|
+
{"name": "created_user_list", "user_xids": str(user.id)}
|
|
21
|
+
)
|
|
22
|
+
assert user_list.name == "created_user_list"
|
|
23
|
+
assert str(user.id) in user_list.user_xids
|
|
24
|
+
user_list.delete()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_list_user_lists(project, user_list):
|
|
28
|
+
ff_user_lists = project.feature_flags_user_lists.list()
|
|
29
|
+
assert len(ff_user_lists) >= 1
|
|
30
|
+
assert user_list.iid in [ff_user.iid for ff_user in ff_user_lists]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_get_user_list(project, user_list, user):
|
|
34
|
+
retrieved_list = project.feature_flags_user_lists.get(user_list.iid)
|
|
35
|
+
assert retrieved_list.name == user_list.name
|
|
36
|
+
assert str(user.id) in retrieved_list.user_xids
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_update_user_list(project, user_list):
|
|
40
|
+
user_list.name = "updated_user_list"
|
|
41
|
+
user_list.save()
|
|
42
|
+
|
|
43
|
+
updated_list = project.feature_flags_user_lists.get(user_list.iid)
|
|
44
|
+
assert updated_list.name == "updated_user_list"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_delete_user_list(project, user_list):
|
|
48
|
+
user_list.delete()
|
|
49
|
+
with pytest.raises(exceptions.GitlabGetError):
|
|
50
|
+
project.feature_flags_user_lists.get(user_list.iid)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_search_user_list(project, user_list):
|
|
54
|
+
ff_user_lists = project.feature_flags_user_lists.list(search=user_list.name)
|
|
55
|
+
assert len(ff_user_lists) >= 1
|
|
56
|
+
assert user_list.iid in [ff_user.iid for ff_user in ff_user_lists]
|