Skip to main content

Bollawax Bollard SDK

The SDK for building on the Pop Boll platform: docks, routines, apps and tools that talk to a Bollawax device or to its web twin, and that read corpora the way the platform does, respecting each corpus's licence and settings.

Status: 0.1.0, the first version, shipped with Bollawax 0.2.4. Its interfaces may still change between 0.x versions. The corpus client, the device layer, routines, the matrix engine and the browser binding are built; the dock protocol, the deck client and the Glass Snipler types are placeholders. Of the specifications under spec/, the software pages are current with this version and the hardware pages are speculative drafts: bollard.md is version 1, the interface under the Boll's foot, and the specification for the cart and its docks is not written (spec/bollardeck.md §20 records what is decided).

Pop Boll builds its own device images and web apps on this SDK. What you install is what we run.

Layout

Path What Licence
python/bollardeck/ The Python package (import bollardeck), standard library only: corpus (read corpora through one gate that respects their licence and settings), device (hardware abstraction with a simulator and a registry for boards, button cues, gestures, the keymap, device identity), routines (the routine API), matrix (the LED matrix frame engine: film shots, playback, DJ mode, text, the premiere box), schema (validate a document against a format), constants. deck and snipler are placeholders Apache-2.0
js/ The browser and Node binding, no build step: bollardeck.js and its parts (constants, the same validator and schemas, button cues, the LED matrix frame engine, optional page helpers). js/README.md is the reference Apache-2.0
c/ A header for dock firmware Apache-2.0
schema/ JSON Schemas (draft 2020-12) for eleven formats: corpus manifest, licence block, corpus origin file, routine manifest, button cues, keymap, device identity, maker registry, image release record, Glass Snipler events and frame Apache-2.0
constants/ constants.json, the single source for values Python and JS share (tap timings, cue states, roles, periods and levels, buttons, gesture names, the keymap), and makers.json, the maker registry Apache-2.0
conformance/ Test vectors any implementation must pass, as plain JSON: 203 schema vectors with an index, and behaviour vectors for the corpus gate, gestures, the keymap, cues, the matrix engine and the routine manifest reader Apache-2.0
tools/ generate.py (writes everything derived from constants/ and schema/, for Python and JS; --check fails when any is stale), pin_vectors.py (writes the expected values of the cue and matrix vectors from the SDK's own Python), sync_spec.py, release.sh Apache-2.0
examples/ A device on the simulator with routines, three example routines, a corpus read from a fake hub, a page that runs from disk Apache-2.0
tests/ The Python suite (python3 -m unittest discover -s tests) and the Node tests under tests/js/ Apache-2.0
spec/ The public specification pages, unchanged copies of those published at popboll.com/spec (spec/SOURCES.json has the checksums) CC BY 4.0

Install (from a checkout)

pip install .
import bollardeck
print(bollardeck.__version__, bollardeck.SPEAKS)

import bollardeck.schema as schema
print(schema.validate("licence", {"scope": "morpus_only", "store_audio": True}))
# [Problem(pointer='/store_audio', message='must be false, not true', keyword='const')]

Corpora

from bollardeck.corpus import HubClient, discover

found = discover(roots=["/media/sd/corpora"], hub=HubClient("https://hub.example", token=TOKEN))
for corpus in found.corpora:
    verdict = corpus.may("study")                 # the gate: never raises, always says why
    if verdict:
        pairs = corpus.study_pairs(verdict)       # content takes the verdict; there is no other way in
    else:
        print(corpus.id, verdict.reason, verdict.detail)

help(bollardeck.corpus) is the usage guide; examples/corpus_from_a_fake_hub.py runs without a network. The gate's behaviour is pinned by conformance/corpus-gate/.

A hub's read token alone is study only for a corpus that is not public. To reach such a corpus's tracks, audio, art and bundles, say who the client acts for: HubClient(..., acting_for="ada@example.org") or hub.corpus(id, acting_for=...). The name goes in the X-Pop-For header, never in a URL, and is self-declared until sign-in arrives. Also there: CorpusUnavailable and NotAvailable carry a reason and the hub's status; corpus.open_audio_ranged(file, verdict, range_header=...) gives a relay the source's status and headers; hub.listing().from_cache; corpus.manifest_view() (read-only, no copy); hub.corpus_gate() (the hub's rollout switch, enforce or report). A clock that is set back does not reopen an expired licence held in a cache.

The device layer and routines

bollardeck.device is the hardware abstraction (with a registry so a board family registers itself from outside), button cues, the gesture engine, the keymap resolver and device identity; bollardeck.routines is the routine API. Each module's docstring is its usage guide. To see them work together on the simulator:

python3 examples/device_on_sim.py

A key source may say when a press begins ("<button> down [t_ms]", hal.base.key_line(1, down=True)). That is a hint and never a gesture: a press is a tap or a hold by the hold_ms its release states, and every Gesture carries that hold_ms. A routine.yaml may also be one JSON object.

bollardeck.matrix makes the frames of the 13 x 8 LED matrix and its three RGB LEDs, byte for byte what js/bollardeck.matrix.js makes (conformance/matrix/, 1,135 vectors):

from bollardeck import matrix
frame = matrix.glyph("boot", 0)            # also film, playback, idle, corpus, dj, text, premiere, tone
frame.to_bytes(), frame.hex(), matrix.to_ascii(frame)

The keymap (bollardeck.constants.KEYMAP, schema/keymap.schema.json) says what each button gesture means, and conformance/gestures/, conformance/cues/ and conformance/cue-render/ pin the behaviour for every binding. conformance/DECISIONS.md says what the SDK does where the schemas and the pages left room.

Working on it

python3 -m unittest discover -s tests     # also runs the Node tests when node is installed
node --test tests/js/*.test.js            # the browser binding alone
python3 tools/generate.py                 # after changing constants/ or schema/
python3 tools/pin_vectors.py              # after changing how a cue or a matrix frame is drawn

jsonschema and PyYAML, when installed, cross-check the SDK's own validator and its reader for routine.yaml. Neither is needed to use the SDK; CI installs both for the tests.

popbollard is Pop Boll's own repository for Bollawax, and it is closed. Where a tool or a test here names it (tools/sync_spec.py --from, the BOLLARD_SDK_POPBOLLARD environment variable of tests/test_reality.py and tests/test_corpus_reality.py), that is a check for its maintainers: it reads a checkout of that repository and is skipped without one. Nothing in the SDK needs it.

In a page

<script src="js/bollardeck.js"></script>
<script>
  bollardeck.schema.validate("licence", {scope: "morpus_only", store_audio: true});
  bollardeck.cues.at([{button: 1, state: "pulse", role: "go"}], performance.now());
  bollardeck.matrix.glyph("boot", 0);
</script>

One tag loads the whole binding: the validator (the twin of bollardeck.schema in Python), the button cue helpers, the LED matrix frame engine, the gesture engine and keymap resolver, and the corpus gate with a hub client on fetch, with optional helpers for elements and a canvas. js/README.md is the reference, examples/browser/index.html runs from disk, and node --test tests/js/*.test.js runs its tests. conformance/matrix/ and conformance/cue-render/ hold the behaviour vectors it must pass (tools/pin_vectors.py writes their expected values), and tools/generate.py writes js/bollardeck.schemas.js.

CHANGELOG.md lists what each version added and changed.

Versions

The SDK has its own version (sdk-v<version> tags). It is not the Bollawax image version. bollardeck.SPEAKS lists the wire and format versions this SDK speaks, and bollardeck.MIN_BOLLAWAX is the oldest Bollawax release it is tested against.

Contributing

Pull requests are closed for now; see CONTRIBUTING.md. Issues are welcome.

Licence

Code: Apache-2.0 (LICENSE). Specification text in spec/: CC BY 4.0, "Pop Boll, by Graham Smith" (LICENSES/CC-BY-4.0.txt). See NOTICE for names and trademarks.

Metadata

Release files for bollard-sdk 0.1.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 bollard-sdk 0.1.0
File Size Uploaded Provenance Actions
bollard_sdk-0.1.0.tar.gz 206.5 kB Without provenance Details for bollard_sdk-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for bollard-sdk 0.1.0
File Interpreter ABI Platform Actions
bollard_sdk-0.1.0-py3-none-any.whl Python 3 none any Details for bollard_sdk-0.1.0-py3-none-any.whl

Total release size: 370.0 kB

Release files / bollard_sdk-0.1.0.tar.gz

Download URL bollard_sdk-0.1.0.tar.gz
Size 206.5 kB
Tags Source
SHA-256 checksum
How to use checksums
304bd81ea07260911a9f5e077e47138bebe760b2ecd855871ea785e0f12068ed
BLAKE2b-256 checksum
How to use checksums
c9f4db569a248a72885a47a338b1860ea19b47a9c57ecedba343cbbaf235f172
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / bollard_sdk-0.1.0-py3-none-any.whl

Download URL bollard_sdk-0.1.0-py3-none-any.whl
Size 163.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
46d952a9f7bb09015d352fa0cdffa2466397ee5b278e3838b4fc0c24d1376f67
BLAKE2b-256 checksum
How to use checksums
41d4acf8097fd6216bf121709943c69c22a303a9856325362529a62a6ae47053
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for bollard-sdk 0.1.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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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