Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
8de74a6
Add modernisation design spec
jeandet May 8, 2026
7eeced9
Add PR 1 plan: foundation (Python ≥3.10 + UV + dependency-groups)
jeandet May 8, 2026
3b787e1
Bump Python floor to 3.10 and declare dependency-groups
jeandet May 8, 2026
81c33ef
Add uv.lock for reproducible installs
jeandet May 8, 2026
3fdeb44
Switch CI to uv-based dependency install
jeandet May 8, 2026
b82836f
Switch Read the Docs to uv-based build
jeandet May 8, 2026
ce8c9aa
Drop requirements*.txt, tox.ini, setup.cfg in favor of uv groups
jeandet May 8, 2026
d7d538a
Switch Makefile to uv-based commands
jeandet May 8, 2026
3392b59
Update CLAUDE.md to uv-based dev commands
jeandet May 8, 2026
ccba88c
Update CONTRIBUTING.rst to uv-based dev workflow
jeandet May 8, 2026
30c2233
Exclude .venv from flake8 in CI workflows
jeandet May 8, 2026
42023a0
Update CLAUDE.md project-overview Python floor to 3.10
jeandet May 8, 2026
0ef85dc
Sync PRs.yml with tests.yml and scope flake8 to speasy tests
jeandet May 8, 2026
3ee7798
Install RTD docs into RTD's expected venv path
jeandet May 8, 2026
245de0d
Configure pytest markers and fold pytest.ini into pyproject.toml
jeandet May 8, 2026
7c78f1a
Add devtools script to apply pytest markers mechanically
jeandet May 8, 2026
5e124cd
Apply unit/contract markers to existing test files
jeandet May 8, 2026
4998e25
Add tests/test_e2e_smoke.py with 5 end-to-end happy-path tests
jeandet May 8, 2026
0c0ca8b
Rename tests.yml to unit.yml; consolidate PRs.yml triggers
jeandet May 8, 2026
015524f
Add contract.yml: daily real-server tests for upstream-drift detection
jeandet May 8, 2026
3333d91
Add e2e.yml: weekly full-matrix smoke tests
jeandet May 8, 2026
fd117c1
Add lint.yml: single-runner flake8 step extracted from tests.yml
jeandet May 8, 2026
9ba94e0
Fix e2e smoke generic_archive test: use correct flat_inventories modu…
jeandet May 8, 2026
75e675f
Address code review for PR 2
jeandet May 8, 2026
a5c3f4f
Address PR 2 review and fix doctest CI failure
jeandet May 9, 2026
41b5f59
Install system pandoc/texlive on the doctest runner
jeandet May 9, 2026
749bdf2
Restore env overrides for doctest step
jeandet May 9, 2026
8b9d7ea
Update doctest expectation for newer pandas DataFrame repr
jeandet May 9, 2026
b80e8f0
Add pytest-recording, pytest-httpserver, pytest-sugar to dev group
jeandet May 9, 2026
1005063
Rewrite tests/conftest.py with shared fixtures for cassette tier
jeandet May 9, 2026
31e5d41
Reserve tests/cassettes/ for PR 4-9 cassette migration
jeandet May 9, 2026
39cd032
Add tests/test_infra_smoke.py: 5 unit tests for the new fixtures
jeandet May 9, 2026
ef825ba
Document cassette recording workflow in CONTRIBUTING.rst
jeandet May 9, 2026
1142f02
Address PR 3 code review
jeandet May 9, 2026
ea2bbec
Fix vcr_config and apply_test_markers idempotency
jeandet May 10, 2026
1b14837
Add cassette storage tooling: HTTP-fetch hook, publish script, manifest
jeandet May 10, 2026
87482bf
Add vcrpy compatibility shims in conftest and Response.url
jeandet May 11, 2026
e3e66cc
Scrub Set-Cookie and AMDA auth.php tokens from response side
jeandet May 11, 2026
7c90dbb
Add one-off cassette scrubber for response-side leaks
jeandet May 11, 2026
ea15685
Drop HTTP Basic auth from cassette-fetch path
jeandet May 11, 2026
b22e407
Make numpy import in conftest lazy
jeandet May 12, 2026
28656c9
Make requests import in conftest lazy
jeandet May 12, 2026
c5aedaa
wasm_tests: pass --no-cassette-fetch to pytest
jeandet May 13, 2026
cd6efd1
Promote AMDA tests to unit tier with vcr decorator (no cassettes yet)
jeandet May 10, 2026
bc09f97
Add tests/test_amda_contract.py: 5 daily-cron drift probes for AMDA
jeandet May 10, 2026
0bb8a1f
Add tests/test_amda_failures.py: 1 failure-path unit test for AMDA
jeandet May 10, 2026
41eecf6
Add AMDA cassette manifest (22 cassettes hosted on sciqlop.lpp)
jeandet May 10, 2026
ac14801
Re-record AMDA test_load_obs_datatree with clean disk cache
jeandet May 11, 2026
2be1dae
Update AMDA cassette hashes after response-side scrub
jeandet May 11, 2026
dc0debc
Re-record AMDA test_load_obs_datatree with fresh cache and index
jeandet May 12, 2026
342ca29
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
6f84c04
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
ab0088c
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
c1cba89
Promote CDA tests to unit tier with vcr decorator (no cassettes yet)
jeandet May 10, 2026
b54a2a6
Trim test_cdaweb to fit unit-tier cassette budget
jeandet May 10, 2026
f4e043d
Add CDA cassette manifest entries (18 cassettes hosted on sciqlop.lpp)
jeandet May 10, 2026
0b244da
Add tests/test_cdaweb_contract.py: drift probes for CDAWeb
jeandet May 10, 2026
5d5a7fa
Add tests/test_cdaweb_failures.py: failure-path unit test for CDA
jeandet May 10, 2026
192958b
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
839c045
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
1c09b9d
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
e3d565f
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
1adce90
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
0ac6353
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
f341485
Promote CSA tests to unit tier with vcr decorator (no cassettes yet)
jeandet May 11, 2026
3a6d563
Add tests/test_csa_contract.py: drift probes for CSA
jeandet May 11, 2026
93151e5
Add CSA cassette manifest entry
jeandet May 11, 2026
1fa7ff9
Re-run CI after AMDA cassette upload
jeandet May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 0 additions & 80 deletions .github/workflows/PRs.yml

This file was deleted.

44 changes: 44 additions & 0 deletions .github/workflows/contract.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Contract tests

on:
schedule:
# Daily at 04:00 UTC
- cron: "0 4 * * *"
workflow_dispatch:

# Avoid two contract runs hammering the upstream servers in parallel if the
# previous one is still going (or someone hits Run workflow during a cron run).
concurrency:
group: contract
cancel-in-progress: false

jobs:
contract:
runs-on: ubuntu-latest
env:
SPEASY_AMDA_USERNAME: ${{ secrets.SPEASY_AMDA_USERNAME }}
SPEASY_AMDA_PASSWORD: ${{ secrets.SPEASY_AMDA_PASSWORD }}
SPEASY_CORE_DISABLED_PROVIDERS: "cdpp3dview"
SPEASY_CORE_HTTP_REWRITE_RULES: '{"https://thisserver_does_not_exists.lpp.polytechnique.fr/pub/":"http://sciqlop.lpp.polytechnique.fr/cdaweb-data/pub/"}'
SPEASY_CORE_HTTP_USER_AGENT: "speasy-test-github-actions"

steps:
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: add test logins
uses: extractions/netrc@v3
with:
machine: authenticationtest.com
username: user
password: pass
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install dependencies
run: uv sync --group dev --group docs
- name: Run contract tests
run: uv run pytest -m contract -v
42 changes: 42 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: E2E smoke tests

on:
schedule:
# Weekly on Sundays at 06:00 UTC
- cron: "0 6 * * 0"
workflow_dispatch:

concurrency:
group: e2e
cancel-in-progress: false

jobs:
e2e:
env:
SPEASY_AMDA_USERNAME: ${{ secrets.SPEASY_AMDA_USERNAME }}
SPEASY_AMDA_PASSWORD: ${{ secrets.SPEASY_AMDA_PASSWORD }}
SPEASY_CORE_DISABLED_PROVIDERS: "cdpp3dview"

runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
max-parallel: 2
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
os: [macos-latest, windows-latest, ubuntu-latest]

steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install dependencies
run: uv sync --group dev --group docs
- name: Run E2E smoke tests
run: uv run pytest -m e2e -v
26 changes: 26 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Lint

on:
push:
branches: [main]
pull_request:

jobs:
flake8:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install dependencies
run: uv sync --group dev
- name: Lint with flake8
run: |
uv run --with flake8 flake8 speasy tests --count --select=E9,F63,F7,F82 --show-source --statistics
uv run --with flake8 flake8 speasy tests --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
90 changes: 0 additions & 90 deletions .github/workflows/tests.yml

This file was deleted.

84 changes: 84 additions & 0 deletions .github/workflows/unit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Unit tests

on:
push:
branches: [main]
pull_request:

jobs:
unit:
env:
SPEASY_CORE_DISABLED_PROVIDERS: "cdpp3dview"
SPEASY_CORE_HTTP_REWRITE_RULES: '{"https://thisserver_does_not_exists.lpp.polytechnique.fr/pub/":"http://sciqlop.lpp.polytechnique.fr/cdaweb-data/pub/"}'

runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
max-parallel: 2
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
os: [macos-latest, windows-latest, ubuntu-latest]

steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install dependencies
if: matrix.python-version != '3.13' || matrix.os != 'ubuntu-latest'
run: uv sync --group dev
- name: Install dependencies (with docs group, on coverage runner)
if: matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'
run: uv sync --group dev --group docs
- name: Run unit tests
if: matrix.python-version != '3.13' || matrix.os != 'ubuntu-latest'
run: uv run pytest -m unit
- name: Install system tooling for doctest (one runner)
if: matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'
run: sudo apt update && sudo apt install -y texlive pandoc
- name: Run unit tests with coverage and doctests (one runner)
if: matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'
env:
# Doctests reference all providers (cdpp3dview, etc.) and live
# inventories — re-enable everything for this step. The HTTP rewrite
# rule re-routes a placeholder URL used in some examples to LPP's
# mirror.
SPEASY_CORE_DISABLED_PROVIDERS: ""
SPEASY_CORE_HTTP_REWRITE_RULES: '{"https://thisserver_does_not_exists.lpp.polytechnique.fr/pub/":"http://sciqlop.lpp.polytechnique.fr/cdaweb-data/pub/"}'
SPEASY_CORE_HTTP_USER_AGENT: "speasy-test-github-actions"
run: |
uv run pytest -m unit --cov=speasy --cov-config=.coveragerc --cov-report=xml
uv run make doctest
- name: Upload coverage to Codecov
if: matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage.xml
flags: unit
name: codecov-umbrella
fail_ci_if_error: true

release-check:
runs-on: ubuntu-latest
needs: unit
steps:
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Build and check release artifacts
run: |
uv run --with build --with wheel --with twine python -m build .
uv run --with twine twine check dist/*
7 changes: 6 additions & 1 deletion .github/workflows/wasm_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,13 @@ jobs:
run: python -m pip install pytest-pyodide

- name: Run tests
# Override the pyproject default `addopts = "-m unit"` so the
# contract-marked test_wasm.py module is collected here.
# --no-cassette-fetch skips the conftest cassette-download hook
# (wasm tests don't replay cassettes and the minimal pyodide env
# doesn't install the requests library).
run: |
python -m pytest -vra \
python -m pytest -vra -m '' --no-cassette-fetch \
--dist-dir=./pyodide-dist/ \
--runner=selenium \
--rt=chrome \
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,10 @@ ENV/
/docs/dev/speasy.webservices.csa.rst
/docs/dev/speasy.webservices.rst
/docs/dev/speasy.webservices.ssc.rst

# Cassettes are fetched from the maintainer's storage; do not commit
tests/cassettes/*
!tests/cassettes/.gitkeep

# Staging directory created by devtools/publish_cassettes.py
.publish_staging/
Loading
Loading