Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
b8beee9
docs: fix light controller state machine
cuinixam Aug 17, 2026
3dace8f
feat: Set up sphinx-mounts
Rubyfi Sep 8, 2026
fff37d3
chore: adjust mount conditionals, add correct variant to autoiconf.json
Rubyfi Sep 8, 2026
05234c8
fix: display correct html_title
LuSilber Sep 15, 2026
27d87b3
chore: align the Python pin and unblock the documentation toolchain
LuSilber Sep 16, 2026
e57925e
Merge branch 'sphinx-mounts': declarative variant gating, no Jinja in…
LuSilber Sep 16, 2026
1e39d46
feat: generate variant data once, and delete the Jinja hook
LuSilber Sep 16, 2026
8dd1c80
refactor: make ubproject.toml the one configuration both readers read
LuSilber Sep 16, 2026
abc8729
refactor: gate documents on component membership, not on feature or v…
LuSilber Sep 16, 2026
8225e20
ci: gate the documentation without a compiler
LuSilber Sep 16, 2026
9306f40
docs: record what was implemented, and why Phase 6 was not
LuSilber Sep 16, 2026
c65b328
fix: check with ubc, and fix the two defects it found
LuSilber Sep 16, 2026
92ad9bd
docs: recheck against the concept note, and record the symlink finding
LuSilber Sep 16, 2026
375771a
fix: work against the pinned spl-core, not a local checkout
LuSilber Sep 16, 2026
92aad17
fix: keep the report toctrees on the build path spl-core writes to
LuSilber Sep 16, 2026
8430cc8
fix: pin utf-8 on every file read, for Windows
LuSilber Sep 16, 2026
6c4e9b4
fix: hide the per-component report root from ubCode
LuSilber Sep 17, 2026
27918fe
fix: read the generated report pages only in the reports shape
LuSilber Sep 21, 2026
5afd49e
fix: strip the Jinja armour from generated source listings
LuSilber Sep 21, 2026
a5c45c1
fix: stop copying the binary directory, and run ubc in CI
LuSilber Sep 21, 2026
bd851d1
fix: stop walking the symlink, and guard the path that replaces it
LuSilber Sep 21, 2026
f5ba89e
chore(deps): require spl-core 8.9 and update the locked dependencies
TheRedSwabian Sep 22, 2026
f4f98a5
Merge upstream develop into the variant handling work
ubmarco Sep 24, 2026
4b9433e
build: pin spl-core to the useblocks fork with the docs pipeline changes
ubmarco Sep 24, 2026
523509d
refactor(variant-data): take the declared booleans from spl-core
ubmarco Sep 24, 2026
362333b
feat(docs): let spl-core carry the documentation settings, drop the w…
ubmarco Sep 24, 2026
6b38f40
docs: add a guide to variant management, by use case
ubmarco Sep 25, 2026
59e5e7d
chore: drop uv.lock
ubmarco Sep 29, 2026
464cdb1
docs: highlight the JSON blocks with comments as json
ubmarco Sep 29, 2026
cbef21a
docs: give every page a place in the navigation
ubmarco Sep 29, 2026
d610d5b
feat(needs): declare the fields the imported needs carry
ubmarco Sep 29, 2026
d84d052
chore(ubc): ignore tabs in the generated source listings
ubmarco Sep 29, 2026
d5f4fb1
fix(brightness_controller): implement SWDD_BC-203 in the automatic br…
ubmarco Sep 29, 2026
db9e968
docs(agents): a condition that cannot be evaluated warns
ubmarco Sep 29, 2026
6825977
docs(variants): trace code to the design, per variant
ubmarco Sep 29, 2026
dd8216e
refactor: define implementation needs as one-line comments
ubmarco Sep 29, 2026
218247e
docs(variants): name the component directory in src-trace
ubmarco Sep 29, 2026
e0bebae
fix(csv): put the requirement images into the needs' content
ubmarco Sep 29, 2026
f439624
feat: select a variant with generated files instead of a link
ubmarco Sep 29, 2026
5c4c6e8
feat: import the test results as needs in both readers
ubmarco Sep 29, 2026
d3df1b3
feat: hand codelinks the selected build's compile database
ubmarco Sep 29, 2026
3b630bd
docs: give every generated page a place in the navigation
ubmarco Sep 29, 2026
5076fdc
docs: describe the generated selection
ubmarco Sep 29, 2026
40a8046
ci: gate the documentation on both readers, strictly
ubmarco Sep 29, 2026
8cd0dbe
build: pin the spl-core commit that the generated selection needs
ubmarco Sep 29, 2026
3303b5a
feat: check the configuration whenever Sphinx reads it
ubmarco Sep 29, 2026
b4f38a4
test: check the generated selection instead of the link
ubmarco Sep 29, 2026
bfb7ab1
fix(csv): let ubc show the images of the imported requirements
ubmarco Sep 29, 2026
6550277
test: run the documentation gate in a linked worktree too
ubmarco Sep 29, 2026
536f633
fix: show only its own component in a component report
ubmarco Sep 29, 2026
9b3c644
ci: gate the per-component reports as well
ubmarco Sep 29, 2026
8df4803
feat: add a guided, cross-OS tour of the variant documentation
ubmarco Oct 1, 2026
cc70358
style: make the Python files pass ruff check and ruff format
ubmarco Oct 1, 2026
122b535
feat(docs): read the generated pages where spl-core writes them
ubmarco Oct 1, 2026
9e6e9c1
fix(test): require the gate's tools only in the documentation job
ubmarco Oct 1, 2026
867d16b
fix(docs): pin the clanguru that lists each file's own, configured code
ubmarco Oct 1, 2026
51a6231
fix(variant-data): accept only the parts.cmake grammar, exactly
ubmarco Oct 1, 2026
ed69f22
fix(vscode): open the report pages where the builds write them
ubmarco Oct 1, 2026
0717018
test: keep the spl-core settings above the parts.cmake include
ubmarco Oct 1, 2026
c452ecb
docs: update two comments the selection made obsolete
ubmarco Oct 1, 2026
aa5ea32
chore: ignore _build, ubc's default output directory
ubmarco Oct 1, 2026
48a1d9c
fix(docs): link the codelinks remote URL in ubCode as well
ubmarco Oct 1, 2026
5bc1ebb
build: pin spl-core and clanguru to the merges on the forks' default …
ubmarco Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
ENV PIP_CERT=/etc/ssl/certs/ca-certificates.crt

# Python toolchain (uv/CPython 3.11/Poetry) baked as the vscode user, so it lands
# Python toolchain (uv/CPython 3.12/Poetry) baked as the vscode user, so it lands
# in /home/vscode/.local (owned by the runtime user) and is on PATH the instant the
# container starts. Same script bare WSL and CI run at runtime — one source of truth.
COPY bootstrap_python.sh /tmp/bootstrap_python.sh
Expand Down
54 changes: 54 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,60 @@ jobs:
echo "Selected gate marker: $marker"
echo "marker=$marker" >> "$GITHUB_OUTPUT"

documentation:
name: Documentation
runs-on: ubuntu-24.04
timeout-minutes: 30
needs: determine-gate

# The documentation of every variant and kit, in both readers, in strict
# mode, with their needs compared (test/test_docs_gate.py). Each cell is
# CONFIGURED: codelinks takes a variant's #ifdef branches from its
# build's compile database, which only CMake writes. The reports shape
# also compiles each test-kit variant and runs its tests, because the
# test specifications, results and listings are what that run generates.
# The runner's gcc, g++, cmake and ninja are enough -- no poks, no scoop,
# no cross-compiler. It covers every variant, where the build jobs cover
# the variants they build.
steps:
- name: Checkout Code
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Install documentation dependencies
run: |
pipx install poetry==2.4.1
poetry config virtualenvs.in-project true
poetry install --no-root

# cmake and gcc are part of the runner image; Ninja is the generator
# the builds use.
- name: Install Ninja
run: sudo apt-get install -y --no-install-recommends ninja-build

# `ubc` is the second reader. Without it the parity tests skip, and
# a guarantee that only holds on a developer machine is not a
# guarantee -- so the gate installs it and CI_REQUIRE_UBC turns a
# skip into a failure. No licence is needed for `check`; the inputs
# are passed anyway so that adding the secrets later just works.
- name: Install ubc
uses: useblocks/ubc-action@0.1
with:
version: "0.35.0"
license-key: ${{ secrets.UBCODE_LICENSE_KEY }}
license-user: ${{ secrets.UBCODE_LICENSE_USER }}

- name: Documentation gate
env:
CI_REQUIRE_UBC: "1"
run: poetry run pytest -m "docs and ${{ needs.determine-gate.outputs.marker }}"

test-on-windows:
name: Build and Test on Windows
runs-on: windows-2025
Expand Down
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
# Binary output dir, not recommended to push binary results to Git.
/build

# ubc's default output (`ubc build html` without -o writes _build/html), and
# Sphinx's conventional `_build/<builder>`. SPLed's own commands write under
# build/; this catches a bare run.
/_build/

# The document rules tools/variant_data.py generates whenever a variant is
# selected (see ubproject.toml). Generated output, never committed; the
# selection itself lives under /build.
/ubproject.variants.toml

# Output directory of test results
/test/output

Expand Down
9 changes: 8 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,15 @@
"editor.defaultFormatter": "josetr.cmake-language-support-vscode"
},
"cmake.configureOnOpen": false,
// Generated output. tools/variant_data.py writes the variant data here and
// CMake writes everything else; an edit under build/ is lost on the next
// configure, and worse, it looks like it worked. Making the editor refuse
// the edit is the only guard rail that also applies to an assistant.
"files.readonlyInclude": {
"build/**": true,
"ubproject.variants.toml": true
},
"cmake.buildDirectory": "${workspaceFolder}/build/${variant:variant}/${buildKit}/${buildType}",
"cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json",
"cmake.configureSettings": {
"BUILD_KIT": "${buildKit}",
"CMAKE_MESSAGE_LOG_LEVEL": "STATUS",
Expand Down
76 changes: 73 additions & 3 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,58 @@
},
"problemMatcher": []
},
{
"label": "Select documentation variant",
"detail": "Point the docs and ubCode at one variant -- no CMake, no compiler",
"type": "shell",
// Always the docs cell. Choosing `reports` here would open every
// report fence in the IDE, and each one globs into build/**, which
// ubCode excludes -- so every component would report an unmatched
// glob. CMake writes the docs cell as the pointer for the same
// reason. The target choice belongs to the build task below, which
// is where it changes what is produced rather than what is linted.
"command": "${command:python.interpreterPath} tools/variant_data.py --variant ${input:variant} --kit ${input:buildKit} --target docs --current",
"problemMatcher": [],
"presentation": {
"reveal": "silent",
"panel": "shared"
}
},
{
"label": "Generate all variant data",
"detail": "Write build/variants/<Variant>/<kit>/<target>.json for every variant",
"type": "shell",
"command": "${command:python.interpreterPath} tools/variant_data.py --all",
"problemMatcher": []
},
{
"label": "Build documentation for a variant",
"detail": "Sphinx docs for one variant, without configuring or building the software",
"type": "shell",
"command": "${command:python.interpreterPath} -m sphinx -b html -D needs_variant_data_file=build/variants/${input:variant}/${input:buildKit}/${input:docsTarget}.json . build/docs/${input:variant}",
"options": {
"env": {
"VARIANT": "${input:variant}"
}
},
"problemMatcher": []
},
{
"label": "Documentation gate (all variants)",
"detail": "What CI's compiler-free job runs: generate every variant and build its documents",
"type": "shell",
"command": "${command:python.interpreterPath} -m pytest -m docs",
"group": "test",
"problemMatcher": []
},
{
"label": "Check documentation with ubc (all variants)",
"detail": "Lint every variant with the reader that never runs conf.py",
"type": "shell",
"command": "${command:python.interpreterPath} -m pytest -m docs -k ubc",
"group": "test",
"problemMatcher": []
},
{
"label": "Open variant test report",
"detail": "Open the variant's overall test report in your web browser",
Expand All @@ -43,7 +95,7 @@
{
"label": "Open variant coverage report",
"detail": "Open the variant's overall coverage report in your web browser",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/reports/coverage/index.html",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/reports/html/build/${input:variant}/test/Debug/reports/coverage/index.html",
"type": "shell",
"presentation": {
"reveal": "always"
Expand All @@ -56,7 +108,7 @@
{
"label": "Open component test report",
"detail": "Open the component's test report in your web browser",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/${input:component}/reports/html/index.html",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/${input:component}/reports/html/doc/component_report.html",
"type": "shell",
"presentation": {
"reveal": "always"
Expand All @@ -69,7 +121,7 @@
{
"label": "Open component coverage report",
"detail": "Open the component's coverage report in your web browser",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/${input:component}/reports/coverage/index.html",
"command": "${workspaceFolder}/build/${input:variant}/test/Debug/reports/html/build/${input:variant}/test/Debug/${input:component}/reports/coverage/index.html",
"type": "shell",
"presentation": {
"reveal": "always"
Expand Down Expand Up @@ -111,6 +163,24 @@
"components/spled"
]
},
{
"type": "pickString",
"id": "buildKit",
"description": "Which build kit? (the test kit adds a variant's test suites to its component list)",
"options": [
"test",
"prod"
]
},
{
"type": "pickString",
"id": "docsTarget",
"description": "Which build shape? (reports additionally shows the generated test and coverage pages)",
"options": [
"docs",
"reports"
]
},
{
"type": "pickString",
"id": "buildType",
Expand Down
Loading
Loading