symtest-cli 1.4.1__tar.gz → 1.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/LICENSE +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/MANIFEST.in +2 -1
- {symtest_cli-1.4.1/src/symtest_cli.egg-info → symtest_cli-1.5.1}/PKG-INFO +25 -44
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/README.md +21 -18
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/design.md +73 -41
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/design_en.md +35 -35
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/user_manual.md +185 -141
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/user_manual_en.md +200 -139
- symtest_cli-1.5.1/pyproject.toml +47 -0
- symtest_cli-1.5.1/skill/SKILL.md +297 -0
- symtest_cli-1.5.1/skill/assets/full_runner_example.py +359 -0
- symtest_cli-1.5.1/skill/assets/templates/extract_channels_script.py +77 -0
- symtest_cli-1.5.1/skill/assets/templates/my_analysis_comparator.py +80 -0
- symtest_cli-1.5.1/skill/assets/templates/my_channel_extractor.py +83 -0
- symtest_cli-1.5.1/skill/assets/templates/test_cases_golden_file.json +35 -0
- symtest_cli-1.5.1/skill/assets/templates/test_cases_simple.json +18 -0
- symtest_cli-1.5.1/skill/assets/templates/test_cases_simple.yaml +12 -0
- symtest_cli-1.5.1/skill/assets/templates/test_cases_steps.json +31 -0
- symtest_cli-1.5.1/skill/references/field_reference.md +110 -0
- symtest_cli-1.5.1/skill/references/user_manual.md +2220 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/__init__.py +11 -2
- symtest_cli-1.5.1/src/symtest/cli.py +120 -0
- symtest_cli-1.5.1/src/symtest/commands/__init__.py +9 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/commands/compare.py +70 -40
- symtest_cli-1.5.1/src/symtest/commands/find.py +275 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/commands/migrate.py +26 -0
- symtest_cli-1.4.1/src/symtest/cli.py → symtest_cli-1.5.1/src/symtest/commands/run.py +62 -344
- symtest_cli-1.5.1/src/symtest/commands/schema.py +24 -0
- symtest_cli-1.5.1/src/symtest/commands/validate.py +80 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/__init__.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/config_schema.py +42 -8
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/normalize.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/__init__.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/base_runner.py +7 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/config_loader.py +2 -2
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/parallel_runner.py +31 -14
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/result.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/test_case.py +13 -15
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/assertions.py +54 -4
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/validator.py +48 -9
- symtest_cli-1.5.1/src/symtest/file_comparator/__init__.py +44 -0
- symtest_cli-1.5.1/src/symtest/file_comparator/base_comparator.py +128 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/binary_comparator.py +6 -6
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/csv_comparator.py +3 -4
- symtest_cli-1.5.1/src/symtest/file_comparator/extractor_comparator.py +199 -0
- symtest_cli-1.5.1/src/symtest/file_comparator/factory.py +354 -0
- symtest_cli-1.4.1/src/symtest/file_comparator/base_comparator.py → symtest_cli-1.5.1/src/symtest/file_comparator/file_comparator_base.py +57 -30
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/h5_comparator.py +10 -6
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/json_comparator.py +3 -4
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/result.py +66 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_comparator.py +22 -41
- symtest_cli-1.5.1/src/symtest/file_comparator/script_extract_comparator.py +160 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/text_comparator.py +2 -2
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/logging_config.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/reporting/__init__.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/reporting/diagnosis.py +2 -2
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/__init__.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/__init__.py +2 -2
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/junit_xml_writer.py +1 -1
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/report_generator.py +93 -19
- {symtest_cli-1.4.1 → symtest_cli-1.5.1/src/symtest_cli.egg-info}/PKG-INFO +25 -44
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/SOURCES.txt +30 -41
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/requires.txt +0 -5
- symtest_cli-1.5.1/tests/README.md +15 -0
- symtest_cli-1.5.1/tests/__init__.py +3 -0
- symtest_cli-1.5.1/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_csv_compare.py +2 -2
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_text_compare.py +8 -1
- symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/test_parallel_runner.py +63 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/commands/test_find.py +344 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_architecture_guard.py +6 -6
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_assertions.py +20 -5
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_case_env.py +0 -33
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_model_v2.py +8 -9
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/test_extractor_channels.py +253 -0
- symtest_cli-1.5.1/tests/unit/file_comparator/test_plugin_lifecycle.py +420 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_comparator.py +10 -9
- symtest_cli-1.5.1/tests/unit/file_comparator/test_script_extract.py +187 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_workspace_plugins.py +46 -50
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_cli.py +41 -29
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/test_report_generator.py +177 -0
- symtest_cli-1.4.1/docs/tui_and_config_split_design.md +0 -818
- symtest_cli-1.4.1/pyproject.toml +0 -3
- symtest_cli-1.4.1/setup.py +0 -75
- symtest_cli-1.4.1/src/symtest/commands/__init__.py +0 -9
- symtest_cli-1.4.1/src/symtest/file_comparator/__init__.py +0 -10
- symtest_cli-1.4.1/src/symtest/file_comparator/factory.py +0 -191
- symtest_cli-1.4.1/src/symtest/tui/__init__.py +0 -11
- symtest_cli-1.4.1/src/symtest/tui/app.py +0 -90
- symtest_cli-1.4.1/src/symtest/tui/controllers/__init__.py +0 -0
- symtest_cli-1.4.1/src/symtest/tui/controllers/case_controller.py +0 -336
- symtest_cli-1.4.1/src/symtest/tui/screens/__init__.py +0 -0
- symtest_cli-1.4.1/src/symtest/tui/screens/case_editor.py +0 -282
- symtest_cli-1.4.1/src/symtest/tui/screens/case_list.py +0 -255
- symtest_cli-1.4.1/src/symtest/tui/widgets/__init__.py +0 -0
- symtest_cli-1.4.1/src/symtest/tui/widgets/case_table.py +0 -113
- symtest_cli-1.4.1/src/symtest/tui/widgets/expected_editor.py +0 -159
- symtest_cli-1.4.1/src/symtest/tui/widgets/search_bar.py +0 -160
- symtest_cli-1.4.1/src/symtest/tui/widgets/steps_editor.py +0 -243
- symtest_cli-1.4.1/tests/README.md +0 -25
- symtest_cli-1.4.1/tests/__init__.py +0 -3
- symtest_cli-1.4.1/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- symtest_cli-1.4.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__init__.py +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/__init__.cpython-312.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/__init__.cpython-313.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.4.1/tests/unit/tui/conftest.py +0 -73
- symtest_cli-1.4.1/tests/unit/tui/test_app.py +0 -106
- symtest_cli-1.4.1/tests/unit/tui/test_case_controller.py +0 -439
- symtest_cli-1.4.1/tests/unit/tui/test_search_functions.py +0 -187
- symtest_cli-1.4.1/tests/unit/tui/test_tui_run_test.py +0 -384
- symtest_cli-1.4.1/tests/unit/tui/test_widgets_data.py +0 -188
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/setup.cfg +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/config_io.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/import_expander.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/inheritance_expander.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/migrate.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/__init__.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/executor.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/result.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/history_store.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/last_run_store.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/__init__.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/accept.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/sequence.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/single.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/process_worker.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/sequence_state.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/setup.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/types.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/__init__.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/result.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/numeric_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/xml_comparator.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/config_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/json_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_config_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_json_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_yaml_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/yaml_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/path_resolver.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/dependency_links.txt +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/entry_points.txt +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/top_level.txt +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-313.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-39.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-313.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-39.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/test_setup_module.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/conftest.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/h5_filter_demo.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/manual_report_example.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/perf_parallel.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__init__.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-313.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-39.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/test_user_flows.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/circular_config_a.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/circular_config_b.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_mismatch.txt +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_sample.txt +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_base.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_chain.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_circular.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/main_config.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_a.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_b.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_base.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_chain.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_circular.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/main_config.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/missing_fields.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_main.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_sub.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_golden_file.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_steps.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_json_tests.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_text_tests.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases1.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/missing_fields.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/mock_fail_script.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/mock_pass_script.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/setup_main.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/setup_sub.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/sub_json_tests.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/sub_text_tests.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases1.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.json +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.yaml +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_binary_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_h5_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_json_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_xml_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/test_depends_on.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/test_spaces_in_paths.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_history_feature.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_new_cli_features.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_real_command_execution.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_sequence.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/run_all.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/test_compare_command.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader_new_features.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_execution.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_execution_new_features.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_history_store.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_last_run_store.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_orchestration_accept.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_process_worker.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_sequence_state.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_setup.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_validation_error.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_xfail.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/__init__.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_error_analysis.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_hourglass_tangent_comparator.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_compare.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_parity.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_json_yaml_runner.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_filter.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_tag_filter.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_binary_comparator.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_config_io.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_h5_comparator.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_import_expander.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_inheritance_expander.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_migrate.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_result.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_run_all.py +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/test_junit_xml_writer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2024
|
|
3
|
+
Copyright (c) 2024 SymTest Contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symtest-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.1
|
|
4
4
|
Summary: Regression testing for CLI applications, with multi-step workflows and numerical file comparison.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
Author-email: Xiaotong Wang <xiaotongwang98@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/ozil111/symtest-cli
|
|
8
8
|
Project-URL: Documentation, https://github.com/ozil111/symtest-cli/blob/main/docs/user_manual.md
|
|
9
9
|
Project-URL: Source, https://github.com/ozil111/symtest-cli
|
|
10
10
|
Project-URL: Tracker, https://github.com/ozil111/symtest-cli/issues
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
-
Classifier: Operating System :: OS Independent
|
|
14
|
-
Classifier: Development Status :: 4 - Beta
|
|
15
|
-
Classifier: Intended Audience :: Developers
|
|
16
|
-
Classifier: Topic :: Software Development :: Testing
|
|
17
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
11
|
Requires-Python: >=3.9
|
|
19
12
|
Description-Content-Type: text/markdown
|
|
20
13
|
License-File: LICENSE
|
|
@@ -23,31 +16,16 @@ Requires-Dist: numpy>=1.21.0; python_version < "3.12"
|
|
|
23
16
|
Requires-Dist: numpy>=1.26.0; python_version >= "3.12"
|
|
24
17
|
Provides-Extra: yaml
|
|
25
18
|
Requires-Dist: PyYAML>=6.0; extra == "yaml"
|
|
26
|
-
Provides-Extra: tui
|
|
27
|
-
Requires-Dist: textual>=0.40.0; extra == "tui"
|
|
28
19
|
Provides-Extra: all
|
|
29
20
|
Requires-Dist: PyYAML>=6.0; extra == "all"
|
|
30
|
-
Requires-Dist: textual>=0.40.0; extra == "all"
|
|
31
21
|
Provides-Extra: dev
|
|
32
22
|
Requires-Dist: PyYAML>=6.0; extra == "dev"
|
|
33
|
-
Requires-Dist: textual>=0.40.0; extra == "dev"
|
|
34
23
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
35
24
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
36
25
|
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
37
|
-
Dynamic: author
|
|
38
|
-
Dynamic: author-email
|
|
39
|
-
Dynamic: classifier
|
|
40
|
-
Dynamic: description
|
|
41
|
-
Dynamic: description-content-type
|
|
42
|
-
Dynamic: home-page
|
|
43
26
|
Dynamic: license-file
|
|
44
|
-
Dynamic: project-url
|
|
45
|
-
Dynamic: provides-extra
|
|
46
|
-
Dynamic: requires-dist
|
|
47
|
-
Dynamic: requires-python
|
|
48
|
-
Dynamic: summary
|
|
49
27
|
|
|
50
|
-
#
|
|
28
|
+
# SymTest
|
|
51
29
|
|
|
52
30
|
[中文](README_cn.md) | English
|
|
53
31
|
|
|
@@ -60,10 +38,14 @@ Dynamic: summary
|
|
|
60
38
|
> pip install symtest-cli
|
|
61
39
|
> ```
|
|
62
40
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
41
|
+
Regression testing for numerical and scientific command-line workflows.
|
|
42
|
+
|
|
43
|
+
Run solvers, compare HDF5/CSV outputs with tolerances, diagnose numerical
|
|
44
|
+
regressions, and rerun only what failed.
|
|
45
|
+
|
|
46
|
+
SymTest can also be used as a general-purpose CLI regression framework:
|
|
47
|
+
multi-step commands, large configuration sets, parallel execution, and
|
|
48
|
+
CI-ready reports.
|
|
67
49
|
|
|
68
50
|
The project grew out of finite-element solver development, where a single test
|
|
69
51
|
may run several programs, produce HDF5 or CSV results, compare them with
|
|
@@ -71,7 +53,7 @@ tolerances, and track execution time across revisions.
|
|
|
71
53
|
|
|
72
54
|
## What it solves
|
|
73
55
|
|
|
74
|
-
|
|
56
|
+
SymTest keeps the execution workflow and its acceptance criteria in
|
|
75
57
|
one JSON or YAML configuration:
|
|
76
58
|
|
|
77
59
|
- **Execute workflows** — single commands or fail-fast step sequences, with
|
|
@@ -79,8 +61,8 @@ one JSON or YAML configuration:
|
|
|
79
61
|
- **Verify results** — return codes, output text and regular expressions, plus
|
|
80
62
|
text, JSON, CSV, XML, HDF5, binary, and custom-script file comparisons.
|
|
81
63
|
- **Manage large suites** — split configurations with `import`, reuse templates
|
|
82
|
-
with `extends`, filter by name or tag, and
|
|
83
|
-
|
|
64
|
+
with `extends`, filter by name or tag, and locate cases across files with
|
|
65
|
+
`symtest find`.
|
|
84
66
|
- **Iterate and integrate** — parallel execution, `--last-failed`, step-level
|
|
85
67
|
`--resume`, runtime history, structured reports, and JUnit XML output.
|
|
86
68
|
|
|
@@ -95,11 +77,10 @@ Python 3.9 or newer is required.
|
|
|
95
77
|
pip install symtest-cli
|
|
96
78
|
```
|
|
97
79
|
|
|
98
|
-
YAML
|
|
80
|
+
YAML support is optional:
|
|
99
81
|
|
|
100
82
|
```bash
|
|
101
83
|
pip install "symtest-cli[yaml]"
|
|
102
|
-
pip install "symtest-cli[tui]"
|
|
103
84
|
pip install "symtest-cli[all]"
|
|
104
85
|
```
|
|
105
86
|
|
|
@@ -204,7 +185,7 @@ symtest run solver_tests.json -t long_case --resume
|
|
|
204
185
|
`--resume` deliberately trusts that workspace artifacts have not changed
|
|
205
186
|
between runs.
|
|
206
187
|
|
|
207
|
-
## Large test suites and
|
|
188
|
+
## Large test suites and cross-file search
|
|
208
189
|
|
|
209
190
|
Large suites can be divided into sub-configurations:
|
|
210
191
|
|
|
@@ -217,12 +198,12 @@ Large suites can be divided into sub-configurations:
|
|
|
217
198
|
}
|
|
218
199
|
```
|
|
219
200
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
201
|
+
`symtest find` auto-expands all `import` references and searches across the
|
|
202
|
+
unified case set (substring / fuzzy / regex modes), making it easy to locate
|
|
203
|
+
cases and review scenario coverage in large projects:
|
|
223
204
|
|
|
224
205
|
```bash
|
|
225
|
-
symtest
|
|
206
|
+
symtest find main_config.json "login"
|
|
226
207
|
```
|
|
227
208
|
|
|
228
209
|
## Parallel execution and resources
|
|
@@ -298,9 +279,9 @@ requirement for using the framework.
|
|
|
298
279
|
- [User manual](docs/user_manual_en.md)
|
|
299
280
|
- [Design document](docs/design_en.md)
|
|
300
281
|
- [Plugin examples](examples/plugins/README.md)
|
|
301
|
-
- [AI Skill
|
|
302
|
-
|
|
303
|
-
|
|
282
|
+
- [Official AI Skill](skill/) — install this skill into AI coding assistants
|
|
283
|
+
so they can author test cases, acceptance criteria, and TDD workflows
|
|
284
|
+
directly — the recommended entry point for new users
|
|
304
285
|
|
|
305
286
|
## Development
|
|
306
287
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SymTest
|
|
2
2
|
|
|
3
3
|
[中文](README_cn.md) | English
|
|
4
4
|
|
|
@@ -11,10 +11,14 @@
|
|
|
11
11
|
> pip install symtest-cli
|
|
12
12
|
> ```
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
Regression testing for numerical and scientific command-line workflows.
|
|
15
|
+
|
|
16
|
+
Run solvers, compare HDF5/CSV outputs with tolerances, diagnose numerical
|
|
17
|
+
regressions, and rerun only what failed.
|
|
18
|
+
|
|
19
|
+
SymTest can also be used as a general-purpose CLI regression framework:
|
|
20
|
+
multi-step commands, large configuration sets, parallel execution, and
|
|
21
|
+
CI-ready reports.
|
|
18
22
|
|
|
19
23
|
The project grew out of finite-element solver development, where a single test
|
|
20
24
|
may run several programs, produce HDF5 or CSV results, compare them with
|
|
@@ -22,7 +26,7 @@ tolerances, and track execution time across revisions.
|
|
|
22
26
|
|
|
23
27
|
## What it solves
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
SymTest keeps the execution workflow and its acceptance criteria in
|
|
26
30
|
one JSON or YAML configuration:
|
|
27
31
|
|
|
28
32
|
- **Execute workflows** — single commands or fail-fast step sequences, with
|
|
@@ -30,8 +34,8 @@ one JSON or YAML configuration:
|
|
|
30
34
|
- **Verify results** — return codes, output text and regular expressions, plus
|
|
31
35
|
text, JSON, CSV, XML, HDF5, binary, and custom-script file comparisons.
|
|
32
36
|
- **Manage large suites** — split configurations with `import`, reuse templates
|
|
33
|
-
with `extends`, filter by name or tag, and
|
|
34
|
-
|
|
37
|
+
with `extends`, filter by name or tag, and locate cases across files with
|
|
38
|
+
`symtest find`.
|
|
35
39
|
- **Iterate and integrate** — parallel execution, `--last-failed`, step-level
|
|
36
40
|
`--resume`, runtime history, structured reports, and JUnit XML output.
|
|
37
41
|
|
|
@@ -46,11 +50,10 @@ Python 3.9 or newer is required.
|
|
|
46
50
|
pip install symtest-cli
|
|
47
51
|
```
|
|
48
52
|
|
|
49
|
-
YAML
|
|
53
|
+
YAML support is optional:
|
|
50
54
|
|
|
51
55
|
```bash
|
|
52
56
|
pip install "symtest-cli[yaml]"
|
|
53
|
-
pip install "symtest-cli[tui]"
|
|
54
57
|
pip install "symtest-cli[all]"
|
|
55
58
|
```
|
|
56
59
|
|
|
@@ -155,7 +158,7 @@ symtest run solver_tests.json -t long_case --resume
|
|
|
155
158
|
`--resume` deliberately trusts that workspace artifacts have not changed
|
|
156
159
|
between runs.
|
|
157
160
|
|
|
158
|
-
## Large test suites and
|
|
161
|
+
## Large test suites and cross-file search
|
|
159
162
|
|
|
160
163
|
Large suites can be divided into sub-configurations:
|
|
161
164
|
|
|
@@ -168,12 +171,12 @@ Large suites can be divided into sub-configurations:
|
|
|
168
171
|
}
|
|
169
172
|
```
|
|
170
173
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
`symtest find` auto-expands all `import` references and searches across the
|
|
175
|
+
unified case set (substring / fuzzy / regex modes), making it easy to locate
|
|
176
|
+
cases and review scenario coverage in large projects:
|
|
174
177
|
|
|
175
178
|
```bash
|
|
176
|
-
symtest
|
|
179
|
+
symtest find main_config.json "login"
|
|
177
180
|
```
|
|
178
181
|
|
|
179
182
|
## Parallel execution and resources
|
|
@@ -249,9 +252,9 @@ requirement for using the framework.
|
|
|
249
252
|
- [User manual](docs/user_manual_en.md)
|
|
250
253
|
- [Design document](docs/design_en.md)
|
|
251
254
|
- [Plugin examples](examples/plugins/README.md)
|
|
252
|
-
- [AI Skill
|
|
253
|
-
|
|
254
|
-
|
|
255
|
+
- [Official AI Skill](skill/) — install this skill into AI coding assistants
|
|
256
|
+
so they can author test cases, acceptance criteria, and TDD workflows
|
|
257
|
+
directly — the recommended entry point for new users
|
|
255
258
|
|
|
256
259
|
## Development
|
|
257
260
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SymTest 设计文档
|
|
2
2
|
|
|
3
3
|
> **维护原则(单一事实来源)**:本文档不镜像代码结构——不再维护目录树、类签名、
|
|
4
4
|
> 函数清单、dataclass 字段定义等会随代码漂移的内容。目录结构与 API 以
|
|
5
5
|
> `src/symtest/` 源码及其 docstring 为准,用法示例见 `examples/`。
|
|
6
6
|
> 本文档只承载代码里读不出来的设计信息:架构分层、职责边界、关键流程语义、
|
|
7
|
-
>
|
|
7
|
+
> 扩展契约、设计决策与核心架构不变量。
|
|
8
8
|
|
|
9
9
|
## 1. 架构总览
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
┌─────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ CLI 入口层 symtest run /
|
|
14
|
-
│ compare-files
|
|
13
|
+
│ CLI 入口层 symtest run / find / validate / schema / │
|
|
14
|
+
│ compare-files │
|
|
15
15
|
└───────────────────────────┬─────────────────────────────────┘
|
|
16
16
|
▼
|
|
17
17
|
┌─────────────────────────────────────────────────────────────┐
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
└─────────────────────────────────────────────────────────────┘
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
框架分为四层:**CLI
|
|
35
|
+
框架分为四层:**CLI 入口层**、**Runner / Comparator 业务层**、**Config 管线层**、**Core 基础层**。
|
|
36
36
|
|
|
37
|
-
层与层不是自由组合:跨层数据流与依赖方向受 §10
|
|
38
|
-
新增 feature
|
|
37
|
+
层与层不是自由组合:跨层数据流与依赖方向受 §10「架构不变量」约束,
|
|
38
|
+
新增 feature 请先对照不变量确定归属。
|
|
39
39
|
|
|
40
40
|
## 2. 模块地图
|
|
41
41
|
|
|
@@ -49,14 +49,13 @@
|
|
|
49
49
|
| `runners/` | Config/JSON/YAML × 顺序/并行 的薄封装运行器 |
|
|
50
50
|
| `file_comparator/` | 比较器家族 + 工厂 + workspace 插件发现(详见 §6) |
|
|
51
51
|
| `utils/` | 路径解析、报告生成、JUnit XML 输出 |
|
|
52
|
-
| `tui/` | Textual 交互式用例管理(详见 §7) |
|
|
53
52
|
|
|
54
53
|
### 2.1 入口点
|
|
55
54
|
|
|
56
55
|
| 命令 | 映射 |
|
|
57
56
|
|---|---|
|
|
58
57
|
| `symtest run` | `symtest.cli:run_tests` |
|
|
59
|
-
| `symtest
|
|
58
|
+
| `symtest find` | `symtest.commands.find:run_find` |
|
|
60
59
|
| `symtest validate` | `symtest.cli:run_validate` |
|
|
61
60
|
| `symtest schema` | `symtest.cli:run_schema` |
|
|
62
61
|
| `symtest compare` | `symtest.cli:run_compare` |
|
|
@@ -175,33 +174,68 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
|
|
|
175
174
|
|
|
176
175
|
## 6. 文件比较子系统
|
|
177
176
|
|
|
178
|
-
### 6.1
|
|
177
|
+
### 6.1 三泳道比较器架构
|
|
179
178
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
所有比较器共享根契约 `ComparatorBase.compare(ctx) -> ComparisonResult`:
|
|
180
|
+
框架构建 `CompareContext`(workspace / actual / baseline / params / error_analysis);
|
|
181
|
+
`actual`/`baseline` 以及插件 `path_params` 声明的构造参数在**比较器构造之前**
|
|
182
|
+
按 workspace 统一解析,插件不得自行对 CWD resolve。配置单一事实源:
|
|
183
|
+
比较器配置只存在于构造器捕获的实例状态,`ctx` 仅承载调用级上下文。
|
|
184
|
+
三条泳道职责互斥:
|
|
183
185
|
|
|
184
|
-
|
|
186
|
+
| 泳道 | 基类 | 契约 | verdict 归属 | 内置实例 |
|
|
187
|
+
|---|---|---|---|---|
|
|
188
|
+
| 文件泳道 | `FileComparator` | `read_content` + `compare_content`(两文件模型,行列窗口、line N 偏移、chunk_size、similarity 均属本泳道) | 插件 | text / json / csv / xml / h5 / binary |
|
|
189
|
+
| 数据泳道 | `ExtractorComparator` | `extract(ctx) -> {channel: ChannelData}`;框架逐通道跑 `compare_numeric`,per-channel 容差(`channels` / `default_channel`),聚合 `ChannelResult` | **框架**(容差语义对 AI 消费端可预期) | script_extract、extractor 插件 |
|
|
190
|
+
| 自主泳道 | 直接继承根 | `compare(ctx)` 全权判定 | 插件 | script、hourglass 式分析插件 |
|
|
185
191
|
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
-
|
|
192
|
+
- 文本系共享 difflib 行级基底,json / csv / xml 为其结构化特化;h5 面向科学数据集;binary 流式分块 + LCS 相似度
|
|
193
|
+
- 统一返回 `ComparisonResult`(identical / differences / error / error_stats / command_output / channels),支持 text / json / html 渲染
|
|
194
|
+
- 数据泳道插件可通过 `ChannelData.extra_stats` 附带自定义误差指标,存放在独立命名空间(`ChannelResult.extra_stats`),不可覆盖框架规范指标;但 verdict 仍由框架容差持有——需要自定 verdict 的走自主泳道
|
|
189
195
|
|
|
190
|
-
### 6.
|
|
196
|
+
### 6.2 通道协议(数据泳道)
|
|
191
197
|
|
|
192
|
-
-
|
|
198
|
+
- 通道判定:`identical = all(channels.passed)`;差异 position 带通道前缀(`channel S33`);`error_stats` 按通道名嵌套
|
|
199
|
+
- 内置 `script_extract` 类型:子进程执行用户脚本(零改动接入),脚本 stdout 输出约定 JSON:
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{"channels": {"S11": {"expected": [...], "actual": [...], "extra_stats": {...}}}}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
非零退出、超时、畸形 JSON 一律判为比较 error(绝不静默通过);`actual`/`baseline` 按惯例以 baseline 在前的顺序追加为尾部 argv 槽位(可缺省)
|
|
206
|
+
- 结果粒度:一条 compareSpec = 一条断言;`ComparisonResult.channels` 携带通道级子结果,报告逐通道展示 pass/fail + stats;JSON 输出中通道 differences 按 per-channel 配额截断
|
|
207
|
+
|
|
208
|
+
### 6.3 工厂与插件发现
|
|
209
|
+
|
|
210
|
+
- `file_type` 取值:`text` / `json` / `csv` / `xml` / `h5` / `binary` / `script` / `script_extract`;工厂按类型分发,支持动态注册与全局 reset(测试用)
|
|
211
|
+
- 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(用户声明的输入;框架只读,进程模式 worker 经进程池 initializer 显式接收插件目录,框架从不修改 `os.environ`)
|
|
212
|
+
- 命名约定:`*_comparator.py` + `*Comparator` 类名;可用类属性 `comparator_type` 显式指定类型名(如 `script_extract`);抽象基类自动跳过注册
|
|
213
|
+
- 配置传递与严格校验:`actual`/`baseline`/`type`/`options` 之外的键转发给比较器构造函数(kwargs);构造器参数是**严格**的——未声明的键(拼写错误)在构造时大声失败并给出支持参数清单。`options` 是框架持有的插件配置命名空间(并入构造参数,显式顶层键优先),核心 schema 不为单个插件增加专属字段;`channels`/`default_channel` 属数据泳道框架结构
|
|
214
|
+
|
|
215
|
+
### 6.4 script 比较协议(自主泳道对外契约)
|
|
216
|
+
|
|
217
|
+
- 子进程方式执行 `<interpreter> <script> <baseline> <actual>`(文件槽位可缺省)
|
|
193
218
|
- 默认 exit code 0 → 通过;可选 `pass_pattern` / `fail_pattern` 正则匹配 stdout 细化判定
|
|
194
219
|
- 超时可配
|
|
195
220
|
|
|
196
|
-
|
|
221
|
+
### 6.5 插件公共 API
|
|
222
|
+
|
|
223
|
+
`symtest.file_comparator` 包导出:`ComparatorBase` / `CompareContext` /
|
|
224
|
+
`FileComparator` / `ExtractorComparator` / `ChannelData` / `ChannelResult` /
|
|
225
|
+
`compare_numeric` / `NumericComparisonStats` / `parse_data_filter`。
|
|
226
|
+
数据泳道插件只需依赖 `ExtractorComparator` + `ChannelData`,数值判定全部复用框架核心。
|
|
197
227
|
|
|
198
|
-
|
|
199
|
-
delete / run_single / save 业务动作)+ 列表 / 编辑两屏 + 表格封装、多模式搜索条
|
|
200
|
-
(名称 / 命令 / 标签)、expected 编辑器、steps 编辑器。
|
|
228
|
+
## 7. 用例搜索命令(find)
|
|
201
229
|
|
|
202
|
-
|
|
230
|
+
替代已移除的 TUI 搜索能力:`symtest find` 走与 runner 完全相同的加载路径
|
|
231
|
+
(`load_config` 自动展开 import + 继承解析,`parse_test_cases` 全系统唯一
|
|
232
|
+
解析器),在展开后的用例集上按三种模式匹配(子串 / 模糊 / 正则,字段覆盖
|
|
233
|
+
name / command / args / tags / description),支持叠加标签过滤与 JSON 输出
|
|
234
|
+
(供 AI / 脚本消费)。退出码沿用 grep 语义:有匹配 0、无匹配 1、错误 2。
|
|
203
235
|
|
|
204
|
-
|
|
236
|
+
原 TUI 的另一职责(给不习惯写配置的同事提供图形化定义/修改用例)由官方
|
|
237
|
+
skill(仓库根 `skill/`)承担:AI 编程助手按 skill 知识直接生成/修改
|
|
238
|
+
JSON/YAML 配置,学习成本更低且无交互界面维护负担。
|
|
205
239
|
|
|
206
240
|
## 8. 扩展点
|
|
207
241
|
|
|
@@ -210,9 +244,8 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
|
|
|
210
244
|
| 新配置格式 | `BaseRunner` | 支持新的测试定义格式(如 XML、TOML) |
|
|
211
245
|
| 自定义 Setup | `BaseSetup` | 数据库初始化、服务启停等 |
|
|
212
246
|
| 自定义断言 | 扩展 `Assertions` | 特定业务校验逻辑 |
|
|
213
|
-
| 新比较器 | `
|
|
247
|
+
| 新比较器 | `FileComparator` / `ExtractorComparator` / `ComparatorBase` | 按泳道选择基类(文件格式 / 数据提取+通道 / 全权分析),放入 `comparators/` 目录自动发现 |
|
|
214
248
|
| 新 Runner | `ParallelRunner` / `BaseRunner` | 自定义并行调度策略 |
|
|
215
|
-
| TUI 扩展 | `CaseController` / Widgets | 扩展终端管理界面 |
|
|
216
249
|
|
|
217
250
|
## 9. 设计决策
|
|
218
251
|
|
|
@@ -238,17 +271,16 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
|
|
|
238
271
|
| DAG 依赖调度 | 基于 Kahn 拓扑 + 就绪队列,依赖满足后立即提交;依赖失败级联 skip 下游;无依赖时走 fast path 零开销 |
|
|
239
272
|
| --update-baseline | 比较失败时自动将实际输出覆盖 baseline,适合批量更新基准 |
|
|
240
273
|
| next_action_hint 结构化建议 | 失败结果附带下一步操作建议(update_baseline / update_expected / increase_timeout / investigate),便于 AI 消费 |
|
|
241
|
-
| TUI
|
|
274
|
+
| 移除 TUI,由官方 skill + `symtest find` 替代 | TUI 的两大职责均有更轻替代:定义/修改用例由 AI 编程助手按官方 skill 完成,跨文件搜索由复用同一解析管线的 `find` 命令覆盖;移除后砍掉 textual 重依赖与交互界面维护负担 |
|
|
242
275
|
| JUnit XML 输出 | 兼容 GitLab CI / Jenkins / CircleCI 等主流 CI 系统的测试报告格式 |
|
|
243
276
|
| Logging 统一化 | 通过 `logging` 模块集中管理,CLI 入口激活控制台输出,库用户按需启用 |
|
|
244
277
|
|
|
245
278
|
---
|
|
246
279
|
|
|
247
|
-
## 10.
|
|
280
|
+
## 10. 架构不变量
|
|
248
281
|
|
|
249
|
-
>
|
|
250
|
-
>
|
|
251
|
-
> 修订宪法必须在变更说明中显式指出所放宽/违反的条款及理由。
|
|
282
|
+
> **定位**:本节自 Symtest 1.4 Phase 0 评审定稿。这些不变量定义了模块归属与依赖方向;
|
|
283
|
+
> 新增 feature 应遵守它们,除非变更说明中显式记录了某条不变量为何需要演进。
|
|
252
284
|
|
|
253
285
|
### 10.1 数据流主线
|
|
254
286
|
|
|
@@ -326,10 +358,10 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
326
358
|
|
|
327
359
|
#### 原则 6 — 核心模型不依赖表现层
|
|
328
360
|
|
|
329
|
-
`core` 绝对不能 import:`cli` / `
|
|
361
|
+
`core` 绝对不能 import:`cli` / `reporter` / AI-specific adapter。
|
|
330
362
|
|
|
331
|
-
|
|
332
|
-
|
|
363
|
+
解析器全系统唯一:不允许存在宽松解析后门(如 workspace=None 时放宽校验);
|
|
364
|
+
宽松形态由调用方先 normalize 再调用。
|
|
333
365
|
|
|
334
366
|
### 10.3 模块依赖方向
|
|
335
367
|
|
|
@@ -344,9 +376,9 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
344
376
|
- `execution` 与 `validation` 互不 import;
|
|
345
377
|
- `executor` 不得 import `assertions` / validation 侧模块;
|
|
346
378
|
- `validator` 不得启动被测进程(见原则 3);
|
|
347
|
-
- `core` 不得 import `cli` / `
|
|
379
|
+
- `core` 不得 import `cli` / `reporter`。
|
|
348
380
|
|
|
349
|
-
### 10.4
|
|
381
|
+
### 10.4 归属速查
|
|
350
382
|
|
|
351
383
|
任何新需求先问归属:
|
|
352
384
|
|
|
@@ -358,14 +390,14 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
358
390
|
| AI 告诉我下一步该干嘛? | Result consumer / diagnosis |
|
|
359
391
|
|
|
360
392
|
判据:若仍经常出现"这个功能到底放 execution、runner 还是 testcase?"的争论,
|
|
361
|
-
|
|
393
|
+
说明不变量没有被正确适用,应回到 10.2 逐条对照。
|
|
362
394
|
|
|
363
|
-
### 10.5
|
|
395
|
+
### 10.5 不变量可执行化
|
|
364
396
|
|
|
365
|
-
|
|
397
|
+
这些不变量不只是文档约定,配套 architecture guard 测试并由 CI 强制:
|
|
366
398
|
|
|
367
399
|
- 断言 import 图:如 `execution/executor.py` 的 import 不得出现
|
|
368
|
-
`assertions` / `validation`;`core/**` 不得 import `cli` /
|
|
400
|
+
`assertions` / `validation`;`core/**` 不得 import `cli` /
|
|
369
401
|
`reporter`;
|
|
370
402
|
- guard 测试纳入常规回归套件(`python tests\run_all.py`),违规即失败;
|
|
371
403
|
- 冲突裁决次序:guard 测试 > 本节文字 > 个人偏好。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SymTest Design Document
|
|
2
2
|
|
|
3
3
|
> **Maintenance principle (single source of truth)**: this document does not mirror
|
|
4
4
|
> code structure — it no longer maintains directory trees, class signatures,
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
> their docstrings; usage examples live in `examples/`.
|
|
8
8
|
> This document only carries what cannot be read out of code: architecture
|
|
9
9
|
> layering, responsibility boundaries, key flow semantics, extension contracts,
|
|
10
|
-
> design decisions, and the architecture
|
|
10
|
+
> design decisions, and the architecture invariants.
|
|
11
11
|
|
|
12
12
|
## 1. Architecture Overview
|
|
13
13
|
|
|
14
14
|
```
|
|
15
15
|
┌─────────────────────────────────────────────────────────────┐
|
|
16
|
-
│ CLI Entry Layer symtest run /
|
|
17
|
-
│ compare-files
|
|
16
|
+
│ CLI Entry Layer symtest run / find / validate / schema / │
|
|
17
|
+
│ compare-files │
|
|
18
18
|
└───────────────────────────┬─────────────────────────────────┘
|
|
19
19
|
▼
|
|
20
20
|
┌─────────────────────────────────────────────────────────────┐
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
└─────────────────────────────────────────────────────────────┘
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
The framework is divided into four layers: **CLI Entry Layer
|
|
40
|
+
The framework is divided into four layers: **CLI Entry Layer**,
|
|
41
41
|
**Runner / Comparator Business Layer**, **Config Pipeline Layer**, and
|
|
42
42
|
**Core Foundation Layer**.
|
|
43
43
|
|
|
44
44
|
Layers are not free-to-wire: cross-layer data flow and dependency directions are
|
|
45
|
-
governed by the §10
|
|
46
|
-
against
|
|
45
|
+
governed by the §10 architecture invariants. Resolve feature ownership
|
|
46
|
+
against them first.
|
|
47
47
|
|
|
48
48
|
## 2. Module Map
|
|
49
49
|
|
|
@@ -57,14 +57,13 @@ Responsibilities by package (file-level details and public APIs live in source):
|
|
|
57
57
|
| `runners/` | Thin wrapper runners: Config/JSON/YAML × sequential/parallel |
|
|
58
58
|
| `file_comparator/` | Comparator family + factory + workspace plugin discovery (see §6) |
|
|
59
59
|
| `utils/` | Path resolution, report generation, JUnit XML output |
|
|
60
|
-
| `tui/` | Interactive Textual case management (see §7) |
|
|
61
60
|
|
|
62
61
|
### 2.1 Entry Points
|
|
63
62
|
|
|
64
63
|
| Command | Mapping |
|
|
65
64
|
|---|---|
|
|
66
65
|
| `symtest run` | `symtest.cli:run_tests` |
|
|
67
|
-
| `symtest
|
|
66
|
+
| `symtest find` | `symtest.commands.find:run_find` |
|
|
68
67
|
| `symtest validate` | `symtest.cli:run_validate` |
|
|
69
68
|
| `symtest schema` | `symtest.cli:run_schema` |
|
|
70
69
|
| `symtest compare` | `symtest.cli:run_compare` |
|
|
@@ -204,17 +203,21 @@ guarantees they are unmodified.
|
|
|
204
203
|
- Default exit code 0 → pass; optional `pass_pattern` / `fail_pattern` regexes refine the verdict on stdout
|
|
205
204
|
- Timeout configurable
|
|
206
205
|
|
|
207
|
-
## 7.
|
|
206
|
+
## 7. Case Search Command (find)
|
|
208
207
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
208
|
+
Replaces the search capability of the retired TUI: `symtest find` goes through
|
|
209
|
+
exactly the same loading path as the runners (`load_config` auto-expands
|
|
210
|
+
imports + resolves inheritance; `parse_test_cases` is the single system-wide
|
|
211
|
+
parser), then matches cases in three modes (substring / fuzzy / regex, across
|
|
212
|
+
name / command / args / tags / description) with optional tag filtering and
|
|
213
|
+
JSON output (for AI / scripts). Exit codes follow grep semantics: 0 = match,
|
|
214
|
+
1 = no match, 2 = error.
|
|
212
215
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
216
|
+
The TUI's other responsibility (graphical case authoring/editing for people
|
|
217
|
+
unfamiliar with writing configs) is now covered by the official skill
|
|
218
|
+
(`skill/` at the repository root): AI coding assistants author/modify
|
|
219
|
+
JSON/YAML configs directly from skill knowledge, with lower learning cost and
|
|
220
|
+
no interactive UI maintenance burden.
|
|
218
221
|
|
|
219
222
|
## 8. Extension Points
|
|
220
223
|
|
|
@@ -225,7 +228,6 @@ TUI side itself (§10 Principle 6).
|
|
|
225
228
|
| Custom assertions | Extend `Assertions` | Specific business validation logic |
|
|
226
229
|
| New comparator | `BaseComparator` | Support new file formats; place in `comparators/` for auto-discovery |
|
|
227
230
|
| New Runner | `ParallelRunner` / `BaseRunner` | Custom parallel scheduling strategies |
|
|
228
|
-
| TUI extensions | `CaseController` / Widgets | Extend the terminal management interface |
|
|
229
231
|
|
|
230
232
|
## 9. Design Decisions
|
|
231
233
|
|
|
@@ -250,19 +252,17 @@ TUI side itself (§10 Principle 6).
|
|
|
250
252
|
| DAG dependency scheduling | Kahn topology + ready queue; submits dependents immediately once deps are satisfied; cascade-skips downstream on dep failure; zero-overhead fast path when no deps declared |
|
|
251
253
|
| --update-baseline | Automatically overwrites baseline files with actual output on comparison failure; ideal for batch baseline updates |
|
|
252
254
|
| next_action_hint structured suggestions | Failed results include actionable suggestions (update_baseline / update_expected / increase_timeout / investigate), convenient for AI consumption |
|
|
253
|
-
| TUI
|
|
255
|
+
| TUI removed; replaced by official skill + `symtest find` | Both TUI responsibilities have lighter replacements: case authoring/editing is done by AI assistants via the official skill; cross-file search is covered by the `find` command reusing the same parsing pipeline; removes the heavy textual dependency and interactive-UI maintenance burden |
|
|
254
256
|
| JUnit XML output | Compatible with GitLab CI / Jenkins / CircleCI and other major CI system test report formats |
|
|
255
257
|
| Centralized logging | All diagnostic messages go through Python's `logging` module; CLI entry activates console output; library users enable as needed |
|
|
256
258
|
|
|
257
259
|
---
|
|
258
260
|
|
|
259
|
-
## 10.
|
|
261
|
+
## 10. Architecture Invariants
|
|
260
262
|
|
|
261
|
-
> **Status
|
|
262
|
-
>
|
|
263
|
-
>
|
|
264
|
-
> Amending it requires explicitly naming the clause being relaxed/waived and the
|
|
265
|
-
> rationale in the change description.
|
|
263
|
+
> **Status**: established at Symtest 1.4 Phase 0 review. These invariants define
|
|
264
|
+
> module ownership and dependency direction. New features should preserve them
|
|
265
|
+
> unless a change explicitly documents why an invariant must evolve.
|
|
266
266
|
|
|
267
267
|
### 10.1 Data Flow Spine
|
|
268
268
|
|
|
@@ -346,11 +346,11 @@ to result consumers (diagnosis) and must not exist in the execution layer.
|
|
|
346
346
|
|
|
347
347
|
#### Principle 6 — The core model does not depend on presentation
|
|
348
348
|
|
|
349
|
-
`core` must never import: `cli` / `
|
|
349
|
+
`core` must never import: `cli` / `reporter` / AI-specific adapters.
|
|
350
350
|
|
|
351
|
-
One parser for the whole system:
|
|
352
|
-
|
|
353
|
-
|
|
351
|
+
One parser for the whole system: no relaxed-parsing back door is allowed
|
|
352
|
+
(e.g., relaxed validation when workspace=None); relaxed shapes are normalized
|
|
353
|
+
by the caller before invoking the parser.
|
|
354
354
|
|
|
355
355
|
### 10.3 Module Dependency Direction
|
|
356
356
|
|
|
@@ -365,7 +365,7 @@ Forbidden:
|
|
|
365
365
|
- `execution` and `validation` must not import each other;
|
|
366
366
|
- the `executor` must not import `assertions` / validation-side modules;
|
|
367
367
|
- the `validator` must not launch the process under test (see Principle 3);
|
|
368
|
-
- `core` must not import `cli` / `
|
|
368
|
+
- `core` must not import `cli` / `reporter`.
|
|
369
369
|
|
|
370
370
|
### 10.4 Ownership Quick Reference
|
|
371
371
|
|
|
@@ -379,17 +379,17 @@ For any new requirement, ask ownership first:
|
|
|
379
379
|
| AI tells me what to do next? | Result consumer / diagnosis |
|
|
380
380
|
|
|
381
381
|
Litmus test: if arguments like "does this go into execution, the runner, or the
|
|
382
|
-
testcase?" keep recurring, the
|
|
382
|
+
testcase?" keep recurring, the invariants are not being applied correctly — go
|
|
383
383
|
back to 10.2 and check clause by clause.
|
|
384
384
|
|
|
385
|
-
### 10.5 Making the
|
|
385
|
+
### 10.5 Making the Invariants Enforceable
|
|
386
386
|
|
|
387
|
-
|
|
387
|
+
These invariants are not documentation-only; they come with
|
|
388
388
|
architecture guard tests enforced by CI:
|
|
389
389
|
|
|
390
390
|
- Assert the import graph: e.g., imports of `execution/executor.py` must not
|
|
391
391
|
contain `assertions` / `validation`; `core/**` must not import `cli` /
|
|
392
|
-
`
|
|
392
|
+
`reporter`;
|
|
393
393
|
- Guard tests are part of the regular regression suite
|
|
394
394
|
(`python tests\run_all.py`); violations fail the build;
|
|
395
395
|
- Conflict resolution order: guard tests > this text > personal preference.
|