Skip to content

Support Python 3.14 #166

Support Python 3.14

Support Python 3.14 #166

Workflow file for this run

name: CI
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Cancel a running PR check when new commits are pushed, so a wedged run does not
# keep burning runner hours after it has been superseded. Pushes to main still run
# to completion.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
run-tests:
runs-on: ${{ matrix.os }}
continue-on-error: false
# Backstop for a wedged run: the fork/TensorFlow deadlock hangs in native code
# holding the GIL, which pytest-timeout cannot interrupt in either method, so the
# job-level limit is what stops it. Slowest healthy job is ~32 min; 50 leaves
# headroom while capping a hang's cost.
timeout-minutes: 50
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-24.04,
ubuntu-24.04-arm,
macos-15,
macos-15-intel,
windows-2025,
]
python-version: ["3.11", "3.12", "3.13", "3.14"]
exclude:
- os: macos-15-intel
python-version: "3.13" # no TF support
- os: macos-15-intel
python-version: "3.14" # no TF / torch x86 macOS wheels
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 2
- name: Install audio system libs (Linux)
if: startsWith(matrix.os, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y libsndfile1
- name: Install audio system libs (macOS)
if: startsWith(matrix.os, 'macos')
run: |
brew update
brew install libsndfile
- name: Install audio system libs (Windows)
if: startsWith(matrix.os, 'windows')
run: |
choco install libsndfile
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install uv --upgrade
python -m uv pip install --system .[tests]
- name: Run tests py311
if: matrix.python-version == '3.11'
run: |
python -m tox -e py311
- name: Run tests py312
if: matrix.python-version == '3.12'
run: |
python -m tox -e py312
- name: Run tests py313
if: matrix.python-version == '3.13'
run: |
python -m tox -e py313
# TensorFlow has no Python 3.14 wheels yet (issue #55), so 3.14 installs
# without it and only the TensorFlow-free surface (acoustic 3.0 via onnx)
# is exercised here.
- name: Run tests py314
if: matrix.python-version == '3.14'
run: |
python -m tox -e py314
- name: Run repro tests
if: matrix.python-version == '3.12' && matrix.os != 'macos-15-intel'
run: |
python -m tox -e py312-repro
- name: Run coverage tests
if: matrix.os == 'ubuntu-24.04' && matrix.python-version == '3.12'
run: |
python -m tox -e py312-coverage
- name: Upload results to Codecov
if: matrix.os == 'ubuntu-24.04' && matrix.python-version == '3.12'
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: birdnet-team/birdnet
- name: Extract log path
id: extract-log-path
shell: pwsh
run: |
$logPaths = @()
if (Test-Path output.log) {
$output = Get-Content output.log -Raw
$pattern = '(?<path>(?:[A-Za-z]:\\|/)[^\r\n]*?\.log)'
$logPaths = [regex]::Matches($output, $pattern) |
ForEach-Object { $_.Groups['path'].Value } |
Sort-Object -Unique |
Where-Object { Test-Path $_ -PathType Leaf }
}
if ($logPaths.Count -gt 0) {
"log_paths<<EOF" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
$logPaths | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
"EOF" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
}
else {
"log_paths=" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
}
- name: Upload log file
if: failure() && steps.extract-log-path.outputs.log_paths != ''
uses: actions/upload-artifact@v7
with:
name: birdnet-log
path: ${{ steps.extract-log-path.outputs.log_paths }}