diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 57efe02..d563c2a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.12", "3.14"] + python-version: ["3.10", "3.12", "3.14"] steps: - uses: actions/checkout@v7 - uses: actions/setup-python@v7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c2d4de..870b5c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to DataLab-Capsule are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The capsule format itself is versioned by its profile (). +## [Unreleased] + +### Changed + +- Python 3.10 or later is now required. Python 3.9 users must keep an earlier compatible release; the Pyodide runtime is unchanged. + ## [0.1.0] - 2026-10-19 First public release, shared by DataLab Desktop and DataLab-Web. diff --git a/README.md b/README.md index 80d1b6a..32bdcaf 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Status: experimental. Version 0.1.0 is the first public release, on PyPI as `dat - Light attachments: up to 8 files of at most 16 MiB each, chosen by the author (protocol, notes, small tables...), stored under `attachments/` and declared in the manifest (`dlc:attachment`) with their media type, size and SHA-256. They are part of the manifest fingerprint. The reader refuses undeclared, missing or altered attachments. They are returned as bytes, written to disk only on explicit request, and never opened or executed. - Semantic diff (`diff_manifests`): changes between two capsules are sorted into scientific (activities, parameters, states, fingerprints, ROI), presentation (name, description, licence, date), storage (workspace file SHA-256 and size, included or referenced, locators: different bytes do not show a scientific change), environment (environments, packages, the environment of each activity) and attachments (added, removed or changed; their content is not interpreted, since a protocol or a calibration certificate may matter scientifically). `scientific_conclusion` says what can be concluded: `differences`, `none` (no scientific change, the same workspace file and the same attachment contents) or `none_detected` (nothing differs in the recorded activities and states, but the workspace files or the attachment contents differ, so equality is not established). - Verification without computation (`verify_capsule`): the archive and manifest, the workspace integrity, the match between the manifest and the workspace ledger, the fingerprints and ROI of every stored state (with h5py), and supplied verification reports and reviews. Recomputing an activity is the replay of an edition, never this package's job. -- Pure Python for CPython 3.9+ and Pyodide (Python 3.12). The core only needs the standard library and `jsonschema`; HDF5 helpers use NumPy and h5py. +- Pure Python for CPython 3.10+ and Pyodide (Python 3.12). The core only needs the standard library and `jsonschema`; HDF5 helpers use NumPy and h5py. - The package never imports DataLab, Sigima, SigimaX or Qt, and never executes code named in a file. ## Installation diff --git a/doc/api.md b/doc/api.md index c1804ee..5cf8be3 100644 --- a/doc/api.md +++ b/doc/api.md @@ -1,6 +1,6 @@ # API -DataLab-Capsule is a pure Python library (CPython 3.9+ and Pyodide). The core needs the standard library and `jsonschema`; functions marked **h5py** also need NumPy and h5py. Every error derives from `datalab_capsule.integrity.ProvenanceError`. Nothing in the library accesses the network or executes code named in a file. +DataLab-Capsule is a pure Python library (CPython 3.10+ and Pyodide). The core needs the standard library and `jsonschema`; functions marked **h5py** also need NumPy and h5py. Every error derives from `datalab_capsule.integrity.ProvenanceError`. Nothing in the library accesses the network or executes code named in a file. ## Read, verify and compare capsules diff --git a/doc/development.md b/doc/development.md index 552e907..2155e15 100644 --- a/doc/development.md +++ b/doc/development.md @@ -35,7 +35,7 @@ The other repositories use the checkout directly: ## Pins and CI - DataLab-Web pins DataLab-Capsule, Sigima and guidata in `datalab-capsule-dependency.json`, `sigima-dependency.json` and `guidata-dependency.json`. `developmentRef` is a full commit hash used by development builds and CI (`scripts/*_dependency.py prepare-pyodide` builds the wheel from that commit); `publishedRequirement` is used by release builds only (`npm run build:release`, checked by `npm run release:guard`). A change to the library reaches the Web CI only after it is pushed and the pin is moved. -- DataLab-Capsule CI runs on push: CPython 3.9, 3.12 and 3.14 (with the `registry` extra), Pyodide 0.26.4 (Node), and the CLI in a clean environment without NumPy or h5py. +- DataLab-Capsule CI runs on push: CPython 3.10, 3.12 and 3.14 (with the `registry` extra), Pyodide 0.26.4 (Node), and the CLI in a clean environment without NumPy or h5py. - DataLab-Web CI runs on demand on feature branches: `gh workflow run tests.yml -R DataLab-Platform/web --ref `. Its end-to-end job installs the registry from the pinned wheel and requires it (`DLW_REQUIRE_REGISTRY=1`), and requires provenance (`DLW_REQUIRE_PROVENANCE=1`): those tests fail rather than skip. - DataLab CI: `gh workflow run test_pyqt5.yml` and `test_pyqt6.yml` with `-f job_to_run=build`. diff --git a/pyproject.toml b/pyproject.toml index f1be8f0..ef26e8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ readme = "README.md" license = "BSD-3-Clause" license-files = ["LICENSE"] authors = [{ name = "DataLab Platform Developers" }] -requires-python = ">=3.9, <4" +requires-python = ">=3.10, <4" dependencies = ["jsonschema >= 4.17"] classifiers = [ "Development Status :: 2 - Pre-Alpha", @@ -51,7 +51,7 @@ addopts = "--import-mode=importlib" exclude = [".git", ".vscode", "build", "dist", "venv*", ".venv*", "node_modules"] line-length = 88 indent-width = 4 -target-version = "py39" +target-version = "py310" [tool.ruff.lint] select = ["D202", "D403", "E", "F", "I", "NPY201", "RUF022", "W"]