smart-tests-cli 2.4.2__tar.gz → 2.5.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 (422) hide show
  1. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.tagpr +1 -0
  2. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/PKG-INFO +1 -1
  3. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/attachment.py +74 -12
  4. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/subset.py +1 -1
  5. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/maven.py +14 -3
  6. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/pytest.py +36 -3
  7. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/PKG-INFO +1 -1
  8. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/compare/test_subsets.py +13 -14
  9. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_attachment.py +122 -8
  10. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.bazelrc +0 -0
  11. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.bazelversion +0 -0
  12. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.dockerignore +0 -0
  13. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.editorconfig +0 -0
  14. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/release.yml +0 -0
  15. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/workflows/bazel-test.yml +0 -0
  16. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/workflows/e2e.yml +0 -0
  17. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/workflows/publish.yml +0 -0
  18. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/workflows/test.yml +0 -0
  19. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.github/workflows/update_maven_install_json.yml +0 -0
  20. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.gitignore +0 -0
  21. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.pre-commit-config.yaml +0 -0
  22. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/.python-version +0 -0
  23. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/CLAUDE.md +0 -0
  24. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/CONTRIBUTING.md +0 -0
  25. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/Dockerfile +0 -0
  26. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/LICENSE.txt +0 -0
  27. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/README.md +0 -0
  28. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/WORKSPACE +0 -0
  29. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/build-java.sh +0 -0
  30. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/pyproject.toml +0 -0
  31. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/renovate.json +0 -0
  32. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/setup.cfg +0 -0
  33. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/setup.py +0 -0
  34. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/__init__.py +0 -0
  35. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/__main__.py +0 -0
  36. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/app.py +0 -0
  37. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/README.md +0 -0
  38. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/__init__.py +0 -0
  39. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/argument.py +0 -0
  40. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/command.py +0 -0
  41. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/converters/__init__.py +0 -0
  42. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/decorators.py +0 -0
  43. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/exceptions.py +0 -0
  44. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/option.py +0 -0
  45. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/parameter.py +0 -0
  46. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/args4p/typer/__init__.py +0 -0
  47. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/__init__.py +0 -0
  48. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/compare/__init__.py +0 -0
  49. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/compare/subsets.py +0 -0
  50. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/detect_flakes.py +0 -0
  51. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/gate.py +0 -0
  52. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/inspect/__init__.py +0 -0
  53. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/inspect/model.py +0 -0
  54. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/inspect/subset.py +0 -0
  55. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/__init__.py +0 -0
  56. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/build.py +0 -0
  57. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/case_event.py +0 -0
  58. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/commit.py +0 -0
  59. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/session.py +0 -0
  60. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/record/tests.py +0 -0
  61. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/stats/__init__.py +0 -0
  62. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/stats/test_sessions.py +0 -0
  63. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/test_path_writer.py +0 -0
  64. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/commands/verify.py +0 -0
  65. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/jar/exe_deploy.jar +0 -0
  66. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/plugins/__init__.py +0 -0
  67. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/__init__.py +0 -0
  68. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/adb.py +0 -0
  69. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/ant.py +0 -0
  70. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/bazel.py +0 -0
  71. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/behave.py +0 -0
  72. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/codeceptjs.py +0 -0
  73. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/ctest.py +0 -0
  74. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/cts.py +0 -0
  75. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/cucumber.py +0 -0
  76. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/cypress.py +0 -0
  77. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/dotnet.py +0 -0
  78. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/file.py +0 -0
  79. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/flutter.py +0 -0
  80. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/go_test.py +0 -0
  81. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/googletest.py +0 -0
  82. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/gradle.py +0 -0
  83. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/jasmine.py +0 -0
  84. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/jest.py +0 -0
  85. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/karma.py +0 -0
  86. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/minitest.py +0 -0
  87. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/nunit.py +0 -0
  88. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/playwright.py +0 -0
  89. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/prove.py +0 -0
  90. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/raw.py +0 -0
  91. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/robot.py +0 -0
  92. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/rspec.py +0 -0
  93. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/smart_tests.py +0 -0
  94. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/vitest.py +0 -0
  95. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/test_runners/xctest.py +0 -0
  96. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/testpath.py +0 -0
  97. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/__init__.py +0 -0
  98. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/authentication.py +0 -0
  99. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/ci_provider.py +0 -0
  100. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/commands.py +0 -0
  101. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/commit_ingester.py +0 -0
  102. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/common_tz.py +0 -0
  103. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/edit_distance.py +0 -0
  104. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/env_keys.py +0 -0
  105. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/exceptions.py +0 -0
  106. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/fail_fast_mode.py +0 -0
  107. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/file_name_pattern.py +0 -0
  108. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/git_log_parser.py +0 -0
  109. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/glob.py +0 -0
  110. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/gzipgen.py +0 -0
  111. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/http_client.py +0 -0
  112. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/input_snapshot.py +0 -0
  113. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/java.py +0 -0
  114. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/link.py +0 -0
  115. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/logger.py +0 -0
  116. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/no_build.py +0 -0
  117. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/sax.py +0 -0
  118. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/session.py +0 -0
  119. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/smart_tests_client.py +0 -0
  120. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/subprocess.py +0 -0
  121. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/tracking.py +0 -0
  122. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/utils/typer_types.py +0 -0
  123. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests/version.py +0 -0
  124. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/SOURCES.txt +0 -0
  125. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
  126. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/entry_points.txt +0 -0
  127. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/requires.txt +0 -0
  128. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/smart_tests_cli.egg-info/top_level.txt +0 -0
  129. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/BUILD +0 -0
  130. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  131. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
  132. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java +0 -0
  133. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java +0 -0
  134. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +0 -0
  135. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
  136. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +0 -0
  137. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java +0 -0
  138. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  139. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +0 -0
  140. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +0 -0
  141. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +0 -0
  142. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  143. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  144. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
  145. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java +0 -0
  146. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java +0 -0
  147. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  148. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  149. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java +0 -0
  150. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
  151. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  152. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java +0 -0
  153. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  154. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  155. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
  156. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
  157. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/maven_install.json +0 -0
  158. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +0 -0
  159. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  160. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java +0 -0
  161. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +0 -0
  162. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java +0 -0
  163. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +0 -0
  164. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
  165. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
  166. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java +0 -0
  167. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  168. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  169. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/test-runner/__main__.py +0 -0
  170. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/__init__.py +0 -0
  171. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/__init__.py +0 -0
  172. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/converters/__init__.py +0 -0
  173. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/converters/test_converters.py +0 -0
  174. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_badcode.py +0 -0
  175. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_badinput.py +0 -0
  176. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_command.py +0 -0
  177. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_decorators.py +0 -0
  178. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_help.py +0 -0
  179. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_parameter.py +0 -0
  180. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/args4p/test_typer.py +0 -0
  181. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/cli_test_case.py +0 -0
  182. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/__init__.py +0 -0
  183. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/compare/__init__.py +0 -0
  184. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/inspect/test_model.py +0 -0
  185. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/inspect/test_subset.py +0 -0
  186. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/__init__.py +0 -0
  187. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_build.py +0 -0
  188. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_case_event.py +0 -0
  189. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_commit.py +0 -0
  190. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_session.py +0 -0
  191. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/record/test_tests.py +0 -0
  192. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/test_api_error.py +0 -0
  193. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/test_detect_flakes.py +0 -0
  194. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/test_gate.py +0 -0
  195. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/test_subset.py +0 -0
  196. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/commands/test_verify.py +0 -0
  197. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/adb/subset_result.json +0 -0
  198. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
  199. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
  200. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  201. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/record_test_result.json +0 -0
  202. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
  203. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
  204. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/src/com/example/library/Cache.java +0 -0
  205. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
  206. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ant/subset_result.json +0 -0
  207. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  208. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
  209. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  210. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  211. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  212. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  213. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  214. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  215. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  216. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  217. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  218. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  219. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  220. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  221. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  222. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  223. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  224. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  225. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  226. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/build_event.json +0 -0
  227. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/build_event_rest.json +0 -0
  228. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/record_test_result.json +0 -0
  229. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  230. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  231. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/bazel/subset_result.json +0 -0
  232. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/behave/record_test_result.json +0 -0
  233. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/behave/reports/report.xml +0 -0
  234. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/behave/subset_result.json +0 -0
  235. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/broken_xml/broken.xml +0 -0
  236. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/broken_xml/normal.xml +0 -0
  237. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
  238. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/codeceptjs/record_test_result.json +0 -0
  239. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  240. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ctest/ctest_list.json +0 -0
  241. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ctest/record_test_result.json +0 -0
  242. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/ctest/subset_result.json +0 -0
  243. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cts/record_test_result.json +0 -0
  244. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cts/subset_result.json +0 -0
  245. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cts/test_result.xml +0 -0
  246. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/features/foo/bar.feature +0 -0
  247. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  248. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/features/foo-bar.feature +0 -0
  249. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  250. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/record_test_json_result.json +0 -0
  251. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/record_test_result.json +0 -0
  252. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  253. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  254. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  255. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/report/dummy.xml +0 -0
  256. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cucumber/report/result.json +0 -0
  257. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cypress/empty.json +0 -0
  258. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cypress/empty.xml +0 -0
  259. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cypress/record_test_result.json +0 -0
  260. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cypress/subset_result.json +0 -0
  261. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/cypress/test-result.xml +0 -0
  262. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/dotnet/record_test_result.json +0 -0
  263. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/dotnet/test-result.xml +0 -0
  264. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/file/record_test_result.json +0 -0
  265. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/file/record_test_result_custom_attribute.json +0 -0
  266. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/file/result.xml +0 -0
  267. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/file/result_custom_attribute.xml +0 -0
  268. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/flutter/record_test_result.json +0 -0
  269. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/flutter/report.json +0 -0
  270. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/git_log_ingest/sample.out +0 -0
  271. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/go_test/record_test_result.json +0 -0
  272. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  273. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  274. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/go_test/subset_result.json +0 -0
  275. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/fail/output.xml +0 -0
  276. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/fail/record_test_result.json +0 -0
  277. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/output_a.xml +0 -0
  278. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/output_b.xml +0 -0
  279. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/record_test_result.json +0 -0
  280. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/googletest/subset_result.json +0 -0
  281. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
  282. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
  283. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
  284. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/gradle/recursion/expected.json +0 -0
  285. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  286. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jasmine/README.md +0 -0
  287. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
  288. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jasmine/jasmine-test-results.json +0 -0
  289. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jasmine/record_test_result.json +0 -0
  290. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jasmine/subset_payload.json +0 -0
  291. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jest/junit.xml +0 -0
  292. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jest/record_test_result.json +0 -0
  293. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/jest/subset_result.json +0 -0
  294. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/karma/README.md +0 -0
  295. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/karma/record_test_result.json +0 -0
  296. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/karma/sample-report.json +0 -0
  297. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/karma/subset_payload.json +0 -0
  298. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/karma/subset_result.json +0 -0
  299. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/createdFile_1.lst +0 -0
  300. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/createdFile_2.lst +0 -0
  301. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
  302. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
  303. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
  304. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/list.lst +0 -0
  305. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/record_test_result.json +0 -0
  306. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/reports/TEST-1.xml +0 -0
  307. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/reports/TEST-2.xml +0 -0
  308. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/reports/TEST-nested.xml +0 -0
  309. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/reports/dummy.xml +0 -0
  310. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
  311. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_by_confidence_result.json +0 -0
  312. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_from_file_result.json +0 -0
  313. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_result.json +0 -0
  314. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
  315. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/maven/subset_with_exclude_rules_result.json +0 -0
  316. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  317. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  318. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  319. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  320. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/TEST-UserTest.xml +0 -0
  321. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/record_test_result.json +0 -0
  322. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/record_test_result_chunk1.json +0 -0
  323. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/record_test_result_chunk2.json +0 -0
  324. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/subset_result.json +0 -0
  325. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/minitest/test/example_test.rb +0 -0
  326. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/list.xml +0 -0
  327. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  328. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  329. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/output-linux.xml +0 -0
  330. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/output-windows.xml +0 -0
  331. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/record_test_result-linux.json +0 -0
  332. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/record_test_result-windows.json +0 -0
  333. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/src/.gitignore +0 -0
  334. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/src/Program.cs +0 -0
  335. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/src/README.md +0 -0
  336. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/src/Test.cs +0 -0
  337. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/src/calc.csproj +0 -0
  338. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/nunit/subset_result.json +0 -0
  339. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/playwright/record_test_result.json +0 -0
  340. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/playwright/record_test_result_with_json.json +0 -0
  341. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/playwright/report.json +0 -0
  342. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/playwright/report.xml +0 -0
  343. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/prove/record_test_result.json +0 -0
  344. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/prove/report.xml +0 -0
  345. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/pytest.ini +0 -0
  346. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/record_test_result.json +0 -0
  347. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/record_test_result_json.json +0 -0
  348. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/report.json +0 -0
  349. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/report.xml +0 -0
  350. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/subset_result.json +0 -0
  351. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/conftest.py +0 -0
  352. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/fooo/__init__.py +0 -0
  353. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  354. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  355. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/funcs3_test.py +0 -0
  356. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/test_funcs1.py +0 -0
  357. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/pytest/tests/test_funcs2.py +0 -0
  358. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/dryrun.xml +0 -0
  359. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/output.xml +0 -0
  360. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  361. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/record_test_result.json +0 -0
  362. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/single-output.xml +0 -0
  363. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/robot/subset_result.json +0 -0
  364. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/rspec/record_test_result.json +0 -0
  365. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/rspec/rspec.xml +0 -0
  366. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/vitest/record_test_result.json +0 -0
  367. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/vitest/report.xml +0 -0
  368. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/xctest/junit.xml +0 -0
  369. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/xctest/record_test_result.json +0 -0
  370. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/data/xctest/subset_result.json +0 -0
  371. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/helper.py +0 -0
  372. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/plugins/foo.py +0 -0
  373. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_cli_test_case.py +0 -0
  374. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_plugin.py +0 -0
  375. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/__init__.py +0 -0
  376. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_adb.py +0 -0
  377. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_ant.py +0 -0
  378. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_bazel.py +0 -0
  379. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_behave.py +0 -0
  380. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_codeceptjs.py +0 -0
  381. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_ctest.py +0 -0
  382. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_cts.py +0 -0
  383. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_cucumber.py +0 -0
  384. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_cypress.py +0 -0
  385. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_dotnet.py +0 -0
  386. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_file.py +0 -0
  387. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_go_test.py +0 -0
  388. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_googletest.py +0 -0
  389. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_gradle.py +0 -0
  390. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_jasmine.py +0 -0
  391. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_jest.py +0 -0
  392. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_karma.py +0 -0
  393. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_maven.py +0 -0
  394. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_minitest.py +0 -0
  395. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_nunit.py +0 -0
  396. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_playwright.py +0 -0
  397. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_prove.py +0 -0
  398. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_pytest.py +0 -0
  399. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_raw.py +0 -0
  400. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_robot.py +0 -0
  401. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_rspec.py +0 -0
  402. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_vitest.py +0 -0
  403. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_runners/test_xctest.py +0 -0
  404. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_testpath.py +0 -0
  405. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/test_version.py +0 -0
  406. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/__init__.py +0 -0
  407. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_authentication.py +0 -0
  408. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_edit_distance.py +0 -0
  409. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_fail_fast_mode.py +0 -0
  410. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_file_name_pattern.py +0 -0
  411. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_git_log_parser.py +0 -0
  412. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_glob.py +0 -0
  413. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_gzipgen.py +0 -0
  414. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_http_client.py +0 -0
  415. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_link.py +0 -0
  416. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_logger.py +0 -0
  417. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_session.py +0 -0
  418. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_typer.py +0 -0
  419. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tests/utils/test_typer_types.py +0 -0
  420. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tools/README.md +0 -0
  421. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/tools/generate_reference.py +0 -0
  422. {smart_tests_cli-2.4.2 → smart_tests_cli-2.5.0}/uv.lock +0 -0
@@ -41,3 +41,4 @@
41
41
  releaseBranch = main
42
42
  versionFile = -
43
43
  changelog = false
44
+ fixedMajorVersion = v2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-tests-cli
3
- Version: 2.4.2
3
+ Version: 2.5.0
4
4
  Summary: Smart Tests CLI
5
5
  Author-email: CloudBees <support@cloudbees.com>
6
6
  License: Apache Software License v2
@@ -1,25 +1,26 @@
1
1
  import fnmatch
2
+ import os
2
3
  import tarfile
3
4
  import zipfile
4
5
  from io import BytesIO
5
- from typing import Annotated, List, Tuple
6
+ from typing import Annotated, List, Optional, Set, Tuple
6
7
 
7
8
  import click
9
+ from tabulate import tabulate
8
10
 
9
11
  import smart_tests.args4p.typer as typer
10
12
  from smart_tests.utils.session import SessionId, get_session
11
13
 
12
14
  from ... import args4p
13
15
  from ...app import Application
14
- from ...utils.fail_fast_mode import warn_and_exit_if_fail_fast_mode
15
16
  from ...utils.smart_tests_client import SmartTestsClient
16
- from tabulate import tabulate
17
17
 
18
18
 
19
19
  class AttachmentStatus:
20
20
  SUCCESS = "✓ Recorded successfully"
21
21
  FAILED = "⚠ Failed to record"
22
22
  SKIPPED_NON_TEXT = "⚠ Skipped: not a valid text file"
23
+ SKIPPED_DUPLICATE = "⚠ Skipped: duplicate"
23
24
 
24
25
 
25
26
  @args4p.command(help="Record attachment information")
@@ -39,6 +40,8 @@ def attachment(
39
40
  ):
40
41
  client = SmartTestsClient(app=app)
41
42
  summary_rows = []
43
+ used_filenames: Set[str] = set()
44
+
42
45
  try:
43
46
  # Note: Call get_session method to check test session exists
44
47
  _ = get_session(session, client)
@@ -50,7 +53,7 @@ def attachment(
50
53
  if zip_info.is_dir():
51
54
  continue
52
55
 
53
- if not matches_include_patterns(zip_info.filename, include_patterns):
56
+ if not matches_include_patterns(zip_info.filename, tuple(include_patterns)):
54
57
  continue
55
58
 
56
59
  file_content = zip_file.read(zip_info.filename)
@@ -60,9 +63,15 @@ def attachment(
60
63
  [zip_info.filename, AttachmentStatus.SKIPPED_NON_TEXT])
61
64
  continue
62
65
 
66
+ file_name = get_unique_filename(zip_info.filename, used_filenames)
67
+ if not file_name:
68
+ summary_rows.append(
69
+ [zip_info.filename, AttachmentStatus.SKIPPED_DUPLICATE])
70
+ continue
71
+
63
72
  status = post_attachment(
64
- client, session, file_content, zip_info.filename)
65
- summary_rows.append([zip_info.filename, status])
73
+ client, session, file_content, file_name)
74
+ summary_rows.append([file_name, status])
66
75
 
67
76
  # If tar file (tar, tar.gz, tar.bz2, tgz, etc.)
68
77
  elif tarfile.is_tarfile(a):
@@ -71,7 +80,7 @@ def attachment(
71
80
  if tar_info.isdir():
72
81
  continue
73
82
 
74
- if not matches_include_patterns(tar_info.name, include_patterns):
83
+ if not matches_include_patterns(tar_info.name, tuple(include_patterns)):
75
84
  continue
76
85
 
77
86
  file_obj = tar_file.extractfile(tar_info)
@@ -85,9 +94,15 @@ def attachment(
85
94
  [tar_info.name, AttachmentStatus.SKIPPED_NON_TEXT])
86
95
  continue
87
96
 
97
+ file_name = get_unique_filename(tar_info.name, used_filenames)
98
+ if not file_name:
99
+ summary_rows.append(
100
+ [tar_info.name, AttachmentStatus.SKIPPED_DUPLICATE])
101
+ continue
102
+
88
103
  status = post_attachment(
89
- client, session, file_content, tar_info.name)
90
- summary_rows.append([tar_info.name, status])
104
+ client, session, file_content, file_name)
105
+ summary_rows.append([file_name, status])
91
106
 
92
107
  else:
93
108
  with open(a, mode='rb') as f:
@@ -98,15 +113,55 @@ def attachment(
98
113
  [a, AttachmentStatus.SKIPPED_NON_TEXT])
99
114
  continue
100
115
 
101
- status = post_attachment(client, session, file_content, a)
102
- summary_rows.append([a, status])
116
+ file_name = get_unique_filename(a, used_filenames)
117
+ if not file_name:
118
+ summary_rows.append(
119
+ [a, AttachmentStatus.SKIPPED_DUPLICATE])
120
+ continue
121
+
122
+ status = post_attachment(client, session, file_content, file_name)
123
+ summary_rows.append([file_name, status])
124
+
103
125
  except Exception as e:
104
126
  client.print_exception_and_recover(e)
105
127
 
106
128
  display_summary_as_table(summary_rows)
107
129
 
108
130
 
109
- def matches_include_patterns(filename: str, include_patterns: List[str]) -> bool:
131
+ def get_unique_filename(filepath: str, used_filenames: Set[str]) -> Optional[str]:
132
+ """
133
+ Get a unique filename by extracting the basename and prepending parent folders if needed.
134
+ Strategy:
135
+ 1. First occurrence: use basename (e.g., app.log)
136
+ 2. Duplicate: prepend parent directories until unique
137
+ """
138
+ # Normalize path separators to forward slash (archives always use forward slash in both linux, and windows)
139
+ normalized_path = filepath.replace(os.sep, '/')
140
+ normalized_path = normalize_filename(normalized_path)
141
+
142
+ basename = normalized_path.split('/')[-1]
143
+
144
+ # If basename is not used, return it
145
+ if basename not in used_filenames:
146
+ used_filenames.add(basename)
147
+ return basename
148
+
149
+ # Try prepending parents from nearest to farthest
150
+ path_parts = normalized_path.split('/')
151
+ parent_parts = [p for p in path_parts[:-1] if p]
152
+
153
+ prefixed_name = basename
154
+ for parent in reversed(parent_parts):
155
+ prefixed_name = f"{parent}/{prefixed_name}"
156
+
157
+ if prefixed_name not in used_filenames:
158
+ used_filenames.add(prefixed_name)
159
+ return prefixed_name
160
+
161
+ return None
162
+
163
+
164
+ def matches_include_patterns(filename: str, include_patterns: Tuple[str, ...]) -> bool:
110
165
  """
111
166
  Check if a file should be included based on the include patterns.
112
167
  If no patterns are specified, all files are included.
@@ -121,6 +176,13 @@ def matches_include_patterns(filename: str, include_patterns: List[str]) -> bool
121
176
  return False
122
177
 
123
178
 
179
+ def normalize_filename(filename: str) -> str:
180
+ """
181
+ Normalize filename by replacing whitespace with dashes.
182
+ """
183
+ return filename.replace(' ', '-')
184
+
185
+
124
186
  def valid_utf8_file(file_content: bytes) -> bool:
125
187
  # Check for null bytes (binary files)
126
188
  if b'\x00' in file_content:
@@ -537,7 +537,7 @@ class Subset(TestPathWriter):
537
537
 
538
538
  def _collect_potential_test_files(self):
539
539
  LOOSE_TEST_FILE_PATTERN = r'(\.(test|spec)\.|_test\.|Test\.|Spec\.|test/|tests/|__tests__/|src/test/)'
540
- 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
540
+ 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|csv|list)$' # noqa E501
541
541
 
542
542
  try:
543
543
  git_managed_files = subprocess.run(['git', 'ls-files'], stdout=subprocess.PIPE,
@@ -1,18 +1,18 @@
1
1
  import glob
2
2
  import os
3
3
  import re
4
- from typing import Annotated
5
- from typing import Dict, List, Tuple
4
+ from typing import Annotated, Dict, List
6
5
 
7
6
  import click
8
7
 
9
8
  import smart_tests.args4p.typer as typer
10
9
  from smart_tests.utils import glob as uglob
11
10
  from smart_tests.utils.java import junit5_nested_class_path_builder
12
- from . import smart_tests
11
+
13
12
  from ..args4p.exceptions import BadCmdLineException
14
13
  from ..commands.record.tests import RecordTests
15
14
  from ..commands.subset import Subset
15
+ from . import smart_tests
16
16
 
17
17
  # Surefire has the default inclusion pattern
18
18
  # https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#includes
@@ -169,4 +169,15 @@ def record_tests(
169
169
  )],
170
170
  ):
171
171
  client.path_builder = junit5_nested_class_path_builder(client.path_builder)
172
+
173
+ # Override report method to filter out non-JUnit report files
174
+ original_report = client.report
175
+
176
+ IGNORED_FILES = {'failsafe-summary.xml', 'testng-results.xml'}
177
+
178
+ def report_with_filter(junit_report_file: str):
179
+ if not any(junit_report_file.endswith(f) for f in IGNORED_FILES):
180
+ original_report(junit_report_file)
181
+
182
+ client.report = report_with_filter # type: ignore[method-assign]
172
183
  smart_tests.CommonRecordTestImpls.load_report_files(client=client, source_roots=reports)
@@ -3,7 +3,8 @@ import json
3
3
  import os
4
4
  import pathlib
5
5
  import subprocess
6
- from typing import Annotated, Generator, Iterable, List
6
+ from datetime import datetime, timezone
7
+ from typing import Annotated, Generator, Iterable, List, Optional
7
8
 
8
9
  import click
9
10
  from junitparser import Properties, TestCase # type: ignore
@@ -17,7 +18,6 @@ from ..commands.record.tests import RecordTests
17
18
  from ..commands.subset import Subset
18
19
  from . import smart_tests
19
20
 
20
-
21
21
  # Please specify junit_family=legacy for pytest report format. if using pytest version 6 or higher.
22
22
  # - pytest has changed its default test report format from xunit1 to xunit2 since version 6.
23
23
  # - https://docs.pytest.org/en/latest/deprecations.html#junit-family-default-value-change-to-xunit2
@@ -40,6 +40,15 @@ from . import smart_tests
40
40
  # <testcase classname="tests.test_mod.TestClass" name="test__can_print_aaa" file="tests/test_mod.py"
41
41
  # line="3" time="0.001" />
42
42
  #
43
+
44
+
45
+ def _timestamp_to_iso(ts: Optional[float]) -> Optional[str]:
46
+ # convert to ISO-8601 formatted date
47
+ if ts is None:
48
+ return None
49
+ return datetime.fromtimestamp(ts, tz=timezone.utc).isoformat()
50
+
51
+
43
52
  @smart_tests.subset
44
53
  def subset(
45
54
  client: Subset,
@@ -344,15 +353,39 @@ class PytestJSONReportParser:
344
353
  else:
345
354
  props = None
346
355
 
356
+ # extract raw timestamps
357
+ start_timestamp = data.get("start")
358
+ stop_timestamp = data.get("stop")
359
+
360
+ # convert to ISO-8601
361
+ start_timestamp_iso_format = _timestamp_to_iso(start_timestamp)
362
+ end_timestamp_iso_format = _timestamp_to_iso(stop_timestamp)
363
+
364
+ print(
365
+ f"DEBUG pytest timing start={start_timestamp_iso_format}, stop={end_timestamp_iso_format}"
366
+ )
367
+
368
+ event_data = {}
369
+ if start_timestamp_iso_format:
370
+ event_data["start_timestamp"] = start_timestamp_iso_format
371
+ if end_timestamp_iso_format:
372
+ event_data["stop_timestamp"] = end_timestamp_iso_format
373
+
347
374
  test_path = _parse_pytest_nodeid(nodeid)
348
375
  for path in test_path:
349
376
  if path.get("type") == "file":
350
377
  path["name"] = pathlib.Path(path["name"]).as_posix()
351
378
 
379
+ data_payload = event_data if event_data else None
380
+
381
+ # end_timestamp_iso_format is being passed as timestamp as it reflects event finalization
382
+ # start + duration = stop
383
+ # sending both start and stop time in the event data field
352
384
  yield CaseEvent.create(
353
385
  test_path=test_path,
354
386
  duration_secs=data.get("duration", 0),
355
387
  status=status,
356
388
  stdout=stdout,
357
389
  stderr=stderr,
358
- data=props)
390
+ timestamp=end_timestamp_iso_format,
391
+ data=data_payload)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-tests-cli
3
- Version: 2.4.2
3
+ Version: 2.5.0
4
4
  Summary: Smart Tests CLI
5
5
  Author-email: CloudBees <support@cloudbees.com>
6
6
  License: Apache Software License v2
@@ -201,17 +201,16 @@ class SubsetsTest(CliTestCase):
201
201
  mix_stderr=False)
202
202
 
203
203
  self.assert_success(result)
204
- expect = """PTS subset change summary:
205
- ────────────────────────────────
206
- -> 3 tests analyzed | 1 ↑ promoted | 1 ↓ demoted
207
- -> Code files affected: bbb.py, ccc.py, ddd.py
208
- ────────────────────────────────
209
-
210
- Δ Rank Subset Rank Test Name Reason Density
211
- -------- ------------- ----------- -------------------- ---------
212
- NEW 1 file=ddd.py Changed file: ddd.py 0.9
213
- ↑1 2 file=ccc.py Changed file: ccc.py 0.7
214
- ↓1 3 file=bbb.py Changed file: bbb.py 0.5
215
- DELETED - file=aaa.py
216
- """
217
- self.assertEqual(result.stdout, expect)
204
+ output = result.stdout
205
+ self.assertIn("3 tests analyzed | 1 ↑ promoted | 1 ↓ demoted", output)
206
+ self.assertIn("Code files affected: bbb.py, ccc.py, ddd.py", output)
207
+ self.assertIn("Δ Rank", output)
208
+ self.assertIn("Density", output)
209
+ for expected_row in [
210
+ ("NEW", "1", "file=ddd.py", "Changed file: ddd.py", "0.9"),
211
+ ("↑1", "2", "file=ccc.py", "Changed file: ccc.py", "0.7"),
212
+ ("↓1", "3", "file=bbb.py", "Changed file: bbb.py", "0.5"),
213
+ ("DELETED", "-", "file=aaa.py"),
214
+ ]:
215
+ for cell in expected_row:
216
+ self.assertIn(cell, output)
@@ -90,15 +90,15 @@ class AttachmentTest(CliTestCase):
90
90
  responses.POST,
91
91
  "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
92
92
  get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
93
- match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="nested/debug.log"'})],
93
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="debug.log"'})],
94
94
  status=200)
95
95
 
96
96
  expect = """
97
- | File | Status |
98
- |------------------|----------------------------------|
99
- | app.log | ⚠ Failed to record |
100
- | nested/debug.log | ✓ Recorded successfully |
101
- | binary.dat | ⚠ Skipped: not a valid text file |
97
+ | File | Status |
98
+ |------------|----------------------------------|
99
+ | app.log | ⚠ Failed to record |
100
+ | debug.log | ✓ Recorded successfully |
101
+ | binary.dat | ⚠ Skipped: not a valid text file |
102
102
  """
103
103
 
104
104
  result = self.cli("record", "attachment", "--session", self.session, zip_path)
@@ -147,14 +147,128 @@ class AttachmentTest(CliTestCase):
147
147
  responses.POST,
148
148
  "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
149
149
  get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
150
- match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="nested/debug.log"'})],
150
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="debug.log"'})],
151
151
  status=200)
152
152
 
153
153
  result = self.cli("record", "attachment", "--session", self.session, "--include", "*.log", zip_path)
154
154
 
155
+ expect = """| File | Status |
156
+ |-----------|-------------------------|
157
+ | app.log | ✓ Recorded successfully |
158
+ | debug.log | ✓ Recorded successfully |
159
+ """
160
+ self.assertEqual(expect, result.output)
161
+
162
+ @responses.activate
163
+ @mock.patch.dict(os.environ, {"SMART_TESTS_TOKEN": CliTestCase.smart_tests_token})
164
+ def test_attachment_with_identical_file_names(self):
165
+ with tempfile.TemporaryDirectory() as temp_dir:
166
+ # Create temporary files
167
+ text_file_1 = os.path.join(temp_dir, "app.log")
168
+ text_file_2 = os.path.join(temp_dir, "nested_2", "app.log")
169
+ zip_path = os.path.join(temp_dir, "logs.zip")
170
+
171
+ # Create directory structure
172
+ os.makedirs(os.path.dirname(text_file_2))
173
+
174
+ # Write test content
175
+ with open(text_file_1, 'w') as f:
176
+ f.write("[INFO] Test log entry")
177
+ with open(text_file_2, 'w') as f:
178
+ f.write("[DEBUG] Nested log entry")
179
+
180
+ # Create zip file
181
+ with zipfile.ZipFile(zip_path, 'w') as zf:
182
+ zf.write(text_file_1, 'app.log')
183
+ zf.write(text_file_2, 'nested_1/app.log')
184
+ zf.write(text_file_2, 'nested_2/app.log')
185
+
186
+ responses.add(
187
+ responses.POST,
188
+ "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
189
+ get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
190
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="app.log"'})],
191
+ status=200)
192
+
193
+ responses.add(
194
+ responses.POST,
195
+ "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
196
+ get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
197
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="nested_1/app.log"'})],
198
+ status=200)
199
+
200
+ responses.add(
201
+ responses.POST,
202
+ "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
203
+ get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
204
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="nested_2/app.log"'})],
205
+ status=200)
206
+
207
+ result = self.cli("record", "attachment", "--session", self.session, zip_path)
208
+
155
209
  expect = """| File | Status |
156
210
  |------------------|-------------------------|
157
211
  | app.log | ✓ Recorded successfully |
158
- | nested/debug.log | ✓ Recorded successfully |
212
+ | nested_1/app.log | ✓ Recorded successfully |
213
+ | nested_2/app.log | ✓ Recorded successfully |
159
214
  """
215
+ self.assertEqual(expect, result.output)
216
+
217
+ @responses.activate
218
+ @mock.patch.dict(os.environ, {"SMART_TESTS_TOKEN": CliTestCase.smart_tests_token})
219
+ def test_attachment_with_whitespace_in_filename(self):
220
+ TEST_CONTENT = b"Test log content"
221
+
222
+ # Create a file with whitespace in the name
223
+ with tempfile.TemporaryDirectory() as temp_dir:
224
+ file_path = os.path.join(temp_dir, "app log file.txt")
225
+ with open(file_path, 'wb') as f:
226
+ f.write(TEST_CONTENT)
227
+
228
+ # Expect the filename with whitespace replaced by dashes in the Content-Disposition header
229
+ responses.add(
230
+ responses.POST,
231
+ "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
232
+ get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
233
+ match=[responses.matchers.header_matcher(
234
+ {"Content-Disposition": 'attachment;filename="{}"'.format("app-log-file.txt")}
235
+ )],
236
+ status=200)
237
+
238
+ result = self.cli("record", "attachment", "--session", self.session, file_path)
239
+
240
+ self.assert_success(result)
241
+ self.assertIn("✓ Recorded successfully", result.output)
242
+
243
+ @responses.activate
244
+ @mock.patch.dict(os.environ, {"SMART_TESTS_TOKEN": CliTestCase.smart_tests_token})
245
+ def test_attachment_duplicate_file_paths(self):
246
+ with tempfile.TemporaryDirectory() as temp_dir:
247
+ # Create temporary files
248
+ text_file_1 = os.path.join(temp_dir, "app.log")
249
+ zip_path = os.path.join(temp_dir, "logs.zip")
250
+
251
+ # Write test content
252
+ with open(text_file_1, 'w') as f:
253
+ f.write("[INFO] Test log entry")
254
+
255
+ # Create zip file
256
+ with zipfile.ZipFile(zip_path, 'w') as zf:
257
+ zf.write(text_file_1, 'app.log')
258
+
259
+ responses.add(
260
+ responses.POST,
261
+ "{}/intake/organizations/{}/workspaces/{}/builds/{}/test_sessions/{}/attachment".format(
262
+ get_base_url(), self.organization, self.workspace, self.build_name, self.session_id),
263
+ match=[responses.matchers.header_matcher({"Content-Disposition": 'attachment;filename="app.log"'})],
264
+ status=200)
265
+
266
+ expect = """| File | Status |
267
+ |---------|-------------------------|
268
+ | app.log | ✓ Recorded successfully |
269
+ | app.log | ⚠ Skipped: duplicate |
270
+ """
271
+
272
+ result = self.cli("record", "attachment", "--session", self.session, zip_path, zip_path)
273
+
160
274
  self.assertIn(expect, result.output)