symtest-cli 1.5.0__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.5.0 → symtest_cli-1.5.1}/LICENSE +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/MANIFEST.in +2 -1
- {symtest_cli-1.5.0/src/symtest_cli.egg-info → symtest_cli-1.5.1}/PKG-INFO +25 -44
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/README.md +21 -18
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/design.md +31 -32
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/design_en.md +35 -35
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/user_manual.md +21 -120
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/user_manual_en.md +24 -117
- 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/src/symtest/commands/compare.py +43 -25
- symtest_cli-1.5.1/src/symtest/commands/find.py +275 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/commands/migrate.py +26 -0
- symtest_cli-1.5.0/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.5.0 → symtest_cli-1.5.1}/src/symtest/config/__init__.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/normalize.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/__init__.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/base_runner.py +7 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/config_loader.py +2 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/parallel_runner.py +31 -14
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/result.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/test_case.py +13 -15
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/assertions.py +4 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/factory.py +25 -12
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/logging_config.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/reporting/__init__.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/reporting/diagnosis.py +2 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/__init__.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/__init__.py +2 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/junit_xml_writer.py +1 -1
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/report_generator.py +13 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1/src/symtest_cli.egg-info}/PKG-INFO +25 -44
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/SOURCES.txt +18 -41
- {symtest_cli-1.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.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.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/test_parallel_runner.py +63 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_architecture_guard.py +6 -6
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_case_env.py +0 -33
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_model_v2.py +8 -9
- {symtest_cli-1.5.0 → 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.5.0 → 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.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.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.5.0 → 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.5.0 → 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.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.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.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.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.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.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.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.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.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_plugin_lifecycle.py +30 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_workspace_plugins.py +17 -2
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_cli.py +41 -29
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/docs/tui_and_config_split_design.md +0 -818
- symtest_cli-1.5.0/pyproject.toml +0 -3
- symtest_cli-1.5.0/setup.py +0 -75
- symtest_cli-1.5.0/src/symtest/commands/__init__.py +0 -9
- symtest_cli-1.5.0/src/symtest/tui/__init__.py +0 -11
- symtest_cli-1.5.0/src/symtest/tui/app.py +0 -90
- symtest_cli-1.5.0/src/symtest/tui/controllers/__init__.py +0 -0
- symtest_cli-1.5.0/src/symtest/tui/controllers/case_controller.py +0 -336
- symtest_cli-1.5.0/src/symtest/tui/screens/__init__.py +0 -0
- symtest_cli-1.5.0/src/symtest/tui/screens/case_editor.py +0 -282
- symtest_cli-1.5.0/src/symtest/tui/screens/case_list.py +0 -255
- symtest_cli-1.5.0/src/symtest/tui/widgets/__init__.py +0 -0
- symtest_cli-1.5.0/src/symtest/tui/widgets/case_table.py +0 -113
- symtest_cli-1.5.0/src/symtest/tui/widgets/expected_editor.py +0 -159
- symtest_cli-1.5.0/src/symtest/tui/widgets/search_bar.py +0 -160
- symtest_cli-1.5.0/src/symtest/tui/widgets/steps_editor.py +0 -243
- symtest_cli-1.5.0/tests/README.md +0 -25
- symtest_cli-1.5.0/tests/__init__.py +0 -3
- symtest_cli-1.5.0/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- symtest_cli-1.5.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__init__.py +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/__init__.cpython-312.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/__init__.cpython-313.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-7.4.4.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-9.0.3.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-313-pytest-9.0.2.pyc +0 -0
- symtest_cli-1.5.0/tests/unit/tui/conftest.py +0 -73
- symtest_cli-1.5.0/tests/unit/tui/test_app.py +0 -106
- symtest_cli-1.5.0/tests/unit/tui/test_case_controller.py +0 -439
- symtest_cli-1.5.0/tests/unit/tui/test_search_functions.py +0 -187
- symtest_cli-1.5.0/tests/unit/tui/test_tui_run_test.py +0 -384
- symtest_cli-1.5.0/tests/unit/tui/test_widgets_data.py +0 -188
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/setup.cfg +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/config_io.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/config_schema.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/import_expander.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/inheritance_expander.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/migrate.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/__init__.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/executor.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/result.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/history_store.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/last_run_store.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/__init__.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/accept.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/sequence.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/single.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/process_worker.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/sequence_state.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/setup.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/types.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/__init__.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/result.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/validator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/__init__.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/base_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/binary_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/csv_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/extractor_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/file_comparator_base.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/h5_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/json_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/numeric_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/result.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_extract_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/text_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/xml_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/config_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/json_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_config_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_json_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_yaml_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/yaml_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/path_resolver.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/dependency_links.txt +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/entry_points.txt +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/top_level.txt +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-313.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-39.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-312.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-313.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-39.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/test_setup_module.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/conftest.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/h5_filter_demo.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/manual_report_example.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/perf_parallel.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__init__.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-312.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-313.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-39.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/test_user_flows.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/circular_config_a.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/circular_config_b.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_mismatch.txt +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_sample.txt +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_base.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_chain.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_circular.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/main_config.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_a.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_b.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_base.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_chain.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_circular.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/main_config.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/missing_fields.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_main.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_sub.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_golden_file.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_steps.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_json_tests.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_text_tests.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases1.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/missing_fields.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/mock_fail_script.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/mock_pass_script.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/setup_main.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/setup_sub.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/sub_json_tests.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/sub_text_tests.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases1.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.json +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.yaml +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_binary_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_csv_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_h5_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_json_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_text_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_xml_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/test_depends_on.py +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/test_spaces_in_paths.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_history_feature.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_new_cli_features.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_real_command_execution.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_sequence.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/run_all.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/test_compare_command.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-39-pytest-8.3.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-7.4.4.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-9.0.3.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_assertions.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader_new_features.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_execution.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_execution_new_features.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_history_store.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_last_run_store.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_orchestration_accept.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_process_worker.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_sequence_state.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_setup.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_validation_error.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_xfail.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/__init__.cpython-312.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_error_analysis.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_extractor_channels.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_hourglass_tangent_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_compare.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_parity.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_extract.py +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312.pyc +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_json_yaml_runner.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_filter.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_tag_filter.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_binary_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_config_io.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_h5_comparator.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_import_expander.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_inheritance_expander.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_migrate.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_result.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_run_all.py +0 -0
- {symtest_cli-1.5.0 → 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.5.0 → 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.5.0 → 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.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-313-pytest-9.0.2.pyc +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/test_junit_xml_writer.py +0 -0
- {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/test_report_generator.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.5.
|
|
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` |
|
|
@@ -209,7 +208,7 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
|
|
|
209
208
|
### 6.3 工厂与插件发现
|
|
210
209
|
|
|
211
210
|
- `file_type` 取值:`text` / `json` / `csv` / `xml` / `h5` / `binary` / `script` / `script_extract`;工厂按类型分发,支持动态注册与全局 reset(测试用)
|
|
212
|
-
- 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS`
|
|
211
|
+
- 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(用户声明的输入;框架只读,进程模式 worker 经进程池 initializer 显式接收插件目录,框架从不修改 `os.environ`)
|
|
213
212
|
- 命名约定:`*_comparator.py` + `*Comparator` 类名;可用类属性 `comparator_type` 显式指定类型名(如 `script_extract`);抽象基类自动跳过注册
|
|
214
213
|
- 配置传递与严格校验:`actual`/`baseline`/`type`/`options` 之外的键转发给比较器构造函数(kwargs);构造器参数是**严格**的——未声明的键(拼写错误)在构造时大声失败并给出支持参数清单。`options` 是框架持有的插件配置命名空间(并入构造参数,显式顶层键优先),核心 schema 不为单个插件增加专属字段;`channels`/`default_channel` 属数据泳道框架结构
|
|
215
214
|
|
|
@@ -226,15 +225,17 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
|
|
|
226
225
|
`compare_numeric` / `NumericComparisonStats` / `parse_data_filter`。
|
|
227
226
|
数据泳道插件只需依赖 `ExtractorComparator` + `ChannelData`,数值判定全部复用框架核心。
|
|
228
227
|
|
|
229
|
-
## 7.
|
|
228
|
+
## 7. 用例搜索命令(find)
|
|
230
229
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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。
|
|
234
235
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
原 TUI 的另一职责(给不习惯写配置的同事提供图形化定义/修改用例)由官方
|
|
237
|
+
skill(仓库根 `skill/`)承担:AI 编程助手按 skill 知识直接生成/修改
|
|
238
|
+
JSON/YAML 配置,学习成本更低且无交互界面维护负担。
|
|
238
239
|
|
|
239
240
|
## 8. 扩展点
|
|
240
241
|
|
|
@@ -245,7 +246,6 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
|
|
|
245
246
|
| 自定义断言 | 扩展 `Assertions` | 特定业务校验逻辑 |
|
|
246
247
|
| 新比较器 | `FileComparator` / `ExtractorComparator` / `ComparatorBase` | 按泳道选择基类(文件格式 / 数据提取+通道 / 全权分析),放入 `comparators/` 目录自动发现 |
|
|
247
248
|
| 新 Runner | `ParallelRunner` / `BaseRunner` | 自定义并行调度策略 |
|
|
248
|
-
| TUI 扩展 | `CaseController` / Widgets | 扩展终端管理界面 |
|
|
249
249
|
|
|
250
250
|
## 9. 设计决策
|
|
251
251
|
|
|
@@ -271,17 +271,16 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
|
|
|
271
271
|
| DAG 依赖调度 | 基于 Kahn 拓扑 + 就绪队列,依赖满足后立即提交;依赖失败级联 skip 下游;无依赖时走 fast path 零开销 |
|
|
272
272
|
| --update-baseline | 比较失败时自动将实际输出覆盖 baseline,适合批量更新基准 |
|
|
273
273
|
| next_action_hint 结构化建议 | 失败结果附带下一步操作建议(update_baseline / update_expected / increase_timeout / investigate),便于 AI 消费 |
|
|
274
|
-
| TUI
|
|
274
|
+
| 移除 TUI,由官方 skill + `symtest find` 替代 | TUI 的两大职责均有更轻替代:定义/修改用例由 AI 编程助手按官方 skill 完成,跨文件搜索由复用同一解析管线的 `find` 命令覆盖;移除后砍掉 textual 重依赖与交互界面维护负担 |
|
|
275
275
|
| JUnit XML 输出 | 兼容 GitLab CI / Jenkins / CircleCI 等主流 CI 系统的测试报告格式 |
|
|
276
276
|
| Logging 统一化 | 通过 `logging` 模块集中管理,CLI 入口激活控制台输出,库用户按需启用 |
|
|
277
277
|
|
|
278
278
|
---
|
|
279
279
|
|
|
280
|
-
## 10.
|
|
280
|
+
## 10. 架构不变量
|
|
281
281
|
|
|
282
|
-
>
|
|
283
|
-
>
|
|
284
|
-
> 修订宪法必须在变更说明中显式指出所放宽/违反的条款及理由。
|
|
282
|
+
> **定位**:本节自 Symtest 1.4 Phase 0 评审定稿。这些不变量定义了模块归属与依赖方向;
|
|
283
|
+
> 新增 feature 应遵守它们,除非变更说明中显式记录了某条不变量为何需要演进。
|
|
285
284
|
|
|
286
285
|
### 10.1 数据流主线
|
|
287
286
|
|
|
@@ -359,10 +358,10 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
359
358
|
|
|
360
359
|
#### 原则 6 — 核心模型不依赖表现层
|
|
361
360
|
|
|
362
|
-
`core` 绝对不能 import:`cli` / `
|
|
361
|
+
`core` 绝对不能 import:`cli` / `reporter` / AI-specific adapter。
|
|
363
362
|
|
|
364
|
-
|
|
365
|
-
|
|
363
|
+
解析器全系统唯一:不允许存在宽松解析后门(如 workspace=None 时放宽校验);
|
|
364
|
+
宽松形态由调用方先 normalize 再调用。
|
|
366
365
|
|
|
367
366
|
### 10.3 模块依赖方向
|
|
368
367
|
|
|
@@ -377,9 +376,9 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
377
376
|
- `execution` 与 `validation` 互不 import;
|
|
378
377
|
- `executor` 不得 import `assertions` / validation 侧模块;
|
|
379
378
|
- `validator` 不得启动被测进程(见原则 3);
|
|
380
|
-
- `core` 不得 import `cli` / `
|
|
379
|
+
- `core` 不得 import `cli` / `reporter`。
|
|
381
380
|
|
|
382
|
-
### 10.4
|
|
381
|
+
### 10.4 归属速查
|
|
383
382
|
|
|
384
383
|
任何新需求先问归属:
|
|
385
384
|
|
|
@@ -391,14 +390,14 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
|
|
|
391
390
|
| AI 告诉我下一步该干嘛? | Result consumer / diagnosis |
|
|
392
391
|
|
|
393
392
|
判据:若仍经常出现"这个功能到底放 execution、runner 还是 testcase?"的争论,
|
|
394
|
-
|
|
393
|
+
说明不变量没有被正确适用,应回到 10.2 逐条对照。
|
|
395
394
|
|
|
396
|
-
### 10.5
|
|
395
|
+
### 10.5 不变量可执行化
|
|
397
396
|
|
|
398
|
-
|
|
397
|
+
这些不变量不只是文档约定,配套 architecture guard 测试并由 CI 强制:
|
|
399
398
|
|
|
400
399
|
- 断言 import 图:如 `execution/executor.py` 的 import 不得出现
|
|
401
|
-
`assertions` / `validation`;`core/**` 不得 import `cli` /
|
|
400
|
+
`assertions` / `validation`;`core/**` 不得 import `cli` /
|
|
402
401
|
`reporter`;
|
|
403
402
|
- guard 测试纳入常规回归套件(`python tests\run_all.py`),违规即失败;
|
|
404
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.
|