smart-tests-cli 2.3.2__tar.gz → 2.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. smart_tests_cli-2.4.1/.dockerignore +4 -0
  2. smart_tests_cli-2.4.1/CLAUDE.md +2 -0
  3. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/PKG-INFO +4 -1
  4. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/README.md +3 -0
  5. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/__main__.py +2 -0
  6. smart_tests_cli-2.4.1/smart_tests/commands/gate.py +70 -0
  7. smart_tests_cli-2.4.1/smart_tests/commands/record/attachment.py +151 -0
  8. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/commit.py +3 -0
  9. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/subset.py +10 -0
  10. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/jar/exe_deploy.jar +0 -0
  11. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/bazel.py +0 -1
  12. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/maven.py +25 -4
  13. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/smart_tests.py +10 -6
  14. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/commands.py +1 -0
  15. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/session.py +16 -2
  16. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/PKG-INFO +4 -1
  17. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/SOURCES.txt +21 -2
  18. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java +8 -0
  19. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java +80 -0
  20. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +8 -8
  21. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +277 -168
  22. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java +45 -0
  23. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +22 -7
  24. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +8 -2
  25. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +6 -5
  26. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java +10 -0
  27. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java +8 -0
  28. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java +67 -0
  29. smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java +101 -0
  30. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +4 -2
  31. smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java +93 -0
  32. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +15 -15
  33. smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java +124 -0
  34. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +5 -4
  35. smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java +95 -0
  36. smart_tests_cli-2.4.1/tests/commands/record/test_attachment.py +160 -0
  37. smart_tests_cli-2.4.1/tests/commands/test_gate.py +126 -0
  38. smart_tests_cli-2.4.1/tests/data/file/record_test_result.json +53 -0
  39. smart_tests_cli-2.4.1/tests/data/file/record_test_result_custom_attribute.json +45 -0
  40. smart_tests_cli-2.4.1/tests/data/file/result.xml +9 -0
  41. smart_tests_cli-2.4.1/tests/data/file/result_custom_attribute.xml +9 -0
  42. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_by_absolute_time_result.json +4 -1
  43. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_by_confidence_result.json +4 -1
  44. smart_tests_cli-2.4.1/tests/data/maven/subset_result.json +20 -0
  45. smart_tests_cli-2.3.2/tests/data/maven/subset_result.json → smart_tests_cli-2.4.1/tests/data/maven/subset_with_exclude_rules_result.json +1 -1
  46. smart_tests_cli-2.4.1/tests/test_runners/test_file.py +41 -0
  47. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_maven.py +19 -0
  48. smart_tests_cli-2.4.1/tests/utils/__init__.py +0 -0
  49. smart_tests_cli-2.4.1/tests/utils/test_session.py +89 -0
  50. smart_tests_cli-2.3.2/smart_tests/commands/record/attachment.py +0 -40
  51. smart_tests_cli-2.3.2/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -74
  52. smart_tests_cli-2.3.2/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +0 -31
  53. smart_tests_cli-2.3.2/tests/commands/record/test_attachment.py +0 -43
  54. smart_tests_cli-2.3.2/tests/utils/test_session.py +0 -48
  55. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.bazelrc +0 -0
  56. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.bazelversion +0 -0
  57. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.editorconfig +0 -0
  58. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/release.yml +0 -0
  59. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/bazel-test.yml +0 -0
  60. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/e2e.yml +0 -0
  61. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/publish.yml +0 -0
  62. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/test.yml +0 -0
  63. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/update_maven_install_json.yml +0 -0
  64. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.gitignore +0 -0
  65. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.pre-commit-config.yaml +0 -0
  66. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.python-version +0 -0
  67. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.tagpr +0 -0
  68. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/CONTRIBUTING.md +0 -0
  69. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/Dockerfile +0 -0
  70. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/LICENSE.txt +0 -0
  71. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/WORKSPACE +0 -0
  72. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/build-java.sh +0 -0
  73. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/pyproject.toml +0 -0
  74. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/renovate.json +0 -0
  75. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/setup.cfg +0 -0
  76. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/setup.py +0 -0
  77. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/__init__.py +0 -0
  78. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/app.py +0 -0
  79. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/README.md +0 -0
  80. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/__init__.py +0 -0
  81. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/argument.py +0 -0
  82. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/command.py +0 -0
  83. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/converters/__init__.py +0 -0
  84. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/decorators.py +0 -0
  85. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/exceptions.py +0 -0
  86. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/option.py +0 -0
  87. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/parameter.py +0 -0
  88. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/typer/__init__.py +0 -0
  89. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/__init__.py +0 -0
  90. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/compare/__init__.py +0 -0
  91. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/compare/subsets.py +0 -0
  92. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/detect_flakes.py +0 -0
  93. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/__init__.py +0 -0
  94. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/model.py +0 -0
  95. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/subset.py +0 -0
  96. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/__init__.py +0 -0
  97. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/build.py +0 -0
  98. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/case_event.py +0 -0
  99. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/session.py +0 -0
  100. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/tests.py +0 -0
  101. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/stats/__init__.py +0 -0
  102. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/stats/test_sessions.py +0 -0
  103. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/test_path_writer.py +0 -0
  104. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/verify.py +0 -0
  105. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/plugins/__init__.py +0 -0
  106. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/__init__.py +0 -0
  107. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/adb.py +0 -0
  108. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/ant.py +0 -0
  109. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/behave.py +0 -0
  110. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/codeceptjs.py +0 -0
  111. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/ctest.py +0 -0
  112. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cts.py +0 -0
  113. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cucumber.py +0 -0
  114. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cypress.py +0 -0
  115. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/dotnet.py +0 -0
  116. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/file.py +0 -0
  117. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/flutter.py +0 -0
  118. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/go_test.py +0 -0
  119. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/googletest.py +0 -0
  120. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/gradle.py +0 -0
  121. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/jasmine.py +0 -0
  122. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/jest.py +0 -0
  123. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/karma.py +0 -0
  124. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/minitest.py +0 -0
  125. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/nunit.py +0 -0
  126. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/playwright.py +0 -0
  127. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/prove.py +0 -0
  128. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/pytest.py +0 -0
  129. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/raw.py +0 -0
  130. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/robot.py +0 -0
  131. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/rspec.py +0 -0
  132. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/vitest.py +0 -0
  133. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/xctest.py +0 -0
  134. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/testpath.py +0 -0
  135. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/__init__.py +0 -0
  136. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/authentication.py +0 -0
  137. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/ci_provider.py +0 -0
  138. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/commit_ingester.py +0 -0
  139. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/common_tz.py +0 -0
  140. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/edit_distance.py +0 -0
  141. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/env_keys.py +0 -0
  142. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/exceptions.py +0 -0
  143. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/fail_fast_mode.py +0 -0
  144. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/file_name_pattern.py +0 -0
  145. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/git_log_parser.py +0 -0
  146. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/glob.py +0 -0
  147. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/gzipgen.py +0 -0
  148. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/http_client.py +0 -0
  149. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/input_snapshot.py +0 -0
  150. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/java.py +0 -0
  151. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/link.py +0 -0
  152. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/logger.py +0 -0
  153. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/no_build.py +0 -0
  154. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/sax.py +0 -0
  155. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/smart_tests_client.py +0 -0
  156. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/subprocess.py +0 -0
  157. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/tracking.py +0 -0
  158. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/typer_types.py +0 -0
  159. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/version.py +0 -0
  160. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
  161. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/entry_points.txt +0 -0
  162. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/requires.txt +0 -0
  163. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/top_level.txt +0 -0
  164. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/BUILD +0 -0
  165. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  166. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
  167. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
  168. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  169. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  170. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  171. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
  172. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  173. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  174. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
  175. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  176. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  177. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  178. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
  179. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
  180. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/maven_install.json +0 -0
  181. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  182. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
  183. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
  184. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  185. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  186. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/test-runner/__main__.py +0 -0
  187. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/__init__.py +0 -0
  188. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/__init__.py +0 -0
  189. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/converters/__init__.py +0 -0
  190. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/converters/test_converters.py +0 -0
  191. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_badcode.py +0 -0
  192. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_badinput.py +0 -0
  193. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_command.py +0 -0
  194. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_decorators.py +0 -0
  195. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_help.py +0 -0
  196. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_parameter.py +0 -0
  197. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_typer.py +0 -0
  198. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/cli_test_case.py +0 -0
  199. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/__init__.py +0 -0
  200. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/compare/__init__.py +0 -0
  201. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/compare/test_subsets.py +0 -0
  202. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/inspect/test_model.py +0 -0
  203. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/inspect/test_subset.py +0 -0
  204. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/__init__.py +0 -0
  205. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_build.py +0 -0
  206. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_case_event.py +0 -0
  207. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_commit.py +0 -0
  208. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_session.py +0 -0
  209. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_tests.py +0 -0
  210. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_api_error.py +0 -0
  211. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_detect_flakes.py +0 -0
  212. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_subset.py +0 -0
  213. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_verify.py +0 -0
  214. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/adb/subset_result.json +0 -0
  215. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
  216. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
  217. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  218. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/record_test_result.json +0 -0
  219. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
  220. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
  221. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/library/Cache.java +0 -0
  222. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
  223. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/subset_result.json +0 -0
  224. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  225. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
  226. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  227. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  228. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  229. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  230. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  231. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  232. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  233. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  234. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  235. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  236. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  237. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  238. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  239. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  240. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  241. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  242. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  243. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/build_event.json +0 -0
  244. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/build_event_rest.json +0 -0
  245. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_result.json +0 -0
  246. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  247. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  248. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/subset_result.json +0 -0
  249. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/record_test_result.json +0 -0
  250. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/reports/report.xml +0 -0
  251. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/subset_result.json +0 -0
  252. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/broken_xml/broken.xml +0 -0
  253. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/broken_xml/normal.xml +0 -0
  254. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
  255. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/codeceptjs/record_test_result.json +0 -0
  256. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  257. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/ctest_list.json +0 -0
  258. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/record_test_result.json +0 -0
  259. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/subset_result.json +0 -0
  260. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/record_test_result.json +0 -0
  261. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/subset_result.json +0 -0
  262. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/test_result.xml +0 -0
  263. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo/bar.feature +0 -0
  264. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  265. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo-bar.feature +0 -0
  266. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  267. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/record_test_json_result.json +0 -0
  268. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/record_test_result.json +0 -0
  269. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  270. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  271. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  272. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/dummy.xml +0 -0
  273. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/result.json +0 -0
  274. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/empty.json +0 -0
  275. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/empty.xml +0 -0
  276. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/record_test_result.json +0 -0
  277. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/subset_result.json +0 -0
  278. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/test-result.xml +0 -0
  279. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/dotnet/record_test_result.json +0 -0
  280. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/dotnet/test-result.xml +0 -0
  281. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/flutter/record_test_result.json +0 -0
  282. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/flutter/report.json +0 -0
  283. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/git_log_ingest/sample.out +0 -0
  284. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/record_test_result.json +0 -0
  285. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  286. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  287. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/subset_result.json +0 -0
  288. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/fail/output.xml +0 -0
  289. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/fail/record_test_result.json +0 -0
  290. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/output_a.xml +0 -0
  291. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/output_b.xml +0 -0
  292. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/record_test_result.json +0 -0
  293. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/subset_result.json +0 -0
  294. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
  295. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
  296. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
  297. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/recursion/expected.json +0 -0
  298. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  299. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/README.md +0 -0
  300. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
  301. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/jasmine-test-results.json +0 -0
  302. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/record_test_result.json +0 -0
  303. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/subset_payload.json +0 -0
  304. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/junit.xml +0 -0
  305. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/record_test_result.json +0 -0
  306. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/subset_result.json +0 -0
  307. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/README.md +0 -0
  308. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/record_test_result.json +0 -0
  309. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/sample-report.json +0 -0
  310. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/subset_payload.json +0 -0
  311. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/subset_result.json +0 -0
  312. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/createdFile_1.lst +0 -0
  313. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/createdFile_2.lst +0 -0
  314. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
  315. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
  316. /smart_tests_cli-2.3.2/tests/data/pytest/tests/fooo/__init__.py → /smart_tests_cli-2.4.1/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
  317. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/list.lst +0 -0
  318. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/record_test_result.json +0 -0
  319. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-1.xml +0 -0
  320. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-2.xml +0 -0
  321. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-nested.xml +0 -0
  322. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/dummy.xml +0 -0
  323. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_from_file_result.json +0 -0
  324. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
  325. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  326. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  327. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  328. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  329. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserTest.xml +0 -0
  330. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result.json +0 -0
  331. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result_chunk1.json +0 -0
  332. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result_chunk2.json +0 -0
  333. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/subset_result.json +0 -0
  334. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/test/example_test.rb +0 -0
  335. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/list.xml +0 -0
  336. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  337. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  338. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/output-linux.xml +0 -0
  339. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/output-windows.xml +0 -0
  340. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/record_test_result-linux.json +0 -0
  341. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/record_test_result-windows.json +0 -0
  342. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/.gitignore +0 -0
  343. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/Program.cs +0 -0
  344. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/README.md +0 -0
  345. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/Test.cs +0 -0
  346. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/calc.csproj +0 -0
  347. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/subset_result.json +0 -0
  348. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/record_test_result.json +0 -0
  349. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/record_test_result_with_json.json +0 -0
  350. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/report.json +0 -0
  351. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/report.xml +0 -0
  352. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/prove/record_test_result.json +0 -0
  353. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/prove/report.xml +0 -0
  354. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/pytest.ini +0 -0
  355. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/record_test_result.json +0 -0
  356. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/record_test_result_json.json +0 -0
  357. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/report.json +0 -0
  358. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/report.xml +0 -0
  359. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/subset_result.json +0 -0
  360. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/conftest.py +0 -0
  361. {smart_tests_cli-2.3.2/tests/test_runners → smart_tests_cli-2.4.1/tests/data/pytest/tests/fooo}/__init__.py +0 -0
  362. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  363. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  364. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/funcs3_test.py +0 -0
  365. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/test_funcs1.py +0 -0
  366. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/test_funcs2.py +0 -0
  367. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/dryrun.xml +0 -0
  368. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/output.xml +0 -0
  369. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  370. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/record_test_result.json +0 -0
  371. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/single-output.xml +0 -0
  372. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/subset_result.json +0 -0
  373. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/rspec/record_test_result.json +0 -0
  374. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/rspec/rspec.xml +0 -0
  375. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/vitest/record_test_result.json +0 -0
  376. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/vitest/report.xml +0 -0
  377. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/junit.xml +0 -0
  378. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/record_test_result.json +0 -0
  379. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/subset_result.json +0 -0
  380. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/helper.py +0 -0
  381. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/plugins/foo.py +0 -0
  382. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_cli_test_case.py +0 -0
  383. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_plugin.py +0 -0
  384. {smart_tests_cli-2.3.2/tests/utils → smart_tests_cli-2.4.1/tests/test_runners}/__init__.py +0 -0
  385. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_adb.py +0 -0
  386. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_ant.py +0 -0
  387. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_bazel.py +0 -0
  388. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_behave.py +0 -0
  389. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_codeceptjs.py +0 -0
  390. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_ctest.py +0 -0
  391. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cts.py +0 -0
  392. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cucumber.py +0 -0
  393. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cypress.py +0 -0
  394. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_dotnet.py +0 -0
  395. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_go_test.py +0 -0
  396. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_googletest.py +0 -0
  397. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_gradle.py +0 -0
  398. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_jasmine.py +0 -0
  399. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_jest.py +0 -0
  400. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_karma.py +0 -0
  401. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_minitest.py +0 -0
  402. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_nunit.py +0 -0
  403. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_playwright.py +0 -0
  404. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_prove.py +0 -0
  405. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_pytest.py +0 -0
  406. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_raw.py +0 -0
  407. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_robot.py +0 -0
  408. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_rspec.py +0 -0
  409. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_vitest.py +0 -0
  410. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_xctest.py +0 -0
  411. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_testpath.py +0 -0
  412. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_version.py +0 -0
  413. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_authentication.py +0 -0
  414. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_edit_distance.py +0 -0
  415. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_fail_fast_mode.py +0 -0
  416. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_file_name_pattern.py +0 -0
  417. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_git_log_parser.py +0 -0
  418. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_glob.py +0 -0
  419. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_gzipgen.py +0 -0
  420. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_http_client.py +0 -0
  421. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_link.py +0 -0
  422. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_logger.py +0 -0
  423. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_typer.py +0 -0
  424. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_typer_types.py +0 -0
  425. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tools/README.md +0 -0
  426. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tools/generate_reference.py +0 -0
  427. {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/uv.lock +0 -0
@@ -0,0 +1,4 @@
1
+ # Git files
2
+ .git
3
+ .gitignore
4
+ .gitattributes
@@ -0,0 +1,2 @@
1
+ - In Java code, use JUnit 4 & Google truth. Test needs to be added to AllTests.java or else it won't run.
2
+ - See README.md & CONTRIBUTING.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-tests-cli
3
- Version: 2.3.2
3
+ Version: 2.4.1
4
4
  Summary: Smart Tests CLI
5
5
  Author-email: CloudBees <support@cloudbees.com>
6
6
  License: Apache Software License v2
@@ -53,6 +53,9 @@ source .venv/bin/activate
53
53
  uv run <command>
54
54
  ```
55
55
 
56
+ From this shell, run `pip install -e .` to create `launchable` wrapper script from the workspace.
57
+ This is useful to test the CLI with real/local server.
58
+
56
59
  ## Run tests cli
57
60
 
58
61
  ```shell
@@ -30,6 +30,9 @@ source .venv/bin/activate
30
30
  uv run <command>
31
31
  ```
32
32
 
33
+ From this shell, run `pip install -e .` to create `launchable` wrapper script from the workspace.
34
+ This is useful to test the CLI with real/local server.
35
+
33
36
  ## Run tests cli
34
37
 
35
38
  ```shell
@@ -8,6 +8,7 @@ from smart_tests.app import Application
8
8
  from smart_tests.args4p.command import Group
9
9
  from smart_tests.commands.compare import compare
10
10
  from smart_tests.commands.detect_flakes import detect_flakes
11
+ from smart_tests.commands.gate import gate
11
12
  from smart_tests.commands.inspect import inspect
12
13
  from smart_tests.commands.record import record
13
14
  from smart_tests.commands.stats import stats
@@ -23,6 +24,7 @@ cli.add_command(inspect)
23
24
  cli.add_command(stats)
24
25
  cli.add_command(compare)
25
26
  cli.add_command(detect_flakes)
27
+ cli.add_command(gate)
26
28
 
27
29
 
28
30
  def _load_test_runners():
@@ -0,0 +1,70 @@
1
+ import json
2
+ import sys
3
+ from http import HTTPStatus
4
+ from typing import Annotated
5
+
6
+ import click
7
+ from requests import Response
8
+ from tabulate import tabulate
9
+
10
+ from smart_tests.utils.tracking import TrackingClient
11
+ from .. import args4p
12
+ from ..app import Application
13
+ from ..args4p import typer
14
+
15
+ from ..utils.commands import Command
16
+ from ..utils.session import SessionId
17
+ from ..utils.smart_tests_client import SmartTestsClient
18
+
19
+
20
+ @args4p.command()
21
+ def gate(app_instance: Application,
22
+ session: Annotated[SessionId, SessionId.as_option()],
23
+ is_json_format: Annotated[bool, typer.Option(
24
+ "--json",
25
+ help="display JSON format")] = False):
26
+ tracking_client = TrackingClient(Command.GATE, app=app_instance)
27
+ client = SmartTestsClient(tracking_client=tracking_client, app=app_instance)
28
+ try:
29
+ res: Response = client.request("get", "gate", params={"session-id": session.test_part})
30
+
31
+ if res.status_code == HTTPStatus.NOT_FOUND:
32
+ click.echo(click.style(
33
+ "Gate data currently not available for this workspace.", 'yellow'), err=True)
34
+ sys.exit()
35
+
36
+ res.raise_for_status()
37
+
38
+ res_json = res.json()
39
+
40
+ if is_json_format:
41
+ display_as_json(res)
42
+ else:
43
+ display_as_table(res)
44
+
45
+ # Exit with failure status if gate failed
46
+ if res_json.get('status') == 'FAILED':
47
+ sys.exit(1)
48
+
49
+ except Exception as e:
50
+ client.print_exception_and_recover(e, "Warning: failed to fetch gate status")
51
+
52
+
53
+ def display_as_json(res: Response):
54
+ res_json = res.json()
55
+ click.echo(json.dumps(res_json, indent=2))
56
+
57
+
58
+ def display_as_table(res: Response):
59
+ headers = ["Status", "Quarantined (Ignored)", "Actionable Failures"]
60
+ res_json = res.json()
61
+
62
+ status_icon = "PASSED" if res_json.get('status') == 'PASSED' else "FAILED"
63
+
64
+ rows = [[
65
+ status_icon,
66
+ res_json.get('quarantinedFailures', 0),
67
+ res_json.get('actionableFailures', 0)
68
+ ]]
69
+
70
+ click.echo(tabulate(rows, headers, tablefmt="github"))
@@ -0,0 +1,151 @@
1
+ import fnmatch
2
+ import tarfile
3
+ import zipfile
4
+ from io import BytesIO
5
+ from typing import Annotated, List, Tuple
6
+
7
+ import click
8
+
9
+ import smart_tests.args4p.typer as typer
10
+ from smart_tests.utils.session import SessionId, get_session
11
+
12
+ from ... import args4p
13
+ from ...app import Application
14
+ from ...utils.fail_fast_mode import warn_and_exit_if_fail_fast_mode
15
+ from ...utils.smart_tests_client import SmartTestsClient
16
+ from tabulate import tabulate
17
+
18
+
19
+ class AttachmentStatus:
20
+ SUCCESS = "✓ Recorded successfully"
21
+ FAILED = "⚠ Failed to record"
22
+ SKIPPED_NON_TEXT = "⚠ Skipped: not a valid text file"
23
+
24
+
25
+ @args4p.command(help="Record attachment information")
26
+ def attachment(
27
+ app: Application,
28
+ session: Annotated[SessionId, SessionId.as_option()],
29
+ attachments: Annotated[List[str], typer.Argument(
30
+ multiple=True,
31
+ help="Attachment files to upload"
32
+ )],
33
+ include_patterns: Annotated[List[str], typer.Option(
34
+ '--include',
35
+ help='Include only files matching pattern (e.g., "*.log"). Can be specified multiple times.',
36
+ type=str,
37
+ multiple=True,
38
+ )] = []
39
+ ):
40
+ client = SmartTestsClient(app=app)
41
+ summary_rows = []
42
+ try:
43
+ # Note: Call get_session method to check test session exists
44
+ _ = get_session(session, client)
45
+ for a in attachments:
46
+ # If zip file
47
+ if zipfile.is_zipfile(a):
48
+ with zipfile.ZipFile(a, 'r') as zip_file:
49
+ for zip_info in zip_file.infolist():
50
+ if zip_info.is_dir():
51
+ continue
52
+
53
+ if not matches_include_patterns(zip_info.filename, include_patterns):
54
+ continue
55
+
56
+ file_content = zip_file.read(zip_info.filename)
57
+
58
+ if not valid_utf8_file(file_content):
59
+ summary_rows.append(
60
+ [zip_info.filename, AttachmentStatus.SKIPPED_NON_TEXT])
61
+ continue
62
+
63
+ status = post_attachment(
64
+ client, session, file_content, zip_info.filename)
65
+ summary_rows.append([zip_info.filename, status])
66
+
67
+ # If tar file (tar, tar.gz, tar.bz2, tgz, etc.)
68
+ elif tarfile.is_tarfile(a):
69
+ with tarfile.open(a, 'r:*') as tar_file:
70
+ for tar_info in tar_file:
71
+ if tar_info.isdir():
72
+ continue
73
+
74
+ if not matches_include_patterns(tar_info.name, include_patterns):
75
+ continue
76
+
77
+ file_obj = tar_file.extractfile(tar_info)
78
+ if file_obj is None:
79
+ continue
80
+
81
+ file_content = file_obj.read()
82
+
83
+ if not valid_utf8_file(file_content):
84
+ summary_rows.append(
85
+ [tar_info.name, AttachmentStatus.SKIPPED_NON_TEXT])
86
+ continue
87
+
88
+ status = post_attachment(
89
+ client, session, file_content, tar_info.name)
90
+ summary_rows.append([tar_info.name, status])
91
+
92
+ else:
93
+ with open(a, mode='rb') as f:
94
+ file_content = f.read()
95
+
96
+ if not valid_utf8_file(file_content):
97
+ summary_rows.append(
98
+ [a, AttachmentStatus.SKIPPED_NON_TEXT])
99
+ continue
100
+
101
+ status = post_attachment(client, session, file_content, a)
102
+ summary_rows.append([a, status])
103
+ except Exception as e:
104
+ client.print_exception_and_recover(e)
105
+
106
+ display_summary_as_table(summary_rows)
107
+
108
+
109
+ def matches_include_patterns(filename: str, include_patterns: List[str]) -> bool:
110
+ """
111
+ Check if a file should be included based on the include patterns.
112
+ If no patterns are specified, all files are included.
113
+ """
114
+ if not include_patterns:
115
+ return True
116
+
117
+ for pattern in include_patterns:
118
+ if fnmatch.fnmatch(filename, pattern):
119
+ return True
120
+
121
+ return False
122
+
123
+
124
+ def valid_utf8_file(file_content: bytes) -> bool:
125
+ # Check for null bytes (binary files)
126
+ if b'\x00' in file_content:
127
+ return False
128
+
129
+ try:
130
+ file_content.decode('utf-8')
131
+ return True
132
+ except UnicodeDecodeError:
133
+ return False
134
+
135
+
136
+ def post_attachment(client: SmartTestsClient, session: SessionId, file_content: bytes, filename: str) -> str:
137
+ try:
138
+ res = client.request(
139
+ "post", session.subpath("attachment"), compress=True, payload=BytesIO(file_content),
140
+ additional_headers={"Content-Disposition": "attachment;filename=\"{}\"".format(filename)})
141
+ res.raise_for_status()
142
+ return AttachmentStatus.SUCCESS
143
+ except Exception as e:
144
+ click.echo("Failed to upload {}: {}".format(
145
+ filename, str(e)), err=True)
146
+ return AttachmentStatus.FAILED
147
+
148
+
149
+ def display_summary_as_table(rows):
150
+ headers = ["File", "Status"]
151
+ click.echo(tabulate(rows, headers, tablefmt="github"))
@@ -101,6 +101,9 @@ def exec_jar(name: str, source: str, max_days: int, app: Application, is_collect
101
101
  # using subprocess.check_out with shell=False and a list of command to prevent vulnerability
102
102
  # https://knowledge-base.secureflag.com/vulnerabilities/code_injection/os_command_injection_python.html
103
103
  command = [java]
104
+ debug_opts = os.getenv("LAUNCHABLE_JAVA_DEBUG")
105
+ if debug_opts:
106
+ command.extend(debug_opts.split())
104
107
  command.extend(_build_proxy_option(os.getenv("HTTPS_PROXY")))
105
108
  command.extend([
106
109
  "-jar",
@@ -115,6 +115,10 @@ class Subset(TestPathWriter):
115
115
  help="Subsetting by confidence from 0% to 100%",
116
116
  metavar="PERCENTAGE"
117
117
  )] = None,
118
+ similarity: Annotated[float | None, typer.Option(
119
+ type=floatType(min=0.0, max=1.0),
120
+ help='subsetting by similarity from 0 to 1.0. Tests scoring above this value are included in the subset.',
121
+ )] = None,
118
122
  goal_spec: Annotated[str | None, typer.Option(
119
123
  help="Subsetting by programmatic goal definition",
120
124
  metavar="GOAL_SPEC"
@@ -262,6 +266,7 @@ class Subset(TestPathWriter):
262
266
  self.target = target
263
267
  self.time = time
264
268
  self.confidence = confidence
269
+ self.similarity = similarity
265
270
  self.goal_spec = goal_spec
266
271
  self.base_path = base_path
267
272
  self.base_path_explicitly_set = (base_path is not None)
@@ -413,6 +418,11 @@ class Subset(TestPathWriter):
413
418
  "type": "subset-by-goal-spec",
414
419
  "goal": self.goal_spec
415
420
  }
421
+ elif self.similarity is not None:
422
+ payload["goal"] = {
423
+ "type": "subset-by-similarity",
424
+ "similarity": self.similarity
425
+ }
416
426
  else:
417
427
  payload['useServerSideOptimizationTarget'] = True
418
428
 
@@ -89,7 +89,6 @@ def record_tests(
89
89
  if ts.findtext('system-out', '') == "" and ts.findtext('system-err', '') == "":
90
90
  logfile = path.join(path.dirname(report), 'test.log')
91
91
  if path.exists(logfile):
92
- print("Found {}".format(logfile))
93
92
  for x in ts.findall('system-out'):
94
93
  ts.remove(x)
95
94
  with open(logfile, 'r', encoding='utf-8', errors='replace') as log_file:
@@ -1,16 +1,18 @@
1
1
  import glob
2
2
  import os
3
- from typing import Annotated, Dict, List
3
+ import re
4
+ from typing import Annotated
5
+ from typing import Dict, List, Tuple
4
6
 
5
7
  import click
6
8
 
7
9
  import smart_tests.args4p.typer as typer
8
10
  from smart_tests.utils import glob as uglob
9
11
  from smart_tests.utils.java import junit5_nested_class_path_builder
10
-
12
+ from . import smart_tests
13
+ from ..args4p.exceptions import BadCmdLineException
11
14
  from ..commands.record.tests import RecordTests
12
15
  from ..commands.subset import Subset
13
- from . import smart_tests
14
16
 
15
17
  # Surefire has the default inclusion pattern
16
18
  # https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#includes
@@ -66,8 +68,21 @@ def subset(
66
68
  help="Scan testCompile/default-testCompile/createdFiles.lst for *.lst files generated by `mvn compile` and "
67
69
  "use them as test inputs."
68
70
  )] = False,
71
+ exclude_rules: Annotated[List[str], typer.Option(
72
+ "--exclude",
73
+ multiple=True,
74
+ help="Exclude tests matching the given Python regular expression pattern. Can be specified multiple times."
75
+ )] = [],
69
76
  ):
70
77
 
78
+ # Compile exclude rules
79
+ compiled_exclude_rules = []
80
+ for rule in exclude_rules:
81
+ try:
82
+ compiled_exclude_rules.append(re.compile(rule))
83
+ except re.error as e:
84
+ raise BadCmdLineException("Invalid regular expression '{}': {}".format(rule, e))
85
+
71
86
  def file2class_test_path(f: str) -> List[Dict[str, str]]:
72
87
  # remove extension
73
88
  f, _ = os.path.splitext(f)
@@ -78,7 +93,13 @@ def subset(
78
93
 
79
94
  def file2test(f: str) -> List | None:
80
95
  if is_file(f):
81
- return file2class_test_path(f)
96
+ test_path = file2class_test_path(f)
97
+
98
+ for pattern in compiled_exclude_rules:
99
+ if pattern.search(test_path[0]["name"]):
100
+ return None
101
+
102
+ return test_path
82
103
  else:
83
104
  return None
84
105
 
@@ -169,16 +169,20 @@ class CommonRecordTestImpls:
169
169
  source_roots: Annotated[list[str], typer.Argument(
170
170
  multiple=True,
171
171
  help="Source directories containing test report files"
172
- )]):
172
+ )],
173
+ file_path_attribute: Annotated[list[str], typer.Option(
174
+ "--file-path-attribute",
175
+ multiple=True,
176
+ help="Attributes to look for file paths in test reports (e.g., name, classname, file, filepath)"
177
+ )] = ["file", "filepath"]):
173
178
  def path_builder(
174
179
  case: TestCase, suite: TestSuite, report_file: str
175
180
  ) -> TestPath:
176
181
  def find_filename():
177
182
  """look for what looks like file names from test reports"""
178
183
  for e in [case, suite]:
179
- for a in ["file", "filepath"]:
180
- filepath = e._elem.attrib.get(a)
181
- if filepath:
184
+ for a in file_path_attribute:
185
+ if filepath := e._elem.attrib.get(a):
182
186
  return filepath
183
187
  return None # failing to find a test name
184
188
 
@@ -188,9 +192,9 @@ class CommonRecordTestImpls:
188
192
 
189
193
  # default test path in `subset` expects to have this file name
190
194
  test_path = [client.make_file_path_component(filepath)]
191
- if suite.name:
195
+ if suite.name and suite.name != filepath:
192
196
  test_path.append({"type": "testsuite", "name": suite.name})
193
- if case.name:
197
+ if case.name and case.name != filepath:
194
198
  test_path.append({"type": "testcase", "name": case.name})
195
199
  return test_path
196
200
 
@@ -9,6 +9,7 @@ class Command(Enum):
9
9
  SUBSET = 'SUBSET'
10
10
  COMMIT = 'COMMIT'
11
11
  DETECT_FLAKE = 'DETECT_FLAKE'
12
+ GATE = 'GATE'
12
13
 
13
14
  def display_name(self):
14
15
  return self.value.lower().replace('_', ' ')
@@ -30,9 +30,23 @@ class SessionId:
30
30
  '''This is the method in which we parse the user input, so be defensive'''
31
31
  if id.startswith('@'):
32
32
  file_path = id[1:]
33
+ # Earlier versions of PowerShell write Unicode BOM when redirecting output to a file.
34
+ # https://github.com/PowerShell/PowerShell/issues/8592
35
+ # Since we tell people to redirect `record session` output to a file, here we can
36
+ # encounter such files. Here's the scheme to cope with this.
37
+ #
38
+ # First we try utf-8-sig, which handles UTF-8 BOM correctly.
39
+ # our session ID only uses ASCII chars, so unless the writer used non ascii compatible encoding
40
+ # (e.g., EBCDIC but those are very very unlikely), this will read the file correctly.
41
+ # If the writer used UTF-16 (e.g., legacy PowerShell on Windows), we'll get a decode error, and
42
+ # then we try UTF-16, which handles BOM correctly.
33
43
  try:
34
- with open(file_path, 'r') as f:
35
- id = f.read().strip()
44
+ try:
45
+ with open(file_path, 'r', encoding='utf-8-sig') as f:
46
+ id = f.read().strip()
47
+ except UnicodeDecodeError:
48
+ with open(file_path, 'r', encoding='utf-16') as f:
49
+ id = f.read().strip()
36
50
  except FileNotFoundError:
37
51
  raise BadCmdLineException(f"Session file '{file_path}' not found.")
38
52
  except IOError as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-tests-cli
3
- Version: 2.3.2
3
+ Version: 2.4.1
4
4
  Summary: Smart Tests CLI
5
5
  Author-email: CloudBees <support@cloudbees.com>
6
6
  License: Apache Software License v2
@@ -53,6 +53,9 @@ source .venv/bin/activate
53
53
  uv run <command>
54
54
  ```
55
55
 
56
+ From this shell, run `pip install -e .` to create `launchable` wrapper script from the workspace.
57
+ This is useful to test the CLI with real/local server.
58
+
56
59
  ## Run tests cli
57
60
 
58
61
  ```shell
@@ -1,10 +1,12 @@
1
1
  .bazelrc
2
2
  .bazelversion
3
+ .dockerignore
3
4
  .editorconfig
4
5
  .gitignore
5
6
  .pre-commit-config.yaml
6
7
  .python-version
7
8
  .tagpr
9
+ CLAUDE.md
8
10
  CONTRIBUTING.md
9
11
  Dockerfile
10
12
  LICENSE.txt
@@ -38,6 +40,7 @@ smart_tests/args4p/converters/__init__.py
38
40
  smart_tests/args4p/typer/__init__.py
39
41
  smart_tests/commands/__init__.py
40
42
  smart_tests/commands/detect_flakes.py
43
+ smart_tests/commands/gate.py
41
44
  smart_tests/commands/subset.py
42
45
  smart_tests/commands/test_path_writer.py
43
46
  smart_tests/commands/verify.py
@@ -124,9 +127,12 @@ src/BUILD
124
127
  src/maven_install.json
125
128
  src/main/java/com/launchableinc/ingest/commits/Authenticator.java
126
129
  src/main/java/com/launchableinc/ingest/commits/BUILD
130
+ src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java
131
+ src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java
127
132
  src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java
128
133
  src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java
129
134
  src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java
135
+ src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java
130
136
  src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java
131
137
  src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java
132
138
  src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java
@@ -134,22 +140,27 @@ src/main/java/com/launchableinc/ingest/commits/GitFile.java
134
140
  src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java
135
141
  src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java
136
142
  src/main/java/com/launchableinc/ingest/commits/IOConsumer.java
143
+ src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java
144
+ src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java
137
145
  src/main/java/com/launchableinc/ingest/commits/JSCommit.java
138
146
  src/main/java/com/launchableinc/ingest/commits/JSFileChange.java
147
+ src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java
139
148
  src/main/java/com/launchableinc/ingest/commits/Main.java
140
149
  src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java
141
- src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java
150
+ src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java
142
151
  src/main/java/com/launchableinc/ingest/commits/SSLBypass.java
143
152
  src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java
144
153
  src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java
145
154
  src/main/java/com/launchableinc/ingest/commits/VirtualFile.java
146
155
  src/test/java/com/launchableinc/ingest/commits/AllTests.java
147
156
  src/test/java/com/launchableinc/ingest/commits/BUILD
157
+ src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java
148
158
  src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java
159
+ src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java
149
160
  src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java
150
161
  src/test/java/com/launchableinc/ingest/commits/MainTest.java
151
162
  src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java
152
- src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java
163
+ src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java
153
164
  src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java
154
165
  src/test/java/com/launchableinc/ingest/commits/java8-compat.sh
155
166
  test-runner/__main__.py
@@ -173,6 +184,7 @@ tests/args4p/converters/test_converters.py
173
184
  tests/commands/__init__.py
174
185
  tests/commands/test_api_error.py
175
186
  tests/commands/test_detect_flakes.py
187
+ tests/commands/test_gate.py
176
188
  tests/commands/test_subset.py
177
189
  tests/commands/test_verify.py
178
190
  tests/commands/compare/__init__.py
@@ -253,6 +265,10 @@ tests/data/cypress/subset_result.json
253
265
  tests/data/cypress/test-result.xml
254
266
  tests/data/dotnet/record_test_result.json
255
267
  tests/data/dotnet/test-result.xml
268
+ tests/data/file/record_test_result.json
269
+ tests/data/file/record_test_result_custom_attribute.json
270
+ tests/data/file/result.xml
271
+ tests/data/file/result_custom_attribute.xml
256
272
  tests/data/flutter/record_test_result.json
257
273
  tests/data/flutter/report.json
258
274
  tests/data/git_log_ingest/sample.out
@@ -293,8 +309,10 @@ tests/data/maven/subset_by_confidence_result.json
293
309
  tests/data/maven/subset_from_file_result.json
294
310
  tests/data/maven/subset_result.json
295
311
  tests/data/maven/subset_scan_test_compile_lst_result.json
312
+ tests/data/maven/subset_with_exclude_rules_result.json
296
313
  tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java
297
314
  tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java
315
+ tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java
298
316
  tests/data/maven/reports/TEST-1.xml
299
317
  tests/data/maven/reports/TEST-2.xml
300
318
  tests/data/maven/reports/TEST-nested.xml
@@ -366,6 +384,7 @@ tests/test_runners/test_cts.py
366
384
  tests/test_runners/test_cucumber.py
367
385
  tests/test_runners/test_cypress.py
368
386
  tests/test_runners/test_dotnet.py
387
+ tests/test_runners/test_file.py
369
388
  tests/test_runners/test_go_test.py
370
389
  tests/test_runners/test_googletest.py
371
390
  tests/test_runners/test_gradle.py
@@ -0,0 +1,8 @@
1
+ package com.launchableinc.ingest.commits;
2
+
3
+ public enum BackgroundWorkStatus {
4
+ IN_PROGRESS,
5
+ SUCCEEDED,
6
+ FAILED,
7
+ ABANDONED
8
+ }
@@ -0,0 +1,80 @@
1
+ package com.launchableinc.ingest.commits;
2
+
3
+ import java.util.List;
4
+ import java.util.concurrent.AbstractExecutorService;
5
+ import java.util.concurrent.ExecutorService;
6
+ import java.util.concurrent.Executors;
7
+ import java.util.concurrent.RejectedExecutionException;
8
+ import java.util.concurrent.Semaphore;
9
+ import java.util.concurrent.TimeUnit;
10
+ import java.util.concurrent.atomic.AtomicInteger;
11
+
12
+ /**
13
+ * {@link ExecutorService} decorator that limits the number of concurrent tasks,
14
+ * and make the caller block when the limit is reached.
15
+ */
16
+ class BoundedExecutorService extends AbstractExecutorService {
17
+ private final ExecutorService delegate;
18
+ private final Semaphore semaphore;
19
+ /** # of threads that are blocked trying to {@link #execute(Runnable)}. Just for diagnostics. */
20
+ private final AtomicInteger blockCount = new AtomicInteger(0);
21
+
22
+ BoundedExecutorService(int limit) {
23
+ this(Executors.newFixedThreadPool(limit), limit);
24
+ }
25
+
26
+ BoundedExecutorService(ExecutorService delegate, int limit) {
27
+ this.delegate = delegate;
28
+ this.semaphore = new Semaphore(limit);
29
+ }
30
+
31
+ @Override
32
+ public void execute(Runnable command) {
33
+ try {
34
+ blockCount.incrementAndGet();
35
+ semaphore.acquire();
36
+ } catch (InterruptedException e) {
37
+ throw new RejectedExecutionException(e);
38
+ } finally {
39
+ blockCount.decrementAndGet();
40
+ }
41
+
42
+ try {
43
+ delegate.execute(() -> {
44
+ try {
45
+ command.run();
46
+ } finally {
47
+ semaphore.release();
48
+ }
49
+ });
50
+ } catch (RejectedExecutionException e) {
51
+ semaphore.release();
52
+ throw e;
53
+ }
54
+ }
55
+
56
+ @Override
57
+ public void shutdown() {
58
+ delegate.shutdown();
59
+ }
60
+
61
+ @Override
62
+ public List<Runnable> shutdownNow() {
63
+ return delegate.shutdownNow();
64
+ }
65
+
66
+ @Override
67
+ public boolean isShutdown() {
68
+ return delegate.isShutdown();
69
+ }
70
+
71
+ @Override
72
+ public boolean isTerminated() {
73
+ return delegate.isTerminated();
74
+ }
75
+
76
+ @Override
77
+ public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
78
+ return delegate.awaitTermination(timeout, unit);
79
+ }
80
+ }