StrictDoc High-Level Requirements (L2)
1. SDoc data model
StrictDoc shall be based on a data model.
Designing StrictDoc with a goal of having a consistent data model ensures that the tool:
- can support a rich set of use cases,
- model the existing documentation templates used by the industries,
- interface well with other formats for storing documentation and requirements, e.g., ReqIF and SPDX.
Verification: data model diagram TBD.
StrictDoc's data model shall support modeling requirements.
StrictDoc's "Requirement" model shall support configurable fields system.
By default, the Requirement shall support the following fields:
- MID
- UID
- STATUS
- TITLE
- STATEMENT
- RATIONALE
- COMMENT.
These fields are the most typical fields found in requirement documents.
StrictDoc's data model shall support modeling documents.
StrictDoc's data model shall support a Document metadata model including at least:
- UID
- Document version
- Document classification
- Document authors.
StrictDoc's data model shall support configuring the document options:
- Enable/disable MID
- Markup choice, e.g., RST, HTML, etc.
- Levels (automatic or manual)
- Node style
- Default presentation view.
StrictDoc's data model shall support a concept of a "Section" which nests other Sections, Requirements, Texts.
"Section" corresponds to a chapter or a section in a document and helps to organize a document by grouping text nodes, requirements and other sections.
StrictDoc's data model shall support a "Free Text" model, representing non-normative documentation content.
Documentation comprises normative components, such as uniquely identifiable elements like requirements or design items, and non-normative components, including introductory text, overview chapters, and other content. The non-normative parts help provide a general understanding for the reader but do not contribute to traceability information. StrictDoc's free text is designed to store this type of non-normative information in SDoc documents.
StrictDoc's data model shall allow composing a Document from other Documents.
The logic behind the parent requirement remains fully relevant. Additionally, an alternative approach could involve using a dedicated entity, like "Fragment", to allow a Document to be composed of includable sections or document fragments. Managing composition at the Document level eliminates the need in additional entities like "Fragment", streamlining both the conceptual understanding and the practical implementation of composability.
The corresponding UI capability for Fragments CRUD is TBD.
- strictdoc/backend/sdoc/models/document.py, lines: 1-386, entire file
- strictdoc/backend/sdoc/models/document_from_file.py, lines: 1-102, entire file
- strictdoc/core/traceability_index_builder.py, lines: 814-867, range
- tests/integration/features/document_fragments/--included-documents/included_documents_option_not_provided/test.itest, lines: 1-32, entire file
- tests/integration/features/document_fragments/--included-documents/included_documents_option_provided/test.itest, lines: 1-40, entire file
- tests/integration/features/document_fragments/04_nested_fragments/test.itest, lines: 1-14, entire file
- tests/integration/features/document_fragments/05_nested_fragments_relations/test.itest, lines: 1-14, entire file
- tests/integration/features/document_fragments/10_nested_fragments_inserted_to_section/test.itest, lines: 1-18, entire file
- tests/integration/features/document_fragments/20_included_documents_in_nested_folders/test.itest, lines: 1-36, entire file
- tests/integration/features/document_fragments/30_multiple_inclusion_of_document/test.itest, lines: 1-15, entire file
- tests/integration/features/document_fragments/40_DOCUMENT_FROM_FILE_in_SECTION/test.itest, lines: 1-13, entire file
- tests/integration/features/document_fragments/_validations/01_document_file_path_must_be_sdoc/test.itest, lines: 1-7, entire file
- tests/integration/features/document_fragments/_validations/02_document_file_path_must_be_valid/test.itest, lines: 1-7, entire file
- tests/integration/features/document_fragments/_validations/03_document_file_must_be_included_once/test.itest, lines: 1-7, entire file
The StrictDoc data model shall support connecting requirements using Parent and Child relations.
Support of both Parent and Child relations allows to build typical requirements relations such as child-to-parent and less common relations when one document can have parent links to a parent document and child links to a child document (e.g., the so-called "compliance" or "tailoring matrix" documents may use this structure).
Each SDoc relation shall be optionally configurable with a relation role.
NOTE: A relation role is a string value. Typical examples: "refines", "verifies", "implements".
StrictDoc shall support referencing any node by embedding a hyperlink within the text content of another node.
The inline links do not replace the relations between SDoc nodes. Instead, an inline link could be an easy way to refer from one textual node to a chapter or a document. A common use case is "See section ABC for more details".
StrictDoc shall support adding anchors within the text content of any node, such that these anchors can be referenced by inline links from other nodes.
Anchors allow authors to define precise reference points within SDoc node fields.
2. SDoc text markup
StrictDoc shall implement its own text markup language called S-Doc (strict-doc).
The most commonly used Markdown format lacks the ability to store requirements metadata. While the RST syntax does allow for customization with directives to implement metadata extensions, its visual appearance contradicts other requirements of StrictDoc, such as the type-safety of the grammar and visual readability. Therefore, a markup language tailored specifically to the needs of the requirements tool provides direct control over the capabilities implemented in both the markup and the user interface.
- strictdoc/backend/sdoc/grammar/grammar.py, lines: 1-241, entire file
- strictdoc/backend/sdoc/grammar/grammar.py, lines: 1-241, entire file
- strictdoc/backend/sdoc/grammar/grammar_builder.py, lines: 1-59, entire file
- strictdoc/backend/sdoc/processor.py, lines: 1-223, entire file
- strictdoc/backend/sdoc/reader.py, lines: 1-142, entire file
- strictdoc/backend/sdoc/writer.py, lines: 1-603, entire file
StrictDoc shall ensure that identical SDoc content is produced every time StrictDoc reads an SDoc file and then writes it to another SDoc file.
A consistent import/export roundtrip implementation and testing reduces the risk of the SDoc bi-directional import/export corruption.
- tests/unit/strictdoc/backend/sdoc/test_dsl_parent_document_assignment.py, lines: 1-52, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough.py, lines: 1-1308, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough.py, lines: 1-1308, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_document_views.py, lines: 1-49, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_document_views.py, lines: 1-49, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_grammar.py, lines: 1-567, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_grammar.py, lines: 1-567, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_grammar_from_file.py, lines: 1-32, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_new_composite.py, lines: 1-32, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_new_section_composite_syntax.py, lines: 1-48, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_relations.py, lines: 1-188, entire file
- tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_relations.py, lines: 1-188, entire file
StrictDoc shall assume and implement capabilities for storage of SDoc files using Git version control system.
The SDoc markup content shall be stored in files with .sdoc extension.
Given that the name of the model is S-Doc (strict-doc), it is reasonable to make the document files have the .sdoc extension. This helps to identify the document files.
StrictDoc's SDoc file shall represent content of a single document.
A "Document" corresponds to a "Document" of the SDoc data model.
StrictDoc's markup language shall be based on a well-defined grammar.
The StrictDoc grammar shall have at least the following fields activated by default:
- UID
- STATUS
- TITLE
- STATEMENT
- RATIONALE
- COMMENT
- RELATIONS (references to other requirements)
The SDoc markup shall support custom grammars.
A custom grammar allows a user to define their own configuration of requirement fields.
StrictDoc shall support an inclusion of a grammar stored in a separate file.
A single grammar defined for several documents helps to standardize the structure of all documents in a documentation tree and removes the effort needed to create identical grammars all the time.
The SDoc markup shall only accept UID identifiers that consist of alphanumeric characters separated by a limited set of ("_", "-", ".") characters (TBD).
A standardized UID format supports easier unique identification of requirements. It is easier to visually identify UIDs that look similar and common to a given industry.
This requirement may need a revision to accommodate for more UID formats.
StrictDoc shall render supported markup formats (at least RST and Markdown) to HTML fragments via dedicated format-specific writers selected by markup type.
StrictDoc's markup language shall support integration with MathJax.
SDoc text markup blocks shall all start from column 1, i.e., the nesting of the blocks is not allowed.
Nesting large text blocks of free text and requirements compromises readability.
SDoc markup shall provide "type safety" for all fields.
NOTE: "Type safety" means that each field has a type and a corresponding set of validation checks.
3. Markdown markup
StrictDoc shall support Markdown markup.
Markdown is the most popular markup language among programmers. Compared to the StrictDoc native SDoc markup, Markdown is much more familiar to developers, which lowers the entry barrier for writing formal requirements with StrictDoc or other tools. It is also used extensively by AI tools.
4. Graph database
StrictDoc shall maintain a complete Traceability Index of all documentation- and requirements-related information available in a project tree.
- strictdoc/core/file_traceability_index.py, lines: 1-1434, entire file
- strictdoc/core/graph_database.py, lines: 1-120, entire file
- strictdoc/core/traceability_index.py, lines: 1-1435, entire file
- strictdoc/core/traceability_index_builder.py, lines: 1-979, entire file
- tests/unit/strictdoc/core/test_delete_document_validation.py, lines: 1-88, entire file
- tests/unit/strictdoc/core/test_graph_database.py, lines: 1-122, entire file
- tests/unit/strictdoc/core/test_traceability_index.py, lines: 1-486, entire file
For each requirement node, the Traceability Index shall ensure its uniqueness throughout the node's lifecycle.
The requirement ensures that the Traceability Index takes of care of validating the uniqueness of all nodes in a document/requirements graph.
- strictdoc/core/traceability_index_builder.py, lines: 546-576, range
- tests/integration/features/sdoc/graph_consistency/01_requirement_exists_in_two_different_docs/test.itest, lines: 1-6, entire file
- tests/integration/features/sdoc/graph_consistency/02_requirement_exists_two_times_in_the_same_doc/test.itest, lines: 1-6, entire file
- tests/integration/features/sdoc/graph_consistency/03_section_uid_exists_in_two_different_docs/test.itest, lines: 1-6, entire file
The Traceability Index shall detect cycles between requirements.
- strictdoc/backend/sdoc/errors/document_tree_error.py, lines: 1-35, entire file
- strictdoc/core/traceability_index_builder.py, lines: 759-804, range
- strictdoc/core/tree_cycle_detector.py, lines: 1-88, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_2_requirements_add_child_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_2_requirements_add_parent_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_3_requirements_add_child_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_3_requirements_add_parent_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_not_possible_parent_and_child_relation_same_uid/test_case.py, lines: 1-82, entire file
- tests/integration/features/sdoc/graph_consistency/04_requirement_link_cycles_two_reqs/test.itest, lines: 1-8, entire file
- tests/integration/features/sdoc/graph_consistency/05_requirement_link_cycles_4_reqs/test.itest, lines: 1-8, entire file
- tests/integration/features/sdoc/graph_consistency/08_requirement_child_link_cycle/test.itest, lines: 1-8, entire file
- tests/unit/strictdoc/core/test_traceability_index_cycles.py, lines: 1-303, entire file
The Traceability Index shall recognize and maintain the relations between all documents of a project tree.
The relations between all documents are a summary of all relations between these documents' requirements. This information is useful for:
- Structural analysis of a requirements/documents graph.
- Incremental regeneration of only those documents whose content was modified.
The StrictDoc's graph database shall maintain the requirement relations and their reverse relations as follows:
- For a Parent relation, the database shall calculate the reverse Child relation.
- For a Child relation, the database shall calculate the reverse Parent relation.
The calculation of the reverse relations allows the user interface code to get and display both requirement's parent and child relations.
Example: If a child requirement REQ-002 has a parent requirement REQ-001, the graph database first reads the link REQ-002 -Parent> REQ-001, then it creates a corresponding REQ-001 -Child> REQ-002 on the go. Both relations can be queried as follows, in pseudocode:
get_parent_requirements(REQ-002) == [REQ-001] get_children_requirements(REQ-001) == [REQ-002]
5. Documentation tree
StrictDoc shall discover SDoc documents recursively based on a specified input path.
Recursive search allows working with documents located in multiple folders, potentially spanning over several Git repositories.
6. Web/HTML frontend
6.1. General export requirements
StrictDoc shall support generating requirements documentation into static HTML.
StrictDoc shall provide a web interface.
StrictDoc shall support concurrent use and editing of a single StrictDoc web server instance by multiple users.
For all export operations, StrictDoc shall maintain the original filenames of the documents when producing output files.
Name preservation helps to visually identify which input file an output file corresponds to.
6.2. Screen: Project tree
StrictDoc's "Project tree" screen shall provide browsing of a documentation project tree.
This screen is the main tool for visualizing the project tree structure.
- strictdoc/features/project_index/assets/project_tree.js, lines: 1-399, entire file
- strictdoc/features/project_index/generator.py, lines: 1-28, entire file
- strictdoc/features/project_index/view_object.py, lines: 1-126, entire file
- tests/end2end/screens/project_index/view_dashboard_paths_reveal_external_prefix/test_case.py, lines: 1-39, entire file
- tests/end2end/screens/project_index/view_project_tree/view_project_tree_empty_tree/test_case.py, lines: 1-25, entire file
StrictDoc's Project Tree screen shall allow creating documents.
- strictdoc/server/routers/main_router.py, lines: 2714-2731, function create_main_router.get_new_document()
- strictdoc/server/routers/main_router.py, lines: 2906-3050, function create_main_router.document_tree__create_document()
- tests/end2end/screens/project_index/create_document/_validation/create_document_validate_document_path_inside_of_exclude_filter/test_case.py, lines: 1-47, entire file
- tests/end2end/screens/project_index/create_document/_validation/create_document_validate_document_path_outside_of_include_filter/test_case.py, lines: 1-47, entire file
- tests/end2end/screens/project_index/create_document/_validation/create_document_validate_document_path_with_bad_chars/test_case.py, lines: 1-38, entire file
- tests/end2end/screens/project_index/create_document/_validation/create_document_validate_empty_document_path/test_case.py, lines: 1-37, entire file
- tests/end2end/screens/project_index/create_document/_validation/create_document_validate_empty_document_title/test_case.py, lines: 1-37, entire file
- tests/end2end/screens/project_index/create_document/create_document_normal_flow/test_case.py, lines: 1-55, entire file
StrictDoc's Project Tree screen shall allow deleting documents.
6.3. Screen: Document (DOC)
StrictDoc's Document screen shall arrange all CRUD operations according to the input document format.
Example: If an SDoc document is read from a Markdown file using a dedicated reader, it shall be written back using a Markdown writer.
StrictDoc's Document screen shall allow reading documents.
- strictdoc/export/html/generators/document.py, lines: 1-41, entire file
- strictdoc/export/html/generators/view_objects/document_screen_view_object.py, lines: 1-777, entire file
- tests/end2end/screens/document/view_document/_grammar_from_file/view_document_with_grammar_from_file/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/view_document/view_document_display_png_image/test_case.py, lines: 1-34, entire file
- tests/end2end/screens/document/view_document/view_document_display_rst_directive_wildcard_image/test_case.py, lines: 1-34, entire file
- tests/end2end/screens/document/view_document/view_document_display_rst_directive_wildcard_image_nested_dir/test_case.py, lines: 1-34, entire file
- tests/end2end/screens/document/view_document/view_document_display_svg_image/test_case.py, lines: 1-34, entire file
- tests/end2end/screens/document/view_document/view_document_empty/test_case.py, lines: 1-32, entire file
- tests/end2end/screens/document/view_document/view_document_when_document_has_freetext/test_case.py, lines: 1-32, entire file
- tests/end2end/screens/document/view_document/view_document_with_markdown_mermaid/test_case.py, lines: 1-37, entire file
- tests/end2end/screens/document/view_document/view_document_with_one_requirement/test_case.py, lines: 1-34, entire file
StrictDoc's Document screen shall allow creating document nodes.
- tests/end2end/screens/document/create_requirement/_MultipleChoice/create_requirement_MultipleChoice_field_using_autocomplete/test_case.py, lines: 1-84, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/_validations/create_section_must_validate_empty_name/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/_validations/create_section_with_nonunique_uid/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/_validations/create_two_section_with_same_uid/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/_validations/create_two_sections_then_update_with_same_uid/test_case.py, lines: 1-66, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_first_section/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_section_after_requirement/test_case.py, lines: 1-55, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_section_before_section/test_case.py, lines: 1-60, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_section_cancel_new_section/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_section_three_nested_sections/test_case.py, lines: 1-77, entire file
- tests/end2end/screens/document/create_requirement/_SECTION/create_section_two_sibling_sections/test_case.py, lines: 1-71, entire file
- tests/end2end/screens/document/create_requirement/_SingleChoice/create_requirement_SingleChoice_field_using_autocomplete/test_case.py, lines: 1-77, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_autocomplete_no_duplicates/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_autocomplete_no_matches/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_using_autocomplete/test_case.py, lines: 1-88, entire file
- tests/end2end/screens/document/create_requirement/_arbitrary_elements/create_requirement_create_test_element_after_test_element/test_case.py, lines: 1-57, entire file
- tests/end2end/screens/document/create_requirement/_arbitrary_elements/create_requirement_create_test_element_before_test_element/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/create_requirement/_arbitrary_elements/create_requirement_create_test_element_in_section/test_case.py, lines: 1-64, entire file
- tests/end2end/screens/document/create_requirement/_arbitrary_elements/create_requirement_create_test_element_in_top_level_document/test_case.py, lines: 1-56, entire file
- tests/end2end/screens/document/create_requirement/_arbitrary_elements/create_requirement_create_test_element_with_custom_field_in_top_level_document/test_case.py, lines: 1-56, entire file
- tests/end2end/screens/document/create_requirement/_autouid_and_PREFIX/create_requirement_dont_generate_autouid_first_and_second_requirement_when_no_prefix/test_case.py, lines: 1-78, entire file
- tests/end2end/screens/document/create_requirement/_autouid_and_PREFIX/create_requirement_generate_autouid_first_and_second_requirement/test_case.py, lines: 1-78, entire file
- tests/end2end/screens/document/create_requirement/_autouid_and_PREFIX/create_requirement_generate_autouid_first_and_second_requirement_inside_section/test_case.py, lines: 1-78, entire file
- tests/end2end/screens/document/create_requirement/_autouid_and_PREFIX/create_requirement_generate_autouid_first_and_second_requirement_two_different_documents/test_case.py, lines: 1-78, entire file
- tests/end2end/screens/document/create_requirement/_autouid_and_PREFIX/create_requirement_generate_autouid_when_requirement_with_another_prefix_exists/test_case.py, lines: 1-65, entire file
- tests/end2end/screens/document/create_requirement/_comments/create_requirement_with_comments/test_case.py, lines: 1-79, entire file
- tests/end2end/screens/document/create_requirement/_mid/_validations/create_requirement__mid__create_requirement_with_duplicate_mid/test_case.py, lines: 1-55, entire file
- tests/end2end/screens/document/create_requirement/_mid/create_requirement__mid__create_requirement_with_mid_auto_generated/test_case.py, lines: 1-56, entire file
- tests/end2end/screens/document/create_requirement/_mid/update_requirement__mid__update_requirement_preserves_mid/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/create_requirement/_validation/create_requirement_must_validate_rst_wildcard_image_not_found/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/create_requirement/_validation/create_requirement_validate_at_least_one_field_present/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/create_requirement/_validation/create_requirement_validate_malformed_rst_statement/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/create_requirement/_validation/create_requirement_validate_no_statement_if_grammar_has_required_statement/test_case.py, lines: 1-56, entire file
- tests/end2end/screens/document/create_requirement/_validation/create_requirement_validate_uid_already_exists/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_after_section/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_cancel_new_requirement/test_case.py, lines: 1-44, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_in_section/test_case.py, lines: 1-64, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_in_top_level_document/test_case.py, lines: 1-106, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_sanitize_trailing_symbols/test_case.py, lines: 1-54, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_with_rst_image/test_case.py, lines: 1-50, entire file
- tests/end2end/screens/document/create_requirement/create_requirement_with_rst_wildcard_image/test_case.py, lines: 1-50, entire file
- tests/end2end/screens/document/create_requirement/create_three_nested_requirements/test_case.py, lines: 1-87, entire file
StrictDoc shall support cloning nodes from existing nodes.
Simplifies the creation of similar nodes.
StrictDoc's Document screen shall allow update document content.
- strictdoc/core/transforms/update_requirement.py, lines: 1-585, entire file
- strictdoc/export/html/form_objects/requirement_form_object.py, lines: 1-1070, entire file
- strictdoc/server/routers/main_router.py, lines: 747-804, function create_main_router.get_edit_requirement()
- strictdoc/server/routers/main_router.py, lines: 860-1005, function create_main_router.document__update_requirement()
- strictdoc/server/routers/main_router.py, lines: 2429-2475, function create_main_router.cancel_edit_requirement()
- tests/end2end/screens/document/update_node/_MultipleChoice/update_requirement_MultipleChoice_field_using_autocomplete/test_case.py, lines: 1-69, entire file
- tests/end2end/screens/document/update_node/_MultipleChoice/update_requirement_must_not_save_INCORRECT_MultipleChoice_value/test_case.py, lines: 1-44, entire file
- tests/end2end/screens/document/update_node/_MultipleChoice/update_requirement_must_sanitize_MultipleChoice_separation/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/_MultipleChoice/update_requirement_saves_empty_MultipleChoice_value/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/_REQUIREMENT_STYLE/update_requirement_edit_table_style_requirement/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/update_node/_SECTION/_autouid/update_node_section_generate_auto_uid/test_case.py, lines: 1-50, entire file
- tests/end2end/screens/document/update_node/_SECTION/_autouid/update_node_section_generate_auto_uid_duplicate_section_title/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/_SECTION/_validation/update_section_create_two_duplicate_uids/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/update_node/_SECTION/_validation/update_section_create_uid_that_already_exists/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/_SECTION/_validation/update_section_with_empty_title/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/_SECTION/update_section_cancel_edit_nested_section/test_case.py, lines: 1-41, entire file
- tests/end2end/screens/document/update_node/_SECTION/update_section_cancel_edit_section/test_case.py, lines: 1-41, entire file
- tests/end2end/screens/document/update_node/_SECTION/update_section_nominal_fields_editing/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/_SECTION/update_section_update_uid/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/_validation/update_requirement_must_not_save_INCORRECT_SingleChoice_value/test_case.py, lines: 1-44, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/update_requirement_SingleChoice_field_using_autocomplete/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/update_requirement_basic_update_of_SingleChoice_value/test_case.py, lines: 1-45, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/update_requirement_saves_TBD_as_acceptable_SingleChoice_value/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/update_requirement_saves_empty_SingleChoice_value/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/_Tag/update_requirement_Tag_field_using_autocomplete/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/update_node/_arbitrary_elements/update_node_add_relation_between_two_custom_nodes/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/update_node/_arbitrary_elements/update_node_delete_relation_between_two_custom_nodes/test_case.py, lines: 1-57, entire file
- tests/end2end/screens/document/update_node/_arbitrary_elements/update_requirement_edit_custom_node_statement/test_case.py, lines: 1-49, entire file
- tests/end2end/screens/document/update_node/_comments/update_requirement_add_comment/test_case.py, lines: 1-67, entire file
- tests/end2end/screens/document/update_node/_comments/update_requirement_add_empty_to_two_existing_comments/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/update_node/_comments/update_requirement_remove_comment/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/update_node/_comments/update_requirement_remove_one_of_three_comments/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/update_node/_singleline_vs_multiline/update_node_edit_singlechoice_as_last_grammar_element_field/test_case.py, lines: 1-47, entire file
- tests/end2end/screens/document/update_node/_singleline_vs_multiline/update_node_edit_status_as_last_grammar_element_field/test_case.py, lines: 1-47, entire file
- tests/end2end/screens/document/update_node/_validation/update_node_must_prevent_renaming_UID_to_an_existing_UID/test_case.py, lines: 1-45, entire file
- tests/end2end/screens/document/update_node/_validation/update_requirement_must_not_save_empty_required_field/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/_validation/update_requirement_must_validate_empty_REQUIRED_fields/test_case.py, lines: 1-54, entire file
- tests/end2end/screens/document/update_node/_validation/update_requirement_statement_malformed_rst/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/update_node/update_requirement_cancel_edit_requirement/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/update_node/update_requirement_editing_statement_only/test_case.py, lines: 1-49, entire file
- tests/end2end/screens/document/update_node/update_requirement_escape_html_in_statement/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/update_node/update_requirement_reescape_html_by_validations/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/update_node/update_requirement_remove_uid_then_create_new_requirement/test_case.py, lines: 1-60, entire file
- tests/end2end/screens/document/update_node/update_requirement_sanitize_trailing_symbols/test_case.py, lines: 1-54, entire file
- tests/end2end/screens/document/update_node/update_requirement_toc_add_title_to_node_without_title/test_case.py, lines: 1-67, entire file
- tests/end2end/screens/document/update_node/update_requirement_toc_remove_title_from_node/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/update_node/update_requirement_toc_remove_title_from_node_MARKDOWN/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/update_node/update_requirement_uid_reset_button/test_case.py, lines: 1-76, entire file
- tests/end2end/screens/document/update_node/update_requirement_uid_reset_button_PREFIX_None/test_case.py, lines: 1-79, entire file
- tests/end2end/screens/document/update_node/update_requirement_update_title_statement_rationale/test_case.py, lines: 1-70, entire file
- tests/end2end/screens/document/update_node/update_requirement_when_HTML_markup/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/update_node/update_requirement_when_MARKDOWN_markup/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/update_node/update_requirement_when_MARKDOWN_markup_statement_with_multiple_paragraphs/test_case.py, lines: 1-53, entire file
- tests/unit/strictdoc/core/transforms/test_update_requirement.py, lines: 1-520, entire file
- tests/unit/strictdoc/export/html/form_objects/test_requirement_form_object_markup_validation.py, lines: 1-105, entire file
StrictDoc's Document screen shall support the deletion of document nodes.
- tests/end2end/screens/document/delete_document/delete_document_with_incoming_parent_node_link/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/document/delete_document/delete_document_with_no_dependencies/test_case.py, lines: 1-37, entire file
- tests/end2end/screens/document/delete_node/_SECTION/_validation/delete_section_that_has_incoming_LINKs/test_case.py, lines: 1-44, entire file
- tests/end2end/screens/document/delete_node/_SECTION/delete_simple_non_nested_section/test_delete_simple_non_nested_section.py, lines: 1-41, entire file
- tests/end2end/screens/document/delete_node/_validation/delete_node_must_prevent_deletion_when_children_have_incoming_parent_RELATIONs/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/delete_node/_validation/delete_node_must_prevent_deletion_when_incoming_parent_RELATIONs/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/document/delete_node/_validation/delete_node_that_has_incoming_LINKs/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/document/delete_node/_validation/delete_node_with_ANCHOR_that_has_incoming_LINKs/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/document/delete_node/delete_node_delete_existing/test_case.py, lines: 1-39, entire file
- tests/end2end/screens/document/delete_node/delete_node_delete_newly_created/test_case.py, lines: 1-64, entire file
StrictDoc's Document screen shall creating updating node relations.
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/_validations/create_requirement_validate_relation_parent_does_not_exist/test_case.py, lines: 1-65, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/_validations/create_requirement_validate_relation_source_must_have_uid/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/_validations/create_requirement_validate_relation_target_requirement_document_supports_relation/test_case.py, lines: 1-82, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/create_requirement_with_relation_and_role_to_existing_requirement/test_case.py, lines: 1-65, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/create_requirement_with_relation_to_existing_requirement/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/create_requirement_with_relation_to_existing_requirement_in_another_document/test_case.py, lines: 1-66, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/create_requirement_with_relation_using_uid_autocomplete/test_case.py, lines: 1-66, entire file
StrictDoc's Document screen shall allow updating node relations.
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_2_requirements_add_child_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_2_requirements_add_parent_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_3_requirements_add_child_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_3_requirements_add_parent_link_with_cycle/test_case.py, lines: 1-85, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/_cycles/update_requirement_validate_not_possible_parent_and_child_relation_same_uid/test_case.py, lines: 1-82, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/update_requirement_linking_requirement_must_have_uid/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/update_requirement_parent_uid_does_not_exist/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/_validations/update_requirement_parent_uid_must_not_be_empty/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_one_child_link_with_role/test_case.py, lines: 1-58, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_one_link/test_case.py, lines: 1-80, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_one_link_with_trailing_spaces/test_case.py, lines: 1-81, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_one_parent_link_with_role/test_case.py, lines: 1-82, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_second_child_link_with_role/test_case.py, lines: 1-56, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_second_parent_link_with_role/test_case.py, lines: 1-58, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_add_three_links/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_remove_child_link/test_case.py, lines: 1-64, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_remove_parent_link/test_case.py, lines: 1-64, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_renaming_uid_when_child_links_exist/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_renaming_uid_when_parent_links_exist/test_case.py, lines: 1-49, entire file
- tests/end2end/screens/document/_cross_cutting/RELATIONS/update_node/update_requirement_two_documents_removing_link/test_case.py, lines: 1-66, entire file
StrictDoc's Document screen shall provide a capability to move the nodes within a document.
Moving the nodes within a document is a convenience feature that speeds up the requirements editing process significantly.
StrictDoc's screen shall allow editing a document's grammar.
Editing document grammar allows a user to customize the requirements fields.
- strictdoc/core/transforms/update_grammar.py, lines: 1-63, entire file
- strictdoc/core/transforms/update_grammar_element.py, lines: 1-132, entire file
- strictdoc/export/html/form_objects/grammar_element_form_object.py, lines: 1-534, entire file
- strictdoc/export/html/form_objects/grammar_form_object.py, lines: 1-240, entire file
- strictdoc/export/html/form_objects/rows/row_with_grammar_element_form_object.py, lines: 1-40, entire file
- strictdoc/server/routers/main_router.py, lines: 3630-3649, function create_main_router.document__edit_grammar()
- strictdoc/server/routers/main_router.py, lines: 3654-3738, function create_main_router.document__save_grammar()
- strictdoc/server/routers/main_router.py, lines: 3743-3761, function create_main_router.document__add_grammar_element()
- strictdoc/server/routers/main_router.py, lines: 3766-3791, function create_main_router.document__edit_grammar_element()
- strictdoc/server/routers/main_router.py, lines: 3796-3883, function create_main_router.document__save_grammar_element()
- strictdoc/server/routers/main_router.py, lines: 3888-3911, function create_main_router.document__add_grammar_field()
- strictdoc/server/routers/main_router.py, lines: 3916-3939, function create_main_router.document__add_grammar_relation()
- tests/end2end/screens/document/edit_document_grammar/_validations/edit_grammar_validation_add_new_element_title_must_be_uppercase/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/edit_document_grammar/edit_document_grammar_save_without_editing/test_case.py, lines: 1-44, entire file
- tests/end2end/screens/document/edit_document_grammar/edit_grammar_add_new_element/test_case.py, lines: 1-50, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_arbitrary_elements/edit_grammar_test_case_add_new_field/test_case.py, lines: 1-54, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/_validations/update_grammar_add_second_general_relation/test_case.py, lines: 1-59, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/_validations/update_grammar_add_second_non_general_relation/test_case.py, lines: 1-68, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/_validations/update_grammar_validate_remove_last_relation/test_case.py, lines: 1-68, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/update_grammar_add_new_child_relation/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/update_grammar_add_new_relation/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/update_grammar_element_noop/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/update_grammar_noop_save_preserves_relations/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_relations/update_grammar_with_new_relation_preserves_requirements_relations/test_case.py, lines: 1-59, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_validation/edit_grammar_add_empty_field/test_case.py, lines: 1-61, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_validation/edit_grammar_add_two_fields_same_name/test_case.py, lines: 1-70, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_validation/edit_grammar_validation_field_name_must_be_uppercase/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/edit_document_grammar_element/_validation/edit_grammar_validation_rename_field_to_existing_field_name/test_case.py, lines: 1-64, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_field_move_up_and_down_save/test_case.py, lines: 1-76, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_field_move_up_save/test_case.py, lines: 1-70, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_human_title/test_case.py, lines: 1-66, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_human_title_TEXT_node/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_new_field/test_case.py, lines: 1-55, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_add_three_fields/test_case.py, lines: 1-70, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_back_button/test_case.py, lines: 1-57, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_delete_existing_field/test_case.py, lines: 1-63, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_move_field_down/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_move_field_up/test_case.py, lines: 1-60, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_rename_field/test_case.py, lines: 1-66, entire file
- tests/end2end/screens/document/edit_document_grammar_element/edit_grammar_rename_field_human_title/test_case.py, lines: 1-66, entire file
StrictDoc's Document screen shall provide controls for configuring the document-specific options.
- strictdoc/core/transforms/update_document_config.py, lines: 1-196, entire file
- strictdoc/export/html/form_objects/document_config_form_object.py, lines: 1-195, entire file
- strictdoc/server/routers/main_router.py, lines: 3259-3291, function create_main_router.document__edit_config()
- strictdoc/server/routers/main_router.py, lines: 3355-3450, function create_main_router.document__save_edit_config()
- strictdoc/server/routers/main_router.py, lines: 3537-3582, function create_main_router.document__cancel_edit_config()
- tests/end2end/screens/document/update_document_config/_validations/update_document_config_empty_title/test_case.py, lines: 1-45, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_cancel/test_case.py, lines: 1-40, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_classification/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_document_title/test_case.py, lines: 1-49, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_metadata/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_requirement_prefix/test_case.py, lines: 1-41, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_uid/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/document/update_document_config/update_document_config_version/test_case.py, lines: 1-43, entire file
StrictDoc's Document screen shall provide controls for automatic generation of requirements UIDs.
StrictDoc's Document screen shall provide controls for automatic completion of requirements UIDs.
The automatic completion can be especially useful when a user has to fill in a parent relation UID.
- strictdoc/server/routers/main_router.py, lines: 4300-4365, function create_main_router.get_autocomplete_uid_results()
- tests/end2end/screens/document/_cross_cutting/RELATIONS/create_node/create_requirement_with_relation_using_uid_autocomplete/test_case.py, lines: 1-66, entire file
- tests/end2end/screens/document/create_requirement/_MultipleChoice/create_requirement_MultipleChoice_field_using_autocomplete/test_case.py, lines: 1-84, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_autocomplete_no_duplicates/test_case.py, lines: 1-53, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_autocomplete_no_matches/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/create_requirement/_Tag/create_requirement_Tag_field_using_autocomplete/test_case.py, lines: 1-88, entire file
- tests/end2end/screens/document/update_node/_MultipleChoice/update_requirement_MultipleChoice_field_using_autocomplete/test_case.py, lines: 1-69, entire file
- tests/end2end/screens/document/update_node/_SingleChoice/update_requirement_SingleChoice_field_using_autocomplete/test_case.py, lines: 1-62, entire file
- tests/end2end/screens/document/update_node/_Tag/update_requirement_Tag_field_using_autocomplete/test_case.py, lines: 1-61, entire file
StrictDoc shall provide a "copy text to buffer" button for all requirement's text fields.
6.4. Screen: Table (TBL)
StrictDoc's Table screen shall allow reading documents in a table-like manner.
- strictdoc/export/html/generators/document_table.py, lines: 1-41, entire file
- strictdoc/export/html/generators/document_table.py, lines: 1-41, entire file
- tests/end2end/screens/table/view_table_document/view_table_document_document_has_content/test_case.py, lines: 1-38, entire file
- tests/end2end/screens/table/view_table_document/view_table_document_document_has_no_content/test_case.py, lines: 1-58, entire file
6.5. Screen: Traceability (TR)
StrictDoc shall provide a single document-level traceability screen.
NOTE: This screen helps to read a document like a normal document while the traceability to this document's parent and child elements is visible at the same time.
- strictdoc/features/trace/generator.py, lines: 1-41, entire file
- tests/end2end/screens/traceability/view_traceability_document/view_traceability_document_document_has_content/test_case.py, lines: 1-38, entire file
- tests/end2end/screens/traceability/view_traceability_document/view_traceability_document_document_has_no_content/test_case.py, lines: 1-38, entire file
6.6. Screen: Deep traceability (DTR)
StrictDoc shall provide a deep traceability screen.
- strictdoc/features/deep_trace/generator.py, lines: 1-41, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_go_from_requirement_card_to_requirement_in_document_view/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_go_from_requirement_card_to_requirement_in_document_view_another_document/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_requirement_show_more_modal_window/test_case.py, lines: 1-73, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_statement_with_inline_csv_table/test_case.py, lines: 1-47, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_when_document_has_no_requirement/test_case.py, lines: 1-41, entire file
- tests/end2end/screens/deep_traceability/view_document/view_document_when_document_has_requirement/test_case.py, lines: 1-41, entire file
6.7. Screen: HTML2PDF
StrictDoc shall allow exporting documents and entire documentation trees to PDF.
As required by the parent requirement, PDF is one of the most common documentation formats.
- strictdoc/core/traceability_index.py, lines: 1359-1435, function TraceabilityIndex.clone_to_bundle_document()
- strictdoc/features/html2pdf/generator.py, lines: 1-41, entire file
- strictdoc/features/html2pdf/html2pdf_generator.py, lines: 1-139, entire file
- strictdoc/features/html2pdf/pdf_postprocessor.py, lines: 1-159, entire file
- strictdoc/features/html2pdf/pdf_print_driver.py, lines: 1-104, entire file
- tests/end2end/screens/document/_export_to_pdf/export_to_pdf_basic/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/_export_to_pdf/export_to_pdf_with_picture/test_case.py, lines: 1-51, entire file
- tests/end2end/screens/document/_export_to_pdf/export_to_pdf_with_sanitized_filename/test_case.py, lines: 1-52, entire file
- tests/end2end/screens/document/_export_to_pdf/export_to_pdf_with_uid/test_case.py, lines: 1-48, entire file
- tests/end2end/screens/document/_export_to_pdf/export_to_pdf_with_unicode_title/test_case.py, lines: 1-52, entire file
- tests/integration/features/_integration_/markdown_and_html2pdf_bundle_document/test.itest, lines: 1-19, entire file
- tests/integration/features/html2pdf/01_empty_document/test.itest, lines: 1-13, entire file
- tests/integration/features/html2pdf/02_three_top_level_requirements/test.itest, lines: 1-16, entire file
- tests/integration/features/html2pdf/03_three_documents_with_assets/test.itest, lines: 1-19, entire file
- tests/integration/features/html2pdf/04_composable_document_with_assets/test.itest, lines: 1-27, entire file
- tests/integration/features/html2pdf/05_generate_bundle_document/test.itest, lines: 1-30, entire file
- tests/integration/features/html2pdf/05b_generate_bundle_document_meta_via_config/test.itest, lines: 1-29, entire file
- tests/integration/features/html2pdf/06_system_chromedriver/test.itest, lines: 1-16, entire file
- tests/integration/features/html2pdf/07_composable_document_with_relations/test.itest, lines: 1-31, entire file
- tests/integration/features/html2pdf/08_three_requirements_each_on_new_page/test.itest, lines: 1-19, entire file
- tests/integration/features/html2pdf/09_cross_document_links_relative_paths/test.itest, lines: 1-19, entire file
- tests/integration/features/html2pdf/10_bundle_document_with_cross_directory_image_refs/test.itest, lines: 1-22, entire file
- tests/integration/features/html2pdf/11_bundle_document_with_wildcard_image_refs/test.itest, lines: 1-28, entire file
- tests/integration/features/html2pdf/12_bundle_document_with_markdown_image_refs/test.itest, lines: 1-27, entire file
- tests/integration/features/html2pdf/90_strictdoc_smoke_test_html2pdf/test.itest, lines: 1-6, entire file
- tests/integration/features/html2pdf/_validations/01_invalid_path_to_html2pdf_template/test.itest, lines: 1-5, entire file
When exporting multiple HTML documents from a same project tree into PDF, StrictDoc shall preserve all cross-document linking in the output PDF documents.
This enables navigation between PDF documents within the same project tree, which can be useful for simplifying the review and tracing work performed by readers.
StrictDoc shall support the customization of the PDF export template.
6.8. Screen: Project statistics
StrictDoc shall provide a Project Statistics screen that displays the following project information:
- Project title
- Date of generation
- Git revision
- Total documents
- Total requirements
- Requirements status breakdown
- Total number of TBD/TBC found in documents.
TBD
- strictdoc/features/project_statistics/generator.py, lines: 28-325, function ProgressStatisticsGenerator.export()
- strictdoc/features/project_statistics/metric.py, lines: 1-19, entire file
- strictdoc/features/project_statistics/models/project_tree_stats.py, lines: 1-62, entire file
- strictdoc/features/project_statistics/screen.py, lines: 15-72, function render_project_statistics_screen()
- strictdoc/features/project_statistics/view_object.py, lines: 1-59, entire file
- tests/end2end/screens/project_statistics/view_project_statistics/test_case.py, lines: 1-66, entire file
- tests/integration/features/project_statistics/01_statistics_are_generated/test.itest, lines: 1-18, entire file
- tests/integration/features/project_statistics/10_metric_sections_without_text/test.itest, lines: 1-19, entire file
- tests/integration/features/project_statistics/20_requirement_metric_does_not_include_text_nodes/test.itest, lines: 1-17, entire file
- tests/integration/features/project_statistics/30_requirements_status_breakdown/test.itest, lines: 1-23, entire file
StrictDoc shall support customization of the project statistics screen, enabling users to define and display their own project-specific statistics.
Projects often have unique traceability and reporting requirements, and supporting custom statistics allows StrictDoc to display metrics that are most relevant to each project's context.
- strictdoc/features/project_statistics/screen.py, lines: 15-72, function render_project_statistics_screen()
- tests/integration/features/project_statistics/90_user_provided_statistics/test.itest, lines: 1-21, entire file
- tests/integration/features/project_statistics/91_user_provided_statistics_wrong_module/test.itest, lines: 1-13, entire file
6.9. Screen: Document tree map
StrictDoc shall provide a tree map screen, visualizing the following information:
- Document tree map
- Requirements coverage by source code
- Requirements coverage by test files.
Enables the visualization and browsing of the overall document tree and requirements coverage information.
- strictdoc/features/tree_map/generator.py, lines: 1-595, entire file
- strictdoc/features/tree_map/helpers.py, lines: 1-35, entire file
- strictdoc/features/tree_map/plotly_js.py, lines: 1-102, entire file
- strictdoc/features/tree_map/view_object.py, lines: 1-47, entire file
- tests/end2end/screens/tree_map/01_tree_map_cli/test_case.py, lines: 1-31, entire file
- tests/end2end/screens/tree_map/02_tree_map_server/test_case.py, lines: 1-31, entire file
6.10. Screen: Source coverage
StrictDoc shall generate project source code coverage information.
NOTE: Source code information can be visualized using both web or CLI interfaces.
- strictdoc/features/source_coverage/assets/source_coverage_screen.js, lines: 1-75, entire file
- strictdoc/features/source_coverage/generator.py, lines: 1-27, entire file
- tests/end2end/screens/source_coverage/view_source_coverage/test_case.py, lines: 1-33, entire file
- tests/integration/features/source_coverage/01_links_to_files/test.itest, lines: 1-11, entire file
6.11. Screen: Single source file coverage
StrictDoc shall generate single file traceability information.
With this capability in place, it is possible to focus on a single implementation file's links to requirements which helps in the code reviews and inspections.
- strictdoc/features/source_file_view/assets/source_file_screen.js, lines: 1-644, entire file
- strictdoc/features/source_file_view/generator.py, lines: 1-313, entire file
- strictdoc/features/source_file_view/view_object.py, lines: 1-240, entire file
- tests/end2end/screens/source_file/view_source_file/test_case.py, lines: 1-44, entire file
6.12. Screen: Traceability matrix
StrictDoc shall provide a traceability matrix screen.
- strictdoc/features/traceability_matrix/assets/traceability_matrix_screen.js, lines: 1-49, entire file
- strictdoc/features/traceability_matrix/generator.py, lines: 1-111, entire file
- strictdoc/features/traceability_matrix/view_object.py, lines: 1-68, entire file
- tests/end2end/screens/traceability_matrix/view_traceability_matrix/test_case.py, lines: 1-33, entire file
- tests/integration/features/traceability_matrix/01_links_to_files/test.itest, lines: 1-11, entire file
- tests/integration/features/traceability_matrix/10__columns__relations_with_roles/test.itest, lines: 1-17, entire file
- tests/integration/features/traceability_matrix/20__columns__file_relations/test.itest, lines: 1-15, entire file
- tests/integration/features/traceability_matrix/50__config__sorting_relation_columns/test.itest, lines: 1-20, entire file
6.13. Screen: Project tree diff
StrictDoc shall provide a project tree diff screen.
- strictdoc/features/diff_and_changelog/assets/diff.js, lines: 1-159, entire file
- strictdoc/features/diff_and_changelog/diff_screen_results_view_object.py, lines: 1-127, entire file
- strictdoc/features/diff_and_changelog/diff_screen_view_object.py, lines: 1-78, entire file
- strictdoc/server/routers/other_router.py, lines: 1-321, entire file
- tests/end2end/screens/diff/01_view_basic_diff/test_case.py, lines: 1-116, entire file
- tests/integration/features/diff/--generate-diff/01_basic/test.itest, lines: 1-16, entire file
- tests/integration/features/diff/--generate-diff/02_grammar_with_alias/test.itest, lines: 1-15, entire file
- tests/integration/features/diff/--generate-diff/03_tags/test.itest, lines: 1-43, entire file
- tests/integration/features/diff/--generate-diff/_validations/01_invalid_revision_format_missing_two_dots/test.itest, lines: 1-18, entire file
- tests/integration/features/diff/--generate-diff/_validations/02_invalid_git_revision/test.itest, lines: 1-18, entire file
- tests/integration/features/diff/01__requirements__from_empty_doc_to_one_requirement/test.itest, lines: 1-43, entire file
- tests/integration/features/diff/02__requirements__from_requirement_to_requirement__add_uid/test.itest, lines: 1-29, entire file
- tests/integration/features/diff/03__requirements__from_requirement_to_requirement__remove_uid/test.itest, lines: 1-39, entire file
- tests/integration/features/diff/04__requirements__rename_statement/test.itest, lines: 1-27, entire file
- tests/integration/features/diff/04a__requirements__rename_statement_contained_in_section/test.itest, lines: 1-28, entire file
- tests/integration/features/diff/05__requirements__remove_one_requirement/test.itest, lines: 1-27, entire file
- tests/integration/features/diff/06__requirements__unmatched_requirement_content_changed/test.itest, lines: 1-33, entire file
- tests/integration/features/diff/07__requirements__matched_requirement_content_changed/test.itest, lines: 1-31, entire file
- tests/integration/features/diff/10__requirements_comments__add_comment/test.itest, lines: 1-32, entire file
- tests/integration/features/diff/11__requirements_comments__modify_one_comment/test.itest, lines: 1-33, entire file
- tests/integration/features/diff/120__escaping__basic/test.itest, lines: 1-34, entire file
- tests/integration/features/diff/12__requirements_comments__modify_second_of_three_comments/test.itest, lines: 1-37, entire file
- tests/integration/features/diff/13__requirements_comments__insert_new_comment_between_two_comments/test.itest, lines: 1-37, entire file
- tests/integration/features/diff/14__requirements_comments__insert_two_similar_requirements/test.itest, lines: 1-37, entire file
- tests/integration/features/diff/20__requirements_relations__same_document__add_parent_relation/test.itest, lines: 1-42, entire file
- tests/integration/features/diff/21__requirements_relations__same_document__remove_parent_relation/test.itest, lines: 1-42, entire file
- tests/integration/features/diff/22__requirements_relations__two_docs__add_child_relation/test.itest, lines: 1-45, entire file
- tests/integration/features/diff/50a__sections__from_empty_doc_to_one_section/test.itest, lines: 1-32, entire file
- tests/integration/features/diff/50b__sections__from_empty_doc_to_one_section/test.itest, lines: 1-35, entire file
- tests/integration/features/diff/51__sections__from_one_section_to_empty_doc/test.itest, lines: 1-20, entire file
- tests/integration/features/diff/52__sections__modify_text_node/test.itest, lines: 1-20, entire file
- tests/integration/features/diff/53__sections__modify_text_node_unmatched/test.itest, lines: 1-24, entire file
- tests/integration/features/diff/54__sections__add_text_node/test.itest, lines: 1-25, entire file
- tests/integration/features/diff/55__sections__change_title/test.itest, lines: 1-27, entire file
- tests/integration/features/diff/56__sections__remove_section/test.itest, lines: 1-30, entire file
- tests/integration/features/diff/80__documents__changed_text_node/test.itest, lines: 1-23, entire file
- tests/integration/features/diff/81__documents__changed_free_text_and_renamed_document/test.itest, lines: 1-28, entire file
- tests/integration/features/diff/82__documents__add_free_text/test.itest, lines: 1-25, entire file
- tests/integration/features/diff/83__documents__add_uid/test.itest, lines: 1-25, entire file
- tests/integration/features/diff/97__all_nodes__ensure_order_when_several_changes/test.itest, lines: 1-20, entire file
- tests/integration/features/diff/_included_documents/01_rename_fragment_fields/test.itest, lines: 1-29, entire file
- tests/integration/features/diff/_mid_match/01__mid_match__requirements__from_requirement_to_requirement_no_uid/test.itest, lines: 1-28, entire file
- tests/integration/features/diff/_mid_match/10__mid_match__sections__from_section_to_section_modify_title/test.itest, lines: 1-26, entire file
- tests/integration/features/diff/_mid_match/20__mid_match__document__from_document_to_document_changed_path/test.itest, lines: 1-26, entire file
- tests/integration/features/diff/_mid_match/21__mid_match__document__from_document_to_document_changed_free_text/test.itest, lines: 1-23, entire file
- tests/integration/features/diff/_mid_match/22__mid_match__document__from_document_to_document_changed_free_text_and_title/test.itest, lines: 1-27, entire file
- tests/unit_server/strictdoc/server/20_feature_diff/test_case.py, lines: 1-43, entire file
6.14. Content search
StrictDoc shall provide searching documentation content with queries via a search bar.
As per the parent requirement, a search bar with query support enables users to interactively find specific content without navigating the entire documentation tree.
- strictdoc/backend/sdoc/models/document.py, lines: 331-386, function SDocDocument.build_search_index()
- strictdoc/backend/sdoc/reader.py, lines: 113-115, range
- strictdoc/core/query_engine/grammar.py, lines: 1-173, entire file
- strictdoc/core/query_engine/query_object.py, lines: 1-416, entire file
- strictdoc/core/query_engine/query_reader.py, lines: 1-108, entire file
- strictdoc/export/html/_static/static_html_search.js, lines: 1-897, entire file
- strictdoc/export/html/html_generator.py, lines: 618-773, function HTMLGenerator.export_static_html_search_index()
- strictdoc/features/search/view_object.py, lines: 1-133, entire file
- tests/end2end/project_options/features/02_search_feature_precondition_failed_when_not_activated/test_case.py, lines: 1-23, entire file
- tests/end2end/screens/search/view_search_screen/test_case.py, lines: 1-153, entire file
- tests/end2end/static_html_search/01_search_on_both_server_and_in_static_html/test_case.py, lines: 1-93, entire file
- tests/end2end/static_html_search/02_regex_special_character_search_on_both_server_and_in_static_html/test_case.py, lines: 1-46, entire file
7. Requirements-to-source traceability
StrictDoc shall support bi-directional linking requirements with source files.
- strictdoc/backend/sdoc_source_code/caching_reader.py, lines: 1-83, entire file
- strictdoc/backend/sdoc_source_code/constants.py, lines: 1-15, entire file
- strictdoc/backend/sdoc_source_code/parse_context.py, lines: 1-25, entire file
- strictdoc/backend/sdoc_source_code/processors/general_language_marker_processors.py, lines: 1-308, entire file
- strictdoc/core/file_system/source_tree.py, lines: 1-142, entire file
- strictdoc/core/file_traceability_index.py, lines: 1-1434, entire file
- tests/integration/features/source_code_traceability/_general/04_input_is_single_file/test.itest, lines: 1-12, entire file
- tests/integration/features/source_code_traceability/_general/06_prints_file_export_lines/test.itest, lines: 1-6, entire file
- tests/integration/features/source_code_traceability/_general/70_link_from_section_to_file/test.itest, lines: 1-24, entire file
- tests/integration/features/source_code_traceability/_general/80_link_from_section_to_file_from_included_document/test.itest, lines: 1-35, entire file
- tests/integration/features/source_code_traceability/_general_parser_forward/05_multiple_files_per_requirement/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_parsing_source_files/07_utf8_symbols_in_source_files/test.itest, lines: 1-20, entire file
- tests/integration/features/source_code_traceability/_parsing_source_files/20_skip_invalid_utf8/test.itest, lines: 1-20, entire file
- tests/integration/features/source_code_traceability/_validation/01_req_references_non_existing_file/test.itest, lines: 1-6, entire file
- tests/integration/features/source_code_traceability/_validation/02_source_file_references_non_existing_req/test.itest, lines: 1-7, entire file
- tests/integration/features/source_code_traceability/_validation/03_relation_marker_has_duplicate_uid_general/test.itest, lines: 1-6, entire file
- tests/integration/features/source_code_traceability/_validation/04_relation_marker_has_duplicate_uid_python/test.itest, lines: 1-6, entire file
7.2. Language-aware parsing of source code
StrictDoc shall support parsing the most commonly used formats and programming languages to the Abstract Syntax Tree (AST) level.
The format examples: C, C++, Python, Rust, Ada, Robot, Gherkin, etc.
StrictDoc must be capable of traversing the AST of common formats and programming languages to identify and extract function and class markers.
- strictdoc/backend/sdoc_source_code/caching_reader.py, lines: 1-83, entire file
- strictdoc/backend/sdoc_source_code/helpers/comment_preprocessor.py, lines: 1-30, entire file
- strictdoc/backend/sdoc_source_code/models/language.py, lines: 1-114, entire file
- strictdoc/backend/sdoc_source_code/reader.py, lines: 1-236, entire file
- strictdoc/backend/sdoc_source_code/reader_c.py, lines: 1-530, entire file
- strictdoc/backend/sdoc_source_code/reader_python.py, lines: 1-391, entire file
- strictdoc/backend/sdoc_source_code/reader_robot.py, lines: 1-248, entire file
- strictdoc/backend/sdoc_source_code/reader_rust.py, lines: 1-729, entire file
- strictdoc/backend/sdoc_source_code/tree_sitter_helpers.py, lines: 1-47, entire file
- tests/integration/features/source_code_traceability/_file_types/10_tex/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_file_types/20_jinja/test.itest, lines: 1-18, entire file
- tests/integration/features/source_code_traceability/_file_types/30_cc/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_file_types/40_rst/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_file_types/50_js/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_file_types/60_yaml/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_file_types/65_st_structured_text/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_file_types/66_st_structured_text_user_report/test.itest, lines: 1-31, entire file
- tests/integration/features/source_code_traceability/_file_types/70_unregistered_file_extensions/test.itest, lines: 1-29, entire file
- tests/integration/features/source_code_traceability/_file_types/80_auto_finding_of_lexers/test.itest, lines: 1-32, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_reader_general.py, lines: 1-500, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_reader_rust.py, lines: 1-269, entire file
StrictDoc shall support parsing the C and C++ source files which includes:
- Recognizing functions and their Doxygen comments.
- Recognizing function declarations and function definitions.
C and C++ languages are common languages for embedded and general systems programming. These languages have to be handled with a dedicated parser because of these languages' specifics.
- strictdoc/backend/sdoc_source_code/reader_c.py, lines: 1-530, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/01_c_range/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/02_c_function/test.itest, lines: 1-41, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/03_c_forward_function/test.itest, lines: 1-35, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/04_c_file/test.itest, lines: 1-31, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/05_c_header_function/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/06_c_c_and_h_pair/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/07_c_definition_and_declaration_in_the_same_file/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/08_c_static_definition_in_a_file/test.itest, lines: 1-24, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/09_c_static_declaration_in_a_file/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/10_c_c_and_h_pair_static_declaration/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/20_c_backward_and_forward_functions/test.itest, lines: 1-23, entire file
- tests/integration/features/source_code_traceability/_language_parsers/cpp/01_cpp_class_function_declaration/test.itest, lines: 1-15, entire file
- tests/integration/features/source_code_traceability/_language_parsers/cpp/02_cpp_class_function_declaration_and_definition/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_language_parsers/cpp/03_cpp_overloaded_constructors/test.itest, lines: 1-21, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_reader_c.py, lines: 1-657, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_reader_cpp.py, lines: 1-397, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_writer_c.py, lines: 1-69, entire file
StrictDoc shall support parsing the Python source files which includes:
- Recognizing Python functions, including nested functions.
- Recognizing Python classes, including nested classes.
- Recognizing decorated functions.
Python language has to be handled with a dedicated parser because of this language's specifics.
- strictdoc/backend/sdoc_source_code/reader_python.py, lines: 1-391, entire file
- tests/integration/features/source_code_traceability/_RELATION_FIELD/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/01_python_range/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/02_python_function/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/03_python_forward_function/test.itest, lines: 1-20, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/04_python_forward_function_in_class/test.itest, lines: 1-33, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/05_python_class/test.itest, lines: 1-22, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/06_python_file/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/07_python_functions_decorated/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/07_python_functions_decorated/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/08_python_nested/test.itest, lines: 1-33, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/readers/test_reader_python.py, lines: 1-624, entire file
StrictDoc shall support parsing the Rust source files.
Rust language has to be handled with a dedicated parser because of this language's specifics.
- SDOC-LLR-164 Auto-scoped relation markers in Rust docs
- SDOC-LLR-165 Inner doc attributes
- SDOC-LLR-166 Inner line docs
- SDOC-LLR-167 Inner block docs
- SDOC-LLR-168 Outer doc attributes
- SDOC-LLR-169 Outer line docs
- SDOC-LLR-170 Outer block docs
- SDOC-LLR-171 File, line and range markers
- SDOC-LLR-172 Source nodes from doc comments
- SDOC-LLR-173 Forward relations to Rust items
- SDOC-LLR-174 Forward relation by canonical path
- SDOC-LLR-175 Collapse doc comments
- SDOC-LLR-176 Rust marker descriptions
- SDOC-LLR-177 Valid positions of doc comments
- SDOC-LLR-178 Inner doc comments for functions
- SDOC-LLR-179 Inner doc comments for modules
- SDOC-LLR-180 Inner doc comments for external blocks
- SDOC-LLR-181 Inner doc comments for implementation blocks
- SDOC-LLR-182 Allowed position for outer docs
StrictDoc shall support parsing the Robot framework test files.
Robot framework's markup has to be handled with a dedicated parser because of this language's specifics.
- strictdoc/backend/sdoc_source_code/reader_robot.py, lines: 1-248, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/01_robot_range/test.itest, lines: 1-18, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/02_robot_line/test.itest, lines: 1-18, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/03_robot_function/test.itest, lines: 1-44, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/04_robot_forward_function/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/05_robot_file/test.itest, lines: 1-27, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/06_robot_source_nodes/test.itest, lines: 1-42, entire file
StrictDoc shall support bi-directional linking between requirements, test files, and test reports.
Tracing requirements to not just test files but also the test report information closes the verification cycle more completely.
- strictdoc/backend/sdoc_source_code/test_reports/junit_xml_reader.py, lines: 1-436, entire file
- strictdoc/backend/sdoc_source_code/test_reports/robot_xml_reader.py, lines: 1-239, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_reports/test_junit_xml_reader_ctest.py, lines: 1-85, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_reports/test_junit_xml_reader_nextest.py, lines: 1-240, entire file
StrictDoc shall support linking between requirements, source files, and code coverage information.
Tracing requirements to not just test files but also to the code coverage information closes the verification cycle more completely.
7.5. Forward linking from requirements to source code
StrictDoc shall support forward linking from SDoc nodes to source files.
There are cases when it is not possible to modify source code directly. The forward linking enables to refer to the files or their parts from SDoc nodes. Depending on a project structure, the forward linking from requirements to source files can replace the backward linking from source code back to requirements, or both approaches can co-exist.
- strictdoc/backend/sdoc/grammar/grammar.py, lines: 1-241, entire file
- strictdoc/backend/sdoc/models/reference.py, lines: 131-150, function FileReference()
- tests/integration/features/source_code_traceability/_general_parser_forward/01_basic_req_to_file_link_full_path/test.itest, lines: 1-22, entire file
- tests/integration/features/source_code_traceability/_general_parser_forward/05_multiple_files_per_requirement/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_general_parser_forward/12_basic_req_to_file_link_full_path/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_general_parser_forward/60_file_range_with_line_range/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/03_c_forward_function/test.itest, lines: 1-35, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/20_c_backward_and_forward_functions/test.itest, lines: 1-23, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/03_python_forward_function/test.itest, lines: 1-20, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/04_python_forward_function_in_class/test.itest, lines: 1-33, entire file
- tests/integration/features/source_code_traceability/_path_resolution/02_basic_req_to_file_link_cwd_dot/test.itest, lines: 1-15, entire file
7.6. Source code markup – Relations
StrictDoc shall support annotating source code with links that reference the requirements.
- strictdoc/backend/sdoc_source_code/comment_parser/marker_lexer.py, lines: 1-104, entire file
- strictdoc/backend/sdoc_source_code/grammar.py, lines: 1-49, entire file
- strictdoc/backend/sdoc_source_code/marker_parser.py, lines: 1-324, entire file
- strictdoc/backend/sdoc_source_code/models/range_marker.py, lines: 1-127, entire file
- strictdoc/backend/sdoc_source_code/models/requirement_marker.py, lines: 1-20, entire file
- strictdoc/backend/sdoc_source_code/models/source_file_info.py, lines: 1-101, entire file
- strictdoc/backend/sdoc_source_code/reader.py, lines: 1-236, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_lexer.py, lines: 1-612, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_parser.py, lines: 1-422, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_writer.py, lines: 1-72, entire file
StrictDoc's shall support line markers that can be attached to single source code lines.
NOTE: A single-line marker points to a single line in a source file.
Sometimes a requirement can influence only a single line in the source code. The advantage of a single-line marker compared to a range marker is that a single-line marker is not intrusive and does not clutter source code.
- strictdoc/backend/sdoc_source_code/models/line_marker.py, lines: 1-50, entire file
- tests/integration/features/source_code_traceability/_general_parser_backward/50_line_marker/test.itest, lines: 1-10, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/30_py_line_marker_singline/test.itest, lines: 1-10, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/31_py_line_marker_multiline/test.itest, lines: 1-11, entire file
StrictDoc shall support relation markers that can be attached to individual source code elements. StrictDoc shall support an optional scope attribute to disambiguate the target element where StrictDoc can't infer it solely from the marker position.
Note: The most basic example of such traceable elements are functions and classes, but generally supported elements and available scope attributes depend on the programming language.
Source code elements can often be considered as the next level to trace from a requirement. For example, a low level element is implemented by a function, or a test case is implemented by a test function.
Sometimes it's also feasible to consider the source code elements as lean replacement for prose requirement or test-case definitions.
- strictdoc/backend/sdoc_source_code/models/language_item_marker.py, lines: 1-101, entire file
- tests/integration/features/source_code_traceability/_RELATION_FIELD/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/02_c_function/test.itest, lines: 1-41, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/05_c_header_function/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/06_c_c_and_h_pair/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/07_c_definition_and_declaration_in_the_same_file/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/08_c_static_definition_in_a_file/test.itest, lines: 1-24, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/09_c_static_declaration_in_a_file/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/10_c_c_and_h_pair_static_declaration/test.itest, lines: 1-25, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/20_c_backward_and_forward_functions/test.itest, lines: 1-23, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/02_python_function/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/05_python_class/test.itest, lines: 1-22, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/07_python_functions_decorated/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/07_python_functions_decorated/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/08_python_nested/test.itest, lines: 1-33, entire file
StrictDoc's shall support file markers that can be attached to entire source files.
There are cases when a requirement can be attached to an entire file.
- strictdoc/backend/sdoc_source_code/models/language_item_marker.py, lines: 1-101, entire file
- tests/integration/features/source_code_traceability/_general/01_basic_file_marker_in_python_script/test.itest, lines: 1-10, entire file
- tests/integration/features/source_code_traceability/_general/02_file_marker_regression/test.itest, lines: 1-15, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/04_c_file/test.itest, lines: 1-31, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/06_python_file/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_validation/03_relation_marker_has_duplicate_uid_general/test.itest, lines: 1-6, entire file
- tests/integration/features/source_code_traceability/_validation/04_relation_marker_has_duplicate_uid_python/test.itest, lines: 1-6, entire file
StrictDoc shall support relation markers that can be attached to source code ranges.
NOTE: Compared to other marker types, to indicate a range, two markers are needed: one to start a range and one to end a range.
There are cases when a requirement implementation results in the requirement affecting only a range/block of source code.
- strictdoc/backend/sdoc_source_code/models/range_marker.py, lines: 1-127, entire file
- tests/integration/features/source_code_traceability/_general_parser_backward/03_basic_req_to_file_link_range/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_language_parsers/c/01_c_range/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_language_parsers/python/01_python_range/test.itest, lines: 1-19, entire file
7.7. Source code markup – Nodes
StrictDoc shall support parsing nodes from source code.
It can be practical to define the requirement and other nodes directly in source comments and then let a requirements tool generate documents from these nodes' content automatically.
A reference example: Generating test specifications from the TEST_SPEC nodes which are defined directly in source code comments.
- strictdoc/backend/sdoc_source_code/comment_parser/marker_lexer.py, lines: 1-104, entire file
- strictdoc/backend/sdoc_source_code/marker_parser.py, lines: 1-324, entire file
- strictdoc/backend/sdoc_source_code/models/source_node.py, lines: 1-67, entire file
- tests/integration/features/source_code_traceability/_language_parsers/robot/06_robot_source_nodes/test.itest, lines: 1-42, entire file
- tests/integration/features/source_code_traceability/_source_nodes/01_feature_disabled/test.itest, lines: 1-12, entire file
- tests/integration/features/source_code_traceability/_source_nodes/02_function_with_source_node/test.itest, lines: 1-26, entire file
- tests/integration/features/source_code_traceability/_source_nodes/03_cpp_test_function_with_macro_name/test.itest, lines: 1-19, entire file
- tests/integration/features/source_code_traceability/_source_nodes/04_link_and_anchor_in_fields/test.itest, lines: 1-17, entire file
- tests/integration/features/source_code_traceability/_source_nodes/05_anchor_in_source_node_field/test.itest, lines: 1-14, entire file
- tests/integration/features/source_code_traceability/_source_nodes/10_auto_uid_does_not_generate_automatic_content/test.itest, lines: 1-16, entire file
- tests/integration/features/source_code_traceability/_source_nodes/11_functions_without_fields_do_not_generate_node/test.itest, lines: 1-29, entire file
- tests/integration/features/source_code_traceability/_source_nodes/12_merged_functions_do_not_generate_sections/test.itest, lines: 1-22, entire file
- tests/integration/features/source_code_traceability/_source_nodes/20_linux_spdx_in_source_identifiers/test.itest, lines: 1-21, entire file
- tests/integration/features/source_code_traceability/_source_nodes/30_merge_with_sdoc_by_default_uid/test.itest, lines: 1-30, entire file
- tests/integration/features/source_code_traceability/_source_nodes/31_merge_with_sdoc_by_uid/test.itest, lines: 1-58, entire file
- tests/integration/features/source_code_traceability/_source_nodes/32_merge_with_sdoc_by_mid/test.itest, lines: 1-34, entire file
- tests/integration/features/source_code_traceability/_source_nodes/33_merge_with_sdoc_by_mid_no_uid/test.itest, lines: 1-30, entire file
- tests/integration/features/source_code_traceability/_source_nodes/34_merge_with_sdoc_field_priority/test.itest, lines: 1-37, entire file
- tests/integration/features/source_code_traceability/_source_nodes/40_remap/test.itest, lines: 1-24, entire file
- tests/integration/features/source_code_traceability/_source_nodes/_auto_uuid/10_linux_spdx_req_id_autogen/test.itest, lines: 1-42, entire file
- tests/integration/features/source_code_traceability/_source_nodes/_validation/01_cfg_required_features_not_enabled/test.itest, lines: 1-9, entire file
- tests/integration/features/source_code_traceability/_source_nodes/_validation/02_cfg_no_source_nodes_matched/test.itest, lines: 1-9, entire file
- tests/integration/features/source_code_traceability/_source_nodes/_validation/03_merge_by_uid_conflicting_mid/test.itest, lines: 1-9, entire file
- tests/integration/features/source_code_traceability/_source_nodes/_validation/04_merge_by_mid_conflicting_uid/test.itest, lines: 1-9, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_lexer.py, lines: 1-612, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_parser.py, lines: 1-422, entire file
- tests/unit/strictdoc/backend/sdoc_source_code/test_marker_writer.py, lines: 1-72, entire file
8. Export/import formats
8.1. RST
StrictDoc shall allow exporting SDoc content to the RST format.
Exporting SDoc content to RST enables:
- Generating RST to Sphinx HTML documentation.
- Generating RST to PDF using Sphinx/LaTeX.
- tests/integration/features/rst/01_basic_rst_export/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/02_folder_structure_is_preserved_for_nested/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/04_one_requirement_without_title/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/05_requirement_without_title/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/06_requirement_with_title/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/07_requirement_comments/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/08_requirement_comments_then_section/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/09_requirement_rationale/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/20_custom_field/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/30_requirement_references/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/40_link_to_another_section/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/41_link_to_node/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/42_link_with_custom_grammar/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/50_link_to_anchor/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/51_link_to_anchor_with_title/test.itest, lines: 1-9, entire file
- tests/integration/features/rst/52_link_to_document/test.itest, lines: 1-10, entire file
- tests/integration/features/rst/60_field_human_titles/test.itest, lines: 1-22, entire file
StrictDoc shall generate RST markup to HTML using Docutils.
Docutils is the most mature RST-to-HTML converter.
TBD: Move this to design decisions.
8.2. ReqIF
StrictDoc shall support exporting/importing requirements content from/to ReqIF format.
- strictdoc/backend/reqif/p01_sdoc/reqif_to_sdoc_converter.py, lines: 1-620, entire file
- strictdoc/backend/reqif/p01_sdoc/sdoc_to_reqif_converter.py, lines: 1-699, entire file
- strictdoc/backend/reqif/reqif_export.py, lines: 1-55, entire file
- strictdoc/backend/reqif/reqif_import.py, lines: 1-78, entire file
- strictdoc/backend/reqif/reqif_reader.py, lines: 1-37, entire file
- strictdoc/backend/reqif/sdoc_reqif_fields.py, lines: 1-93, entire file
- tests/end2end/screens/document/export_to_reqif/export_reqif_nominal_case/test_case.py, lines: 1-74, entire file
- tests/end2end/screens/project_index/export_tree_to_reqif/basic_reqif_export/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/project_index/import_document_from_reqif/_validations/input_file_not_reqif_format/test_case.py, lines: 1-41, entire file
- tests/end2end/screens/project_index/import_document_from_reqif/import_document_default_import/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/project_index/import_document_from_reqif/import_document_from_reqif_tree_of_two_documents/test_case.py, lines: 1-46, entire file
- tests/end2end/screens/project_index/import_document_from_reqif/import_reqif_cancel_import/test_case.py, lines: 1-37, entire file
- tests/end2end/screens/project_index/update_project_title_python_config/test_case.py, lines: 1-43, entire file
- tests/end2end/screens/project_index/update_project_title_python_config_disabled_for_config_without_title/test_case.py, lines: 1-42, entire file
- tests/end2end/screens/project_index/update_project_title_toml_deprecated_config/test_case.py, lines: 1-43, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-enable-mid/01_cli_option/test.itest, lines: 1-7, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-enable-mid/02_toml_option/test.itest, lines: 1-10, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-import-markup/01_cli_option/test.itest, lines: 1-7, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-import-markup/02_toml_option/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-multiline-is-xhtml/01_cli_option/test.itest, lines: 1-46, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/--reqif-multiline-is-xhtml/02_toml_option/test.itest, lines: 1-45, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/01_minimal_reqif/test.itest, lines: 1-11, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/02_one_requirement/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/03_one_section_one_requirement/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/04_one_section_one_subsection_one_requirement/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/05_two_sections/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/06_three_sections/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/07_one_nested_section/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/08_two_nested_sections/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/09_next_requirement_drop_in_level/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/100_export_reqif_header/test.itest, lines: 1-19, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/10_next_requirement_drop_of_two_levels/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/11_exporting_sections_free_text/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/12_multiline_statements/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/14_document_freetext/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/15_composite_requirement/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/20_comment_multiple/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/30_custom_grammar/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/31_custom_grammar_single_choice_type/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/32_custom_grammar_multi_choice_type/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/33_custom_grammar_multiple_node_types/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/35_HUMAN_TITLE/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/40_specification_type/test.itest, lines: 1-16, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/50_reqifz_basic_roundtrip/test.itest, lines: 1-7, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/60_multiple_documents/test.itest, lines: 1-9, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/70_relations/test.itest, lines: 1-8, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/end_to_end/90_legacy_section_not_supported_anymore/test.itest, lines: 1-7, entire file
- tests/integration/features/reqif/profiles/p01_sdoc/examples/01_sample/test.itest, lines: 1-19, entire file
- tests/integration/features/reqif/read_reqif/01_read_reqif_basic/01_minimal_document/test.itest, lines: 1-10, entire file
- tests/unit_server/strictdoc/server/02_export_document_to_reqif/test_case.py, lines: 1-50, entire file
StrictDoc shall maintain the core ReqIF implementation as a separate software component.
ReqIF is a well-defined standard which exists independently of StrictDoc's development. It is reasonable to maintain the ReqIF codebase as a separate software component to allow independent development and easier maintainability.
8.3. Excel and CSV
StrictDoc shall allow exporting SDoc documents to Excel, one Excel sheet per document.
- strictdoc/backend/excel/export/excel_generator.py, lines: 1-281, entire file
- tests/integration/features/excel/export/01_basic_excel_export/test.itest, lines: 1-7, entire file
- tests/integration/features/excel/export/02_no_reqs_to_export/test.itest, lines: 1-5, entire file
- tests/integration/features/excel/export/04_custom_grammar_fields_to_export_fields_subset/test.itest, lines: 1-8, entire file
- tests/integration/features/excel/export/05_custom_grammar_fields_to_export_fields_default/test.itest, lines: 1-8, entire file
- tests/integration/features/excel/export/06_custom_grammar_fields_to_export_fields_all/test.itest, lines: 1-8, entire file
- tests/integration/features/excel/export/07_custom_grammar_fields_to_export_fields_all_special/test.itest, lines: 1-8, entire file
- tests/integration/features/excel/export/20_excel_export_multiple_docs/test.itest, lines: 1-9, entire file
- tests/integration/features/excel/export/20_excel_export_multiple_docs/test.itest, lines: 1-9, entire file
StrictDoc shall allow importing Excel documents to SDoc documents, one Excel sheet per document.
- strictdoc/backend/excel/excel_import.py, lines: 1-25, entire file
- strictdoc/backend/excel/export/excel_generator.py, lines: 1-281, entire file
- strictdoc/backend/excel/import_/excel_sheet_proxy.py, lines: 1-94, entire file
- strictdoc/backend/excel/import_/excel_to_sdoc_converter.py, lines: 1-288, entire file
- tests/integration/features/excel/export/20_excel_export_multiple_docs/test.itest, lines: 1-9, entire file
- tests/integration/features/excel/import/01_import_basic_e2e/test.itest, lines: 1-8, entire file
- tests/integration/features/excel/import/02_float_fields_converted_to_strings/test.itest, lines: 1-17, entire file
- tests/integration/features/excel/import/03_default_fields_are_not_duplicated/test.itest, lines: 1-14, entire file
StrictDoc Excel export shall allow exporting SDoc documents to Excel with only selected fields.
9. Command-line interface
9.1. General CLI requirements
StrictDoc shall provide a command-line interface.
9.2. Command: Manage
9.2.1. Command: Auto UID
StrictDoc shall allow automatic generation of requirements UIDs.
- strictdoc/commands/manage_autouid_command.py, lines: 86-172, function ManageAutoUIDCommand.run()
- tests/integration/features/commands/manage/auto-uid/01_issue_1630_autouid_must_preserve_relations/test.itest, lines: 1-18, entire file
- tests/integration/features/commands/manage/auto-uid/composable_documents/01_basic_check_all_elements/test.itest, lines: 1-19, entire file
- tests/integration/features/commands/manage/auto-uid/composable_documents/_validations/01_validate_link_to_non_existing_document/test.itest, lines: 1-6, entire file
- tests/integration/features/commands/manage/auto-uid/composite_requirement_uids/01_default_behavior/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/grammar_from_file/01_basic_grammar_from_file/test.itest, lines: 1-10, entire file
- tests/integration/features/commands/manage/auto-uid/grammar_from_file/02_ignores_junit_xml/test.itest, lines: 1-14, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/01_default_behavior/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/02_some_requirements_already_have_uid/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/03_requirement_prefix_document_level/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/04_requirement_prefix_section_level/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/05_requirement_prefix_grammar_element_level/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/06_works_against_single_files/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/07_works_across_documents_default_prefix/test.itest, lines: 1-9, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/08_works_across_documents_custom_prefix/test.itest, lines: 1-11, entire file
- tests/integration/features/commands/manage/auto-uid/requirement_uids/09_edge_grammar_UID_required/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/section_uids/01_generates_section_uids/test.itest, lines: 1-7, entire file
- tests/integration/features/commands/manage/auto-uid/section_uids/02_identical_titles_get_numeric_postfix/test.itest, lines: 1-7, entire file
10. Python API
StrictDoc shall provide a Python API for its core functions:
- Reading SDoc files
- Creating traceability graph
- Generating HTML exports
- Converting SDoc to other formats.
11. Web server
StrictDoc shall provide a web server.
A web server is a precondition for StrictDoc's web interface. A web server can be available to a single user on their local machine or it can be deployed to a network and be made accessible by several computers.
12. User experience
StrictDoc shall provide 'about' and 'version' commands that display the project's title, current version, license, and links to the project's web pages.
- strictdoc/commands/about_command.py, lines: 1-48, entire file
- strictdoc/commands/version_command.py, lines: 1-27, entire file
- tests/integration/features/commands/about/01_print_about/test.itest, lines: 1-15, entire file
- tests/integration/features/commands/version/01_print_version/test.itest, lines: 1-10, entire file
12.2. Strict mode by default
StrictDoc's default mode of operation shall treat all warnings as errors.
When warnings are treated as errors, the user becomes aware of potential issues as soon as they appear.
13. Configurability
StrictDoc shall support a configuration of project-level options through a TOML file named strictdoc.toml.
StrictDoc shall allow a user to select a subset of StrictDoc's available features by listing them in the strictdoc.toml file.
StrictDoc shall support configuring a host/port on which the StrictDoc web server is run.
- strictdoc/core/feature.py, lines: 1-106, entire file
- strictdoc/core/format.py, lines: 1-201, entire file
- strictdoc/core/project_config.py, lines: 123-934, class ProjectConfig
- tests/end2end/project_options/server_host/01_option_not_specified/test_case.py, lines: 1-35, entire file
- tests/end2end/project_options/server_host/02_option_specified/test_case.py, lines: 1-34, entire file
14. Performance
StrictDoc shall support process-based parallelization for time-critical tasks.
Process-based parallelization can provide a good speed-up when several large documents have to be generated.
- tests/integration/features/html/parallelization/04_parallelization/test.itest, lines: 1-48, entire file
- tests/integration/features/html/parallelization/05_parallelization_no_macos_problem_regression/test.itest, lines: 1-41, entire file
- tests/integration/features/html/parallelization/06_parallelization_sdoc_parsing_problem_in_child_process/test.itest, lines: 1-7, entire file
StrictDoc shall implement caching of parsed SDoc documents.
StrictDoc shall support incremental generation of documents.
NOTE: "Incremental" means that only the modified documents are regenerated when StrictDoc is run repeatedly against the same project tree.
- strictdoc/core/file_dependency_manager.py, lines: 1-113, entire file
- strictdoc/core/traceability_index_builder.py, lines: 1-979, entire file
- tests/integration/features/html/incremental_generation/01_when_document_changes_regenerate_it/test.itest, lines: 1-19, entire file
- tests/integration/features/html/incremental_generation/02_when_changes_regenerate_immediate_neighbours/test.itest, lines: 1-36, entire file
- tests/integration/features/html/incremental_generation/03_when_new_child_generate_parents/test.itest, lines: 1-33, entire file
- tests/integration/features/html/incremental_generation/04_when_config_changes_generate_everything/test.itest, lines: 1-20, entire file
- tests/integration/features/html/incremental_generation/20_sdoc_and_source_files_backward/test.itest, lines: 1-34, entire file
- tests/integration/features/html/incremental_generation/25_sdoc_and_source_files_forward/test.itest, lines: 1-37, entire file
StrictDoc shall cache the RST fragments rendered to HTML.
Conversion of RST markup to HTML is a time consuming process. Caching the rendered HTML of each fragment helps to save time when rendering the HTML content.
StrictDoc's web interface shall generate the HTML content only when it is directly requested by a user.
Generating a whole documentation tree for a user project can be time consuming. The on-demand loading ensures the "do less work" approach when it comes to rendering the HTML pages.
- strictdoc/server/routers/main_router.py, lines: 4590-4804, function create_main_router.get_document()
- tests/end2end/performance/200_and_304_based_asset_caching/01_main_page_serves_304/test_case.py, lines: 1-64, entire file
- tests/unit_server/strictdoc/server/05_http_304_non_modified_for_documents_and_assets/test_case.py, lines: 1-73, entire file
StrictDoc shall support a precompilation of HTML templates.
The StrictDoc-exported HTML content visible to a user is assembled from numerous small HTML fragments. Precompiling the HTML templates from which the content gets rendered improves the performance of the HTML rendering.
15. Development process requirements
15.1. General process
All critical issues reported in relation to StrictDoc shall be addressed with utmost priority.
Prioritizing major issues ensures StrictDoc remains stable and reliable, preventing serious problems that could compromise its performance and integrity.
15.2. Requirements engineering
StrictDoc's development shall be requirements-based.
StrictDoc's requirements shall be written using StrictDoc.
15.3. Implementation requirements
15.3.1. Programming languages
StrictDoc shall be written in Python.
Python has an excellent package ecosystem. It is a widely used language. It is most often the next language for C/C++ programming community when it comes to the tools development and scripting tasks.
15.3.2. Cross-platform availability
StrictDoc shall support the Linux operating systems.
StrictDoc shall support the macOS operating system.
StrictDoc shall support the Windows operating system.
15.4. Implementation constraints
StrictDoc shall be built using only open source software components.
No commercial/proprietary dependency chain ensures that StrictDoc remain free and open for everyone.
StrictDoc shall avoid using large and demanding UI frameworks.
NOTE: An example of frameworks that require a very specific architecture: React JS, AngularJS.
StrictDoc shall avoid extending its infrastructure with anything based on NPM-ecosystem.
StrictDoc already deals with the Python/Pip/Pypi ecosystem. The amount of necessary maintenance is already quite high. NPM is known for splitting its projects into very small parts, which increases the complexity of maintaining all dependencies.
StrictDoc shall avoid using JavaScript-based programming languages.
The development team does not have specific experience with any of the JS alternatives. Staying with a general subset of JavaScript is a safer choice.
StrictDoc shall avoid using microservices and microservice-based architectures.
The project is too small to scale to a multi-service architecture.
This requirement could be re-considered only if a significant technical pressure would require the use of microservices.
StrictDoc shall avoid using containers and containerization technologies.
Containers are significant extra layer of complexity. They are hard to debug.
This constraint does not block a StrictDoc user from wrapping StrictDoc into their containers.
15.5. Coding constraints
StrictDoc's development shall ensure a use of assertions throughout the project codebase.
NOTE: At a minimum, the function input parameters must be checked for validity.
StrictDoc's development shall ensure a use of type annotations throughout the project's Python codebase.
15.6. Linting
StrictDoc's development shall ensure that the project's codebase is compliant with the Python community's modern practices.
15.7. Static analysis
StrictDoc's development shall include a continuous type checking of StrictDoc's codebase.
15.8. Testing
StrictDoc's development shall provide unit testing of its codebase.
StrictDoc's development shall provide complete black-box integration testing of its command-line interface.
StrictDoc's development shall provide complete end-to-end testing of the web interface.
Every update to the StrictDoc codebase shall be complemented with a corresponding provision of at least one test as follows:
- For web interface: at least one end-to-end test.
- For command-line interface: at least one black-box integration test.
- For internal Python functions: at least one unit test.
NOTE: This requirement implies that no modifications to StrictDoc's functionality can be merged unless accompanied by at least one test.
This requirement ensures that every new feature or a chance in the codebase is covered/stressed by at least one test, according to the change type.
16. Code hosting and distribution
16.1. Code hosting
StrictDoc's source code shall be hosted on GitHub.
All StrictDoc software shall be licensed under the Apache 2 license.