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>
68 lines
3.9 KiB
Markdown
68 lines
3.9 KiB
Markdown
# SQL
|
|
|
|
This folder holds the table definitions for the database form of packages, a team's store, and the bundle.
|
|
|
|
## What the database form is for
|
|
|
|
A package is a folder of canonical JSON files, one document per folder ([chapter 12](../spec/12-package.md)).
|
|
Canonical JSON is JSON with exactly one valid byte sequence, so a file's hash changes only when its content does.
|
|
|
|
Handing over a folder is easy.
|
|
Querying across hundreds of documents in folders is hard.
|
|
The database form holds the same data as rows so that a team can ask SQL questions of it, and a package loaded into the tables unloads back to the same bytes.
|
|
About 500 documents come to about a million and a half rows, and SQLite and Dolt hold that comfortably ([chapter 13](../spec/13-database.md#132-tables)).
|
|
|
|
## The three files
|
|
|
|
| File | Holds | Runs on |
|
|
| --- | --- | --- |
|
|
| `doc.sql` | Documents: works, documents, witnesses, nodes, pages, locations, references, citations, corrections, IDs, receipts, revocations, suspects and package files. | SQLite, Dolt, PostgreSQL |
|
|
| `store.sql` | What a team adds: roster keys, projects, members, reading paths, layers, annotations, datasets, digitizations, views, policies, submissions and grades. Load `doc.sql` first. | SQLite, Dolt, PostgreSQL |
|
|
| `bundle-sqlite.sql` | The bundle's extra tables: metadata, a full-text index (FTS5, SQLite's search extension) and room for embeddings. Load both files above first. | SQLite |
|
|
|
|
## Creating a database
|
|
|
|
```sh
|
|
sqlite3 lab.db < sql/doc.sql && sqlite3 lab.db < sql/store.sql
|
|
psql -d lab -f sql/doc.sql && psql -d lab -f sql/store.sql
|
|
dolt sql < sql/doc.sql && dolt sql < sql/store.sql
|
|
```
|
|
|
|
The PostgreSQL database `lab` and the Dolt repository must already exist.
|
|
The `sqlite3` line runs as shown; the `psql` and `dolt` lines follow the portability rules of [chapter 13](../spec/13-database.md#131-portability) but have not been run on those engines in this repository.
|
|
|
|
To load packages into SQLite without pixi, install the package with its `tools` extra on Python 3.14, then run `paperspec load --sqlite lab.db PACKAGE…`.
|
|
The file [docs/examples.md](../docs/examples.md#load-packages-into-sqlite) has queries to try.
|
|
The loader copies files that have no table (assets, dataset files, derived files) by SHA-256 into `lab.db.assets/`.
|
|
|
|
## A first query
|
|
|
|
The query below finds every sentence that cites a given reference, which is the citation's context.
|
|
It returns sentence IDs, and `nodes.content` holds each sentence's text.
|
|
|
|
```sql
|
|
SELECT c.sentence
|
|
FROM citations c
|
|
JOIN refs r ON r.doc_key = c.doc_key AND r.node = c.ref_node
|
|
WHERE c.doc_key = 'hale2026harmonic-damb' AND r.label = '2';
|
|
```
|
|
|
|
On `fixtures/packages/hale2026harmonic-damb` it returns one row, `hca6dc5`: the sentence ending "served as the first test case, with a bending band near 1595 cm⁻¹."
|
|
|
|
## Conventions
|
|
|
|
- Foreign keys: none.
|
|
Validators check references, so the same file runs everywhere.
|
|
- Types: enumerations are `VARCHAR` with a `CHECK`, JSON values are canonical JSON in `TEXT`, and booleans are `INTEGER` 0 or 1.
|
|
- Names: no table, column or index name is reserved in SQLite, PostgreSQL or MySQL (Dolt is MySQL-compatible).
|
|
The formats' `key`, `index`, `at`, `by`, `before` and `after` become `doc_key`, `idx`, `made_at`, `signer`, `before_hash` and `after_hash`.
|
|
- Round trip: each row keeps every property of its record, so unloading restores the same bytes and the same manifest hash.
|
|
Unloading copies the files with no table from the asset store, which must travel with the database.
|
|
`paperspec check` tests this for every fixture package.
|
|
- Derived tables: `citations`, `receipt_nodes` and `annotation_targets` are built on load for queries and are not part of the package.
|
|
|
|
## Status
|
|
|
|
The version is 0.1.0.
|
|
In `registry/formats.json`, `scienting-doc/1` is `candidate`, and the bundle and the project, dataset, digitization and view formats are `provisional`. [Chapter 13](../spec/13-database.md) defines the mapping from files to tables.
|