feat: Add Python 3.14 freethreaded support #850
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Json2xml | |
| on: | |
| push: | |
| branches: [main, master] | |
| paths-ignore: | |
| - 'docs/**' | |
| - '*.md' | |
| - '*.rst' | |
| pull_request: | |
| paths-ignore: | |
| - 'docs/**' | |
| - '*.md' | |
| - '*.rst' | |
| permissions: | |
| contents: read | |
| checks: write # For test results | |
| pull-requests: write # For codecov | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| test: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: [pypy-3.10, pypy-3.11, '3.10', '3.11', '3.12', '3.13', '3.14.0'] | |
| os: [ | |
| ubuntu-22.04, | |
| windows-2022, | |
| macos-14, | |
| ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/[email protected] | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| allow-prereleases: true | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: | | |
| requirements*.txt | |
| requirements-dev.in | |
| pyproject.toml | |
| - name: Install dependencies | |
| run: | | |
| uv pip install --system -e . | |
| uv pip install --system pytest pytest-xdist pytest-cov | |
| - name: Create coverage directory | |
| run: mkdir -p coverage/reports | |
| - name: Run tests | |
| run: | | |
| pytest --cov=json2xml --cov-report=xml:coverage/reports/coverage.xml --cov-report=term -xvs tests -n auto | |
| env: | |
| PYTHONPATH: ${{ github.workspace }} | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v5 | |
| if: success() | |
| with: | |
| directory: ./coverage/reports/ | |
| env_vars: OS,PYTHON | |
| fail_ci_if_error: false # Don't fail CI if codecov upload fails | |
| files: ./coverage/reports/coverage.xml | |
| flags: unittests | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| name: codecov-umbrella | |
| verbose: true | |
| env: | |
| OS: ${{ matrix.os }} | |
| PYTHON: ${{ matrix.python-version }} | |
| lint: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Set up Python 3.12 | |
| uses: actions/[email protected] | |
| with: | |
| python-version: '3.12' | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: | | |
| requirements*.txt | |
| requirements-dev.in | |
| pyproject.toml | |
| - name: Install dependencies | |
| run: | | |
| uv pip install --system -e . | |
| uv pip install --system ruff>=0.3.0 | |
| - name: Run ruff | |
| run: ruff check json2xml tests | |
| typecheck: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Set up Python 3.12 | |
| uses: actions/[email protected] | |
| with: | |
| python-version: '3.12' | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: | | |
| requirements*.txt | |
| requirements-dev.in | |
| pyproject.toml | |
| - name: Install dependencies | |
| run: | | |
| uv pip install --system -e . | |
| uv pip install --system mypy>=1.0.0 types-setuptools | |
| - name: Run mypy | |
| run: mypy json2xml tests | |
| test-freethreaded: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-22.04 | |
| python-version: '3.14.0' | |
| arch: x64 | |
| platform: linux | |
| - os: windows-2022 | |
| python-version: '3.14.0' | |
| arch: x64 | |
| platform: win32 | |
| - os: macos-14 | |
| python-version: '3.14.0' | |
| arch: x64 | |
| platform: darwin | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Download and setup Python ${{ matrix.python-version }} (freethreaded) | |
| run: | | |
| if [ "${{ matrix.platform }}" = "linux" ]; then | |
| wget -O python.tar.gz "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-${{ matrix.arch }}-freethreaded.tar.gz" | |
| tar -xzf python.tar.gz | |
| echo "$PWD/python-3.14.0-linux-22.04-${{ matrix.arch }}-freethreaded/bin" >> $GITHUB_PATH | |
| elif [ "${{ matrix.platform }}" = "win32" ]; then | |
| curl -L -o python.zip "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-${{ matrix.arch }}-freethreaded.zip" | |
| Expand-Archive python.zip -DestinationPath . | |
| echo "$PWD/python-3.14.0-win32-${{ matrix.arch }}-freethreaded" >> $env:GITHUB_PATH | |
| elif [ "${{ matrix.platform }}" = "darwin" ]; then | |
| curl -L -o python.tar.gz "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-${{ matrix.arch }}-freethreaded.tar.gz" | |
| tar -xzf python.tar.gz | |
| echo "$PWD/python-3.14.0-darwin-${{ matrix.arch }}-freethreaded/bin" >> $GITHUB_PATH | |
| fi | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: | | |
| requirements*.txt | |
| requirements-dev.in | |
| pyproject.toml | |
| - name: Install dependencies | |
| run: | | |
| uv pip install --system -e . | |
| uv pip install --system pytest pytest-xdist pytest-cov | |
| - name: Create coverage directory | |
| run: mkdir -p coverage/reports | |
| - name: Run tests with freethreaded Python | |
| run: | | |
| pytest --cov=json2xml --cov-report=xml:coverage/reports/coverage.xml --cov-report=term -xvs tests -n auto | |
| env: | |
| PYTHONPATH: ${{ github.workspace }} | |
| PYTHON_FREETHREADED: 1 | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v5 | |
| if: success() | |
| with: | |
| directory: ./coverage/reports/ | |
| env_vars: OS,PYTHON | |
| fail_ci_if_error: false # Don't fail CI if codecov upload fails | |
| files: ./coverage/reports/coverage.xml | |
| flags: freethreaded | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| name: codecov-freethreaded | |
| verbose: true | |
| env: | |
| OS: ${{ matrix.os }} | |
| PYTHON: ${{ matrix.python-version }}-freethreaded | |