Releases: strictdoc-project/strictdoc
Several enhancements in Diff/Changelog and source node parsing, legacy @sdoc markers removed, several bug fixes, and improvements for edge cases
This release includes several enhancements, the removal of legacy @sdoc markers, several bug fixes, and improvements for edge cases.
The Diff/Changelog feature has been extended to support the new --generate-diff-git option which allows generating the Diff/Changelog screens for a given pair of Git revisions.
The legacy @sdoc marker has been removed from the codebase. From now on, only the @relation markers are recognized when linking requirements with source code files.
An edge case has been fixed where StrictDoc's FileFinder was detecting Linux pipe files that could not be processed meaningfully by StrictDoc’s source file generator. With this release, such files are now ignored.
The Diff/Changelog feature has been extended to better support change tracking of included documents. Previously, only the contents of included documents were visualized, but not the root nodes of the documents themselves. Now, changes to included documents, such as their UID or TITLE, are displayed correctly.
The ReqIF-to-SDoc converter has been improved to handle integer fields by treating them as string grammar fields. Since StrictDoc does not yet support INTEGER fields, they are converted to STRING fields during import. This workaround was sufficient to support the user’s use case. Thanks to @kerfallaCisse for reporting this issue.
The HTML2PDF generator has been fixed to correctly resolve document paths when printing a bundle document that includes other documents. This edge case involved a combination of three features — HTML2PDF, bundle documents, and composable documents — that had not previously been tested to work together. Thanks to @CMon for reporting this issue.
The source code node parser has been updated to recognize only those field names defined in the corresponding document grammar. This change prevents the parser from mistakenly interpreting unrelated FIELD: VALUE strings found in source code. In addition, several improvements have been made to the functionality that extracts SDoc nodes from source code comments, inspired by our proof-of-concept work on modeling Linux kernel requirements directly within the Linux source code. Some aspects of this work are not yet documented but will be once the overall concept becomes more mature. Many thanks to @haxtibal for contributing these improvements.
What's Changed
- Bump version to 0.14.0 by @stanislaw in #2501
- fix(FileFinder): ignore Linux pipe files by @stanislaw in #2502
- docs: clarify that single-line fields are not rendered by RST/LINK parser by @stanislaw in #2505
- fix(backend/reqif): improve handling of documents with no relations and treat integer fields as string grammar fields by @stanislaw in #2506
- fix(html2pdf_generator): resolve the document output path correctly by @stanislaw in #2508
- docs: update release notes, slide deck, roadmap and backlog by @stanislaw in #2509
- feat(html2pdf): enable correct resolution of LINKs when included document is printed to bundle document by @stanislaw in #2510
- trace: add missing traces between L2, source code and tests by @stanislaw in #2511
- trace: add missing traces between L2, source code and tests (focus on tests) by @stanislaw in #2512
- trace: add missing traces between L2, source code and tests (focus on tests - part 2) by @stanislaw in #2513
- trace: add traces for Create/Update node relation by @stanislaw in #2514
- trace: add itest traces to L2 ReqIF by @stanislaw in #2516
- chore(tests/end2end): remove all init.py files by @stanislaw in #2515
- trace: more traces to L2: ReqIF, clone node, delete node, tool identification by @stanislaw in #2517
- fix(backend/sdoc_source_code): general reader: always set function marker to entire file by @stanislaw in #2518
- feat(export/html): remove legacy --filter-sections, rename: --filter-requirements -> --filter-nodes by @stanislaw in #2519
- chore(export/html): drop the legacy 'passthrough' command, migrate itests to export --formats=sdoc by @stanislaw in #2520
- feat(server): generate only a source single file when requested, not all source files by @stanislaw in #2521
- chore(backend/sdoc_source_code): remove legacy @sdoc/nosdoc by @stanislaw in #2522
- feat(diff/changelog): support basic change tracking for included documents by @stanislaw in #2523
- feat(backend/sdoc_source_code): add support for multiline scope=line markers in Python code by @stanislaw in #2524
- feat(diff/changelog): cli: add generation of diff/changelog from a pair of Git revisions by @stanislaw in #2525
- feat(diff/changelog): add a quick shortcut to viewing HEAD^ vs HEAD and origin/main vs HEAD by @stanislaw in #2526
- Add sanity checks for source_nodes configuration by @haxtibal in #2527
- docs: update roadmap and workspace by @stanislaw in #2528
- fix(export/html2pdf): implement a proper handling of LINKs to documents in bundle and non-bundle documents by @stanislaw in #2533
- feat(backend/sdoc_source_code): tighten lark grammar for custom source nodes by @haxtibal in #2532
- docs: update release notes by @stanislaw in #2534
- chore: configure Dependabot for GitHub Actions and Python by @stanislaw in #2535
- chore: bump the github-actions group with 3 updates by @dependabot[bot] in #2536
- feat(core): introduce framework for user-defined plugins by @stanislaw in #2537
- chore: rename: DocumentCachingIterator -> SDocDocumentIterator by @stanislaw in #2538
- feat(backend/sdoc_source_code): Support merging sdoc nodes with soure nodes by @haxtibal in #2539
- feat: display node validations on the HTML screens by @stanislaw in #2541
- fix(export/html): Consider MARKUP = Text option in source file view by @haxtibal in #2545
- feat(backend/sdoc_source_code): Support remapping custom tags to sdoc fields by @haxtibal in #2543
- fix(backend/sdoc_source_code): Don't auto-generate sdoc nodes for function comments without fields by @haxtibal in #2547
- fix(backend/sdoc_source_code): Don't auto-generate sections for merged source nodes by @haxtibal in #2548
- docs: update release notes and roadmap by @stanislaw in #2550
New Contributors
- @dependabot[bot] made their first contribution in #2536
Full Changelog: 0.14.0...0.15.0
Python config file, improvements to parsing SDoc nodes from source files, removal of legacy Section/[SECTION], dropped Python 3.8 support.
This release introduces a new feature: configuring StrictDoc using a Python file instead of a TOML file, improvements to parsing SDoc nodes from source files, the removal of the legacy Section/[SECTION] element, dropped Python 3.8 support.
1) Parsing StrictDoc configuration from a Python file: StrictDoc can now be configured using a Python file rather than a TOML file. This new method (strictdoc_config.py) is intended to replace strictdoc.toml in the long term.
The rationale for this change is that configuring StrictDoc with a Python file provides more flexibility for users who need to:
- Create custom generators
- Remove existing generators
- Customize requirement and document tree validations
- Customize project statistics.
See 🔗 20.3. Migrating StrictDoc Configuration: Python Replaces TOML (2025 Q4) for migration instructions.
2) Parsing SDoc nodes from source files: The feature for parsing SDoc files from source code has been extended to support the SPDX-* syntax. This means that SDoc nodes can now be parsed not only from test files but also from source files.
3) Removal of legacy Section/[SECTION]: The legacy Section/[SECTION] element has been fully removed from the codebase, completing the migration to composite [[SECTION]] nodes. From now on, all projects using the old [SECTION] syntax will generate an error and receive a suggestion to migrate to the new syntax.
4) Dropped Python 3.8 support: We could stay with Python 3.8 a little longer, but several important pip packages that StrictDoc depends on have already dropped support for it, most notably tree-sitter and docutils.
What's Changed
- feat(tools): add a basic html2pdf4doc fuzzer for StrictDoc documents by @stanislaw in #2486
- chore(tests/end2end): migrate several tests from [SECTION] to [[SECTION]] by @stanislaw in #2487
- chore(tests/end2end): migrate several tests from [SECTION] to [[SECTION]] by @stanislaw in #2488
- chore(tests/end2end): migrate remaining tests from [SECTION] to [[SECTION]] by @stanislaw in #2489
- chore(tests/integration): migrate several itests from [SECTION] to [[SECTION]] by @stanislaw in #2490
- chore(tests/integration): migrate several itests from [SECTION] to [[SECTION]] by @stanislaw in #2491
- chore(tests/integration): migrate remaining itests from [SECTION] to [[SECTION]] by @stanislaw in #2492
- chore(export/html): remove unused is_section() from several templates by @stanislaw in #2493
- chore(export/html): remove unused is_section() from several templates by @stanislaw in #2494
- feat(backend/sdoc_source_code): parse SDoc nodes from source code with more flexible syntax by @stanislaw in #2495
- Code climate: remove unused code by @stanislaw in #2496
- chore: remove unused code, add missing coverage by @stanislaw in #2497
- feat(project_config): add a new option for reading configuration from a Python file instead of TOML by @stanislaw in #2498
- chore(pyproject.toml): drop Python 3.8 by @stanislaw in #2499
- feat(docs): store draw.io diagrams in Git, update release notes and dev plan by @stanislaw in #2500
Full Changelog: 0.13.0...0.14.0
New Tree Map visualization, handling of Unicode BOM markers
This release contains a new feature and several bug fixes.
A new experimental screen, Tree Map, provides visualizations of the overall document tree as well as requirements coverage by source files and tests. The visualization is based on a tree map graph generated using Plotly.js.
StrictDoc now correctly handles Unicode BOM (byte order mark) based on a user report. Previously, SDoc files with a BOM caused parsing errors because the parser did not recognize the marker. Although UTF-8 files normally do not contain BOMs, some tools (likely on Windows) may add them. StrictDoc now strips BOM markers from all input files before parsing, preventing errors if BOMs are present. Thanks to @ichsteffen for reporting this.
In the background, we have started removing the legacy Section/[SECTION] code. The core still supports the old [SECTION] syntax, but we are incrementally migrating all unit, integration, and end-to-end tests to the new [[SECTION]] syntax.
What's Changed
- chore(tools): import ECSS script: add basic usage instructions by @stanislaw in #2469
- fix(backend/sdoc/reader): recognize the UTF8 BOM marker and ignore it by @stanislaw in #2471
- Fix autogen image scaling by @mettta in #2473
- feat(export/html): add new screen with tree map-based visualizations by @stanislaw in #2474
- trace(features/tree_map): L2 requirement and traces by @stanislaw in #2475
- feat(features/tree_map): color code parents to green only if children trace to source files by @stanislaw in #2476
- Bump version to 0.13.0a1 by @stanislaw in #2477
- chore: remove legacy Section-related code from several components by @stanislaw in #2472
- fix(coverage_reports/gcov): update to new gcovr syntax by @stanislaw in #2479
- chore(test_reports/junit_xml_reader): remove dependency on legacy Section by @stanislaw in #2481
- docs: add 2025 ESA SW PAW presentation by @stanislaw in #2478
- chore(rst_to_html_fragment_writer): fix a deprecation warning by updating to new API by @stanislaw in #2482
- chore(all readers): switch to utf-8-sig to ignore BOM coming from some Windows tools by @stanislaw in #2480
- chore: remove dependency on legacy Section in multiple components by @stanislaw in #2483
- chore(tests/end2end): remove legacy Section from several tests by @stanislaw in #2484
- Bump version to 0.13.0 by @stanislaw in #2485
Full Changelog: 0.12.1...0.13.0
Minor HTML2PDF layout fixes
This bugfix release contains several HTML2PDF layout fixes.
What's Changed
- fix(html2pdf): Update narrative rules by @mettta in #2466
- fix(strictdoc.toml): enable html2pdf_strict mode by @stanislaw in #2467
- Bump version to 0.12.1 by @stanislaw in #2468
Full Changelog: 0.12.0...0.12.1
Improvement of source code line markers and HTML2PDF layout fixes
This release contains a change in how the source code line markers work, as well as several small HTML2PDF layout fixes.
The source code line markers were changed to include the next source line that follows immediately after the marker. As discussed with a user in #2434, this behavior of line markers makes more sense compared to the previous approach, which assumed that the source line had to be followed by a line marker, forcing both the source line and the marker to be on the same line. Thanks to @Mooan for initiating this discussion and contributing a pull request.
The HTML2PDF fixes include an important correction for an issue where running titles were not displayed on some pages in certain cases. For now, we have implemented a workaround, and the complete fix is being tracked in the upstream html2pdf4doc repository.
What's Changed
- Bump version to 0.11.2 by @stanislaw in #2452
- fix(backend/sdoc): do not generate auto-generated content with auto-uid and export/sdoc commands by @stanislaw in #2453
- fix(RST): do not exit(1) but raise RuntimeError by @stanislaw in #2454
- fix(html2pdf_generator): support printing RST as well as other markups by @stanislaw in #2455
- feat(HTML2PDF): integrate --strict mode, split normal tests and HTML2PDF tests by @stanislaw in #2456
- fix(sdoc_source_code): correct LineMarker range and add validations by @Mooan in #2458
- refactor(backend/sdoc_source_code): de-duplicate line_marker_processor by @stanislaw in #2460
- Disable backgrounds of problematic split sections (workaround for html2pdf4doc bug) by @mettta in #2462
- Preserve meta in narrative nodes and prevent split admonition. by @mettta in #2463
- fix(source_file_view_object.py): fix SourceMarkerTuple is_range_marker decision by @stanislaw in #2464
New Contributors
Full Changelog: 0.11.2...0.12.0
HTML2PDF strict option; auto-uid command-related bugfix
This release contains two enhancements.
-
The HTML2PDF functionality was updated to support the
html2pdf_strictconfig option, which controls whether the html2pdf4doc library validates the printed PDF pages. The only, but very important, validation added is the one that checks whether the number of PDF pages in the printed file equals the number of pages paginated by html2pdf4doc. We are still addressing some remaining edge cases related to image scaling and table splitting, and this validation helps detect those issues. Eventually, every project should be able to sethtml2pdf_stricttotrueand have all documents printed without any layout errors, even minor ones. Ifhtml2pdf_strictis set tofalse, the validation message is still printed, but it does not cause StrictDoc to terminate with a non-zero exit code. -
Parsing of SDoc nodes from source files was adjusted so that the manage auto-uid command no longer causes auto-generated content to be written back to the template SDoc files. Thanks to @johanenglund for reporting this issue.
What's Changed
- Bump version to 0.11.2 by @stanislaw in #2452
- fix(backend/sdoc): do not generate auto-generated content with auto-uid and export/sdoc commands by @stanislaw in #2453
- fix(RST): do not exit(1) but raise RuntimeError by @stanislaw in #2454
- fix(html2pdf_generator): support printing RST as well as other markups by @stanislaw in #2455
- feat(HTML2PDF): integrate --strict mode, split normal tests and HTML2PDF tests by @stanislaw in #2456
Full Changelog: 0.11.2...0.11.3
Bugfix release: Fix large TOC overflows
This release contains a single bug fix.
The html2pdf4doc_python library has been updated to the latest version, which includes a fix for a recent regression introduced in StrictDoc version 0.11.0 and html2pdf4doc_python version 0.0.19.
The bug report: Bug: Large TOC overflows into footer / header #46 <https://github.com/strictdoc-project/html2pdf4doc_python/issues/46>_.
Thanks to @thseiler for reporting this issue.
Full Changelog: 0.11.0...0.11.2
Performance optimizations for static HTML search
This release includes further optimizations of the static HTML search feature:
The size of the generated search index was reduced by using original integer identifiers instead of MID strings.
The page loading performance for very large documents improved by at least 2x through caching the search index in IndexedDB on the browser side.
The search index is now loaded only after the entire page has finished loading. This means that search is unavailable for very large pages until the search JavaScript has been loaded. We will look into improving this aspect of the user experience in the future.
What's Changed
- Bump version to 0.11.0 by @stanislaw in #2441
- refactor(anchors): skip auto-ID in node anchors by @mettta in #2442
- perf(HTML static search): reduce the size of the search index by 4x by @stanislaw in #2444
- perf(HTML static search): reduce the page load size by using IndexedDB storage by @stanislaw in #2445
- fix(HTML): improve how the relation fields are printed by @stanislaw in #2446
- Code climate: Set up a JS linter and reformat some files by @stanislaw in #2447
- about: update the slide deck by @stanislaw in #2448
Full Changelog: 0.11.0...0.11.1
Static HTML search and improvements to parallelization on macOS and Windows
This release includes the following enhancements and bug fixes.
A new static HTML search has been added to the HTML export, making it possible to search for content in documentation trees. The feature is currently available only in the static HTML export but will be added to the web interface in the future.
StrictDoc's Parallelizer class has been switched to a more modern and simpler ProcessPoolExecutor API. This change should resolve edge cases when running parallel processes on Windows and macOS. Previously, the StrictDoc parent process could occasionally hang because child processes were not always deallocated correctly.
A standalone Python script for exporting a complete set of European space standards (ECSS) has been added to the tools/ folder. The script generates a set of SDoc files from the ECSS Applicability Requirement Matrix (EARM) Excel file.
Numbering of math equations has been fixed for RST markup. Thanks to @thseiler for contributing this improvement.
What's Changed
- docs: IDE support: add Neovim/Tree-sitter by @stanislaw in #2404
- backend/sdoc_source_code: add validation for duplicated node UIDs by @stanislaw in #2405
- Code climate: mypy: fix some instances of no-untyped-call by @stanislaw in #2406
- Code climate: mypy: fix some more instances of no-untyped-call by @stanislaw in #2407
- Code climate: traceability_index: make document_tree non-optional by @stanislaw in #2408
- Code climate: mypy: fix several remaining union-attr issues by @stanislaw in #2409
- Code climate: mypy: fix several remaining union-attr issues by @stanislaw in #2410
- Code climate: mypy: fix several remaining union-attr issues by @stanislaw in #2411
- Pull requests list Code climate: mypy: fix several remaining union-attr issues by @stanislaw in #2412
- Code climate: mypy: fix several remaining union-attr issues by @stanislaw in #2413
- Code climate: mypy: traceability_index_builder: fix union-attr by @stanislaw in #2414
- Code climate: mypy: fix all 'misc' issues by @stanislaw in #2415
- Code climate: mypy: fix almost all --warn-unreachable issues by @stanislaw in #2416
- docs: add instructions for nix by @puzzlewolf in #2417
- backend/sdoc: make TEXT nodes work like any other nodes when validating MID by @stanislaw in #2419
- fix(parallelizer): switch to a more simple ProcessPoolExecutor API by @stanislaw in #2421
- about/StrictDoc_SlideDeck.pdf: master slide deck about StrictDoc by @stanislaw in #2422
- feat(tools): Python script to export ECSS EARM Excel to SDoc files by @stanislaw in #2423
- refactor(html_generator): do not run child processes if there is nothing to do by @stanislaw in #2424
- fix(_static/node_content.css): do not capitalize field names with CSS by @stanislaw in #2426
- docs: add links to the slide deck by @stanislaw in #2427
- Static export: fix script paths and handle missing elements by @mettta in #2431
- TOC highlighting: make hashchange/intersection handlers safe for empty/updating TOC by @mettta in #2432
- UI: fix math equation numbering by @thseiler in #2430
- test(integration): add a test case that works with a C++ test function by @stanislaw in #2437
- feat: Static HTML search by @stanislaw in #2433
- refactor(anchors): move copy/back-links markup from JS to template by @mettta in #2438
New Contributors
- @puzzlewolf made their first contribution in #2417
Full Changelog: 0.10.1...0.11.0
User-provided custom statistics generators, fix for updating HUMAN_TITLE in Edit Grammar Element UI, --debug option
This release includes the following enhancements and bugfixes.
1) Debug option to print detailed stack traces.
The --debug option has been added to all commands in the StrictDoc command-line interface. Without this option, StrictDoc prints only the error message and the source of the error. When the --debug option is provided, StrictDoc prints a detailed stack trace of the exception that caused the error.
2) User-provided custom statistics generator.
- Reworked how metrics are collected, stored, and rendered. Introduced Metric and MetricSection classes to encapsulate the metrics displayed on the Statistics screen.
- Added a configuration hook allowing users to specify a custom statistics generator. If provided, the custom generator overrides the default one.
- StrictDoc now includes its own statistics generator, which will be customized over time for its own documentation.
- Introduced four new metrics to the default statistics generator:
- Total source files
- Complete coverage
- Partial coverage
- No coverage.
3) Fix for updating HUMAN_TITLE in Edit Grammar Element UI.
This change removes a previously implemented "clever" optimization that skipped saving a grammar element if none of its fields appeared to be modified. Over time, this check became outdated due to the introduction of new grammar element features such as HUMAN_TITLE, PROPERTIES/IS_COMPOSITE, PROPERTIES/VIEW_STYLE, and others. As a result, the issue manifested as a no-op where updates, such as changing a HUMAN_TITLE, were not saved to disk after submitting the form.
Thanks to @zheylmun for reporting this issue.
What's Changed
- UI: Edit Grammar Element: support updating composite nodes and HUMAN_TITLE fields by @stanislaw in #2391
- docs: update the hello world example with a more realistic command by @stanislaw in #2395
- tasks: include docs/ to be checked by all lint tasks by @stanislaw in #2398
- cli: add a general --debug to print stacktraces when provided by @stanislaw in #2396
- project_statistics: support user-provided custom statistics generators by @stanislaw in #2397
- Code climate: export_action: fix all mypy issues by @stanislaw in #2400
- Code climate: project_config: fix all mypy issues by @stanislaw in #2401
- Code climate: mypy: address remaining arg-type issues by @thseiler in #2399
- docs: update release notes, add custom statistics, add L2 traces to statistics files by @stanislaw in #2402
- Bump version to 0.10.1 by @stanislaw in #2403
Full Changelog: 0.10.0...0.10.1