cli-test-framework 0.5.3__tar.gz → 0.8.0__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.
Files changed (175) hide show
  1. cli_test_framework-0.8.0/PKG-INFO +232 -0
  2. cli_test_framework-0.8.0/README.md +196 -0
  3. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/docs/user_manual_en.md +106 -4
  4. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/setup.py +4 -5
  5. cli_test_framework-0.8.0/src/cli_test_framework/__init__.py +45 -0
  6. cli_test_framework-0.8.0/src/cli_test_framework/cli.py +284 -0
  7. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/commands/compare.py +99 -95
  8. cli_test_framework-0.8.0/src/cli_test_framework/core/assertions.py +113 -0
  9. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/base_runner.py +28 -72
  10. cli_test_framework-0.8.0/src/cli_test_framework/core/config_loader.py +223 -0
  11. cli_test_framework-0.8.0/src/cli_test_framework/core/execution.py +158 -0
  12. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/parallel_runner.py +80 -12
  13. cli_test_framework-0.8.0/src/cli_test_framework/core/process_worker.py +64 -0
  14. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/setup.py +18 -15
  15. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/test_case.py +0 -2
  16. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/types.py +9 -0
  17. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/base_comparator.py +1 -1
  18. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/binary_comparator.py +54 -38
  19. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/csv_comparator.py +3 -2
  20. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/factory.py +9 -58
  21. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/h5_comparator.py +1 -5
  22. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/json_comparator.py +3 -2
  23. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/text_comparator.py +11 -1
  24. cli_test_framework-0.8.0/src/cli_test_framework/logging_config.py +66 -0
  25. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/runners/__init__.py +2 -0
  26. cli_test_framework-0.8.0/src/cli_test_framework/runners/config_runner.py +94 -0
  27. cli_test_framework-0.8.0/src/cli_test_framework/runners/json_runner.py +26 -0
  28. cli_test_framework-0.8.0/src/cli_test_framework/runners/parallel_config_runner.py +272 -0
  29. cli_test_framework-0.8.0/src/cli_test_framework/runners/parallel_json_runner.py +30 -0
  30. cli_test_framework-0.8.0/src/cli_test_framework/runners/parallel_yaml_runner.py +35 -0
  31. cli_test_framework-0.8.0/src/cli_test_framework/runners/yaml_runner.py +31 -0
  32. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/utils/__init__.py +4 -2
  33. cli_test_framework-0.8.0/src/cli_test_framework/utils/junit_xml_writer.py +117 -0
  34. cli_test_framework-0.8.0/src/cli_test_framework/utils/path_resolver.py +124 -0
  35. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/utils/report_generator.py +8 -3
  36. cli_test_framework-0.8.0/src/cli_test_framework.egg-info/PKG-INFO +232 -0
  37. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework.egg-info/SOURCES.txt +21 -0
  38. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework.egg-info/requires.txt +3 -4
  39. cli_test_framework-0.8.0/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
  40. cli_test_framework-0.8.0/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-7.4.4.pyc +0 -0
  41. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-9.0.3.pyc +0 -0
  42. cli_test_framework-0.8.0/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-7.4.4.pyc +0 -0
  43. cli_test_framework-0.5.3/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc → cli_test_framework-0.8.0/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc +0 -0
  44. cli_test_framework-0.8.0/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  45. cli_test_framework-0.8.0/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  46. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  47. cli_test_framework-0.8.0/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  48. cli_test_framework-0.8.0/tests/integration/file_compare/test_binary_compare.py +152 -0
  49. cli_test_framework-0.8.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  50. cli_test_framework-0.8.0/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-7.4.4.pyc +0 -0
  51. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/test_history_feature.py +4 -4
  52. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/test_sequence.py +24 -20
  53. cli_test_framework-0.5.3/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc → cli_test_framework-0.8.0/tests/unit/__pycache__/test_cli.cpython-312-pytest-7.4.4.pyc +0 -0
  54. cli_test_framework-0.8.0/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc +0 -0
  55. cli_test_framework-0.8.0/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  56. cli_test_framework-0.8.0/tests/unit/__pycache__/test_run_all.cpython-312-pytest-7.4.4.pyc +0 -0
  57. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-9.0.3.pyc +0 -0
  58. cli_test_framework-0.8.0/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-7.4.4.pyc +0 -0
  59. cli_test_framework-0.8.0/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-9.0.3.pyc +0 -0
  60. cli_test_framework-0.8.0/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-7.4.4.pyc +0 -0
  61. cli_test_framework-0.5.3/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc → cli_test_framework-0.8.0/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-7.4.4.pyc +0 -0
  62. cli_test_framework-0.8.0/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc +0 -0
  63. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-9.0.3.pyc +0 -0
  64. cli_test_framework-0.8.0/tests/unit/core/test_assertions.py +320 -0
  65. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/test_process_worker.py +4 -4
  66. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/test_setup.py +4 -2
  67. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  68. cli_test_framework-0.8.0/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-9.0.3.pyc +0 -0
  69. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/runners/test_json_yaml_runner.py +8 -4
  70. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/runners/test_test_case_filter.py +28 -14
  71. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/test_cli.py +10 -9
  72. cli_test_framework-0.8.0/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-9.0.3.pyc +0 -0
  73. cli_test_framework-0.8.0/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-7.4.4.pyc +0 -0
  74. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-9.0.3.pyc +0 -0
  75. cli_test_framework-0.8.0/tests/unit/utils/test_junit_xml_writer.py +259 -0
  76. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/utils/test_report_generator.py +2 -2
  77. cli_test_framework-0.5.3/PKG-INFO +0 -146
  78. cli_test_framework-0.5.3/README.md +0 -109
  79. cli_test_framework-0.5.3/src/cli_test_framework/__init__.py +0 -29
  80. cli_test_framework-0.5.3/src/cli_test_framework/cli.py +0 -152
  81. cli_test_framework-0.5.3/src/cli_test_framework/core/assertions.py +0 -32
  82. cli_test_framework-0.5.3/src/cli_test_framework/core/execution.py +0 -95
  83. cli_test_framework-0.5.3/src/cli_test_framework/core/process_worker.py +0 -111
  84. cli_test_framework-0.5.3/src/cli_test_framework/runners/json_runner.py +0 -96
  85. cli_test_framework-0.5.3/src/cli_test_framework/runners/parallel_json_runner.py +0 -321
  86. cli_test_framework-0.5.3/src/cli_test_framework/runners/yaml_runner.py +0 -95
  87. cli_test_framework-0.5.3/src/cli_test_framework/utils/path_resolver.py +0 -210
  88. cli_test_framework-0.5.3/src/cli_test_framework.egg-info/PKG-INFO +0 -146
  89. cli_test_framework-0.5.3/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
  90. cli_test_framework-0.5.3/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  91. cli_test_framework-0.5.3/tests/integration/file_compare/test_binary_compare.py +0 -31
  92. cli_test_framework-0.5.3/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  93. cli_test_framework-0.5.3/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-7.4.4.pyc +0 -0
  94. cli_test_framework-0.5.3/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  95. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/MANIFEST.in +0 -0
  96. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/docs/design.md +0 -0
  97. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/docs/design_en.md +0 -0
  98. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/docs/user_manual.md +0 -0
  99. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/pyproject.toml +0 -0
  100. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/setup.cfg +0 -0
  101. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/commands/__init__.py +0 -0
  102. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/__init__.py +0 -0
  103. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/core/history_store.py +0 -0
  104. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/__init__.py +0 -0
  105. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/result.py +0 -0
  106. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework/file_comparator/xml_comparator.py +0 -0
  107. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework.egg-info/dependency_links.txt +0 -0
  108. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework.egg-info/entry_points.txt +0 -0
  109. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/src/cli_test_framework.egg-info/top_level.txt +0 -0
  110. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/README.md +0 -0
  111. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__init__.py +0 -0
  112. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  113. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/__init__.cpython-39.pyc +0 -0
  114. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
  115. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
  116. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/conftest.cpython-39-pytest-8.3.4.pyc +0 -0
  117. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/run_all.cpython-312.pyc +0 -0
  118. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/run_all.cpython-39.pyc +0 -0
  119. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  120. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/__pycache__/test_setup_module.cpython-312-pytest-7.4.4.pyc +0 -0
  121. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/conftest.py +0 -0
  122. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/demos/h5_filter_demo.py +0 -0
  123. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/demos/manual_report_example.py +0 -0
  124. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/demos/perf_parallel.py +0 -0
  125. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/__init__.py +0 -0
  126. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/__pycache__/__init__.cpython-312.pyc +0 -0
  127. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/__pycache__/__init__.cpython-39.pyc +0 -0
  128. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-9.0.3.pyc +0 -0
  129. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/__pycache__/test_user_flows.cpython-39-pytest-8.3.4.pyc +0 -0
  130. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/e2e/test_user_flows.py +0 -0
  131. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/fixtures/test_cases.json +0 -0
  132. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/fixtures/test_cases.yaml +0 -0
  133. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/fixtures/test_cases1.json +0 -0
  134. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/fixtures/test_with_setup.json +0 -0
  135. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/fixtures/test_with_setup.yaml +0 -0
  136. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-9.0.3.pyc +0 -0
  137. /cli_test_framework-0.5.3/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc → /cli_test_framework-0.8.0/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc +0 -0
  138. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  139. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  140. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  141. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  142. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  143. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  144. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  145. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  146. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  147. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  148. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  149. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  150. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/test_csv_compare.py +0 -0
  151. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/test_h5_compare.py +0 -0
  152. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/test_json_compare.py +0 -0
  153. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/test_text_compare.py +0 -0
  154. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/file_compare/test_xml_compare.py +0 -0
  155. /cli_test_framework-0.5.3/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc → /cli_test_framework-0.8.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  156. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  157. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/parallel/test_parallel_runner.py +0 -0
  158. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-9.0.3.pyc +0 -0
  159. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-39-pytest-8.3.4.pyc +0 -0
  160. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/path_handling/test_spaces_in_paths.py +0 -0
  161. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/integration/test_real_command_execution.py +0 -0
  162. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/run_all.py +0 -0
  163. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/test_report.txt +0 -0
  164. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  165. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-9.0.3.pyc +0 -0
  166. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/commands/test_compare_command.py +0 -0
  167. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-9.0.3.pyc +0 -0
  168. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-7.4.4.pyc +0 -0
  169. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/__pycache__/test_setup.cpython-39-pytest-8.3.4.pyc +0 -0
  170. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/core/test_history_store.py +0 -0
  171. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  172. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  173. /cli_test_framework-0.5.3/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-9.0.3.pyc → /cli_test_framework-0.8.0/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  174. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/test_h5_comparator.py +0 -0
  175. {cli_test_framework-0.5.3 → cli_test_framework-0.8.0}/tests/unit/test_run_all.py +0 -0
@@ -0,0 +1,232 @@
1
+ Metadata-Version: 2.4
2
+ Name: cli-test-framework
3
+ Version: 0.8.0
4
+ Summary: A powerful command line testing framework in Python with setup modules, parallel execution, and file comparison capabilities.
5
+ Home-page: https://github.com/ozil111/cli-test-framework
6
+ Author: Xiaotong Wang
7
+ Author-email: xiaotongwang98@gmail.com
8
+ Project-URL: Documentation, https://github.com/ozil111/cli-test-framework/blob/main/docs/user_manual.md
9
+ Project-URL: Source, https://github.com/ozil111/cli-test-framework
10
+ Project-URL: Tracker, https://github.com/ozil111/cli-test-framework/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
+ Requires-Python: >=3.9
19
+ Description-Content-Type: text/markdown
20
+ Requires-Dist: dukpy==0.5.0
21
+ Requires-Dist: h5py<4.0.0,>=3.11.0
22
+ Requires-Dist: numpy>=1.21.0; python_version < "3.12"
23
+ Requires-Dist: numpy>=1.26.0; python_version >= "3.12"
24
+ Requires-Dist: setuptools>=75.8.0
25
+ Requires-Dist: wheel>=0.45.1
26
+ Dynamic: author
27
+ Dynamic: author-email
28
+ Dynamic: classifier
29
+ Dynamic: description
30
+ Dynamic: description-content-type
31
+ Dynamic: home-page
32
+ Dynamic: project-url
33
+ Dynamic: requires-dist
34
+ Dynamic: requires-python
35
+ Dynamic: summary
36
+
37
+ # CLI Test Framework
38
+
39
+ A lightweight automated testing framework for command-line applications. Define test cases in JSON/YAML, run all validations with a single command.
40
+
41
+ Particularly suited for scientific computing — deep HDF5 support with regex table matching, data filtering, and tolerance-based comparison, making simulation result verification effortless.
42
+
43
+ ## Why this exists
44
+
45
+ This project was created from a real need: regression testing finite-element software.
46
+
47
+ In solver-style projects, checking the exit code is not enough. A test often needs to run multiple commands, generate numerical result files, compare HDF5/CSV outputs with tolerances, and make sure old cases do not become slower over time.
48
+
49
+ CLI Test Framework was built for that workflow.
50
+
51
+ ## Highlights
52
+
53
+ - **Golden File Assertion** — `compare_files` embedded in test `expected`, compares output files against baselines with tolerance
54
+ - **Parallel Execution** — Multi-thread / multi-process, 3-5x speedup
55
+ - **Resource-Aware Scheduling** — Automatic CPU core management, prevents solver thread runaway
56
+ - **Sequence Steps** — Multi-step execution within a single test case, fail-fast
57
+ - **Setup Module** — Auto-configure environment variables before tests, auto-cleanup after
58
+ - **File Comparison** — Text / JSON / CSV / XML / HDF5 / Binary, with CLI and embedded assertion support
59
+ - **Filtered Execution** — Run specific test cases by name
60
+ - **JUnit XML Output** — `--junit-xml` for GitLab CI / Jenkins / CircleCI test report panels
61
+
62
+ ## Quick Start
63
+
64
+ ```bash
65
+ pip install cli-test-framework
66
+ ```
67
+
68
+ ### 30-Second Setup
69
+
70
+ 1. Create `test_cases.json`:
71
+
72
+ ```json
73
+ {
74
+ "test_cases": [
75
+ {
76
+ "name": "hello",
77
+ "command": "echo",
78
+ "args": ["Hello World"],
79
+ "expected": {
80
+ "return_code": 0,
81
+ "output_contains": ["Hello World"]
82
+ }
83
+ }
84
+ ]
85
+ }
86
+ ```
87
+
88
+ 2. Run:
89
+
90
+ ```bash
91
+ cli-test run test_cases.json
92
+ ```
93
+
94
+ ### Golden File Comparison in Tests
95
+
96
+ Run a simulation, then compare its output file against a reference:
97
+
98
+ ```json
99
+ {
100
+ "test_cases": [
101
+ {
102
+ "name": "FEA displacement check",
103
+ "command": "my_solver",
104
+ "args": ["--input", "case1.dat", "--output", "out.h5"],
105
+ "expected": {
106
+ "return_code": 0,
107
+ "compare_files": [
108
+ {
109
+ "actual": "out.h5",
110
+ "baseline": "ref/golden.h5",
111
+ "rtol": 1e-5,
112
+ "atol": 1e-8,
113
+ "tables": ["NASTRAN/RESULT/NODAL/DISPLACEMENT"]
114
+ }
115
+ ]
116
+ }
117
+ }
118
+ ]
119
+ }
120
+ ```
121
+
122
+ - `actual` – file produced by the command
123
+ - `baseline` – reference file to compare against
124
+ - `type` – comparator type (auto-detected from extension if omitted: `.h5`→h5, `.json`→json, `.csv`→csv, `.xml`→xml, `.txt`→text)
125
+ - all other keys are forwarded as comparator parameters (`rtol`, `atol`, `tables`, `table_regex`, `data_filter`, `encoding`, `structure_only`, `delimiter`, `compare_mode`, `key_field`, etc.)
126
+
127
+ Multiple files and mixed assertion types coexist naturally:
128
+
129
+ ```json
130
+ {
131
+ "expected": {
132
+ "return_code": 0,
133
+ "output_contains": ["simulation finished"],
134
+ "compare_files": [
135
+ {"actual": "out.h5", "baseline": "ref/disp.h5", "rtol": 1e-5},
136
+ {"actual": "report.csv", "baseline": "ref/expected.csv", "rtol": 1e-6}
137
+ ]
138
+ }
139
+ }
140
+ ```
141
+
142
+ ### Parallel Execution
143
+
144
+ ```bash
145
+ cli-test run test_cases.json --parallel --workers 4
146
+ ```
147
+
148
+ ### JUnit XML (CI Integration)
149
+
150
+ ```bash
151
+ cli-test run test_cases.json --junit-xml report.xml
152
+ ```
153
+
154
+ In GitLab CI:
155
+
156
+ ```yaml
157
+ # .gitlab-ci.yml
158
+ artifacts:
159
+ reports:
160
+ junit: report.xml
161
+ ```
162
+
163
+ ### Python API
164
+
165
+ ```python
166
+ from cli_test_framework.runners import JSONRunner, ParallelJSONRunner
167
+
168
+ # Sequential
169
+ runner = JSONRunner(config_file="test_cases.json")
170
+ success = runner.run_tests()
171
+
172
+ # Parallel
173
+ runner = ParallelJSONRunner(config_file="test_cases.json", max_workers=4, execution_mode="thread")
174
+ success = runner.run_tests()
175
+ ```
176
+
177
+ ### File Comparison (Standalone CLI)
178
+
179
+ ```bash
180
+ compare-files result1.h5 result2.h5 --h5-table-regex "output_.*" --h5-rtol 1e-5
181
+ ```
182
+
183
+ 📖 **Full Documentation**: [docs/user_manual.md](docs/user_manual_en.md)
184
+
185
+ ## Changelog
186
+
187
+ ### 0.8.0
188
+
189
+ - **JUnit XML output**: New `--junit-xml <filepath>` CLI option writes JUnit-format XML reports that integrate directly with GitLab CI, Jenkins, CircleCI, and other CI tools. Supports `passed` / `failed` / `timeout` / `error` status mapping. Zero extra dependencies — built with `xml.etree.ElementTree`.
190
+
191
+ ### 0.7.0
192
+
193
+ - **Unified logging system**: All diagnostic output (executor, runner, scheduler, setup) now uses Python's standard `logging` module under the `cli_test_framework` namespace. Library users can suppress output entirely via `logging.getLogger("cli_test_framework").setLevel(logging.WARNING)`. Removes the previous ad-hoc `print()` + `_print_lock` pattern — `logging` is inherently thread-safe.
194
+ - **Default handler**: A `StreamHandler` at INFO level is installed on first import, so CLI behavior is unchanged. Use `--verbose` / `--debug` to enable DEBUG-level output.
195
+ - **Public API**: `get_logger(name)` exposed via `cli_test_framework.get_logger` for consistent logger creation in extensions.
196
+
197
+ ### 0.6.0
198
+
199
+ - **Golden file assertion**: `compare_files` is now a first-class assertion in test `expected` — compare output files against baselines directly in your test definitions, with full tolerance and parameter support. The `file_comparator` subsystem is now integrated into the assertion pipeline, completing the closed loop from command execution to result verification.
200
+
201
+ ### 0.5.2
202
+
203
+ - Runtime history tracking (`--history-dir`): persist per-case execution time in `.symtest`, enable smart scheduling & regression detection
204
+ - Regression warning: alert when a case runs slower than historical average × threshold (`--regression-threshold`, default 1.5)
205
+ - Smart scheduling: parallel runner prioritizes historical `avg_duration` over config `estimated_time` for task ordering
206
+ - Per-case duration now shown in test result output
207
+
208
+ ### 0.5.1
209
+ - Run specific test cases by name (`-t` / `test_case_filter`)
210
+
211
+ ### 0.5.0
212
+ - Steps feature: sequential multi-command execution within a single test case, fail-fast
213
+
214
+ ### 0.4.2
215
+ - Resource-aware scheduling: auto-detect CPU cores, semaphore-based core allocation
216
+ - Auto-inject `OMP_NUM_THREADS` / `MKL_NUM_THREADS` / `NPROC` to prevent solver thread runaway
217
+ - Per-test `timeout` support to prevent hanging
218
+
219
+ ### 0.4.1
220
+ - Multi-thread / multi-process parallel execution, 3-5x speedup
221
+
222
+ ## Contributing
223
+
224
+ Before submitting a PR, please make sure all tests pass:
225
+
226
+ ```bash
227
+ python tests\run_all.py
228
+ ```
229
+
230
+ ## License
231
+
232
+ MIT
@@ -0,0 +1,196 @@
1
+ # CLI Test Framework
2
+
3
+ A lightweight automated testing framework for command-line applications. Define test cases in JSON/YAML, run all validations with a single command.
4
+
5
+ Particularly suited for scientific computing — deep HDF5 support with regex table matching, data filtering, and tolerance-based comparison, making simulation result verification effortless.
6
+
7
+ ## Why this exists
8
+
9
+ This project was created from a real need: regression testing finite-element software.
10
+
11
+ In solver-style projects, checking the exit code is not enough. A test often needs to run multiple commands, generate numerical result files, compare HDF5/CSV outputs with tolerances, and make sure old cases do not become slower over time.
12
+
13
+ CLI Test Framework was built for that workflow.
14
+
15
+ ## Highlights
16
+
17
+ - **Golden File Assertion** — `compare_files` embedded in test `expected`, compares output files against baselines with tolerance
18
+ - **Parallel Execution** — Multi-thread / multi-process, 3-5x speedup
19
+ - **Resource-Aware Scheduling** — Automatic CPU core management, prevents solver thread runaway
20
+ - **Sequence Steps** — Multi-step execution within a single test case, fail-fast
21
+ - **Setup Module** — Auto-configure environment variables before tests, auto-cleanup after
22
+ - **File Comparison** — Text / JSON / CSV / XML / HDF5 / Binary, with CLI and embedded assertion support
23
+ - **Filtered Execution** — Run specific test cases by name
24
+ - **JUnit XML Output** — `--junit-xml` for GitLab CI / Jenkins / CircleCI test report panels
25
+
26
+ ## Quick Start
27
+
28
+ ```bash
29
+ pip install cli-test-framework
30
+ ```
31
+
32
+ ### 30-Second Setup
33
+
34
+ 1. Create `test_cases.json`:
35
+
36
+ ```json
37
+ {
38
+ "test_cases": [
39
+ {
40
+ "name": "hello",
41
+ "command": "echo",
42
+ "args": ["Hello World"],
43
+ "expected": {
44
+ "return_code": 0,
45
+ "output_contains": ["Hello World"]
46
+ }
47
+ }
48
+ ]
49
+ }
50
+ ```
51
+
52
+ 2. Run:
53
+
54
+ ```bash
55
+ cli-test run test_cases.json
56
+ ```
57
+
58
+ ### Golden File Comparison in Tests
59
+
60
+ Run a simulation, then compare its output file against a reference:
61
+
62
+ ```json
63
+ {
64
+ "test_cases": [
65
+ {
66
+ "name": "FEA displacement check",
67
+ "command": "my_solver",
68
+ "args": ["--input", "case1.dat", "--output", "out.h5"],
69
+ "expected": {
70
+ "return_code": 0,
71
+ "compare_files": [
72
+ {
73
+ "actual": "out.h5",
74
+ "baseline": "ref/golden.h5",
75
+ "rtol": 1e-5,
76
+ "atol": 1e-8,
77
+ "tables": ["NASTRAN/RESULT/NODAL/DISPLACEMENT"]
78
+ }
79
+ ]
80
+ }
81
+ }
82
+ ]
83
+ }
84
+ ```
85
+
86
+ - `actual` – file produced by the command
87
+ - `baseline` – reference file to compare against
88
+ - `type` – comparator type (auto-detected from extension if omitted: `.h5`→h5, `.json`→json, `.csv`→csv, `.xml`→xml, `.txt`→text)
89
+ - all other keys are forwarded as comparator parameters (`rtol`, `atol`, `tables`, `table_regex`, `data_filter`, `encoding`, `structure_only`, `delimiter`, `compare_mode`, `key_field`, etc.)
90
+
91
+ Multiple files and mixed assertion types coexist naturally:
92
+
93
+ ```json
94
+ {
95
+ "expected": {
96
+ "return_code": 0,
97
+ "output_contains": ["simulation finished"],
98
+ "compare_files": [
99
+ {"actual": "out.h5", "baseline": "ref/disp.h5", "rtol": 1e-5},
100
+ {"actual": "report.csv", "baseline": "ref/expected.csv", "rtol": 1e-6}
101
+ ]
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### Parallel Execution
107
+
108
+ ```bash
109
+ cli-test run test_cases.json --parallel --workers 4
110
+ ```
111
+
112
+ ### JUnit XML (CI Integration)
113
+
114
+ ```bash
115
+ cli-test run test_cases.json --junit-xml report.xml
116
+ ```
117
+
118
+ In GitLab CI:
119
+
120
+ ```yaml
121
+ # .gitlab-ci.yml
122
+ artifacts:
123
+ reports:
124
+ junit: report.xml
125
+ ```
126
+
127
+ ### Python API
128
+
129
+ ```python
130
+ from cli_test_framework.runners import JSONRunner, ParallelJSONRunner
131
+
132
+ # Sequential
133
+ runner = JSONRunner(config_file="test_cases.json")
134
+ success = runner.run_tests()
135
+
136
+ # Parallel
137
+ runner = ParallelJSONRunner(config_file="test_cases.json", max_workers=4, execution_mode="thread")
138
+ success = runner.run_tests()
139
+ ```
140
+
141
+ ### File Comparison (Standalone CLI)
142
+
143
+ ```bash
144
+ compare-files result1.h5 result2.h5 --h5-table-regex "output_.*" --h5-rtol 1e-5
145
+ ```
146
+
147
+ 📖 **Full Documentation**: [docs/user_manual.md](docs/user_manual_en.md)
148
+
149
+ ## Changelog
150
+
151
+ ### 0.8.0
152
+
153
+ - **JUnit XML output**: New `--junit-xml <filepath>` CLI option writes JUnit-format XML reports that integrate directly with GitLab CI, Jenkins, CircleCI, and other CI tools. Supports `passed` / `failed` / `timeout` / `error` status mapping. Zero extra dependencies — built with `xml.etree.ElementTree`.
154
+
155
+ ### 0.7.0
156
+
157
+ - **Unified logging system**: All diagnostic output (executor, runner, scheduler, setup) now uses Python's standard `logging` module under the `cli_test_framework` namespace. Library users can suppress output entirely via `logging.getLogger("cli_test_framework").setLevel(logging.WARNING)`. Removes the previous ad-hoc `print()` + `_print_lock` pattern — `logging` is inherently thread-safe.
158
+ - **Default handler**: A `StreamHandler` at INFO level is installed on first import, so CLI behavior is unchanged. Use `--verbose` / `--debug` to enable DEBUG-level output.
159
+ - **Public API**: `get_logger(name)` exposed via `cli_test_framework.get_logger` for consistent logger creation in extensions.
160
+
161
+ ### 0.6.0
162
+
163
+ - **Golden file assertion**: `compare_files` is now a first-class assertion in test `expected` — compare output files against baselines directly in your test definitions, with full tolerance and parameter support. The `file_comparator` subsystem is now integrated into the assertion pipeline, completing the closed loop from command execution to result verification.
164
+
165
+ ### 0.5.2
166
+
167
+ - Runtime history tracking (`--history-dir`): persist per-case execution time in `.symtest`, enable smart scheduling & regression detection
168
+ - Regression warning: alert when a case runs slower than historical average × threshold (`--regression-threshold`, default 1.5)
169
+ - Smart scheduling: parallel runner prioritizes historical `avg_duration` over config `estimated_time` for task ordering
170
+ - Per-case duration now shown in test result output
171
+
172
+ ### 0.5.1
173
+ - Run specific test cases by name (`-t` / `test_case_filter`)
174
+
175
+ ### 0.5.0
176
+ - Steps feature: sequential multi-command execution within a single test case, fail-fast
177
+
178
+ ### 0.4.2
179
+ - Resource-aware scheduling: auto-detect CPU cores, semaphore-based core allocation
180
+ - Auto-inject `OMP_NUM_THREADS` / `MKL_NUM_THREADS` / `NPROC` to prevent solver thread runaway
181
+ - Per-test `timeout` support to prevent hanging
182
+
183
+ ### 0.4.1
184
+ - Multi-thread / multi-process parallel execution, 3-5x speedup
185
+
186
+ ## Contributing
187
+
188
+ Before submitting a PR, please make sure all tests pass:
189
+
190
+ ```bash
191
+ python tests\run_all.py
192
+ ```
193
+
194
+ ## License
195
+
196
+ MIT
@@ -117,6 +117,9 @@ cli-test run test_cases.json --verbose
117
117
  # Debug mode
118
118
  cli-test run test_cases.json --debug
119
119
 
120
+ # JUnit XML output for CI
121
+ cli-test run test_cases.json --junit-xml report.xml
122
+
120
123
  # Output format
121
124
  cli-test run test_cases.json --output-format json|html|text
122
125
  ```
@@ -162,6 +165,80 @@ for detail in runner.results["details"]:
162
165
  print(detail["name"], detail["status"], detail.get("message", ""))
163
166
  ```
164
167
 
168
+ ### JUnit XML Output (CI Integration)
169
+
170
+ Generate JUnit-format XML reports for CI tools like GitLab CI, Jenkins, or CircleCI:
171
+
172
+ ```bash
173
+ cli-test run test_cases.json --junit-xml report.xml
174
+ ```
175
+
176
+ This produces a standard JUnit XML file that can be consumed by CI report panels:
177
+
178
+ ```xml
179
+ <?xml version="1.0" encoding="UTF-8"?>
180
+ <testsuite name="test_cases" tests="3" failures="1" errors="1" time="12.345">
181
+ <testcase name="test_ok" classname="test_cases" time="0.123" />
182
+ <testcase name="test_fail" classname="test_cases" time="0.456">
183
+ <failure message="expected 'hello'" type="AssertionError">...</failure>
184
+ </testcase>
185
+ <testcase name="test_timeout" classname="test_cases" time="10.0">
186
+ <error message="Timeout reached" type="TimeoutExpired">...</error>
187
+ </testcase>
188
+ </testsuite>
189
+ ```
190
+
191
+ **CI configuration examples:**
192
+
193
+ **GitLab CI** (`.gitlab-ci.yml`):
194
+ ```yaml
195
+ test:
196
+ script:
197
+ - cli-test run test_cases.json --junit-xml report.xml
198
+ artifacts:
199
+ reports:
200
+ junit: report.xml
201
+ ```
202
+
203
+ **Jenkins Pipeline**:
204
+ ```groovy
205
+ stage('Test') {
206
+ steps {
207
+ sh 'cli-test run test_cases.json --junit-xml report.xml'
208
+ junit 'report.xml'
209
+ }
210
+ }
211
+ ```
212
+
213
+ **GitHub Actions**:
214
+ ```yaml
215
+ - name: Run tests
216
+ run: cli-test run test_cases.json --junit-xml report.xml
217
+ - name: Publish test results
218
+ uses: dorny/test-reporter@v1
219
+ with:
220
+ name: CLI Tests
221
+ path: report.xml
222
+ reporter: java-junit
223
+ ```
224
+
225
+ **Python API**:
226
+ ```python
227
+ from cli_test_framework import write_junit_xml
228
+
229
+ runner = JSONRunner(config_file="test_cases.json")
230
+ runner.run_tests()
231
+ write_junit_xml(runner.results, "report.xml", suite_name="my_tests")
232
+ ```
233
+
234
+ Status mapping:
235
+ | Test status | JUnit element | CI interpretation |
236
+ |---|---|---|
237
+ | `passed` | (no child) | Passed |
238
+ | `failed` (assertion) | `<failure>` | Failure |
239
+ | `failed` (execution error) | `<error>` | Error |
240
+ | `timeout` | `<error>` | Error |
241
+
165
242
  ## Setup Module
166
243
 
167
244
  The Setup module performs initialization before tests and cleanup after tests.
@@ -434,6 +511,26 @@ result.differences # list
434
511
 
435
512
  ## Extension Development
436
513
 
514
+ ### Controlling Log Output
515
+
516
+ The framework uses Python's standard `logging` module. By default, a console handler at `INFO` level is installed. You can suppress or redirect output:
517
+
518
+ ```python
519
+ import logging
520
+
521
+ # Suppress all framework output when used as a library
522
+ logging.getLogger("cli_test_framework").setLevel(logging.WARNING)
523
+
524
+ # Or remove the handler entirely
525
+ logging.getLogger("cli_test_framework").handlers.clear()
526
+
527
+ # Redirect to a file
528
+ file_handler = logging.FileHandler("test.log")
529
+ file_handler.setLevel(logging.DEBUG)
530
+ file_handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s"))
531
+ logging.getLogger("cli_test_framework").addHandler(file_handler)
532
+ ```
533
+
437
534
  ### Custom Runner
438
535
 
439
536
  ```python
@@ -451,16 +548,21 @@ class CustomRunner(BaseRunner):
451
548
 
452
549
  ### Custom Setup Plugin
453
550
 
551
+ Use `get_logger` for consistent logging in your extensions:
552
+
454
553
  ```python
455
- from cli_test_framework import BaseSetup
554
+ from cli_test_framework import BaseSetup, get_logger
456
555
 
457
556
  class MySetup(BaseSetup):
557
+ def __init__(self, config=None):
558
+ super().__init__(config)
559
+ self.logger = get_logger(__name__)
560
+
458
561
  def setup(self):
459
- # self.config provides access to the passed configuration dict
460
- pass
562
+ self.logger.info("Running MySetup...")
461
563
 
462
564
  def teardown(self):
463
- pass
565
+ self.logger.info("Tearing down MySetup...")
464
566
  ```
465
567
 
466
568
  ### Custom Assertions
@@ -8,7 +8,7 @@ with open(os.path.join(this_directory, 'README.md'), encoding='utf-8') as f:
8
8
 
9
9
  setup(
10
10
  name="cli-test-framework",
11
- version="0.5.3",
11
+ version="0.8.0",
12
12
  author="Xiaotong Wang",
13
13
  author_email="xiaotongwang98@gmail.com",
14
14
  description="A powerful command line testing framework in Python with setup modules, parallel execution, and file comparison capabilities.",
@@ -19,10 +19,9 @@ setup(
19
19
  package_dir={"": "src"},
20
20
  install_requires=[
21
21
  "dukpy==0.5.0",
22
- "h5py>=3.8.0,<4.0.0; python_version<'3.12'",
23
- "h5py>=3.10.0,<4.0.0; python_version>='3.12'",
24
- "numpy>=1.21.0,<2.0.0; python_version<'3.12'",
25
- "numpy>=1.26.0,<2.0.0; python_version>='3.12'",
22
+ "h5py>=3.11.0,<4.0.0",
23
+ "numpy>=1.21.0; python_version<'3.12'",
24
+ "numpy>=1.26.0; python_version>='3.12'",
26
25
  "setuptools>=75.8.0",
27
26
  "wheel>=0.45.1"
28
27
  ],
@@ -0,0 +1,45 @@
1
+ """
2
+ CLI Test Framework - A powerful command-line testing framework
3
+
4
+ This package provides tools for testing command-line applications and scripts
5
+ with support for parallel execution and advanced file comparison capabilities.
6
+
7
+ Logging
8
+ -------
9
+ All diagnostic and status messages go through Python's standard ``logging``
10
+ module under the ``cli_test_framework`` namespace. By default only a
11
+ ``NullHandler`` is attached — no output is produced on import. The CLI
12
+ entry point calls ``setup_console_logging()`` to enable stderr output at
13
+ runtime. Library users can enable console logging explicitly::
14
+
15
+ from cli_test_framework.logging_config import setup_console_logging
16
+ setup_console_logging(level=logging.DEBUG)
17
+ """
18
+
19
+ __version__ = "0.8.0"
20
+ __author__ = "Xiaotong Wang"
21
+ __email__ = "xiaotongwang98@gmail.com"
22
+
23
+ # Import main classes for convenient access
24
+ from .runners.json_runner import JSONRunner
25
+ from .runners.parallel_json_runner import ParallelJSONRunner
26
+ from .runners.yaml_runner import YAMLRunner
27
+ from .core.test_case import TestCase
28
+ from .core.assertions import Assertions
29
+ from .core.setup import BaseSetup, EnvironmentSetup, SetupManager
30
+ from .logging_config import get_logger, setup_console_logging
31
+ from .utils.junit_xml_writer import write_junit_xml
32
+
33
+ __all__ = [
34
+ 'JSONRunner',
35
+ 'ParallelJSONRunner',
36
+ 'YAMLRunner',
37
+ 'TestCase',
38
+ 'Assertions',
39
+ 'BaseSetup',
40
+ 'EnvironmentSetup',
41
+ 'SetupManager',
42
+ 'get_logger',
43
+ 'setup_console_logging',
44
+ 'write_junit_xml',
45
+ ]