From 72c7d266275a472073d2829a25d730ada9436ab3 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Wed, 25 Jun 2025 18:16:30 +0530 Subject: [PATCH 01/13] Add missing wheel builds on release CI Signed-off-by: Ayan Sinha Mahapatra --- .github/workflows/pypi-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index 7f81361..d41fbf2 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -34,7 +34,7 @@ jobs: run: python -m pip install --user --upgrade build twine pkginfo - name: Build a binary wheel and a source tarball - run: python -m build --sdist --outdir dist/ + run: python -m build --wheel --sdist --outdir dist/ - name: Validate wheel and sdis for Pypi run: python -m twine check dist/* From 265e6121c9bf0eb331e8465a08efb2cc9a169500 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Tue, 21 Oct 2025 20:07:02 +0530 Subject: [PATCH 02/13] Drop python3.9 support and add python 3.14 Signed-off-by: Ayan Sinha Mahapatra --- azure-pipelines.yml | 14 +++++++------- etc/scripts/utils_thirdparty.py | 6 +++--- setup.cfg | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4d347b7..7230c41 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,7 +19,7 @@ jobs: parameters: job_name: ubuntu22_cpython image_name: ubuntu-22.04 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -27,7 +27,7 @@ jobs: parameters: job_name: ubuntu24_cpython image_name: ubuntu-24.04 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -35,7 +35,7 @@ jobs: parameters: job_name: macos13_cpython image_name: macOS-13 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -43,7 +43,7 @@ jobs: parameters: job_name: macos14_cpython image_name: macOS-14 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -51,7 +51,7 @@ jobs: parameters: job_name: macos15_cpython image_name: macOS-15 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -59,7 +59,7 @@ jobs: parameters: job_name: win2022_cpython image_name: windows-2022 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv\Scripts\pytest -n 2 -vvs @@ -67,6 +67,6 @@ jobs: parameters: job_name: win2025_cpython image_name: windows-2025 - python_versions: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] test_suites: all: venv\Scripts\pytest -n 2 -vvs diff --git a/etc/scripts/utils_thirdparty.py b/etc/scripts/utils_thirdparty.py index 6f812f0..bc68ac7 100644 --- a/etc/scripts/utils_thirdparty.py +++ b/etc/scripts/utils_thirdparty.py @@ -115,14 +115,14 @@ TRACE_ULTRA_DEEP = False # Supported environments -PYTHON_VERSIONS = "39", "310", "311", "312", "313" +PYTHON_VERSIONS = "310", "311", "312", "313", "314" PYTHON_DOT_VERSIONS_BY_VER = { - "39": "3.9", "310": "3.10", "311": "3.11", "312": "3.12", "313": "3.13", + "314": "3.14", } @@ -134,11 +134,11 @@ def get_python_dot_version(version): ABIS_BY_PYTHON_VERSION = { - "39": ["cp39", "cp39m", "abi3"], "310": ["cp310", "cp310m", "abi3"], "311": ["cp311", "cp311m", "abi3"], "312": ["cp312", "cp312m", "abi3"], "313": ["cp313", "cp313m", "abi3"], + "314": ["cp314", "cp314m", "abi3"], } PLATFORMS_BY_OS = { diff --git a/setup.cfg b/setup.cfg index 69f850c..fa111c2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,7 @@ license_files = README.rst [options] -python_requires = >=3.9 +python_requires = >=3.10 package_dir = =src From fc4fe3addd98f64684d146926d7f318a9fd469c4 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Wed, 22 Oct 2025 18:44:23 +0530 Subject: [PATCH 03/13] Support trusted-publishing for package releases Signed-off-by: Ayan Sinha Mahapatra --- .github/workflows/pypi-release.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index d41fbf2..7da0a40 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -71,6 +71,9 @@ jobs: needs: - create-gh-release runs-on: ubuntu-24.04 + environment: pypi-publish + permissions: + id-token: write steps: - name: Download built archives @@ -81,6 +84,4 @@ jobs: - name: Publish to PyPI if: startsWith(github.ref, 'refs/tags') - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_API_TOKEN }} + uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file From e81ff6d37248d93689f9947581a7a2148c96785d Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Fri, 24 Oct 2025 16:43:15 +0530 Subject: [PATCH 04/13] Update RTD build python version Signed-off-by: Ayan Sinha Mahapatra --- .readthedocs.yml | 2 +- pyproject.toml | 2 +- setup.cfg | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 683f3a8..27c1595 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -9,7 +9,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11" + python: "3.13" # Build PDF & ePub formats: diff --git a/pyproject.toml b/pyproject.toml index d79574e..f106e69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools >= 50", "wheel", "setuptools_scm[toml] >= 6"] +requires = ["setuptools >= 50", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] diff --git a/setup.cfg b/setup.cfg index fa111c2..a0f2985 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,9 +39,6 @@ packages = find: include_package_data = true zip_safe = false -setup_requires = setuptools_scm[toml] >= 4 - - install_requires = From cf04877d745eef6a279323dabe8a937a509926ef Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Mon, 15 Dec 2025 16:17:29 +0530 Subject: [PATCH 05/13] Deprecate MacOS-13 CI runners Reference: https://github.com/actions/runner-images/issues/13046 Signed-off-by: Ayan Sinha Mahapatra --- azure-pipelines.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7230c41..3b17abc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -31,14 +31,6 @@ jobs: test_suites: all: venv/bin/pytest -n 2 -vvs - - template: etc/ci/azure-posix.yml - parameters: - job_name: macos13_cpython - image_name: macOS-13 - python_versions: ['3.10', '3.11', '3.12', '3.13', '3.14'] - test_suites: - all: venv/bin/pytest -n 2 -vvs - - template: etc/ci/azure-posix.yml parameters: job_name: macos14_cpython From 8682dbfd851999eeff069b657dd9e5f800377cee Mon Sep 17 00:00:00 2001 From: Chin Yeung Li Date: Mon, 23 Feb 2026 14:32:43 +0800 Subject: [PATCH 06/13] Typo and spacing corrections. Signed-off-by: Chin Yeung Li --- etc/scripts/utils_requirements.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/scripts/utils_requirements.py b/etc/scripts/utils_requirements.py index b9b2c0e..f377578 100644 --- a/etc/scripts/utils_requirements.py +++ b/etc/scripts/utils_requirements.py @@ -15,7 +15,7 @@ """ Utilities to manage requirements files and call pip. NOTE: this should use ONLY the standard library and not import anything else -because this is used for boostrapping with no requirements installed. +because this is used for bootstrapping with no requirements installed. """ @@ -31,7 +31,7 @@ def load_requirements(requirements_file="requirements.txt", with_unpinned=False) def get_required_name_versions(requirement_lines, with_unpinned=False): """ - Yield required (name, version) tuples given a`requirement_lines` iterable of + Yield required (name, version) tuples given a `requirement_lines` iterable of requirement text lines. Only accept requirements pinned to an exact version. """ @@ -47,7 +47,7 @@ def get_required_name_versions(requirement_lines, with_unpinned=False): def get_required_name_version(requirement, with_unpinned=False): """ - Return a (name, version) tuple given a`requirement` specifier string. + Return a (name, version) tuple given a `requirement` specifier string. Requirement version must be pinned. If ``with_unpinned`` is True, unpinned requirements are accepted and only the name portion is returned. From 77bd586aaedc0a475d8bfd44bcdda6eaadee301d Mon Sep 17 00:00:00 2001 From: Chin Yeung Li Date: Mon, 16 Mar 2026 14:29:39 +0800 Subject: [PATCH 07/13] Fixed licensing dedup issue #67 Signed-off-by: Chin Yeung Li --- src/license_expression/__init__.py | 33 ++++++++++++++++++++++++------ tests/test_license_expression.py | 14 +++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/license_expression/__init__.py b/src/license_expression/__init__.py index dc1ab31..8a5a333 100644 --- a/src/license_expression/__init__.py +++ b/src/license_expression/__init__.py @@ -750,12 +750,33 @@ def dedup(self, expression): ), ): relation = exp.__class__.__name__ - deduped = combine_expressions( - expressions, - relation=relation, - unique=True, - licensing=self, - ) + # Flatten nested 'AND' expressions only (not OR) to maintain precedence + # Example: (A AND B) AND (C OR D) will become A AND B AND (C OR D) + # The OR will not be flattened to avoid changing the expression logic + if relation == "AND": + flattened = [] + for e in expressions: + if isinstance(e, self.AND): + # Flatten nested ANDs by extending with their args + flattened.extend(e.args) + else: + flattened.append(e) + expressions = flattened + + unique_expressions = [] + for e in expressions: + if e not in unique_expressions: + unique_expressions.append(e) + + if len(unique_expressions) == 1: + deduped = unique_expressions[0] + else: + deduped = combine_expressions( + expressions, + relation=relation, + unique=True, + licensing=self, + ) else: raise ExpressionError(f"Unknown expression type: {expression!r}") return deduped diff --git a/tests/test_license_expression.py b/tests/test_license_expression.py index 193fafd..3e0d547 100644 --- a/tests/test_license_expression.py +++ b/tests/test_license_expression.py @@ -693,6 +693,20 @@ def test_dedup_expressions_can_be_simplified_2(self): expected = l.parse("(mit AND (mit OR bsd-new)) OR mit") assert result == expected + def test_dedup_expressions_can_be_simplified_3(self): + l = Licensing() + exp = "(gpl AND mit) AND mit AND (gpl OR mit)" + result = l.dedup(exp) + expected = l.parse("gpl AND mit AND (gpl OR mit)") + assert result == expected + + def test_dedup_expressions_can_be_simplified_4(self): + l = Licensing() + exp = "(gpl AND mit) AND (mit AND gpl) AND (gpl OR mit)" + result = l.dedup(exp) + expected = l.parse("gpl AND mit AND (gpl OR mit)") + assert result == expected + def test_dedup_expressions_multiple_occurrences(self): l = Licensing() exp = " GPL-2.0 or (mit and LGPL-2.1) or bsd Or GPL-2.0 or (mit and LGPL-2.1)" From ca2a42a18c9507fc94d766a45d6916b71be18d14 Mon Sep 17 00:00:00 2001 From: Chin Yeung Li Date: Tue, 17 Mar 2026 10:42:52 +0800 Subject: [PATCH 08/13] Added more logically equivalent tests #67 Signed-off-by: Chin Yeung Li --- tests/test_license_expression.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/test_license_expression.py b/tests/test_license_expression.py index 3e0d547..ec4b900 100644 --- a/tests/test_license_expression.py +++ b/tests/test_license_expression.py @@ -707,6 +707,34 @@ def test_dedup_expressions_can_be_simplified_4(self): expected = l.parse("gpl AND mit AND (gpl OR mit)") assert result == expected + def test_dedup_expressions_logically_equivalent_1(self): + l = Licensing() + exp = "(gpl OR mit) AND (mit OR gpl)" + result = l.dedup(exp) + expected = l.parse("gpl OR mit") + assert result == expected + + def test_dedup_expressions_logically_equivalent_2(self): + l = Licensing() + exp = "(gpl AND mit) AND (mit AND gpl)" + result = l.dedup(exp) + expected = l.parse("gpl AND mit") + assert result == expected + + def test_dedup_expressions_logically_equivalent_3(self): + l = Licensing() + exp = "(gpl OR mit) OR (mit OR gpl)" + result = l.dedup(exp) + expected = l.parse("gpl OR mit") + assert result == expected + + def test_dedup_expressions_logically_equivalent_4(self): + l = Licensing() + exp = "(gpl AND mit) OR (mit AND gpl)" + result = l.dedup(exp) + expected = l.parse("gpl AND mit") + assert result == expected + def test_dedup_expressions_multiple_occurrences(self): l = Licensing() exp = " GPL-2.0 or (mit and LGPL-2.1) or bsd Or GPL-2.0 or (mit and LGPL-2.1)" From 33840a6daeb28d342b1b439673b8472465b0c31f Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Thu, 16 Apr 2026 17:58:33 +0530 Subject: [PATCH 09/13] Replace versions with commit hashes in actions Signed-off-by: Ayan Sinha Mahapatra --- .github/workflows/docs-ci.yml | 4 ++-- .github/workflows/pypi-release.yml | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docs-ci.yml b/.github/workflows/docs-ci.yml index 8d8aa55..2c01c2c 100644 --- a/.github/workflows/docs-ci.yml +++ b/.github/workflows/docs-ci.yml @@ -13,10 +13,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index 7da0a40..87f2c49 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -24,9 +24,9 @@ jobs: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 with: python-version: 3.12 @@ -40,7 +40,7 @@ jobs: run: python -m twine check dist/* - name: Upload built archives - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f with: name: pypi_archives path: dist/* @@ -54,13 +54,13 @@ jobs: steps: - name: Download built archives - uses: actions/download-artifact@v4 + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 with: name: pypi_archives path: dist - name: Create GH release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda with: draft: true files: dist/* @@ -77,11 +77,11 @@ jobs: steps: - name: Download built archives - uses: actions/download-artifact@v4 + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 with: name: pypi_archives path: dist - name: Publish to PyPI if: startsWith(github.ref, 'refs/tags') - uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file + uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b \ No newline at end of file From c3b24eaca4bdb6e13e6b573fb5f0d56af56586f4 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Thu, 16 Apr 2026 21:41:23 +0530 Subject: [PATCH 10/13] Enable zizmor in github actions Also add fixes to actions from zizmor runs. Signed-off-by: Ayan Sinha Mahapatra --- .github/workflows/docs-ci.yml | 3 +++ .github/workflows/pypi-release.yml | 3 +++ .github/workflows/zizmor.yml | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 .github/workflows/zizmor.yml diff --git a/.github/workflows/docs-ci.yml b/.github/workflows/docs-ci.yml index 2c01c2c..fbc267f 100644 --- a/.github/workflows/docs-ci.yml +++ b/.github/workflows/docs-ci.yml @@ -2,6 +2,7 @@ name: CI Documentation on: [push, pull_request] +permissions: {} jobs: build: runs-on: ubuntu-24.04 @@ -14,6 +15,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index 87f2c49..0a9bb54 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -18,6 +18,7 @@ on: tags: - "v*.*.*" +permissions: {} jobs: build-pypi-distribs: name: Build and publish library to PyPI @@ -25,6 +26,8 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 with: diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml new file mode 100644 index 0000000..aa8259d --- /dev/null +++ b/.github/workflows/zizmor.yml @@ -0,0 +1,24 @@ +name: GitHub Actions Security Analysis with zizmor 🌈 + +on: + push: + branches: ["main"] + pull_request: + branches: ["**"] + +permissions: {} + +jobs: + zizmor: + name: Run zizmor 🌈 + runs-on: ubuntu-latest + permissions: + security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files. + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Run zizmor 🌈 + uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3 From 819554fc9cffe712dd396d94a96d21bb69b1d171 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Fri, 15 May 2026 13:42:58 +0530 Subject: [PATCH 11/13] Add tests and simplify comments Signed-off-by: Ayan Sinha Mahapatra --- src/license_expression/__init__.py | 8 +++++--- tests/test_license_expression.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/license_expression/__init__.py b/src/license_expression/__init__.py index 8a5a333..891a81e 100644 --- a/src/license_expression/__init__.py +++ b/src/license_expression/__init__.py @@ -716,8 +716,12 @@ def dedup(self, expression): The deduplication: + - Performs the deduplication recusively for all sub-expressions. + - Does not sort the licenses of sub-expression in an expression. They - stay in the same order as in the original expression. + stay in the same order as in the original expression. In case of two + similar expressions joined by AND, sorted differently, the sort order + of the first expression is retained. - Choices (as in "MIT or GPL") are kept as-is and not treated as simplifiable. This avoids droping important choice options in complex @@ -751,8 +755,6 @@ def dedup(self, expression): ): relation = exp.__class__.__name__ # Flatten nested 'AND' expressions only (not OR) to maintain precedence - # Example: (A AND B) AND (C OR D) will become A AND B AND (C OR D) - # The OR will not be flattened to avoid changing the expression logic if relation == "AND": flattened = [] for e in expressions: diff --git a/tests/test_license_expression.py b/tests/test_license_expression.py index ec4b900..1e4b060 100644 --- a/tests/test_license_expression.py +++ b/tests/test_license_expression.py @@ -735,6 +735,20 @@ def test_dedup_expressions_logically_equivalent_4(self): expected = l.parse("gpl AND mit") assert result == expected + def test_dedup_expressions_logically_equivalent_5(self): + l = Licensing() + exp = "(gpl OR mit) AND (mit OR gpl) AND ((gpl OR mit) AND (mit OR gpl))" + result = l.dedup(exp) + expected = l.parse("gpl OR mit") + assert result == expected + + def test_dedup_expressions_logically_equivalent_6(self): + l = Licensing() + exp = "(gpl OR mit) AND (mit OR gpl) AND ((gpl OR mit) OR (mit OR gpl))" + result = l.dedup(exp) + expected = l.parse("gpl OR mit") + assert result == expected + def test_dedup_expressions_multiple_occurrences(self): l = Licensing() exp = " GPL-2.0 or (mit and LGPL-2.1) or bsd Or GPL-2.0 or (mit and LGPL-2.1)" From 9f886b9218c6265aa02d4fa800cda1fd1c05ac65 Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Fri, 15 May 2026 13:52:22 +0530 Subject: [PATCH 12/13] Update azure pipelines images and python versions Signed-off-by: Ayan Sinha Mahapatra --- azure-pipelines.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9b8df60..1584077 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ jobs: parameters: job_name: run_code_checks image_name: ubuntu-24.04 - python_versions: ['3.13'] + python_versions: ['3.14'] test_suites: all: make check @@ -17,7 +17,7 @@ jobs: parameters: job_name: ubuntu22_cpython image_name: ubuntu-22.04 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -25,23 +25,23 @@ jobs: parameters: job_name: ubuntu24_cpython image_name: ubuntu-24.04 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv/bin/pytest -n 2 -vvs - template: etc/ci/azure-posix.yml parameters: - job_name: macos13_cpython - image_name: macOS-13 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + job_name: macos14_cpython + image_name: macos-14 + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv/bin/pytest -n 2 -vvs - template: etc/ci/azure-posix.yml parameters: - job_name: macos14_cpython - image_name: macOS-14 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + job_name: macos15_cpython + image_name: macos-15 + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv/bin/pytest -n 2 -vvs @@ -49,7 +49,7 @@ jobs: parameters: job_name: win2025_cpython image_name: windows-2025 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv\Scripts\pytest -n 2 -vvs @@ -57,6 +57,6 @@ jobs: parameters: job_name: win2022_cpython image_name: windows-2022 - python_versions: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python_versions: ["3.10", "3.11", "3.12", "3.13", "3.14"] test_suites: all: venv\Scripts\pytest -n 2 -vvs From abf9ebb5281b8f62718d298aeddfdd78a7c3a68d Mon Sep 17 00:00:00 2001 From: Ayan Sinha Mahapatra Date: Fri, 15 May 2026 13:53:10 +0530 Subject: [PATCH 13/13] Drop support for python 3.9 Signed-off-by: Ayan Sinha Mahapatra --- README.rst | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 4174607..c312853 100644 --- a/README.rst +++ b/README.rst @@ -7,7 +7,7 @@ simplify and normalize license expressions (such as SPDX license expressions) using boolean logic. - License: Apache-2.0 -- Python: 3.9+ +- Python: 3.10+ - Homepage: https://github.com/aboutcode-org/license-expression/ - Install: `pip install license-expression` also available in most Linux distro. diff --git a/setup.cfg b/setup.cfg index af335ad..f7b1ca8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,7 +40,7 @@ license_files = README.rst [options] -python_requires = >=3.9 +python_requires = >=3.10 package_dir = =src