Skip to main content

splent_feature_spl_registry

The marketplace's registry of software product lines. It owns which SPLs exist, who owns each one, the DOI pointer to the published UVL model, and the relay that publishes a model to UVLHub.

Each line's name, description and {mirror, doi, file} pointer live in the spl table, and GET /api/v1/spls serves them to the splent CLI and to the job that builds the marketplace index.

The model

developer --(splent CLI with a splent token)--> MARKETPLACE --(one server-side key)--> UVLHub

A developer authenticates to the marketplace with a token from splent_feature_apikeys and sends a .uvl file. They never hold UVLHub credentials, never name a UVLHub dataset and never learn UVLHub is involved. The marketplace validates the model, relays it with its single key, and stores the DOI pointer. The UVL content itself is never stored here.

Publishing a FEATURE is unchanged: splent feature:release, no account, no token, the git tag is the publication. This feature is only about product lines.

Ordering

A release row is written before the irreversible call to UVLHub, then updated with the outcome. This is the point of the design. If the publish call times out and nothing was written down first, the marketplace cannot tell whether a DOI was minted, and the honest answer ("I do not know") gets replaced by the tempting one ("try again"), which mints a second permanent DOI for the same model.

A release therefore settles into one of three states, and only one of them is safe to retry:

state meaning retry
published UVLHub minted a DOI, recorded here not needed, republishing the same bytes is idempotent
failed UVLHub refused. Nothing was minted yes
unknown No answer after the irreversible call no, an administrator settles it first

splent feature:spl_registry stuck lists the undetermined ones and ... settle <spl> <version> [--doi ...] records what was found.

Endpoints

method path auth
GET /api/v1/spls public
GET /api/v1/spls/<name> public
POST /api/v1/spls/<name>/releases Bearer, write_spl
GET /marketplace/spls/<name> public page
curl -X POST https://<marketplace>/api/v1/spls/my_line/releases \
     -H "Authorization: Bearer splent_..." \
     -F "file=@my_line.uvl"

Configuration

Every variable has a working default; the feature runs with no .env entry.

variable default what it does
UVLHUB_API_KEY (none) the single server-side key. Without it the write path answers 503
UVLHUB_URL https://www.uvlhub.io which instance to relay to
SPL_REGISTRY_PUBLISHING_ENABLED true kill switch. false closes publishing and leaves every read path up
SPL_REGISTRY_VERIFY_PUBLISHED true download the published file and compare it byte for byte
SPL_REGISTRY_UVLHUB_TIMEOUT 60 seconds per UVLHub call
SPL_REGISTRY_QUOTA_WINDOW_HOURS 24 the rolling window every quota is counted over
SPL_REGISTRY_MAX_RELEASES_PER_USER 10 per developer, per window
SPL_REGISTRY_MAX_RELEASES_PER_SPL 5 per product line, per window
SPL_REGISTRY_MAX_RELEASES_TOTAL 100 the ceiling that bounds the single key
SPL_REGISTRY_MAX_SPLS_PER_USER 5 product lines one developer may own

UVLHUB_API_KEY is deliberately never copied into app.config: that mapping is dumped by splent product:config, by the settings screens and by Flask's debug pages. It is read from the environment at call time in exactly one place, uvlhub.api_key(), which is the only place in the whole workspace that reads it server side.

Quotas are counted with SQL COUNTs, never in-process counters, because several workers run in parallel and a per-process counter would multiply every allowance by the number of them.

403 or 404

Every product line is in the public index unless an administrator withdraws it with visibility <spl> withdrawn. That one flag decides what the publishing endpoint says about a line that is not yours:

the line is answer why
listed 403 admitting the name is taken tells the caller nothing they cannot read in GET /api/v1/spls
withdrawn 404 the same answer, code and wording as a name nobody registered, so the write path cannot be walked to find what the read path hides

Withdrawing hides a line. It deletes nothing: every release and every DOI stays exactly where it is, and the owner can still publish to it.

Authorship

A publication is credited to the publishing developer's profile, read server side and never from a request field, because an author line a stranger can choose is an impersonation vector on a permanent record.

The profile feature is not required. When the product installs it, the credit is the name and surname on the developer's UserProfile, read through UserProfileService.get_by_user_id. When it does not, or when the developer never filled the form in, the credit is SPLENT MARKETPLACE. It is never the email address, which would put a personal address on a permanent public record.

A SPLENT profile holds a name and a surname and nothing else, so that is all that is sent. There is no affiliation and no ORCID to send.

Commands

splent db:seed
splent feature:spl_registry list
splent feature:spl_registry stuck [--hours 1]
splent feature:spl_registry settle <spl> <version> [--doi ...] [--note ...]
splent feature:spl_registry set-owner <spl> <email>
splent feature:spl_registry visibility <spl> public|withdrawn

splent db:seed runs SplRegistrySeeder, which carries the founding product lines as data. They were published before the registry existed, and their name, description, mirror, DOI and file name are written out in seeders.py. The seeder is what rebuilds the registry on a fresh database, and it is idempotent.

It records no content digest for the lines it brings in. The digest is the idempotency key, and a release carrying one is the registry promising these exact bytes are what that DOI serves. Nothing has compared them, and one of the three does not even serve a file named after the line (sample_splent_spl serves sample_splent_app.uvl), so the digest is left empty.

Seeded lines arrive with no owner, which is what stops any authenticated developer from publishing to them; set-owner hands one over.

Requires

auth (the User an owner and a publisher point at) and apikeys (the write_spl Bearer token the publishing endpoint is guarded by).

profile is optional. It improves the credit on a publication and the name shown on the public page, and the feature works without it.

Tests

splent feature:test splent_feature_spl_registry

Unit, integration and functional. The suite never reaches UVLHub: the conftest replaces the four relay calls and the HTTP client underneath them, and it does so through its own MonkeyPatch rather than the shared fixture. That last detail is not decoration. While the shared fixture was used, a single monkeypatch.undo() inside a test restored the real relay along with the real UVLHUB_API_KEY, and a test run minted a permanent DOI on production Zenodo. Publishing is irreversible, so the guard has to be one a test cannot lift.

Metadata

Release files for splent-feature-spl-registry 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for splent-feature-spl-registry 0.4.0
File Size Uploaded Provenance Actions
splent_feature_spl_registry-0.4.0.tar.gz 68.4 kB Without provenance Details for splent_feature_spl_registry-0.4.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for splent-feature-spl-registry 0.4.0
File Interpreter ABI Platform Actions
splent_feature_spl_registry-0.4.0-py3-none-any.whl Python 3 none any Details for splent_feature_spl_registry-0.4.0-py3-none-any.whl

Total release size: 148.7 kB

Release files / splent_feature_spl_registry-0.4.0.tar.gz

Download URL splent_feature_spl_registry-0.4.0.tar.gz
Size 68.4 kB
Tags Source
SHA-256 checksum
How to use checksums
956bf4d9b69a94a305a97cedc1b9f1eab0e64acc1f1ea8bf305bad723e27cd89
BLAKE2b-256 checksum
How to use checksums
e6e9e2f400f891186d97ad59c0fe11fc6583d9e37a5fe7553c7fd3a7e3a84b5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.13

Release files / splent_feature_spl_registry-0.4.0-py3-none-any.whl

Download URL splent_feature_spl_registry-0.4.0-py3-none-any.whl
Size 80.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f83359c20fe96ffd000e5cdebc593a5bee45adbe7d68b9c1a7cc55cb29ce7307
BLAKE2b-256 checksum
How to use checksums
85b964f8929789e0583303bddcae5224fac600fd6756486a7694b03098d37405
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.13

Security for splent-feature-spl-registry 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page