sdmxlib-rest
A generic SDMX-REST HTTP surface over a
sdmxlib LocalRegistry.
It owns the parts of an SDMX-REST service that are the same everywhere — URL grammar, content negotiation, localisation, streaming, response assembly — and leaves everything catalog-specific to the consumer, behind explicit seams.
from sdmxlib_rest.app import RestSettings, create_app, library_routers
from sdmxlib_rest.runtime import CatalogRuntime
runtime = CatalogRuntime(MyCatalogProvider())
app = create_app(
runtime,
RestSettings(title="my-sdmx-api", version="1.0.0"),
routers=list(library_routers()),
)
That serves the structure, metadata and availability planes. Serving data is the consumer's job — see Why there is no data route below.
What you supply
Everything catalog-shaped is a Protocol on CatalogRuntime, each with a no-op
default. A bare consumer implements only the first one.
| Seam | Purpose | Default |
|---|---|---|
CatalogProvider |
how the registry is opened | required |
SpliceRegistry |
post-serialise JSON transforms | empty |
StructureCache |
cache rendered structure responses | never caches |
AvailabilityValues |
precomputed availability values, for unfiltered requests | always scans |
MetadataStore |
reference-metadata lookups | returns nothing |
ComponentFilterShaper |
rewrite a parsed filter before it is queried | identity |
MessageAnnotator |
pre-serialise message annotation | no-op |
The defaults are all inert, not broken: a consumer that installs none of them gets a correct service, just one that recomputes more than it needs to.
The registry has to reach its own observations. /availability reads rows
through sdmxlib's query DSL (registry.observations(flow)), which runs on the
registry's own connection and attaches the lake there. Open a bundle with
LocalRegistry.bundle(path), or any opener that does the same (pinax's
Catalog does). A lake attached only to some other connection is invisible to
it. Since 0.6.0; before, /availability ran its own SQL on meta_conn.
What create_app gives you
Routes are the easy part. The assembly is what's worth not rewriting:
- The middleware stack, in the one order that works. The chain has real
adjacency constraints —
?lang=has to rewrite the header before the ETag layer reads it; the version rewrite has to land before compression decides; CORS has to be outermost or preflights fall through to a 404 that browsers report as a CORS failure. Each constraint is documented at_install_middleware. Only successful responses are stamped with an ETag andCache-Control, so an error is never cached or revalidated. - Unwritable catalogue content as a 500 that says what failed. sdmxlib refuses to serialise content no format can carry (a component with no concept, say). The response lists each artefact path and the rule it breaks, on the app and every mount, instead of a bare server error.
- Runtime sharing across mounts, so a service exposing several surfaces (a canonical one plus compatibility variants) opens the registry once.
- A multi-spec docs page, which has to be hand-rolled because FastAPI's
helper emits a single-spec page and Swagger UI renders nothing when given
both
urlandurls.
Why there is no data route
The library owns data-plane helpers — key and query-parameter parsing,
projection, paging headers, binding-driven SQL fragments, and the
arrow→CSV/parquet encoders, all under sdmxlib_rest.data. It does not own the
/data route itself.
That is deliberate. Orchestration is where response caching, partition pushdown and vendor extensions live, and every catalog shapes those differently — one catalog's hierarchy descent and partition-pruning tricks are noise to the next. A second consumer gets the hard, fiddly parts and writes its own handler around them.
Status
Extracted from a production SDMX-REST service and versioned independently from
0.1.0. The seam set is settled; the create_app signature may still move
before 1.0.
Licence
Apache-2.0.
Metadata
Release files for sdmxlib-rest 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sdmxlib_rest-0.6.2.tar.gz | 88.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sdmxlib_rest-0.6.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 199.9 kB
Release files / sdmxlib_rest-0.6.2.tar.gz
| Download URL | sdmxlib_rest-0.6.2.tar.gz |
|---|---|
| Size | 88.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ab7d1f4b921e6fdfc00d95b4ac3f5cc7a8d512ecb9f65be9fbb0ddc0b38a0074
|
|
BLAKE2b-256 checksum How to use checksums |
0da6fa47364508aae3baa7036dbd16277077a67900cc158d4f9fc109ec6963dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / sdmxlib_rest-0.6.2-py3-none-any.whl
| Download URL | sdmxlib_rest-0.6.2-py3-none-any.whl |
|---|---|
| Size | 111.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4ca482911aeb85ff20efc0bdb2ee9290186d6fa28016947f39bf99e1ac6ebbfb
|
|
BLAKE2b-256 checksum How to use checksums |
57e743056c0af50a57009bb1cad638388151e822fac0c5e7e54fcd62333c7702
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|