smart-tests-cli 2.2.0__tar.gz → 2.3.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 (405) hide show
  1. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/PKG-INFO +1 -1
  2. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/build.py +1 -1
  3. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/session.py +3 -4
  4. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/subset.py +190 -3
  5. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/test_path_writer.py +4 -4
  6. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/verify.py +5 -15
  7. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/jar/exe_deploy.jar +0 -0
  8. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/file.py +1 -11
  9. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/go_test.py +1 -0
  10. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/gradle.py +2 -0
  11. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/jasmine.py +1 -7
  12. smart_tests_cli-2.3.0/smart_tests/test_runners/karma.py +174 -0
  13. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/maven.py +2 -0
  14. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/playwright.py +1 -8
  15. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/prove.py +1 -8
  16. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/smart_tests.py +19 -1
  17. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/vitest.py +1 -8
  18. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/authentication.py +6 -1
  19. smart_tests_cli-2.3.0/smart_tests/utils/input_snapshot.py +50 -0
  20. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/smart_tests_client.py +2 -9
  21. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/PKG-INFO +1 -1
  22. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/SOURCES.txt +12 -2
  23. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/BUILD +1 -1
  24. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +197 -150
  25. smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +28 -0
  26. smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/CommitIngester.java → smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/Main.java +4 -4
  27. smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +56 -0
  28. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +1 -1
  29. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +49 -8
  30. smart_tests_cli-2.2.0/src/test/java/com/launchableinc/ingest/commits/CommitIngesterTest.java → smart_tests_cli-2.3.0/src/test/java/com/launchableinc/ingest/commits/MainTest.java +14 -8
  31. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +1 -15
  32. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_session.py +21 -0
  33. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_subset.py +194 -0
  34. smart_tests_cli-2.3.0/tests/data/jasmine/README.md +41 -0
  35. smart_tests_cli-2.3.0/tests/data/jasmine/jasmine-test-results-v3.99.0.json +150 -0
  36. smart_tests_cli-2.3.0/tests/data/karma/README.md +164 -0
  37. smart_tests_cli-2.3.0/tests/data/karma/record_test_result.json +189 -0
  38. smart_tests_cli-2.3.0/tests/data/karma/sample-report.json +360 -0
  39. smart_tests_cli-2.3.0/tests/data/karma/subset_payload.json +16 -0
  40. smart_tests_cli-2.3.0/tests/data/karma/subset_result.json +22 -0
  41. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_jasmine.py +12 -0
  42. smart_tests_cli-2.3.0/tests/test_runners/test_karma.py +48 -0
  43. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_authentication.py +0 -6
  44. smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +0 -14
  45. smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -26
  46. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.bazelrc +0 -0
  47. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.bazelversion +0 -0
  48. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.editorconfig +0 -0
  49. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/release.yml +0 -0
  50. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/bazel-test.yml +0 -0
  51. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/e2e.yml +0 -0
  52. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/publish.yml +0 -0
  53. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/test.yml +0 -0
  54. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/update_maven_install_json.yml +0 -0
  55. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.gitignore +0 -0
  56. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.pre-commit-config.yaml +0 -0
  57. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.python-version +0 -0
  58. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.tagpr +0 -0
  59. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/CONTRIBUTING.md +0 -0
  60. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/Dockerfile +0 -0
  61. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/LICENSE.txt +0 -0
  62. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/README.md +0 -0
  63. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/WORKSPACE +0 -0
  64. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/build-java.sh +0 -0
  65. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/pyproject.toml +0 -0
  66. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/renovate.json +0 -0
  67. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/setup.cfg +0 -0
  68. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/setup.py +0 -0
  69. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/__init__.py +0 -0
  70. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/__main__.py +0 -0
  71. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/app.py +0 -0
  72. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/README.md +0 -0
  73. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/__init__.py +0 -0
  74. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/argument.py +0 -0
  75. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/command.py +0 -0
  76. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/converters/__init__.py +0 -0
  77. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/decorators.py +0 -0
  78. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/exceptions.py +0 -0
  79. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/option.py +0 -0
  80. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/parameter.py +0 -0
  81. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/typer/__init__.py +0 -0
  82. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/__init__.py +0 -0
  83. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/compare/__init__.py +0 -0
  84. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/compare/subsets.py +0 -0
  85. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/detect_flakes.py +0 -0
  86. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/__init__.py +0 -0
  87. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/model.py +0 -0
  88. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/subset.py +0 -0
  89. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/__init__.py +0 -0
  90. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/attachment.py +0 -0
  91. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/case_event.py +0 -0
  92. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/commit.py +0 -0
  93. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/tests.py +0 -0
  94. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/stats/__init__.py +0 -0
  95. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/stats/test_sessions.py +0 -0
  96. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/plugins/__init__.py +0 -0
  97. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/__init__.py +0 -0
  98. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/adb.py +0 -0
  99. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/ant.py +0 -0
  100. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/bazel.py +0 -0
  101. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/behave.py +0 -0
  102. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/codeceptjs.py +0 -0
  103. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/ctest.py +0 -0
  104. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cts.py +0 -0
  105. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cucumber.py +0 -0
  106. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cypress.py +0 -0
  107. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/dotnet.py +0 -0
  108. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/flutter.py +0 -0
  109. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/googletest.py +0 -0
  110. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/jest.py +0 -0
  111. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/minitest.py +0 -0
  112. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/nunit.py +0 -0
  113. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/pytest.py +0 -0
  114. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/raw.py +0 -0
  115. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/robot.py +0 -0
  116. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/rspec.py +0 -0
  117. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/xctest.py +0 -0
  118. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/testpath.py +0 -0
  119. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/__init__.py +0 -0
  120. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/ci_provider.py +0 -0
  121. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/commands.py +0 -0
  122. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/commit_ingester.py +0 -0
  123. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/common_tz.py +0 -0
  124. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/edit_distance.py +0 -0
  125. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/env_keys.py +0 -0
  126. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/exceptions.py +0 -0
  127. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/fail_fast_mode.py +0 -0
  128. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/file_name_pattern.py +0 -0
  129. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/git_log_parser.py +0 -0
  130. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/glob.py +0 -0
  131. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/gzipgen.py +0 -0
  132. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/http_client.py +0 -0
  133. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/java.py +0 -0
  134. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/link.py +0 -0
  135. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/logger.py +0 -0
  136. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/no_build.py +0 -0
  137. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/sax.py +0 -0
  138. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/session.py +0 -0
  139. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/subprocess.py +0 -0
  140. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/tracking.py +0 -0
  141. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/typer_types.py +0 -0
  142. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/version.py +0 -0
  143. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
  144. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/entry_points.txt +0 -0
  145. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/requires.txt +0 -0
  146. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/top_level.txt +0 -0
  147. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/BUILD +0 -0
  148. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  149. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +0 -0
  150. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
  151. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  152. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +0 -0
  153. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +0 -0
  154. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  155. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  156. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
  157. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  158. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  159. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  160. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -0
  161. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  162. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  163. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
  164. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/maven_install.json +0 -0
  165. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  166. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +0 -0
  167. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
  168. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  169. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  170. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/test-runner/__main__.py +0 -0
  171. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/__init__.py +0 -0
  172. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/__init__.py +0 -0
  173. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/converters/__init__.py +0 -0
  174. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/converters/test_converters.py +0 -0
  175. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_badcode.py +0 -0
  176. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_badinput.py +0 -0
  177. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_command.py +0 -0
  178. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_decorators.py +0 -0
  179. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_help.py +0 -0
  180. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_parameter.py +0 -0
  181. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_typer.py +0 -0
  182. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/cli_test_case.py +0 -0
  183. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/__init__.py +0 -0
  184. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/compare/__init__.py +0 -0
  185. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/compare/test_subsets.py +0 -0
  186. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/inspect/test_model.py +0 -0
  187. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/inspect/test_subset.py +0 -0
  188. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/__init__.py +0 -0
  189. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_attachment.py +0 -0
  190. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_build.py +0 -0
  191. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_case_event.py +0 -0
  192. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_commit.py +0 -0
  193. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_tests.py +0 -0
  194. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_api_error.py +0 -0
  195. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_detect_flakes.py +0 -0
  196. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_verify.py +0 -0
  197. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/adb/subset_result.json +0 -0
  198. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
  199. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
  200. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  201. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/record_test_result.json +0 -0
  202. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
  203. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
  204. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/library/Cache.java +0 -0
  205. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
  206. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/subset_result.json +0 -0
  207. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  208. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
  209. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  210. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  211. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  212. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  213. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  214. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  215. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  216. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  217. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  218. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  219. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  220. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  221. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  222. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  223. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  224. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  225. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  226. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/build_event.json +0 -0
  227. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/build_event_rest.json +0 -0
  228. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_result.json +0 -0
  229. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  230. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  231. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/subset_result.json +0 -0
  232. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/record_test_result.json +0 -0
  233. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/reports/report.xml +0 -0
  234. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/subset_result.json +0 -0
  235. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/broken_xml/broken.xml +0 -0
  236. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/broken_xml/normal.xml +0 -0
  237. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
  238. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/codeceptjs/record_test_result.json +0 -0
  239. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  240. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/ctest_list.json +0 -0
  241. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/record_test_result.json +0 -0
  242. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/subset_result.json +0 -0
  243. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/record_test_result.json +0 -0
  244. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/subset_result.json +0 -0
  245. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/test_result.xml +0 -0
  246. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo/bar.feature +0 -0
  247. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  248. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo-bar.feature +0 -0
  249. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  250. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/record_test_json_result.json +0 -0
  251. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/record_test_result.json +0 -0
  252. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  253. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  254. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  255. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/dummy.xml +0 -0
  256. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/result.json +0 -0
  257. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/empty.json +0 -0
  258. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/empty.xml +0 -0
  259. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/record_test_result.json +0 -0
  260. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/subset_result.json +0 -0
  261. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/test-result.xml +0 -0
  262. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/dotnet/record_test_result.json +0 -0
  263. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/dotnet/test-result.xml +0 -0
  264. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/flutter/record_test_result.json +0 -0
  265. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/flutter/report.json +0 -0
  266. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/git_log_ingest/sample.out +0 -0
  267. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/record_test_result.json +0 -0
  268. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  269. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  270. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/subset_result.json +0 -0
  271. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/fail/output.xml +0 -0
  272. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/fail/record_test_result.json +0 -0
  273. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/output_a.xml +0 -0
  274. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/output_b.xml +0 -0
  275. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/record_test_result.json +0 -0
  276. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/subset_result.json +0 -0
  277. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
  278. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
  279. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
  280. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/recursion/expected.json +0 -0
  281. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  282. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/jasmine-test-results.json +0 -0
  283. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/record_test_result.json +0 -0
  284. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/subset_payload.json +0 -0
  285. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/junit.xml +0 -0
  286. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/record_test_result.json +0 -0
  287. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/subset_result.json +0 -0
  288. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/createdFile_1.lst +0 -0
  289. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/createdFile_2.lst +0 -0
  290. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
  291. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
  292. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/list.lst +0 -0
  293. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/record_test_result.json +0 -0
  294. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-1.xml +0 -0
  295. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-2.xml +0 -0
  296. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-nested.xml +0 -0
  297. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/dummy.xml +0 -0
  298. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
  299. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_by_confidence_result.json +0 -0
  300. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_from_file_result.json +0 -0
  301. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_result.json +0 -0
  302. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
  303. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  304. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  305. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  306. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  307. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserTest.xml +0 -0
  308. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result.json +0 -0
  309. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result_chunk1.json +0 -0
  310. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result_chunk2.json +0 -0
  311. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/subset_result.json +0 -0
  312. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/test/example_test.rb +0 -0
  313. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/list.xml +0 -0
  314. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  315. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  316. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/output-linux.xml +0 -0
  317. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/output-windows.xml +0 -0
  318. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/record_test_result-linux.json +0 -0
  319. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/record_test_result-windows.json +0 -0
  320. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/.gitignore +0 -0
  321. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/Program.cs +0 -0
  322. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/README.md +0 -0
  323. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/Test.cs +0 -0
  324. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/calc.csproj +0 -0
  325. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/subset_result.json +0 -0
  326. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/record_test_result.json +0 -0
  327. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/record_test_result_with_json.json +0 -0
  328. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/report.json +0 -0
  329. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/report.xml +0 -0
  330. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/prove/record_test_result.json +0 -0
  331. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/prove/report.xml +0 -0
  332. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/pytest.ini +0 -0
  333. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/record_test_result.json +0 -0
  334. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/record_test_result_json.json +0 -0
  335. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/report.json +0 -0
  336. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/report.xml +0 -0
  337. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/subset_result.json +0 -0
  338. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/conftest.py +0 -0
  339. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/__init__.py +0 -0
  340. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  341. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  342. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/funcs3_test.py +0 -0
  343. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/test_funcs1.py +0 -0
  344. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/test_funcs2.py +0 -0
  345. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/dryrun.xml +0 -0
  346. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/output.xml +0 -0
  347. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  348. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/record_test_result.json +0 -0
  349. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/single-output.xml +0 -0
  350. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/subset_result.json +0 -0
  351. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/rspec/record_test_result.json +0 -0
  352. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/rspec/rspec.xml +0 -0
  353. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/vitest/record_test_result.json +0 -0
  354. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/vitest/report.xml +0 -0
  355. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/junit.xml +0 -0
  356. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/record_test_result.json +0 -0
  357. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/subset_result.json +0 -0
  358. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/helper.py +0 -0
  359. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/plugins/foo.py +0 -0
  360. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_cli_test_case.py +0 -0
  361. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_plugin.py +0 -0
  362. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/__init__.py +0 -0
  363. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_adb.py +0 -0
  364. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_ant.py +0 -0
  365. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_bazel.py +0 -0
  366. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_behave.py +0 -0
  367. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_codeceptjs.py +0 -0
  368. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_ctest.py +0 -0
  369. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cts.py +0 -0
  370. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cucumber.py +0 -0
  371. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cypress.py +0 -0
  372. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_dotnet.py +0 -0
  373. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_go_test.py +0 -0
  374. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_googletest.py +0 -0
  375. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_gradle.py +0 -0
  376. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_jest.py +0 -0
  377. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_maven.py +0 -0
  378. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_minitest.py +0 -0
  379. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_nunit.py +0 -0
  380. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_playwright.py +0 -0
  381. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_prove.py +0 -0
  382. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_pytest.py +0 -0
  383. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_raw.py +0 -0
  384. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_robot.py +0 -0
  385. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_rspec.py +0 -0
  386. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_vitest.py +0 -0
  387. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_xctest.py +0 -0
  388. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_testpath.py +0 -0
  389. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_version.py +0 -0
  390. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/__init__.py +0 -0
  391. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_edit_distance.py +0 -0
  392. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_fail_fast_mode.py +0 -0
  393. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_file_name_pattern.py +0 -0
  394. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_git_log_parser.py +0 -0
  395. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_glob.py +0 -0
  396. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_gzipgen.py +0 -0
  397. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_http_client.py +0 -0
  398. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_link.py +0 -0
  399. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_logger.py +0 -0
  400. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_session.py +0 -0
  401. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_typer.py +0 -0
  402. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_typer_types.py +0 -0
  403. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tools/README.md +0 -0
  404. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tools/generate_reference.py +0 -0
  405. {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-tests-cli
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Smart Tests CLI
5
5
  Author-email: CloudBees <support@cloudbees.com>
6
6
  License: Apache Software License v2
@@ -337,7 +337,7 @@ def build(
337
337
  def report(ws: List[Workspace], build_id: str):
338
338
  org, workspace = get_org_workspace()
339
339
  click.echo(
340
- f"Launchable recorded build {build_name} to workspace {org} / {workspace} with commits from "
340
+ f"Smart Tests recorded build {build_name} to workspace {org} / {workspace} with commits from "
341
341
  f"{len(ws)} {'repositories' if len(ws) > 1 else 'repository'}: \n")
342
342
 
343
343
  header = ["Name", "Path", "HEAD Commit"]
@@ -24,19 +24,18 @@ TEST_SESSION_NAME_RULE = re.compile("^[a-zA-Z0-9][a-zA-Z0-9_.-]*$")
24
24
  @args4p.command(help="Record session information")
25
25
  def session(
26
26
  app: Application,
27
- build_name: Annotated[str, typer.Option(
27
+ build_name: Annotated[str | None, typer.Option(
28
28
  "--build",
29
29
  help="Build name",
30
30
  metavar="NAME",
31
- required=True
32
- )],
31
+ )] = None,
33
32
  test_suite: Annotated[str, typer.Option(
34
33
  "--test-suite",
35
34
  help="Set test suite name. A test suite is a collection of test sessions. Setting a test suite allows you to "
36
35
  "manage data over test sessions and lineages.",
37
36
  metavar="NAME",
38
37
  required=True
39
- )],
38
+ )] = "",
40
39
  flavors: Annotated[List[KeyValue], typer.Option(
41
40
  "--flavor",
42
41
  help="Flavors",
@@ -28,8 +28,9 @@ from ..testpath import FilePathNormalizer, TestPath
28
28
  from ..utils.env_keys import REPORT_ERROR_KEY
29
29
  from ..utils.fail_fast_mode import (FailFastModeValidateParams, fail_fast_mode_validate,
30
30
  set_fail_fast_mode, warn_and_exit_if_fail_fast_mode)
31
+ from ..utils.input_snapshot import InputSnapshotId
31
32
  from ..utils.smart_tests_client import SmartTestsClient
32
- from ..utils.typer_types import Duration, Percentage, parse_duration, parse_percentage
33
+ from ..utils.typer_types import Duration, Fraction, Percentage, parse_duration, parse_fraction, parse_percentage
33
34
  from .test_path_writer import TestPathWriter
34
35
 
35
36
 
@@ -174,6 +175,23 @@ class Subset(TestPathWriter):
174
175
  type=fileText(mode="r"),
175
176
  metavar="FILE"
176
177
  )] = None,
178
+ input_snapshot_id: Annotated[InputSnapshotId | None, InputSnapshotId.as_option()] = None,
179
+ print_input_snapshot_id: Annotated[bool, typer.Option(
180
+ "--print-input-snapshot-id",
181
+ help="Print the input snapshot ID returned from the server instead of the subset results"
182
+ )] = False,
183
+ bin_target: Annotated[Fraction | None, typer.Option(
184
+ "--bin",
185
+ help="Split subset into bins, e.g. --bin 1/4",
186
+ metavar="INDEX/COUNT",
187
+ type=parse_fraction
188
+ )] = None,
189
+ same_bin_files: Annotated[List[str], typer.Option(
190
+ "--same-bin",
191
+ help="Keep all tests listed in the file together when splitting; one test per line",
192
+ metavar="FILE",
193
+ multiple=True
194
+ )] = [],
177
195
  is_get_tests_from_guess: Annotated[bool, typer.Option(
178
196
  "--get-tests-from-guess",
179
197
  help="Get subset list from guessed tests"
@@ -255,9 +273,15 @@ class Subset(TestPathWriter):
255
273
  self.ignore_flaky_tests_above = ignore_flaky_tests_above
256
274
  self.prioritize_tests_failed_within_hours = prioritize_tests_failed_within_hours
257
275
  self.prioritized_tests_mapping_file = prioritized_tests_mapping_file
276
+ self.input_snapshot_id = input_snapshot_id.value if input_snapshot_id else None
277
+ self.print_input_snapshot_id = print_input_snapshot_id
278
+ self.bin_target = bin_target
279
+ self.same_bin_files = list(same_bin_files)
258
280
  self.is_get_tests_from_guess = is_get_tests_from_guess
259
281
  self.use_case = use_case
260
282
 
283
+ self._validate_print_input_snapshot_option()
284
+
261
285
  self.file_path_normalizer = FilePathNormalizer(base_path, no_base_path_inference=no_base_path_inference)
262
286
 
263
287
  self.test_paths: list[list[dict[str, str]]] = []
@@ -305,7 +329,7 @@ class Subset(TestPathWriter):
305
329
  """
306
330
 
307
331
  # To avoid the cli continue to wait from stdin
308
- if self.is_get_tests_from_previous_sessions or self.is_get_tests_from_guess:
332
+ if self._should_skip_stdin():
309
333
  return []
310
334
 
311
335
  if sys.stdin.isatty():
@@ -404,8 +428,103 @@ class Subset(TestPathWriter):
404
428
  if self.use_case:
405
429
  payload['changesUnderTest'] = self.use_case.value
406
430
 
431
+ if self.input_snapshot_id is not None:
432
+ payload['subsettingId'] = self.input_snapshot_id
433
+
434
+ split_subset = self._build_split_subset_payload()
435
+ if split_subset:
436
+ payload['splitSubset'] = split_subset
437
+
407
438
  return payload
408
439
 
440
+ def _build_split_subset_payload(self) -> dict[str, Any] | None:
441
+ if self.bin_target is None:
442
+ if self.same_bin_files:
443
+ print_error_and_die(
444
+ "--same-bin option requires --bin option.\nPlease set --bin option to use --same-bin",
445
+ self.tracking_client,
446
+ Tracking.ErrorEvent.USER_ERROR,
447
+ )
448
+ return None
449
+
450
+ slice_index = self.bin_target.numerator
451
+ slice_count = self.bin_target.denominator
452
+
453
+ if slice_index <= 0 or slice_count <= 0:
454
+ print_error_and_die(
455
+ "Invalid --bin value. Both index and count must be positive integers.",
456
+ self.tracking_client,
457
+ Tracking.ErrorEvent.USER_ERROR,
458
+ )
459
+
460
+ if slice_count < slice_index:
461
+ print_error_and_die(
462
+ "Invalid --bin value. The numerator cannot exceed the denominator.",
463
+ self.tracking_client,
464
+ Tracking.ErrorEvent.USER_ERROR,
465
+ )
466
+
467
+ same_bins = self._read_same_bin_files()
468
+
469
+ return {
470
+ "sliceIndex": slice_index,
471
+ "sliceCount": slice_count,
472
+ "sameBins": same_bins,
473
+ }
474
+
475
+ def _read_same_bin_files(self) -> list[list[TestPath]]:
476
+ if not self.same_bin_files:
477
+ return []
478
+
479
+ formatter = self.same_bin_formatter
480
+ if formatter is None:
481
+ print_error_and_die(
482
+ "--same-bin is not supported for this test runner.",
483
+ self.tracking_client,
484
+ Tracking.ErrorEvent.USER_ERROR,
485
+ )
486
+
487
+ same_bins: list[list[TestPath]] = []
488
+ seen_tests: set[str] = set()
489
+
490
+ for same_bin_file in self.same_bin_files:
491
+ try:
492
+ with open(same_bin_file, "r", encoding="utf-8") as fp:
493
+ tests = [line.strip() for line in fp if line.strip()]
494
+ except OSError as exc:
495
+ print_error_and_die(
496
+ f"Failed to read --same-bin file '{same_bin_file}': {exc}",
497
+ self.tracking_client,
498
+ Tracking.ErrorEvent.USER_ERROR,
499
+ )
500
+
501
+ unique_tests = list(dict.fromkeys(tests))
502
+
503
+ group: list[TestPath] = []
504
+ for test in unique_tests:
505
+ if test in seen_tests:
506
+ print_error_and_die(
507
+ f"Error: test '{test}' is listed in multiple --same-bin files.",
508
+ self.tracking_client,
509
+ Tracking.ErrorEvent.USER_ERROR,
510
+ )
511
+ seen_tests.add(test)
512
+
513
+ # For type check
514
+ assert formatter is not None, "--same -bin is not supported for this test runner"
515
+ formatted = formatter(test)
516
+ if not formatted:
517
+ print_error_and_die(
518
+ f"Failed to parse test '{test}' from --same-bin file {same_bin_file}",
519
+ self.tracking_client,
520
+ Tracking.ErrorEvent.USER_ERROR,
521
+ )
522
+ group.append(formatted)
523
+
524
+ same_bins.append(group)
525
+
526
+ return same_bins
527
+
409
528
  def _collect_potential_test_files(self):
410
529
  LOOSE_TEST_FILE_PATTERN = r'(\.(test|spec)\.|_test\.|Test\.|Spec\.|test/|tests/|__tests__/|src/test/)'
411
530
  EXCLUDE_PATTERN = r'(BUILD|Makefile|Dockerfile|LICENSE|.gitignore|.gitkeep|.keep|id_rsa|rsa|blank|taglib)|\.(xml|json|jsonl|txt|yml|yaml|toml|md|png|jpg|jpeg|gif|svg|sql|html|css|graphql|proto|gz|zip|rz|bzl|conf|config|snap|pem|crt|key|lock|jpi|hpi|jelly|properties|jar|ini|mod|sum|bmp|env|envrc|sh)$' # noqa E501
@@ -463,13 +582,75 @@ class Subset(TestPathWriter):
463
582
  e, "Warning: the service failed to subset. Falling back to running all tests")
464
583
  return SubsetResult.from_test_paths(self.test_paths)
465
584
 
585
+ def _requires_test_input(self) -> bool:
586
+ return (
587
+ self.input_snapshot_id is None
588
+ and not self.is_get_tests_from_previous_sessions # noqa: W503
589
+ and len(self.test_paths) == 0 # noqa: W503
590
+ )
591
+
592
+ def _should_skip_stdin(self) -> bool:
593
+ if self.is_get_tests_from_previous_sessions or self.is_get_tests_from_guess:
594
+ return True
595
+
596
+ if self.input_snapshot_id is not None:
597
+ if not sys.stdin.isatty():
598
+ warn_and_exit_if_fail_fast_mode(
599
+ "Warning: --input-snapshot-id is set so stdin will be ignored."
600
+ )
601
+ return True
602
+ return False
603
+
604
+ def _validate_print_input_snapshot_option(self):
605
+ if not self.print_input_snapshot_id:
606
+ return
607
+
608
+ conflicts: list[str] = []
609
+ option_checks = [
610
+ ("--target", self.target is not None),
611
+ ("--time", self.time is not None),
612
+ ("--confidence", self.confidence is not None),
613
+ ("--goal-spec", self.goal_spec is not None),
614
+ ("--rest", self.rest is not None),
615
+ ("--bin", self.bin_target is not None),
616
+ ("--same-bin", bool(self.same_bin_files)),
617
+ ("--ignore-new-tests", self.ignore_new_tests),
618
+ ("--ignore-flaky-tests-above", self.ignore_flaky_tests_above is not None),
619
+ ("--prioritize-tests-failed-within-hours", self.prioritize_tests_failed_within_hours is not None),
620
+ ("--prioritized-tests-mapping", self.prioritized_tests_mapping_file is not None),
621
+ ("--get-tests-from-previous-sessions", self.is_get_tests_from_previous_sessions),
622
+ ("--get-tests-from-guess", self.is_get_tests_from_guess),
623
+ ("--output-exclusion-rules", self.is_output_exclusion_rules),
624
+ ("--non-blocking", self.is_non_blocking),
625
+ ]
626
+
627
+ for option_name, is_set in option_checks:
628
+ if is_set:
629
+ conflicts.append(option_name)
630
+
631
+ if conflicts:
632
+ conflict_list = ", ".join(conflicts)
633
+ print_error_and_die(
634
+ f"--print-input-snapshot-id cannot be used with {conflict_list}.",
635
+ self.tracking_client,
636
+ Tracking.ErrorEvent.USER_ERROR,
637
+ )
638
+
639
+ def _print_input_snapshot_id_value(self, subset_result: SubsetResult):
640
+ if not subset_result.subset_id:
641
+ raise click.ClickException(
642
+ "Subset request did not return an input snapshot ID. Please re-run the command."
643
+ )
644
+
645
+ click.echo(subset_result.subset_id)
646
+
466
647
  def run(self):
467
648
  """called after tests are scanned to compute the optimized order"""
468
649
 
469
650
  if self.is_get_tests_from_guess:
470
651
  self._collect_potential_test_files()
471
652
 
472
- if not self.is_get_tests_from_previous_sessions and len(self.test_paths) == 0:
653
+ if self._requires_test_input():
473
654
  if self.input_given:
474
655
  print_error_and_die("ERROR: Given arguments did not match any tests. They appear to be incorrect/non-existent.", tracking_client, Tracking.ErrorEvent.USER_ERROR) # noqa E501
475
656
  else:
@@ -488,6 +669,12 @@ class Subset(TestPathWriter):
488
669
 
489
670
  if len(subset_result.subset) == 0:
490
671
  warn_and_exit_if_fail_fast_mode("Error: no tests found matching the path.")
672
+ if self.print_input_snapshot_id:
673
+ self._print_input_snapshot_id_value(subset_result)
674
+ return
675
+
676
+ if self.print_input_snapshot_id:
677
+ self._print_input_snapshot_id_value(subset_result)
491
678
  return
492
679
 
493
680
  # TODO(Konboi): split subset isn't provided for smart-tests initial release
@@ -1,5 +1,5 @@
1
1
  from os.path import join
2
- from typing import Callable, Dict, List
2
+ from typing import Callable, List
3
3
 
4
4
  import click
5
5
 
@@ -19,7 +19,7 @@ class TestPathWriter(object):
19
19
 
20
20
  def __init__(self, app: Application):
21
21
  self.formatter = self.default_formatter
22
- self._same_bin_formatter: Callable[[str], Dict[str, str]] | None = None
22
+ self._same_bin_formatter: Callable[[str], TestPath] | None = None
23
23
  self.separator = "\n"
24
24
  self.app = app
25
25
 
@@ -43,9 +43,9 @@ class TestPathWriter(object):
43
43
  for t in test_paths))
44
44
 
45
45
  @property
46
- def same_bin_formatter(self) -> Callable[[str], Dict[str, str]] | None:
46
+ def same_bin_formatter(self) -> Callable[[str], TestPath] | None:
47
47
  return self._same_bin_formatter
48
48
 
49
49
  @same_bin_formatter.setter
50
- def same_bin_formatter(self, v: Callable[[str], Dict[str, str]]):
50
+ def same_bin_formatter(self, v: Callable[[str], TestPath]):
51
51
  self._same_bin_formatter = v
@@ -7,13 +7,13 @@ from typing import List
7
7
  import click
8
8
 
9
9
  import smart_tests.args4p.typer as typer
10
- from smart_tests.utils.commands import Command
11
- from smart_tests.utils.env_keys import TOKEN_KEY
12
10
  from smart_tests.utils.tracking import Tracking, TrackingClient
13
11
 
14
12
  from .. import args4p
15
13
  from ..app import Application
16
- from ..utils.authentication import get_org_workspace
14
+ from ..utils.authentication import ensure_org_workspace, get_org_workspace
15
+ from ..utils.commands import Command
16
+ from ..utils.env_keys import TOKEN_KEY
17
17
  from ..utils.java import get_java_command
18
18
  from ..utils.smart_tests_client import SmartTestsClient
19
19
  from ..utils.typer_types import emoji
@@ -82,18 +82,8 @@ def verify(app_instance: Application):
82
82
  click.echo("Java command: " + repr(java))
83
83
  click.echo("smart-tests version: " + repr(version))
84
84
 
85
- if org is None or workspace is None:
86
- msg = (
87
- "Could not identify Smart Tests organization/workspace. "
88
- "Please confirm if you set SMART_TESTS_TOKEN or SMART_TESTS_ORGANIZATION and SMART_TESTS_WORKSPACE "
89
- "environment variables"
90
- )
91
- tracking_client.send_error_event(
92
- event_name=Tracking.ErrorEvent.INTERNAL_CLI_ERROR,
93
- stack_trace=msg
94
- )
95
- click.secho(msg, fg='red', err=True)
96
- raise typer.Exit(1)
85
+ # raise an error here after we print out the basic diagnostics if LAUNCHABLE_TOKEN is not set.
86
+ ensure_org_workspace()
97
87
 
98
88
  try:
99
89
  res = client.request("get", "verification")
@@ -2,19 +2,9 @@
2
2
  # The most bare-bone versions of the test runner support
3
3
  #
4
4
 
5
- from ..commands.subset import Subset
6
5
  from . import smart_tests
7
6
 
8
-
9
- @smart_tests.subset
10
- def subset(client: Subset):
11
- # read lines as test file names
12
- for t in client.stdin():
13
- client.test_path(t.rstrip("\n"))
14
-
15
- client.run()
16
-
17
-
7
+ subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
18
8
  record_tests = smart_tests.CommonRecordTestImpls(__name__).file_profile_report_files()
19
9
  smart_tests.CommonDetectFlakesImpls(__name__).detect_flakes()
20
10
  # split_subset = launchable.CommonSplitSubsetImpls(__name__).split_subset()
@@ -41,6 +41,7 @@ def subset(client: Subset):
41
41
  test_cases = []
42
42
  client.formatter = lambda x: f"^{x[1]['name']}$"
43
43
  client.separator = '|'
44
+ client.same_bin_formatter = format_same_bin
44
45
  client.run()
45
46
 
46
47
 
@@ -77,6 +77,8 @@ def subset(
77
77
  client.formatter = lambda x: f"--tests {x[0]['name']}"
78
78
  client.separator = ' '
79
79
 
80
+ client.same_bin_formatter = lambda s: [{"type": "class", "name": s}]
81
+
80
82
  client.run()
81
83
 
82
84
 
@@ -27,13 +27,7 @@ def record_tests(
27
27
  client.run()
28
28
 
29
29
 
30
- @smart_tests.subset
31
- def subset(client):
32
- # read lines as test file names
33
- for t in client.stdin():
34
- client.test_path(t.rstrip("\n"))
35
-
36
- client.run()
30
+ subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
37
31
 
38
32
 
39
33
  class JSONReportParser:
@@ -0,0 +1,174 @@
1
+ import json
2
+ from typing import Annotated, Dict, Generator, List
3
+
4
+ import click
5
+
6
+ from ..args4p import typer
7
+ from ..commands.record.case_event import CaseEvent
8
+ from ..testpath import TestPath
9
+ from . import smart_tests
10
+
11
+
12
+ @smart_tests.record.tests
13
+ def record_tests(client,
14
+ reports: Annotated[List[str], typer.Argument(multiple=True, help="Test report files to process")],
15
+ ):
16
+ client.parse_func = JSONReportParser(client).parse_func
17
+
18
+ for r in reports:
19
+ client.report(r)
20
+ client.run()
21
+
22
+
23
+ @smart_tests.subset
24
+ def subset(client, _with: Annotated[str | None, typer.Option(
25
+ '--with', help='Format output for specific test runner (e.g., "ng" for Angular CLI)')] = None, ):
26
+ """
27
+ Usage:
28
+ find src -name "*.spec.ts" -o -name "*.spec.js" > test-list.txt
29
+ cat test-list.txt | launchable subset --target 10% karma
30
+
31
+ # Output in ng test format
32
+ find src -name "*.spec.ts" | launchable subset --target 10% karma --with ng
33
+ """
34
+ for t in client.stdin():
35
+ path = t.strip()
36
+ if path:
37
+ client.test_path(path)
38
+
39
+ if _with == 'ng':
40
+ client.formatter = lambda x: "--include={}".format(x[0]['name'])
41
+ client.separator = " "
42
+
43
+ client.run()
44
+
45
+
46
+ class JSONReportParser:
47
+ """
48
+ Sample Karma report format:
49
+ {
50
+ "browsers": {...},
51
+ "result": {
52
+ "24461741": [
53
+ {
54
+ "fullName": "path/to/spec.ts should do something",
55
+ "description": "should do something",
56
+ "id": "spec0",
57
+ "log": [],
58
+ "skipped": false,
59
+ "disabled": false,
60
+ "pending": false,
61
+ "success": true,
62
+ "suite": [
63
+ "path/to/spec.ts"
64
+ ],
65
+ "time": 92,
66
+ "executedExpectationsCount": 1,
67
+ "passedExpectations": [...],
68
+ "properties": null
69
+ }
70
+ ]
71
+ },
72
+ "summary": {...}
73
+ }
74
+ """
75
+
76
+ def __init__(self, client):
77
+ self.client = client
78
+
79
+ def parse_func(self, report_file: str) -> Generator[Dict, None, None]: # type: ignore
80
+ data: Dict
81
+ with open(report_file, 'r') as json_file:
82
+ try:
83
+ data = json.load(json_file)
84
+ except Exception:
85
+ click.echo(
86
+ click.style("Error: Failed to load Json report file: {}".format(report_file), fg='red'), err=True)
87
+ return
88
+
89
+ if not self._validate_report_format(data):
90
+ click.echo(
91
+ "Error: {} does not appear to be valid Karma report format. "
92
+ "Make sure you are using karma-json-reporter or a compatible reporter.".format(
93
+ report_file), err=True)
94
+ return
95
+
96
+ results = data.get("result", {})
97
+ for browser_id, specs in results.items():
98
+ if isinstance(specs, list):
99
+ for event in self._parse_specs(specs):
100
+ yield event
101
+
102
+ def _validate_report_format(self, data: Dict) -> bool:
103
+ if not isinstance(data, dict):
104
+ return False
105
+
106
+ if "result" not in data:
107
+ return False
108
+
109
+ results = data.get("result", {})
110
+ if not isinstance(results, dict):
111
+ return False
112
+
113
+ for browser_id, specs in results.items():
114
+ if not isinstance(specs, list):
115
+ return False
116
+
117
+ for spec in specs:
118
+ if not isinstance(spec, dict):
119
+ return False
120
+ # Check for required fields
121
+ if "suite" not in spec or "time" not in spec:
122
+ return False
123
+ # Field suite should have at least one element (filename)
124
+ suite = spec.get("suite", [])
125
+ if not isinstance(suite, list) or len(suite) == 0:
126
+ return False
127
+
128
+ return True
129
+
130
+ def _parse_specs(self, specs: List[Dict]) -> List[Dict]:
131
+ events: List[Dict] = []
132
+
133
+ for spec in specs:
134
+ # TODO:
135
+ # In NextWorld, test filepaths are included in the suite tag
136
+ # But generally in a Karma test report, a suite tag can be any string
137
+ # For the time being let's get filepaths from the suite tag,
138
+ # until we find a standard way to include filepaths in the test reports
139
+ suite = spec.get("suite", [])
140
+ filename = suite[0] if suite else ""
141
+
142
+ test_path: TestPath = [
143
+ self.client.make_file_path_component(filename),
144
+ {"type": "testcase", "name": spec.get("fullName", spec.get("description", ""))}
145
+ ]
146
+
147
+ duration_msec = spec.get("time", 0)
148
+ status = self._case_event_status_from_spec(spec)
149
+ stderr = self._parse_stderr(spec)
150
+
151
+ events.append(CaseEvent.create(
152
+ test_path=test_path,
153
+ duration_secs=duration_msec / 1000 if duration_msec else 0,
154
+ status=status,
155
+ stderr=stderr
156
+ ))
157
+
158
+ return events
159
+
160
+ def _case_event_status_from_spec(self, spec: Dict) -> int:
161
+ if spec.get("skipped", False) or spec.get("disabled", False) or spec.get("pending", False):
162
+ return CaseEvent.TEST_SKIPPED
163
+
164
+ if spec.get("success", False):
165
+ return CaseEvent.TEST_PASSED
166
+ else:
167
+ return CaseEvent.TEST_FAILED
168
+
169
+ def _parse_stderr(self, spec: Dict) -> str:
170
+ log_messages = spec.get("log", [])
171
+ if not log_messages:
172
+ return ""
173
+
174
+ return "\n".join(str(msg) for msg in log_messages if msg)
@@ -126,6 +126,8 @@ def subset(
126
126
  for root in source_roots:
127
127
  client.scan(root, '**/*', file2test)
128
128
 
129
+ client.same_bin_formatter = lambda s: [{"type": "class", "name": s}]
130
+
129
131
  client.run()
130
132
 
131
133
 
@@ -13,7 +13,6 @@ import smart_tests.args4p.typer as typer
13
13
  from ..args4p.exceptions import BadCmdLineException
14
14
  from ..commands.record.case_event import CaseEvent, CaseEventGenerator
15
15
  from ..commands.record.tests import RecordTests
16
- from ..commands.subset import Subset
17
16
  from ..testpath import TestPath
18
17
  from . import smart_tests
19
18
 
@@ -63,13 +62,7 @@ def record_tests(
63
62
  client.run()
64
63
 
65
64
 
66
- @smart_tests.subset
67
- def subset(client: Subset):
68
- # read lines as test file names
69
- for t in client.stdin():
70
- client.test_path(t.rstrip("\n"))
71
-
72
- client.run()
65
+ subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
73
66
 
74
67
 
75
68
  class JSONReportParser:
@@ -7,7 +7,6 @@ import smart_tests.args4p.typer as typer
7
7
 
8
8
  from ..args4p.exceptions import BadCmdLineException
9
9
  from ..commands.record.tests import RecordTests
10
- from ..commands.subset import Subset
11
10
  from ..testpath import TestPath
12
11
  from . import smart_tests
13
12
 
@@ -19,13 +18,7 @@ def remove_leading_number_and_dash(input_string: str) -> str:
19
18
  return result
20
19
 
21
20
 
22
- @smart_tests.subset
23
- def subset(client: Subset):
24
- # read lines as test file names
25
- for t in client.stdin():
26
- client.test_path(t.rstrip("\n"))
27
-
28
- client.run()
21
+ subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
29
22
 
30
23
 
31
24
  @smart_tests.record.tests