From 306c4b1931e2b03d7cbcef5773668e876d5644b1 Mon Sep 17 00:00:00 2001 From: Pierre Colson Date: Wed, 21 May 2025 10:06:44 +0200 Subject: [PATCH 01/10] feat(api): pipeline inputs support (#3194) --- gitlab/v4/objects/projects.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py index 0eaceb5a6..b415a8b98 100644 --- a/gitlab/v4/objects/projects.py +++ b/gitlab/v4/objects/projects.py @@ -429,6 +429,7 @@ def trigger_pipeline( ref: str, token: str, variables: dict[str, Any] | None = None, + inputs: dict[str, Any] | None = None, **kwargs: Any, ) -> ProjectPipeline: """Trigger a CI build. @@ -439,6 +440,7 @@ def trigger_pipeline( ref: Commit to build; can be a branch name or a tag token: The trigger token variables: Variables passed to the build script + inputs: Inputs passed to the build script **kwargs: Extra options to send to the server (e.g. sudo) Raises: @@ -446,8 +448,14 @@ def trigger_pipeline( GitlabCreateError: If the server failed to perform the request """ variables = variables or {} + inputs = inputs or {} path = f"/projects/{self.encoded_id}/trigger/pipeline" - post_data = {"ref": ref, "token": token, "variables": variables} + post_data = { + "ref": ref, + "token": token, + "variables": variables, + "inputs": inputs, + } attrs = self.manager.gitlab.http_post(path, post_data=post_data, **kwargs) if TYPE_CHECKING: assert isinstance(attrs, dict) From 98c13074127ae46d85545498746d55c8b75aef48 Mon Sep 17 00:00:00 2001 From: darkhaniop <72267237+darkhaniop@users.noreply.github.com> Date: Wed, 23 Apr 2025 12:11:56 +0900 Subject: [PATCH 02/10] feat(api): add listing user contributed projects --- docs/gl_objects/users.rst | 4 ++++ gitlab/v4/objects/users.py | 14 ++++++++++++++ tests/unit/objects/test_users.py | 27 ++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/gl_objects/users.rst b/docs/gl_objects/users.rst index 185167f92..5ebfa296b 100644 --- a/docs/gl_objects/users.rst +++ b/docs/gl_objects/users.rst @@ -107,6 +107,10 @@ Get the followings of a user:: user.following_users.list(get_all=True) +List a user's contributed projects:: + + user.contributed_projects.list(get_all=True) + List a user's starred projects:: user.starred_projects.list(get_all=True) diff --git a/gitlab/v4/objects/users.py b/gitlab/v4/objects/users.py index 2c7c28a2c..dec0b375d 100644 --- a/gitlab/v4/objects/users.py +++ b/gitlab/v4/objects/users.py @@ -68,6 +68,8 @@ "UserMembershipManager", "UserProject", "UserProjectManager", + "UserContributedProject", + "UserContributedProjectManager", ] @@ -182,6 +184,7 @@ class User(SaveMixin, ObjectDeleteMixin, RESTObject): memberships: UserMembershipManager personal_access_tokens: UserPersonalAccessTokenManager projects: UserProjectManager + contributed_projects: UserContributedProjectManager starred_projects: StarredProjectManager status: UserStatusManager @@ -665,6 +668,17 @@ def list( return super().list(path=path, iterator=iterator, **kwargs) +class UserContributedProject(RESTObject): + _id_attr = "id" + _repr_attr = "path_with_namespace" + + +class UserContributedProjectManager(ListMixin[UserContributedProject]): + _path = "/users/{user_id}/contributed_projects" + _obj_cls = UserContributedProject + _from_parent_attrs = {"user_id": "id"} + + class StarredProject(RESTObject): pass diff --git a/tests/unit/objects/test_users.py b/tests/unit/objects/test_users.py index c120581fe..ff8c4479d 100644 --- a/tests/unit/objects/test_users.py +++ b/tests/unit/objects/test_users.py @@ -7,7 +7,13 @@ import pytest import responses -from gitlab.v4.objects import StarredProject, User, UserMembership, UserStatus +from gitlab.v4.objects import ( + StarredProject, + User, + UserContributedProject, + UserMembership, + UserStatus, +) from .test_projects import project_content @@ -242,6 +248,19 @@ def resp_starred_projects(): yield rsps +@pytest.fixture +def resp_contributed_projects(): + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.GET, + url="http://localhost/api/v4/users/1/contributed_projects", + json=[project_content], + content_type="application/json", + status=200, + ) + yield rsps + + @pytest.fixture def resp_runner_create(): with responses.RequestsMock() as rsps: @@ -314,6 +333,12 @@ def test_list_followers(user, resp_followers_following): assert followings[1].id == 4 +def test_list_contributed_projects(user, resp_contributed_projects): + projects = user.contributed_projects.list() + assert isinstance(projects[0], UserContributedProject) + assert projects[0].id == project_content["id"] + + def test_list_starred_projects(user, resp_starred_projects): projects = user.starred_projects.list() assert isinstance(projects[0], StarredProject) From bfd31a867547dffb2c2d54127e184fefa058cb30 Mon Sep 17 00:00:00 2001 From: xakepnz Date: Fri, 11 Apr 2025 23:29:28 +1200 Subject: [PATCH 03/10] feat(groups): add protectedbranches to group class (#3164) --- docs/gl_objects/protected_branches.rst | 13 +++++++++---- gitlab/v4/objects/branches.py | 24 ++++++++++++++++++++++++ gitlab/v4/objects/groups.py | 2 ++ tests/functional/api/test_groups.py | 25 +++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/docs/gl_objects/protected_branches.rst b/docs/gl_objects/protected_branches.rst index ce5e300db..a1b1ef5c5 100644 --- a/docs/gl_objects/protected_branches.rst +++ b/docs/gl_objects/protected_branches.rst @@ -2,8 +2,8 @@ Protected branches ################## -You can define a list of protected branch names on a repository. Names can use -wildcards (``*``). +You can define a list of protected branch names on a repository or group. +Names can use wildcards (``*``). References ---------- @@ -13,19 +13,24 @@ References + :class:`gitlab.v4.objects.ProjectProtectedBranch` + :class:`gitlab.v4.objects.ProjectProtectedBranchManager` + :attr:`gitlab.v4.objects.Project.protectedbranches` + + :class:`gitlab.v4.objects.GroupProtectedBranch` + + :class:`gitlab.v4.objects.GroupProtectedBranchManager` + + :attr:`gitlab.v4.objects.Group.protectedbranches` * GitLab API: https://docs.gitlab.com/api/protected_branches#protected-branches-api Examples -------- -Get the list of protected branches for a project:: +Get the list of protected branches for a project or group:: - p_branches = project.protectedbranches.list(get_all=True) + p_branches = project.protectedbranches.list() + p_branches = group.protectedbranches.list() Get a single protected branch:: p_branch = project.protectedbranches.get('main') + p_branch = group.protectedbranches.get('main') Update a protected branch:: diff --git a/gitlab/v4/objects/branches.py b/gitlab/v4/objects/branches.py index 0724476a6..12dbf8848 100644 --- a/gitlab/v4/objects/branches.py +++ b/gitlab/v4/objects/branches.py @@ -49,3 +49,27 @@ class ProjectProtectedBranchManager(CRUDMixin[ProjectProtectedBranch]): ), ) _update_method = UpdateMethod.PATCH + + +class GroupProtectedBranch(SaveMixin, ObjectDeleteMixin, RESTObject): + _id_attr = "name" + + +class GroupProtectedBranchManager(CRUDMixin[GroupProtectedBranch]): + _path = "/groups/{group_id}/protected_branches" + _obj_cls = GroupProtectedBranch + _from_parent_attrs = {"group_id": "id"} + _create_attrs = RequiredOptional( + required=("name",), + optional=( + "push_access_level", + "merge_access_level", + "unprotect_access_level", + "allow_force_push", + "allowed_to_push", + "allowed_to_merge", + "allowed_to_unprotect", + "code_owner_approval_required", + ), + ) + _update_method = UpdateMethod.PATCH diff --git a/gitlab/v4/objects/groups.py b/gitlab/v4/objects/groups.py index 473b40391..7a1767817 100644 --- a/gitlab/v4/objects/groups.py +++ b/gitlab/v4/objects/groups.py @@ -24,6 +24,7 @@ from .audit_events import GroupAuditEventManager # noqa: F401 from .badges import GroupBadgeManager # noqa: F401 from .boards import GroupBoardManager # noqa: F401 +from .branches import GroupProtectedBranchManager # noqa: F401 from .clusters import GroupClusterManager # noqa: F401 from .container_registry import GroupRegistryRepositoryManager # noqa: F401 from .custom_attributes import GroupCustomAttributeManager # noqa: F401 @@ -102,6 +103,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject): packages: GroupPackageManager projects: GroupProjectManager shared_projects: SharedProjectManager + protectedbranches: GroupProtectedBranchManager pushrules: GroupPushRulesManager registry_repositories: GroupRegistryRepositoryManager runners: GroupRunnerManager diff --git a/tests/functional/api/test_groups.py b/tests/functional/api/test_groups.py index 2485ac660..301fea6a2 100644 --- a/tests/functional/api/test_groups.py +++ b/tests/functional/api/test_groups.py @@ -312,6 +312,31 @@ def test_group_hooks(group): hook.delete() +def test_group_protected_branches(group, gitlab_version): + # Updating a protected branch at the group level is possible from Gitlab 15.9 + # https://docs.gitlab.com/api/group_protected_branches/ + can_update_prot_branch = gitlab_version.major > 15 or ( + gitlab_version.major == 15 and gitlab_version.minor >= 9 + ) + + p_b = group.protectedbranches.create( + {"name": "*-stable", "allow_force_push": False} + ) + assert p_b.name == "*-stable" + assert not p_b.allow_force_push + assert p_b in group.protectedbranches.list() + + if can_update_prot_branch: + p_b.allow_force_push = True + p_b.save() + + p_b = group.protectedbranches.get("*-stable") + if can_update_prot_branch: + assert p_b.allow_force_push + + p_b.delete() + + def test_group_transfer(gl, group): transfer_group = gl.groups.create( {"name": "transfer-test-group", "path": "transfer-test-group"} From 378a836bf5744ca6c9409dd60899e5d2f90b55be Mon Sep 17 00:00:00 2001 From: Novi Sandlin Date: Sun, 23 Mar 2025 13:02:20 -0700 Subject: [PATCH 04/10] feat(api): add support for project tag list filters --- gitlab/v4/objects/tags.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gitlab/v4/objects/tags.py b/gitlab/v4/objects/tags.py index 7a559daa7..ad04b4928 100644 --- a/gitlab/v4/objects/tags.py +++ b/gitlab/v4/objects/tags.py @@ -19,6 +19,7 @@ class ProjectTagManager(NoUpdateMixin[ProjectTag]): _path = "/projects/{project_id}/repository/tags" _obj_cls = ProjectTag _from_parent_attrs = {"project_id": "id"} + _list_filters = ("order_by", "sort", "search") _create_attrs = RequiredOptional( required=("tag_name", "ref"), optional=("message",) ) From f734c586e3fe5a0e866bcf60030107ca142fa763 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Mon, 9 Jun 2025 12:44:41 -0700 Subject: [PATCH 05/10] chore: update to mypy 1.16.0 and resolve issues found There was an error in the type-hints that was detected when updating to mypy 1.16.0 The error was: $ mypy gitlab/v4/cli.py:411: error: Argument 1 to "cls_to_gitlab_resource" has incompatible type "type[Any]"; expected "RESTObject" [arg-type] Found 1 error in 1 file (checked 246 source files) --- gitlab/cli.py | 2 +- gitlab/v4/cli.py | 2 +- requirements-lint.txt | 2 +- tests/unit/test_cli.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gitlab/cli.py b/gitlab/cli.py index a3ff5b5b4..ca4734190 100644 --- a/gitlab/cli.py +++ b/gitlab/cli.py @@ -107,7 +107,7 @@ def gitlab_resource_to_cls( return class_type -def cls_to_gitlab_resource(cls: RESTObject) -> str: +def cls_to_gitlab_resource(cls: type[RESTObject]) -> str: dasherized_uppercase = camel_upperlower_regex.sub(r"\1-\2", cls.__name__) dasherized_lowercase = camel_lowerupper_regex.sub(r"\1-\2", dasherized_uppercase) return dasherized_lowercase.lower() diff --git a/gitlab/v4/cli.py b/gitlab/v4/cli.py index 067a0a155..87fcaf261 100644 --- a/gitlab/v4/cli.py +++ b/gitlab/v4/cli.py @@ -394,7 +394,7 @@ def extend_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: subparsers.required = True # populate argparse for all Gitlab Object - classes = set() + classes: set[type[gitlab.base.RESTObject]] = set() for cls in gitlab.v4.objects.__dict__.values(): if not isinstance(cls, type): continue diff --git a/requirements-lint.txt b/requirements-lint.txt index 0620fc57d..c8006e667 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -4,7 +4,7 @@ black==25.1.0 commitizen==4.8.2 flake8==7.2.0 isort==6.0.1 -mypy==1.15.0 +mypy==1.16.0 pylint==3.3.7 pytest==8.3.5 responses==0.25.7 diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py index af3dd3380..cad27afba 100644 --- a/tests/unit/test_cli.py +++ b/tests/unit/test_cli.py @@ -161,7 +161,7 @@ def error(self, message): "Raise error instead of exiting on invalid arguments, to make testing easier" raise ValueError(message) - class Fake: + class Fake(gitlab.base.RESTObject): _id_attr = None class FakeManager(CreateMixin, UpdateMixin, gitlab.base.RESTManager): From ff579a6f4f2a227eb2f4d8c63dfd3de78dbcbaf4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:39:55 +0000 Subject: [PATCH 06/10] chore(deps): update dependency requests to v2.32.4 [security] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5166aa6ee..7941900de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ gql==3.5.3 httpx==0.28.1 -requests==2.32.3 +requests==2.32.4 requests-toolbelt==1.0.0 From a87ba63b613ce67cf227789dc6c5c4bac3a5dfe5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:57:13 +0000 Subject: [PATCH 07/10] chore(deps): update all non-major dependencies --- .pre-commit-config.yaml | 6 +++--- requirements-docker.txt | 2 +- requirements-lint.txt | 8 ++++---- requirements-test.txt | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aef5e4908..4d24be73d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: hooks: - id: black - repo: https://github.com/commitizen-tools/commitizen - rev: v4.8.2 + rev: v4.8.3 hooks: - id: commitizen stages: [commit-msg] @@ -32,7 +32,7 @@ repos: - requests-toolbelt==1.0.0 files: 'gitlab/' - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.15.0 + rev: v1.16.0 hooks: - id: mypy args: [] @@ -51,6 +51,6 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/maxbrunet/pre-commit-renovate - rev: 40.31.0 + rev: 40.49.0 hooks: - id: renovate-config-validator diff --git a/requirements-docker.txt b/requirements-docker.txt index 98b70440c..ee34d1fba 100644 --- a/requirements-docker.txt +++ b/requirements-docker.txt @@ -1,3 +1,3 @@ -r requirements.txt -r requirements-test.txt -pytest-docker==3.2.1 +pytest-docker==3.2.2 diff --git a/requirements-lint.txt b/requirements-lint.txt index c8006e667..4711a5403 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -1,14 +1,14 @@ -r requirements.txt argcomplete==2.0.0 black==25.1.0 -commitizen==4.8.2 +commitizen==4.8.3 flake8==7.2.0 isort==6.0.1 mypy==1.16.0 pylint==3.3.7 -pytest==8.3.5 +pytest==8.4.0 responses==0.25.7 respx==0.22.0 types-PyYAML==6.0.12.20250516 -types-requests==2.32.0.20250515 -types-setuptools==80.8.0.20250521 +types-requests==2.32.0.20250602 +types-setuptools==80.9.0.20250529 diff --git a/requirements-test.txt b/requirements-test.txt index cfe179bf3..e5149cf70 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -5,7 +5,7 @@ coverage==7.8.2 pytest-console-scripts==1.4.1 pytest-cov==6.1.1 pytest-github-actions-annotate-failures==0.3.0 -pytest==8.3.5 +pytest==8.4.0 PyYaml==6.0.2 responses==0.25.7 respx==0.22.0 From 2bab8d4b6fe9752da346fd8a7b261341ba304016 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 07:08:25 +0000 Subject: [PATCH 08/10] chore(deps): update all non-major dependencies --- .github/workflows/release.yml | 2 +- .pre-commit-config.yaml | 2 +- requirements-lint.txt | 2 +- requirements-test.txt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 72f22f125..3acee16f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: - name: Python Semantic Release id: release - uses: python-semantic-release/python-semantic-release@v10.0.2 + uses: python-semantic-release/python-semantic-release@v10.1.0 with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4d24be73d..3dda94ccf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,6 +51,6 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/maxbrunet/pre-commit-renovate - rev: 40.49.0 + rev: 40.57.1 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index 4711a5403..1281b5c87 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -10,5 +10,5 @@ pytest==8.4.0 responses==0.25.7 respx==0.22.0 types-PyYAML==6.0.12.20250516 -types-requests==2.32.0.20250602 +types-requests==2.32.4.20250611 types-setuptools==80.9.0.20250529 diff --git a/requirements-test.txt b/requirements-test.txt index e5149cf70..307f83782 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,9 +1,9 @@ -r requirements.txt anyio==4.9.0 build==1.2.2.post1 -coverage==7.8.2 +coverage==7.9.1 pytest-console-scripts==1.4.1 -pytest-cov==6.1.1 +pytest-cov==6.2.1 pytest-github-actions-annotate-failures==0.3.0 pytest==8.4.0 PyYaml==6.0.2 From 45dda50ff4c0e01307480befa86498600563f818 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Wed, 18 Jun 2025 08:06:53 -0700 Subject: [PATCH 09/10] docs: update CONTRIBUTING.rst with policy on issue management Also update the `stale` job to close issues with no activity, unless they are assigned to someone. --- .github/workflows/stale.yml | 53 ++++++++++++++++++++++++++++++++----- CONTRIBUTING.rst | 36 +++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index cdfaee27b..e65835c30 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -20,16 +20,56 @@ jobs: stale-issue-label: "stale" stale-pr-label: "stale" - any-of-labels: 'need info,Waiting for response,stale' + # If an issue/PR has an assignee it won't be marked as stale + exempt-all-assignees: true stale-issue-message: > - This issue was marked stale because it has been open 60 days with no - activity. Please remove the stale label or comment on this issue. Otherwise, - it will be closed in 15 days. + This issue was marked stale because it has been open 60 days with + no activity. Please remove the stale label or comment on this + issue. Otherwise, it will be closed in 15 days. + + As an open-source project, we rely on community contributions to + address many of the reported issues. Without a proposed fix or + active work towards a solution it is our policy to close inactive + issues. This is documented in CONTRIBUTING.rst + + **How to keep this issue open:** + * If you are still experiencing this issue and are willing to + investigate a fix, please comment and let us know. + * If you (or someone else) can propose a pull request with a + solution, that would be fantastic. + * Any significant update or active discussion indicating progress + will also prevent closure. + + We value your input. If you can help provide a fix, we'd be happy + to keep this issue open and support your efforts. + days-before-issue-stale: 60 days-before-issue-close: 15 close-issue-message: > - This issue was closed because it has been marked stale for 15 days with no - activity. If this issue is still valid, please re-open. + This issue was closed because it has been marked stale for 15 days + with no activity. + + This open-source project relies on community contributions, and + while we value all feedback, we have a limited capacity to address + every issue without a clear path forward. + + Currently, this issue hasn't received a proposed fix, and there + hasn't been recent active discussion indicating someone is planning + to work on it. To maintain a manageable backlog and focus our + efforts, we will be closing this issue for now. + + **This doesn't mean the issue isn't valid or important.** If you or + anyone else in the community is willing to investigate and propose + a solution (e.g., by submitting a pull request), please do. + + We believe that those who feel a bug is important enough to fix + should ideally be part of the solution. Your contributions are + highly welcome. + + Thank you for your understanding and potential future + contributions. + + This is documented in CONTRIBUTING.rst stale-pr-message: > This Pull Request (PR) was marked stale because it has been open 90 days @@ -40,4 +80,3 @@ jobs: close-pr-message: > This PR was closed because it has been marked stale for 15 days with no activity. If this PR is still valid, please re-open. - diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 90c6c1e70..9b07ada11 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -9,6 +9,42 @@ You can contribute to the project in multiple ways: * Add unit and functional tests * Everything else you can think of +Issue Management and Our Approach to Contributions +-------------------------------------------------- + +We value every contribution and bug report. However, as an open-source project +with limited maintainer resources, we rely heavily on the community to help us +move forward. + +**Our Policy on Inactive Issues:** + +To keep our issue tracker manageable and focused on actionable items, we have +the following approach: + +* **We encourage reporters to propose solutions:** If you report an issue, we + strongly encourage you to also think about how it might be fixed and try to + implement that fix. +* **Community interest is key:** Issues that garner interest from the community + (e.g., multiple users confirming, discussions on solutions, offers to help) + are more likely to be addressed. +* **Closing inactive issues:** If an issue report doesn't receive a proposed + fix from the original reporter or anyone else in the community, and there's + no active discussion or indication that someone is willing to work on it + after a reasonable period, it may be closed. + + * When closing such an issue, we will typically leave a comment explaining + that it's being closed due to inactivity and a lack of a proposed fix. + +* **Reopening issues:** This doesn't mean the issue isn't valid. If you (or + someone else) are interested in working on a fix for a closed issue, please + comment on the issue. We are more than happy to reopen it and discuss your + proposed pull request or solution. We greatly appreciate it when community + members take ownership of fixing issues they care about. + +We believe this approach helps us focus our efforts effectively and empowers +the community to contribute directly to the areas they are most passionate +about. + Development workflow -------------------- From ba6f174896f908ba711e1e3e8ebf4692c86bd3d4 Mon Sep 17 00:00:00 2001 From: Matthias Reiff <69197422+matthias-reiff@users.noreply.github.com> Date: Tue, 24 Jun 2025 10:38:53 +0200 Subject: [PATCH 10/10] feat(const): add PLANNER_ACCESS constant --- gitlab/const.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gitlab/const.py b/gitlab/const.py index 9e0b766ea..7a0492e64 100644 --- a/gitlab/const.py +++ b/gitlab/const.py @@ -93,6 +93,7 @@ class PipelineStatus(GitlabEnum): NO_ACCESS = AccessLevel.NO_ACCESS.value MINIMAL_ACCESS = AccessLevel.MINIMAL_ACCESS.value GUEST_ACCESS = AccessLevel.GUEST.value +PLANNER_ACCESS = AccessLevel.PLANNER.value REPORTER_ACCESS = AccessLevel.REPORTER.value DEVELOPER_ACCESS = AccessLevel.DEVELOPER.value MAINTAINER_ACCESS = AccessLevel.MAINTAINER.value @@ -151,6 +152,7 @@ class PipelineStatus(GitlabEnum): "NOTIFICATION_LEVEL_PARTICIPATING", "NOTIFICATION_LEVEL_WATCH", "OWNER_ACCESS", + "PLANNER_ACCESS", "REPORTER_ACCESS", "SEARCH_SCOPE_BLOBS", "SEARCH_SCOPE_COMMITS",