feat: publish the package from CI, and clean up its references
Publishing - .gitea/workflows/publish.yml publishes paperspec to the instance's PyPI registry (/api/packages/infra/pypi) when a v* tag is pushed: it checks the repository, builds the sdist and wheel, refuses to upload unless the built version equals the tag, runs twine check --strict, and uploads with the secrets PACKAGE_USER and PACKAGE_TOKEN (--skip-existing, so a rerun on the same tag is safe). Run by hand, it refuses anything but a tag. - pixi dev environment: twine >= 6.1 (the first that reads Metadata 2.4), and `dist` (sdist and wheel) replaces the `wheel` task. - deploy/README.md: how to set up the secrets, release a version, and install from the registry with pixi, uv or pip, tying paperspec to the registry where the installer allows it. - CONTRIBUTING.md "Releasing": a tag versions the package; a format change takes the new format version as the top CHANGELOG heading, and a code-only release takes the next patch as a subsection, as 0.1.1 does. - pyproject: fallback_version 0+unknown for source trees without git; the license expression is Apache-2.0 AND CC0-1.0, for the code and the data the wheel carries. Cleanup (from an audit of every reference to the package) - spec/00 lists src/ (the package) and tools/ (how to run it), and no longer says the reference implementation is not a library. - Stale explanations fixed in pixi.toml, .gitignore, the Caddyfile, the vectors, context, sql and tools READMEs, docs/examples.md, docs/faq.md, spec/01, docs/rationale.md and docs/comparison.md: the commands, what they need (the tools extra), the fixture folder hale2026harmonic-damb, and three lines that held two sentences. - tools/README.md counts all six commands, says what needs which extra (package.validate and corrections.gate need [schema]), and that the vectors ship but the fixtures they name do not. - The CLI's install and clone hints point at the registry instructions and an https clone URL; schema.py raises an ImportError naming paperspec[schema], as crypto.py does for [crypto]. - check's Unicode check now guards the package's pinned constant. - site skips build/, dist/ and *.egg-info. - CHANGELOG 0.1.1 describes the final state. pixi run check passes (as `python -m paperspec check`); the rebuild is byte-identical. pixi.lock needs `pixi lock` for twine before pushing: the publish workflow installs with --locked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
25 files changed
+224
-61
No files matched your search
+10
-7
@@ -6,10 +6,10 @@ Implementers get the commands and the traps.
|
||||
|
||||
These commands are the repository's reference implementation.
|
||||
They apply every rule of the specification, so the rest of the repository can be checked against them.
|
||||
Two build and check the repository, one validates packages and proposed corrections, and one loads packages into SQLite, a database stored in a single file.
|
||||
Two build and check the repository, one validates packages and proposed corrections, one loads packages into SQLite, a database stored in a single file, one stresses the reference implementation with random inputs, and one builds the website.
|
||||
They are subcommands of one command, `paperspec`, which the Python package `paperspec` installs; its code is in [src/paperspec/](../src/paperspec/), with the commands in `src/paperspec/cli/`.
|
||||
`paperspec --help` lists them and says where each works, and `paperspec COMMAND --help` gives a command's options, advice and examples.
|
||||
They need Python 3.14 and two packages, `jsonschema` and `cryptography`, and are licensed Apache-2.0.
|
||||
They need Python 3.14 and the package's `tools` extra (`jsonschema`, `referencing` and `cryptography`), except `paperspec site`, which needs only the standard library, and they are licensed Apache-2.0.
|
||||
|
||||
A package is the folder of files that holds one document, such as `fixtures/packages/hale2026harmonic-damb`.
|
||||
A vector is a test case: an input and the exact output every implementation must compute (see [the vectors](../vectors/README.md)).
|
||||
@@ -24,7 +24,7 @@ A fixture is an example file or package under `fixtures/`.
|
||||
| `paperspec site` | Builds the website into `_site/`: every file of the repository at its own path, and each Markdown file rendered as a page beside it, with a vocabulary page, folder listings and a search index. It uses only the standard library. `pixi run check` builds it into a temporary folder and checks every link ([deploy/](../deploy/README.md)). |
|
||||
| `paperspec stress` | Stresses the oracle with random inputs from a seeded generator: `paperspec stress [--seed N] [--rounds N]`. It checks the invariants the chapters state rather than the vectors' values, such as canonical JSON round trips, corrections keeping the five values consistent with a full recomputation, anchors always resolving to one of the five outcomes, the zip reader never writing outside its folder, and a mutated package always being refused. |
|
||||
|
||||
`paperspec validate` and `paperspec load` work anywhere the package is installed, with the schemas and SQL it carries.
|
||||
`paperspec validate` and `paperspec load` work anywhere the package is installed with its `tools` extra, using the schemas and SQL it carries.
|
||||
The other four work on a checkout of this repository: the one an editable install points at, or else the one around the current folder.
|
||||
|
||||
## When to run what
|
||||
@@ -49,7 +49,7 @@ paperspec load --sqlite lab.db fixtures/packages/hale2026harmonic-damb
|
||||
|
||||
A passing check ends with `All checks pass.`
|
||||
The load command prints `hale2026harmonic-damb: 75 nodes`, one line per package, and writes `lab.db` with a folder `lab.db.assets/` beside it for files that have no table of their own.
|
||||
It validates every package first and loads nothing if one fails, printing each failure as `package: where: rule: message`.
|
||||
It validates every package first and loads nothing if one fails, printing each failure as `package: where: rule: message`, or `package: rule: message` for a zipped package that cannot be unpacked.
|
||||
The full and checks-only forms of one document share its key, so they go into separate databases.
|
||||
Each command prints its options with `--help` and refuses options it does not know.
|
||||
`paperspec build` rebuilds `fixtures/` and `vectors/` in place unless you pass `--out`.
|
||||
@@ -74,10 +74,13 @@ Hashes are kept incrementally.
|
||||
A node's five values depend only on its own subtree, so after a correction the oracle rehashes only the nodes that changed and their ancestors, and a container's projections are its children's cached projections joined.
|
||||
`paperspec check` compares the result after every correction with a slow computation that projects each node from its whole subtree.
|
||||
|
||||
Other repositories of the project do not reimplement the specification: they install this repository as the Python package `paperspec` (`pip install .`, or a git pin) and import the oracle from it, so that every key, identifier, canonical JSON string, package check and database form comes from one piece of code.
|
||||
Other repositories of the project do not reimplement the specification: they install this repository as the Python package `paperspec`, from the Gitea package registry or as a git pin ([deploy/](../deploy/README.md#install-from-the-registry)), and import the oracle from it, so that every key, identifier, canonical JSON string, package check and database form comes from one piece of code.
|
||||
The library surface they use is `keys`, `text`, `jcs`, `package`, `db`, `schema` and `rights`, with the schemas, SQL and vectors as package data: `paperspec.resources.path("sql")` finds a folder in an installed wheel and in an editable install alike.
|
||||
The vectors travel with the package, but `resolve.jsonl`, `grading.jsonl` and `targets.jsonl` name a fixture package, and the fixtures stay in the repository.
|
||||
The package needs Python 3.14, the only version with the Unicode 16.0 character data the specification pins, and refuses to import on any other.
|
||||
Otherwise it needs only the standard library, except that `schema` needs `paperspec[schema]` (`jsonschema` and `referencing`) and the HKDF and Ed25519 functions of `crypto` need `paperspec[crypto]`; `paperspec[tools]` installs both.
|
||||
The package version comes from git tags through setuptools-scm, and `pixi run -e dev wheel` builds the wheel into `dist/`.
|
||||
Importing any of its modules needs only the standard library.
|
||||
Schema validation (`schema`, and with it `package.validate` and `corrections.gate`) needs `paperspec[schema]` (`jsonschema` and `referencing`), and HKDF and Ed25519 in `crypto`, which the signature and receipt checks use, need `paperspec[crypto]`.
|
||||
`paperspec[tools]` installs both, and is what a program that validates packages needs.
|
||||
The package version comes from git tags through setuptools-scm, and `pixi run -e dev dist` builds the sdist and the wheel into `dist/`.
|
||||
When `scienting-core` exists it takes this role behind the same vectors, and the import changes without any computed value changing.
|
||||
Independent implementations follow the [specification](../spec/README.md) and test themselves against the [vectors](../vectors/README.md).
|
||||
Reference in new issue
Block a user