Hubble Demo Script
This will enable you to flash a pre-determined set of boards and provision them with your credentials.
Testing
Run all commands from python/.
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # smoke tests only; the e2e test is skipped
End-to-end test (hardware required)
tests/test_e2e.py flashes a connected board, BLE-scans + ingests
packets via pyhubblenetwork, then queries the backend by device ID. It
is gated behind the integration and ble markers so it never runs by
accident.
Set HUBBLE_ORG_ID and HUBBLE_API_TOKEN (in your shell, or copy
.env.example to .env in python/ or the repo root — loaded via
python-dotenv), pick a board ID from merge/md.json, plug it in,
then:
export HUBBLE_TEST_BOARD=nrf52dk
pytest -s -m integration tests/test_e2e.py -v
-s is required because TI generate-hex boards (lp_em_cc2340r5,
lp_em_cc2340r53, lp_em_cc2755p10) emit a .hex and the test pauses to ask you to flash
it manually before continuing.
Testing a locally-built ELF
To exercise an ELF you just built (instead of the prebuilt one in
merge/), point HUBBLE_TEST_ELF_FILE at it. The test forwards this
through to hubbledemo flash via the HUBBLE_DEMO_ELF_FILE override:
export HUBBLE_TEST_BOARD=nrf52dk
export HUBBLE_TEST_ELF_FILE=../firmware/zephyr/hubble-demo-app/build/zephyr/zephyr.elf
pytest -s -m integration tests/test_e2e.py -v
Tunables
| Env var | Default | Purpose |
|---|---|---|
HUBBLE_TEST_BOARD |
— | Board ID; test is skipped if unset |
HUBBLE_TEST_ELF_FILE |
— | Local ELF path; uses remote merge/<board>.elf if unset |
HUBBLE_TEST_SCAN_TIMEOUT |
90 |
Seconds to scan for BLE packets |
HUBBLE_TEST_SCAN_COUNT |
3 |
Stop scanning after N packets |
HUBBLE_TEST_INGEST_WAIT |
45 |
Seconds to wait for backend propagation before querying |
HUBBLE_TEST_DEVICE_NAME |
auto | --name for the registered device |
Releasing
Releases are triggered by pushing a vX.Y.Z tag. The
.github/workflows/release.yml workflow then runs lint + tests, builds
sdist + wheel, creates a GitHub Release using release-notes.md as the
body, and publishes to PyPI via OIDC trusted publishing.
One-time setup
- PyPI Trusted Publisher — at
https://pypi.org/manage/project/pyhubbledemo/settings/publishing/,
add a publisher with:
- Owner:
HubbleNetwork - Repository:
hubble-tldm - Workflow filename:
release.yml - Environment name:
pypi
- Owner:
- GitHub Environment — in repo Settings → Environments, create an
environment named
pypi. Optionally add a required-reviewer rule so each publish needs manual approval.
Cutting a release
Run all commands from the repo root.
- Bump the version in
python/pyproject.toml(project.version). The git tag must exactly match this string with avprefix. - Update
python/release-notes.md— prepend a new section under# Release Notes:## [X.Y.Z] - YYYY-MM-DD ### Added - feat(...): ... ### Fixed - fix(...): ...
The full file is dumped as the GitHub Release body, so keep it readable. - Commit and tag:
git add python/pyproject.toml python/release-notes.md git commit -m "chore: release X.Y.Z" git tag vX.Y.Z git push origin master git push origin vX.Y.Z
- Approve the publish step — if you enabled the reviewer gate on
the
pypienvironment, the workflow will pause before pushing to PyPI until you approve it in the Actions UI.
Watch progress at https://github.com/HubbleNetwork/hubble-tldm/actions.
Metadata
Release files for pyhubbledemo 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyhubbledemo-0.1.3.tar.gz | 20.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyhubbledemo-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.6 kB
Release files / pyhubbledemo-0.1.3.tar.gz
| Download URL | pyhubbledemo-0.1.3.tar.gz |
|---|---|
| Size | 20.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5a804515e752672aa9e110d265a83905fe0b646d2eeab5701938ec06284ff60a
|
|
BLAKE2b-256 checksum How to use checksums |
80c085eb5157bbc1e4a2c643e98b5a2ca07b9e4e3c1befde7f607ec6e7bf88c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / pyhubbledemo-0.1.3-py3-none-any.whl
| Download URL | pyhubbledemo-0.1.3-py3-none-any.whl |
|---|---|
| Size | 18.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
140559f4e30b5399f9479615f196b05f518e06fe5a7abe3dfe2779ec071f1c30
|
|
BLAKE2b-256 checksum How to use checksums |
e0df3e2f577e81ec090dd001711f181beb117e2c780b040a8cf19c56186856be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log