Skip to content

feat: Add Python 3.14 freethreaded support #852

feat: Add Python 3.14 freethreaded support

feat: Add Python 3.14 freethreaded support #852

Workflow file for this run

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 -e .
uv pip install 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 -e .
uv pip install 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 -e .
uv pip install 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'
- os: windows-2022
python-version: '3.14.0'
- os: macos-14
python-version: '3.14.0'
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }} (freethreaded)
uses: actions/[email protected]
with:
python-version: '3.14t'
allow-prereleases: true
- name: Verify freethreaded Python
shell: bash
run: |
python -c "import sys; print(f'Python {sys.version}'); print(f'GIL enabled: {sys._is_gil_enabled()}' if hasattr(sys, '_is_gil_enabled') else 'GIL check not available')"
- 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 -e .
uv pip install pytest pytest-xdist pytest-cov
- name: Create coverage directory
shell: bash
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
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