From adbc833b982c3328a47d618bd0e61e4bb068e0ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 00:40:38 +0000 Subject: [PATCH 01/23] chore(deps): update github artifact actions --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 94dde7910..baf3f5262 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -122,7 +122,7 @@ jobs: pip install -r requirements-test.txt - name: Build package run: python -m build -o dist/ - - uses: actions/upload-artifact@v4.6.2 + - uses: actions/upload-artifact@v5.0.0 with: name: dist path: dist @@ -136,7 +136,7 @@ jobs: uses: actions/setup-python@v6.0.0 with: python-version: '3.14' - - uses: actions/download-artifact@v5.0.0 + - uses: actions/download-artifact@v6.0.0 with: name: dist path: dist From 22941acc3f331d5b683599c014ec962ece5d4b76 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Wed, 29 Oct 2025 07:18:00 -0700 Subject: [PATCH 02/23] feat!: drop Python 3.9 support and add Python 3.14 Python 3.9 is End-of-Life (EOL) as of 2025-10 as stated in https://devguide.python.org/versions/ and https://peps.python.org/pep-0596/#lifespan By dropping support for Python 3.9 and requiring Python 3.10 or higher it allows python-gitlab to take advantage of new features in Python 3.10, which are documented at: https://docs.python.org/3/whatsnew/3.10.html Also mark Python 3.14 as officially supported as it has been released. Closes: https://github.com/python-gitlab/python-gitlab/issues/3285 BREAKING CHANGE: As of python-gitlab 7.0.0, Python 3.9 is no longer supported. Python 3.10 or higher is required. --- .github/workflows/test.yml | 12 +++++------- .readthedocs.yml | 2 +- README.rst | 2 +- pyproject.toml | 4 ++-- requirements-test.txt | 3 +-- tox.ini | 4 ++-- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index baf3f5262..7f1b877ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,8 +26,6 @@ jobs: matrix: os: [ubuntu-latest] python: - - version: "3.9" - toxenv: py39,smoke - version: "3.10" toxenv: py310,smoke - version: "3.11" @@ -36,17 +34,17 @@ jobs: toxenv: py312,smoke - version: "3.13" toxenv: py313,smoke - - version: "3.14.0-alpha - 3.14" # SemVer's version range syntax + - version: "3.14" toxenv: py314,smoke include: - os: macos-latest python: - version: "3.13" - toxenv: py313,smoke + version: "3.14" + toxenv: py314,smoke - os: windows-latest python: - version: "3.13" - toxenv: py313,smoke + version: "3.14" + toxenv: py314,smoke steps: - uses: actions/checkout@v5.0.0 - name: Set up Python ${{ matrix.python.version }} diff --git a/.readthedocs.yml b/.readthedocs.yml index 2d561b88b..facdbd3f9 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -3,7 +3,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11" + python: "3.13" sphinx: configuration: docs/conf.py diff --git a/README.rst b/README.rst index 101add1eb..1b7b7ce48 100644 --- a/README.rst +++ b/README.rst @@ -53,7 +53,7 @@ Features Installation ------------ -As of 5.0.0, ``python-gitlab`` is compatible with Python 3.9+. +As of 7.0.0, ``python-gitlab`` is compatible with Python 3.10+. Use ``pip`` to install the latest stable version of ``python-gitlab``: diff --git a/pyproject.toml b/pyproject.toml index 5aad28aee..7b8510b94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ maintainers = [ {name = "Nejc Habjan", email="nejc.habjan@siemens.com"}, {name = "Roger Meier", email="r.meier@siemens.com"} ] -requires-python = ">=3.9.0" +requires-python = ">=3.10.0" dependencies = [ "requests>=2.32.0", "requests-toolbelt>=1.0.0", @@ -30,11 +30,11 @@ classifiers = [ "Operating System :: Microsoft :: Windows", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] keywords = ["api", "client", "gitlab", "python", "python-gitlab", "wrapper"] license = {text = "LGPL-3.0-or-later"} diff --git a/requirements-test.txt b/requirements-test.txt index 8be29d41c..64b22c3af 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,8 +1,7 @@ -r requirements.txt anyio==4.11.0 build==1.3.0 -coverage==7.10.7 ; python_version <= '3.9' -coverage==7.11.0 ; python_version > '3.9' +coverage==7.11.0 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 diff --git a/tox.ini b/tox.ini index 05a15c6c4..0ba295692 100644 --- a/tox.ini +++ b/tox.ini @@ -2,14 +2,14 @@ minversion = 4.0 skipsdist = True skip_missing_interpreters = True -envlist = py313,py312,py311,py310,py39,black,isort,flake8,mypy,twine-check,cz,pylint +envlist = py314,py313,py312,py311,py310,black,isort,flake8,mypy,twine-check,cz,pylint # NOTE(jlvillal): To use a label use the `-m` flag. # For example to run the `func` label group of environments do: # tox -m func labels = lint = black,isort,flake8,mypy,pylint,cz - unit = py313,py312,py311,py310,py39,py38 + unit = py314,py313,py312,py311,py310 # func is the functional tests. This is very time consuming. func = cli_func_v4,api_func_v4 From 378b72d841b5c7ff34eb7b9d8b4c3083af367a4c Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 29 Oct 2025 15:05:36 +0000 Subject: [PATCH 03/23] chore: release v7.0.0 --- CHANGELOG.md | 12 ++++++++++++ gitlab/_version.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f13242484..de7c0d113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All versions below are listed in reverse chronological order. +## v7.0.0 (2025-10-29) + +### Features + +- Drop Python 3.9 support and add Python 3.14 + ([`22941ac`](https://github.com/python-gitlab/python-gitlab/commit/22941acc3f331d5b683599c014ec962ece5d4b76)) + +### Breaking Changes + +- As of python-gitlab 7.0.0, Python 3.9 is no longer supported. Python 3.10 or higher is required. + + ## v6.5.0 (2025-10-17) ### Bug Fixes diff --git a/gitlab/_version.py b/gitlab/_version.py index 5c642f8f0..e7817062d 100644 --- a/gitlab/_version.py +++ b/gitlab/_version.py @@ -3,4 +3,4 @@ __email__ = "gauvainpocentek@gmail.com" __license__ = "LGPL3" __title__ = "python-gitlab" -__version__ = "6.5.0" +__version__ = "7.0.0" From c7333d8520a6eb0b68caf1acbadd715f6dd7dcda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:51:20 +0000 Subject: [PATCH 04/23] chore(deps): update all non-major dependencies --- .pre-commit-config.yaml | 4 ++-- requirements-lint.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 364d107a7..684696497 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: hooks: - id: isort - repo: https://github.com/pycqa/pylint - rev: v4.0.1 + rev: v4.0.2 hooks: - id: pylint additional_dependencies: @@ -51,6 +51,6 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/maxbrunet/pre-commit-renovate - rev: 41.146.0 + rev: 41.165.3 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index b956034b6..3cffe0d99 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -5,7 +5,7 @@ commitizen==4.9.1 flake8==7.3.0 isort==7.0.0 mypy==1.18.2 -pylint==4.0.1 +pylint==4.0.2 pytest==8.4.2 responses==0.25.8 respx==0.22.0 From 614a74c00f027f70b8e48a6b2a2ddcd3f823bffa Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Wed, 29 Oct 2025 08:41:03 -0700 Subject: [PATCH 05/23] ci(release): use the correct token for publish to GitHub For the: "Publish package distributions to GitHub Releases" use the correct `secrets.RELEASE_GITHUB_TOKEN`. Before it was using `secrets.GITHUB_TOKEN` The other steps are already using `secrets.RELEASE_GITHUB_TOKEN` Closes: https://github.com/python-gitlab/python-gitlab/issues/3288 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a3cc1ec7..996c096ea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,4 +35,4 @@ jobs: uses: python-semantic-release/publish-action@v10.4.1 if: steps.release.outputs.released == 'true' with: - github_token: ${{ secrets.GITHUB_TOKEN }} + github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} From b70a2eb9ff5195f123c41cf1d631ff151ce089f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 18:04:51 +0000 Subject: [PATCH 06/23] chore(deps): update all non-major dependencies --- .pre-commit-config.yaml | 2 +- requirements-test.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 684696497..963fecc3b 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: 41.165.3 + rev: 41.169.2 hooks: - id: renovate-config-validator diff --git a/requirements-test.txt b/requirements-test.txt index 64b22c3af..da7703a8b 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -9,5 +9,5 @@ pytest==8.4.2 PyYaml==6.0.3 responses==0.25.8 respx==0.22.0 -trio==0.31.0 +trio==0.32.0 wheel==0.45.1 From 1e025b91d3025a214bb681964bc91a53bfb10752 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 03:07:56 +0000 Subject: [PATCH 07/23] chore(deps): update all non-major dependencies --- .github/workflows/release.yml | 2 +- .pre-commit-config.yaml | 4 ++-- requirements-lint.txt | 2 +- requirements-precommit.txt | 2 +- requirements-test.txt | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 996c096ea..0699b6885 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.4.1 + uses: python-semantic-release/python-semantic-release@v10.5.0 with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 963fecc3b..b2e6bf30d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ default_language_version: repos: - repo: https://github.com/psf/black - rev: 25.9.0 + rev: 25.11.0 hooks: - id: black - repo: https://github.com/commitizen-tools/commitizen @@ -51,6 +51,6 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/maxbrunet/pre-commit-renovate - rev: 41.169.2 + rev: 41.173.1 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index 3cffe0d99..427e28e23 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -1,6 +1,6 @@ -r requirements.txt argcomplete==2.0.0 -black==25.9.0 +black==25.11.0 commitizen==4.9.1 flake8==7.3.0 isort==7.0.0 diff --git a/requirements-precommit.txt b/requirements-precommit.txt index 3ee862221..b6927360e 100644 --- a/requirements-precommit.txt +++ b/requirements-precommit.txt @@ -1 +1 @@ -pre-commit==4.3.0 +pre-commit==4.4.0 diff --git a/requirements-test.txt b/requirements-test.txt index da7703a8b..72bc4db00 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,7 +1,7 @@ -r requirements.txt anyio==4.11.0 build==1.3.0 -coverage==7.11.0 +coverage==7.11.3 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 From 54471d2088b3b1b8442fe7fd88981d188d9fed13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:08:47 +0000 Subject: [PATCH 08/23] chore(deps): update all non-major dependencies --- .github/workflows/release.yml | 4 ++-- .pre-commit-config.yaml | 4 ++-- requirements-docker.txt | 2 +- requirements-lint.txt | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0699b6885..3b9630fd9 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.5.0 + uses: python-semantic-release/python-semantic-release@v10.5.2 with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} @@ -32,7 +32,7 @@ jobs: if: steps.release.outputs.released == 'true' - name: Publish package distributions to GitHub Releases - uses: python-semantic-release/publish-action@v10.4.1 + uses: python-semantic-release/publish-action@v10.5.2 if: steps.release.outputs.released == 'true' with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2e6bf30d..9a2ad6138 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.9.1 + rev: v4.10.0 hooks: - id: commitizen stages: [commit-msg] @@ -20,7 +20,7 @@ repos: hooks: - id: isort - repo: https://github.com/pycqa/pylint - rev: v4.0.2 + rev: v4.0.3 hooks: - id: pylint additional_dependencies: diff --git a/requirements-docker.txt b/requirements-docker.txt index 532609b3f..123a4438a 100644 --- a/requirements-docker.txt +++ b/requirements-docker.txt @@ -1,3 +1,3 @@ -r requirements.txt -r requirements-test.txt -pytest-docker==3.2.3 +pytest-docker==3.2.5 diff --git a/requirements-lint.txt b/requirements-lint.txt index 427e28e23..4b3722256 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -1,11 +1,11 @@ -r requirements.txt argcomplete==2.0.0 black==25.11.0 -commitizen==4.9.1 +commitizen==4.10.0 flake8==7.3.0 isort==7.0.0 mypy==1.18.2 -pylint==4.0.2 +pylint==4.0.3 pytest==8.4.2 responses==0.25.8 respx==0.22.0 From 87513eaf9a49bcd12e7d3a1ca441727886846c29 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 03:01:59 +0000 Subject: [PATCH 09/23] chore(deps): update dependency pytest to v9 --- requirements-lint.txt | 2 +- requirements-test.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-lint.txt b/requirements-lint.txt index 4b3722256..241dd9042 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -6,7 +6,7 @@ flake8==7.3.0 isort==7.0.0 mypy==1.18.2 pylint==4.0.3 -pytest==8.4.2 +pytest==9.0.1 responses==0.25.8 respx==0.22.0 types-PyYAML==6.0.12.20250915 diff --git a/requirements-test.txt b/requirements-test.txt index 72bc4db00..5271bfa51 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -5,7 +5,7 @@ coverage==7.11.3 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 -pytest==8.4.2 +pytest==9.0.1 PyYaml==6.0.3 responses==0.25.8 respx==0.22.0 From 3449af7c6f26a2df8048d88e5977a198e05c3a95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 03:28:19 +0000 Subject: [PATCH 10/23] chore(deps): update pre-commit hook maxbrunet/pre-commit-renovate to v42 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9a2ad6138..5a6adb1be 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: 41.173.1 + rev: 42.11.0 hooks: - id: renovate-config-validator From 595da41c9662e98bb8f048a9e0aaa03335b50104 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:50:32 +0000 Subject: [PATCH 11/23] chore(deps): update all non-major dependencies --- .github/workflows/docs.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/pre_commit.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 10 +++++----- .pre-commit-config.yaml | 2 +- requirements-precommit.txt | 2 +- requirements-test.txt | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 001aca5e2..d6bfe26ce 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -22,7 +22,7 @@ jobs: sphinx: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python uses: actions/setup-python@v6.0.0 with: @@ -37,7 +37,7 @@ jobs: twine-check: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python uses: actions/setup-python@v6.0.0 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4148fcaeb..c097b8d30 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,7 +22,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 with: fetch-depth: 0 - uses: actions/setup-python@v6.0.0 diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index 9bc366f6d..52b5fba96 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -29,7 +29,7 @@ jobs: pre_commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - uses: actions/setup-python@v6.0.0 with: python-version: "3.14" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b9630fd9..7b219c218 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: id-token: write environment: pypi.org steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 with: fetch-depth: 0 token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f1b877ca..2ae02db98 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: version: "3.14" toxenv: py314,smoke steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python ${{ matrix.python.version }} uses: actions/setup-python@v6.0.0 with: @@ -65,7 +65,7 @@ jobs: matrix: toxenv: [api_func_v4, cli_func_v4] steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python uses: actions/setup-python@v6.0.0 with: @@ -87,7 +87,7 @@ jobs: coverage: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6.0.0 with: @@ -111,7 +111,7 @@ jobs: runs-on: ubuntu-latest name: Python wheel steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - uses: actions/setup-python@v6.0.0 with: python-version: "3.14" @@ -129,7 +129,7 @@ jobs: runs-on: ubuntu-latest needs: [dist] steps: - - uses: actions/checkout@v5.0.0 + - uses: actions/checkout@v5.0.1 - name: Set up Python uses: actions/setup-python@v6.0.0 with: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5a6adb1be..2fca6428d 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: 42.11.0 + rev: 42.19.3 hooks: - id: renovate-config-validator diff --git a/requirements-precommit.txt b/requirements-precommit.txt index b6927360e..917f1957e 100644 --- a/requirements-precommit.txt +++ b/requirements-precommit.txt @@ -1 +1 @@ -pre-commit==4.4.0 +pre-commit==4.5.0 diff --git a/requirements-test.txt b/requirements-test.txt index 5271bfa51..2bd17b92e 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,7 +1,7 @@ -r requirements.txt anyio==4.11.0 build==1.3.0 -coverage==7.11.3 +coverage==7.12.0 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 From d071dcfaf2a0de37dd3044c4c8bf4ff3ee1d90f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 02:56:33 +0000 Subject: [PATCH 12/23] chore(deps): update actions/checkout action to v6 --- .github/workflows/docs.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/pre_commit.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 10 +++++----- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d6bfe26ce..d9eba338d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -22,7 +22,7 @@ jobs: sphinx: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python uses: actions/setup-python@v6.0.0 with: @@ -37,7 +37,7 @@ jobs: twine-check: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python uses: actions/setup-python@v6.0.0 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c097b8d30..30dc1e6ce 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,7 +22,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 with: fetch-depth: 0 - uses: actions/setup-python@v6.0.0 diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index 52b5fba96..bf29fd478 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -29,7 +29,7 @@ jobs: pre_commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - uses: actions/setup-python@v6.0.0 with: python-version: "3.14" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7b219c218..413bdae23 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: id-token: write environment: pypi.org steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 with: fetch-depth: 0 token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2ae02db98..78ebbd626 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: version: "3.14" toxenv: py314,smoke steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python ${{ matrix.python.version }} uses: actions/setup-python@v6.0.0 with: @@ -65,7 +65,7 @@ jobs: matrix: toxenv: [api_func_v4, cli_func_v4] steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python uses: actions/setup-python@v6.0.0 with: @@ -87,7 +87,7 @@ jobs: coverage: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6.0.0 with: @@ -111,7 +111,7 @@ jobs: runs-on: ubuntu-latest name: Python wheel steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - uses: actions/setup-python@v6.0.0 with: python-version: "3.14" @@ -129,7 +129,7 @@ jobs: runs-on: ubuntu-latest needs: [dist] steps: - - uses: actions/checkout@v5.0.1 + - uses: actions/checkout@v6.0.0 - name: Set up Python uses: actions/setup-python@v6.0.0 with: From 16fa4b8e648d2fcdf98fabd8d6cd565ce14a3155 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 02:01:29 +0000 Subject: [PATCH 13/23] chore(deps): update all non-major dependencies --- .github/workflows/docs.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/pre_commit.yml | 2 +- .github/workflows/test.yml | 10 +++++----- .pre-commit-config.yaml | 6 +++--- requirements-lint.txt | 4 ++-- requirements-test.txt | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d9eba338d..696abe747 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -24,7 +24,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: Install dependencies @@ -39,7 +39,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: Install dependencies diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 30dc1e6ce..aa022f474 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@v6.0.0 with: fetch-depth: 0 - - uses: actions/setup-python@v6.0.0 + - uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - run: pip install --upgrade tox diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index bf29fd478..ad22f2a6e 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6.0.0 - - uses: actions/setup-python@v6.0.0 + - uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: install tox diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 78ebbd626..58b843c77 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -48,7 +48,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python ${{ matrix.python.version }} - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: ${{ matrix.python.version }} - name: Install dependencies @@ -67,7 +67,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: Install dependencies @@ -89,7 +89,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: Install dependencies @@ -112,7 +112,7 @@ jobs: name: Python wheel steps: - uses: actions/checkout@v6.0.0 - - uses: actions/setup-python@v6.0.0 + - uses: actions/setup-python@v6.1.0 with: python-version: "3.14" - name: Install dependencies @@ -131,7 +131,7 @@ jobs: steps: - uses: actions/checkout@v6.0.0 - name: Set up Python - uses: actions/setup-python@v6.0.0 + uses: actions/setup-python@v6.1.0 with: python-version: '3.14' - uses: actions/download-artifact@v6.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2fca6428d..08ddcb73a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: hooks: - id: isort - repo: https://github.com/pycqa/pylint - rev: v4.0.3 + rev: v4.0.4 hooks: - id: pylint additional_dependencies: @@ -32,7 +32,7 @@ repos: - requests-toolbelt==1.0.0 files: 'gitlab/' - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.18.2 + rev: v1.19.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: 42.19.3 + rev: 42.27.0 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index 241dd9042..bcf13fe69 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -4,8 +4,8 @@ black==25.11.0 commitizen==4.10.0 flake8==7.3.0 isort==7.0.0 -mypy==1.18.2 -pylint==4.0.3 +mypy==1.19.0 +pylint==4.0.4 pytest==9.0.1 responses==0.25.8 respx==0.22.0 diff --git a/requirements-test.txt b/requirements-test.txt index 2bd17b92e..c42011354 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,5 +1,5 @@ -r requirements.txt -anyio==4.11.0 +anyio==4.12.0 build==1.3.0 coverage==7.12.0 pytest-console-scripts==1.4.1 From 9f11323c60468d8fdccb4b08aac857f9c485f9d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 08:39:41 +0000 Subject: [PATCH 14/23] chore(deps): update all non-major dependencies --- .github/workflows/docs.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/pre_commit.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/stale.yml | 2 +- .github/workflows/test.yml | 10 +++++----- .pre-commit-config.yaml | 4 ++-- requirements-lint.txt | 4 ++-- requirements-test.txt | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 696abe747..90f7d3fd5 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -22,7 +22,7 @@ jobs: sphinx: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python uses: actions/setup-python@v6.1.0 with: @@ -37,7 +37,7 @@ jobs: twine-check: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python uses: actions/setup-python@v6.1.0 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index aa022f474..01bee8a33 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,7 +22,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: fetch-depth: 0 - uses: actions/setup-python@v6.1.0 diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index ad22f2a6e..4be228d66 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -29,7 +29,7 @@ jobs: pre_commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - uses: actions/setup-python@v6.1.0 with: python-version: "3.14" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 413bdae23..c48d32445 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: id-token: write environment: pypi.org steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: fetch-depth: 0 token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e75866b21..e4fd014a5 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -17,7 +17,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v10.1.0 + - uses: actions/stale@v10.1.1 with: operations-per-run: 500 stale-issue-label: "stale" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 58b843c77..b10f50c21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: version: "3.14" toxenv: py314,smoke steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python ${{ matrix.python.version }} uses: actions/setup-python@v6.1.0 with: @@ -65,7 +65,7 @@ jobs: matrix: toxenv: [api_func_v4, cli_func_v4] steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python uses: actions/setup-python@v6.1.0 with: @@ -87,7 +87,7 @@ jobs: coverage: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6.1.0 with: @@ -111,7 +111,7 @@ jobs: runs-on: ubuntu-latest name: Python wheel steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - uses: actions/setup-python@v6.1.0 with: python-version: "3.14" @@ -129,7 +129,7 @@ jobs: runs-on: ubuntu-latest needs: [dist] steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 - name: Set up Python uses: actions/setup-python@v6.1.0 with: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 08ddcb73a..c9e61446b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ default_language_version: repos: - repo: https://github.com/psf/black - rev: 25.11.0 + rev: 25.12.0 hooks: - id: black - repo: https://github.com/commitizen-tools/commitizen @@ -51,6 +51,6 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/maxbrunet/pre-commit-renovate - rev: 42.27.0 + rev: 42.39.4 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index bcf13fe69..4eb6779f8 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -1,12 +1,12 @@ -r requirements.txt argcomplete==2.0.0 -black==25.11.0 +black==25.12.0 commitizen==4.10.0 flake8==7.3.0 isort==7.0.0 mypy==1.19.0 pylint==4.0.4 -pytest==9.0.1 +pytest==9.0.2 responses==0.25.8 respx==0.22.0 types-PyYAML==6.0.12.20250915 diff --git a/requirements-test.txt b/requirements-test.txt index c42011354..e8843be94 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -5,7 +5,7 @@ coverage==7.12.0 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 -pytest==9.0.1 +pytest==9.0.2 PyYaml==6.0.3 responses==0.25.8 respx==0.22.0 From 422119576287de30e1b70411c7ab0bbe39231af7 Mon Sep 17 00:00:00 2001 From: Alexandre Laroche Date: Thu, 4 Dec 2025 06:01:29 -0500 Subject: [PATCH 15/23] fix(utils): prevent negative sleep time in rate limit retry --- gitlab/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitlab/utils.py b/gitlab/utils.py index bf37e09a5..cf1b5b7b0 100644 --- a/gitlab/utils.py +++ b/gitlab/utils.py @@ -133,7 +133,7 @@ def handle_retry_on_status( if "Retry-After" in headers: wait_time = int(headers["Retry-After"]) elif "RateLimit-Reset" in headers: - wait_time = int(headers["RateLimit-Reset"]) - time.time() + wait_time = max(0, int(headers["RateLimit-Reset"]) - time.time()) self.cur_retries += 1 time.sleep(wait_time) return True From 3c72fd1e0d74ebd82c257ba1b810252c5a7295f7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:42:30 +0000 Subject: [PATCH 16/23] chore(deps): update all non-major dependencies --- .github/workflows/release.yml | 4 ++-- .github/workflows/test.yml | 4 ++-- .pre-commit-config.yaml | 6 +++--- requirements-lint.txt | 4 ++-- requirements-precommit.txt | 2 +- requirements-test.txt | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c48d32445..ff04716dd 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.5.2 + uses: python-semantic-release/python-semantic-release@v10.5.3 with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} @@ -32,7 +32,7 @@ jobs: if: steps.release.outputs.released == 'true' - name: Publish package distributions to GitHub Releases - uses: python-semantic-release/publish-action@v10.5.2 + uses: python-semantic-release/publish-action@v10.5.3 if: steps.release.outputs.released == 'true' with: github_token: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b10f50c21..eec3e1599 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -77,7 +77,7 @@ jobs: TOXENV: ${{ matrix.toxenv }} run: tox -- --override-ini='log_cli=True' - name: Upload codecov coverage - uses: codecov/codecov-action@v5.5.1 + uses: codecov/codecov-action@v5.5.2 with: files: ./coverage.xml flags: ${{ matrix.toxenv }} @@ -100,7 +100,7 @@ jobs: TOXENV: cover run: tox - name: Upload codecov coverage - uses: codecov/codecov-action@v5.5.1 + uses: codecov/codecov-action@v5.5.2 with: files: ./coverage.xml flags: unit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c9e61446b..41e732604 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.10.0 + rev: v4.10.1 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.19.0 + rev: v1.19.1 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: 42.39.4 + rev: 42.64.0 hooks: - id: renovate-config-validator diff --git a/requirements-lint.txt b/requirements-lint.txt index 4eb6779f8..31ec607b9 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -1,10 +1,10 @@ -r requirements.txt argcomplete==2.0.0 black==25.12.0 -commitizen==4.10.0 +commitizen==4.10.1 flake8==7.3.0 isort==7.0.0 -mypy==1.19.0 +mypy==1.19.1 pylint==4.0.4 pytest==9.0.2 responses==0.25.8 diff --git a/requirements-precommit.txt b/requirements-precommit.txt index 917f1957e..fc2379223 100644 --- a/requirements-precommit.txt +++ b/requirements-precommit.txt @@ -1 +1 @@ -pre-commit==4.5.0 +pre-commit==4.5.1 diff --git a/requirements-test.txt b/requirements-test.txt index e8843be94..b06434452 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,7 +1,7 @@ -r requirements.txt anyio==4.12.0 build==1.3.0 -coverage==7.12.0 +coverage==7.13.0 pytest-console-scripts==1.4.1 pytest-cov==7.0.0 pytest-github-actions-annotate-failures==0.3.0 From 91793733df8de2bd371e2297c80b429a2fcaace1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 19:00:55 +0000 Subject: [PATCH 17/23] chore(deps): update dessant/lock-threads action to v6 --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 05e21065c..f6f1c6229 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -15,6 +15,6 @@ jobs: action: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v5.0.1 + - uses: dessant/lock-threads@v6.0.0 with: process-only: 'issues' From 40827f419020d84aa777fa42a289fb07dc2b3fa7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 00:30:50 +0000 Subject: [PATCH 18/23] chore(deps): update all non-major dependencies --- .pre-commit-config.yaml | 2 +- requirements-docs.txt | 2 +- requirements-lint.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 41e732604..3b93e8655 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: 42.64.0 + rev: 42.64.1 hooks: - id: renovate-config-validator diff --git a/requirements-docs.txt b/requirements-docs.txt index b83ef6dac..8d756d4f1 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,5 +1,5 @@ -r requirements.txt -furo==2025.9.25 +furo==2025.12.19 jinja2==3.1.6 myst-parser==4.0.1 sphinx==8.2.3 diff --git a/requirements-lint.txt b/requirements-lint.txt index 31ec607b9..5006460d1 100644 --- a/requirements-lint.txt +++ b/requirements-lint.txt @@ -11,4 +11,4 @@ responses==0.25.8 respx==0.22.0 types-PyYAML==6.0.12.20250915 types-requests==2.32.4.20250913 -types-setuptools==80.9.0.20250822 +types-setuptools==80.9.0.20251221 From c7c139b9e7823ec1800a819233aee469355ee8d1 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Wed, 24 Dec 2025 13:17:55 -0800 Subject: [PATCH 19/23] test(functional): update to GitLab 18.6 and resolve issues found --- tests/functional/api/test_epics.py | 8 ++++--- tests/functional/api/test_keys.py | 10 ++++++++- .../api/test_project_job_token_scope.py | 4 ++++ tests/functional/api/test_projects.py | 4 ++-- tests/functional/fixtures/.env | 2 +- tests/functional/fixtures/docker-compose.yml | 2 +- tests/functional/helpers.py | 22 +++++++++---------- 7 files changed, 33 insertions(+), 19 deletions(-) diff --git a/tests/functional/api/test_epics.py b/tests/functional/api/test_epics.py index a4f6765da..b61e23776 100644 --- a/tests/functional/api/test_epics.py +++ b/tests/functional/api/test_epics.py @@ -15,18 +15,20 @@ def test_epics(group): assert group.epics.list() -@pytest.mark.xfail(reason="404 on issue.id") def test_epic_issues(epic, issue): assert not epic.issues.list() + # FYI: Creating an issue causes a note to be created epic_issue = epic.issues.create({"issue_id": issue.id}) assert epic.issues.list() + # FYI: Deleting an issue causes a note to be created epic_issue.delete() def test_epic_notes(epic): - assert not epic.notes.list() + notes = epic.notes.list(get_all=True) epic.notes.create({"body": "Test note"}) - assert epic.notes.list() + new_notes = epic.notes.list(get_all=True) + assert len(new_notes) == (len(notes) + 1), f"{new_notes} {notes}" diff --git a/tests/functional/api/test_keys.py b/tests/functional/api/test_keys.py index 359649bef..6a2d660ed 100644 --- a/tests/functional/api/test_keys.py +++ b/tests/functional/api/test_keys.py @@ -38,6 +38,14 @@ def test_keys_deploy(gl, project, DEPLOY_KEY): key_by_fingerprint = gl.keys.get(fingerprint=fingerprint) assert key_by_fingerprint.title == key.title assert key_by_fingerprint.key == key.key - assert len(key_by_fingerprint.deploy_keys_projects) == 1 + + if not any( + key_project.get("project_id") == project.id + for key_project in key_by_fingerprint.deploy_keys_projects + ): + raise AssertionError( + f"Project {project} not found in 'deploy_keys_projects' " + f"{key_by_fingerprint.pformat()}" + ) key.delete() diff --git a/tests/functional/api/test_project_job_token_scope.py b/tests/functional/api/test_project_job_token_scope.py index 0d0466182..b1de0a7b2 100644 --- a/tests/functional/api/test_project_job_token_scope.py +++ b/tests/functional/api/test_project_job_token_scope.py @@ -1,3 +1,6 @@ +import pytest + + # https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-any-project-to-access-your-project def test_enable_limit_access_to_this_project(gl, project): scope = project.job_token_scope.get() @@ -10,6 +13,7 @@ def test_enable_limit_access_to_this_project(gl, project): assert scope.inbound_enabled +@pytest.mark.xfail(reason="https://gitlab.com/gitlab-org/gitlab/-/issues/582271") def test_disable_limit_access_to_this_project(gl, project): scope = project.job_token_scope.get() diff --git a/tests/functional/api/test_projects.py b/tests/functional/api/test_projects.py index 760f95336..c56b23ec7 100644 --- a/tests/functional/api/test_projects.py +++ b/tests/functional/api/test_projects.py @@ -26,9 +26,9 @@ def test_create_project(gl, user): sudo_project = gl.projects.create({"name": "sudo_project"}, sudo=user.id) - created = gl.projects.list() + created = gl.projects.list(get_all=True) created_gen = gl.projects.list(iterator=True) - owned = gl.projects.list(owned=True) + owned = gl.projects.list(owned=True, get_all=True) assert admin_project in created and sudo_project in created assert admin_project in owned and sudo_project not in owned diff --git a/tests/functional/fixtures/.env b/tests/functional/fixtures/.env index e85f85e6f..a96b42f42 100644 --- a/tests/functional/fixtures/.env +++ b/tests/functional/fixtures/.env @@ -1,4 +1,4 @@ GITLAB_IMAGE=gitlab/gitlab-ee -GITLAB_TAG=17.8.2-ee.0 +GITLAB_TAG=18.6.1-ee.0 GITLAB_RUNNER_IMAGE=gitlab/gitlab-runner GITLAB_RUNNER_TAG=96856197 diff --git a/tests/functional/fixtures/docker-compose.yml b/tests/functional/fixtures/docker-compose.yml index f36f3d2fd..17562d5be 100644 --- a/tests/functional/fixtures/docker-compose.yml +++ b/tests/functional/fixtures/docker-compose.yml @@ -34,7 +34,7 @@ services: entrypoint: - /bin/sh - -c - - ruby /create_license.rb && /assets/wrapper + - ruby /create_license.rb && /assets/init-container volumes: - ${PWD}/tests/functional/fixtures/create_license.rb:/create_license.rb ports: diff --git a/tests/functional/helpers.py b/tests/functional/helpers.py index 090673bf7..9d313e540 100644 --- a/tests/functional/helpers.py +++ b/tests/functional/helpers.py @@ -9,6 +9,7 @@ import gitlab import gitlab.base import gitlab.exceptions +import gitlab.v4.objects SLEEP_INTERVAL = 0.5 TIMEOUT = 60 # seconds before timeout will occur @@ -37,6 +38,11 @@ def safe_delete(object: gitlab.base.RESTObject) -> None: object = manager.get(object.get_id()) # type: ignore[attr-defined] except gitlab.exceptions.GitlabGetError: return + # If object is already marked for deletion we have succeeded + if getattr(object, "marked_for_deletion_on", None) is not None: + # 'Group' and 'Project' objects have a 'marked_for_deletion_on' attribute + logging.info(f"{object!r} is marked for deletion.") + return if index: logging.info(f"Attempt {index + 1} to delete {object!r}.") @@ -52,22 +58,16 @@ def safe_delete(object: gitlab.base.RESTObject) -> None: # we shouldn't cause test to fail if it still exists return elif isinstance(object, gitlab.v4.objects.Project): - # Immediately delete rather than waiting for at least 1day - # https://docs.gitlab.com/ee/api/projects.html#delete-project - object.delete(permanently_remove=True) - pass + # Starting in GitLab 18, projects can't be immediately deleted. + # So this will mark it for deletion. + object.delete() else: # We only attempt to delete parent groups to prevent dangling sub-groups - # However parent groups can only be deleted on a delay in Gl 16 + # However parent groups can only be deleted on a delay in GitLab 16 # https://docs.gitlab.com/ee/api/groups.html#remove-group object.delete() except gitlab.exceptions.GitlabDeleteError: - logging.info(f"{object!r} already deleted or scheduled for deletion.") - if isinstance(object, gitlab.v4.objects.Group): - # Parent groups can never be immediately deleted in GL 16, - # so don't cause test to fail if it still exists - return - pass + logging.exception(f"Error attempting to delete: {object.pformat()}") time.sleep(SLEEP_INTERVAL) pytest.fail(f"{object!r} was not deleted") From d6eac7bea8d755dbe11ef4ff8a5247aa1aba2e24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:54:12 +0000 Subject: [PATCH 20/23] chore(deps): update gitlab/gitlab-ee docker tag to v18.7.0-ee.0 (#3218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- tests/functional/fixtures/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/fixtures/.env b/tests/functional/fixtures/.env index a96b42f42..f33c35752 100644 --- a/tests/functional/fixtures/.env +++ b/tests/functional/fixtures/.env @@ -1,4 +1,4 @@ GITLAB_IMAGE=gitlab/gitlab-ee -GITLAB_TAG=18.6.1-ee.0 +GITLAB_TAG=18.7.0-ee.0 GITLAB_RUNNER_IMAGE=gitlab/gitlab-runner GITLAB_RUNNER_TAG=96856197 From 9dd62c3f5bcf3e082c2733bd4edc068f993c22ec Mon Sep 17 00:00:00 2001 From: Sigurd Spieckermann Date: Thu, 20 Nov 2025 12:58:50 +0100 Subject: [PATCH 21/23] feat(registry-protection): add support for registry protection rule deletion --- .../registry_protection_repository_rules.py | 10 +++++++++- tests/functional/api/test_registry.py | 5 +++++ .../objects/test_registry_protection_rules.py | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gitlab/v4/objects/registry_protection_repository_rules.py b/gitlab/v4/objects/registry_protection_repository_rules.py index 19d4bdf59..2a457a024 100644 --- a/gitlab/v4/objects/registry_protection_repository_rules.py +++ b/gitlab/v4/objects/registry_protection_repository_rules.py @@ -1,5 +1,12 @@ from gitlab.base import RESTObject -from gitlab.mixins import CreateMixin, ListMixin, SaveMixin, UpdateMethod, UpdateMixin +from gitlab.mixins import ( + CreateMixin, + DeleteMixin, + ListMixin, + SaveMixin, + UpdateMethod, + UpdateMixin, +) from gitlab.types import RequiredOptional __all__ = [ @@ -16,6 +23,7 @@ class ProjectRegistryRepositoryProtectionRuleManager( ListMixin[ProjectRegistryRepositoryProtectionRule], CreateMixin[ProjectRegistryRepositoryProtectionRule], UpdateMixin[ProjectRegistryRepositoryProtectionRule], + DeleteMixin[ProjectRegistryRepositoryProtectionRule], ): _path = "/projects/{project_id}/registry/protection/repository/rules" _obj_cls = ProjectRegistryRepositoryProtectionRule diff --git a/tests/functional/api/test_registry.py b/tests/functional/api/test_registry.py index 91fdceacc..d234128ca 100644 --- a/tests/functional/api/test_registry.py +++ b/tests/functional/api/test_registry.py @@ -26,3 +26,8 @@ def test_project_protected_registry(project: Project): protected_registry.minimum_access_level_for_push = "owner" protected_registry.save() assert protected_registry.minimum_access_level_for_push == "owner" + + protected_registry.delete() + + rules = project.registry_protection_repository_rules.list() + assert rules == [] diff --git a/tests/unit/objects/test_registry_protection_rules.py b/tests/unit/objects/test_registry_protection_rules.py index 3078278f5..3e9db414a 100644 --- a/tests/unit/objects/test_registry_protection_rules.py +++ b/tests/unit/objects/test_registry_protection_rules.py @@ -58,6 +58,17 @@ def resp_update_protected_registry(): yield rsps +@pytest.fixture +def resp_delete_protected_registry(): + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.DELETE, + url="http://localhost/api/v4/projects/1/registry/protection/repository/rules/1", + status=204, + ) + yield rsps + + def test_list_project_protected_registries(project, resp_list_protected_registries): protected_registry = project.registry_protection_repository_rules.list()[0] assert isinstance(protected_registry, ProjectRegistryRepositoryProtectionRule) @@ -80,3 +91,7 @@ def test_update_project_protected_registry(project, resp_update_protected_regist 1, {"repository_path_pattern": "abc*"} ) assert updated["repository_path_pattern"] == "abc*" + + +def test_delete_project_protected_registry(project, resp_delete_protected_registry): + project.registry_protection_repository_rules.delete(1) From 8719985bdb88057cd8dbc2bd27f6a1161cdac6fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:37:59 +0000 Subject: [PATCH 22/23] chore(deps): update github artifact actions --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eec3e1599..0f2af115e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -120,7 +120,7 @@ jobs: pip install -r requirements-test.txt - name: Build package run: python -m build -o dist/ - - uses: actions/upload-artifact@v5.0.0 + - uses: actions/upload-artifact@v6.0.0 with: name: dist path: dist @@ -134,7 +134,7 @@ jobs: uses: actions/setup-python@v6.1.0 with: python-version: '3.14' - - uses: actions/download-artifact@v6.0.0 + - uses: actions/download-artifact@v7.0.0 with: name: dist path: dist From f49175d5bcb3634fd9c707446e5fc879e911b7fb Mon Sep 17 00:00:00 2001 From: semantic-release Date: Sun, 28 Dec 2025 01:26:37 +0000 Subject: [PATCH 23/23] chore: release v7.1.0 --- CHANGELOG.md | 23 +++++++++++++++++++++++ gitlab/_version.py | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de7c0d113..ef85c5019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,29 @@ All versions below are listed in reverse chronological order. +## v7.1.0 (2025-12-28) + +### Bug Fixes + +- **utils**: Prevent negative sleep time in rate limit retry + ([`4221195`](https://github.com/python-gitlab/python-gitlab/commit/422119576287de30e1b70411c7ab0bbe39231af7)) + +### Continuous Integration + +- **release**: Use the correct token for publish to GitHub + ([`614a74c`](https://github.com/python-gitlab/python-gitlab/commit/614a74c00f027f70b8e48a6b2a2ddcd3f823bffa)) + +### Features + +- **registry-protection**: Add support for registry protection rule deletion + ([`9dd62c3`](https://github.com/python-gitlab/python-gitlab/commit/9dd62c3f5bcf3e082c2733bd4edc068f993c22ec)) + +### Testing + +- **functional**: Update to GitLab 18.6 and resolve issues found + ([`c7c139b`](https://github.com/python-gitlab/python-gitlab/commit/c7c139b9e7823ec1800a819233aee469355ee8d1)) + + ## v7.0.0 (2025-10-29) ### Features diff --git a/gitlab/_version.py b/gitlab/_version.py index e7817062d..8305f3a6c 100644 --- a/gitlab/_version.py +++ b/gitlab/_version.py @@ -3,4 +3,4 @@ __email__ = "gauvainpocentek@gmail.com" __license__ = "LGPL3" __title__ = "python-gitlab" -__version__ = "7.0.0" +__version__ = "7.1.0"