launchable 1.124.2__tar.gz → 1.124.3__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 (397) hide show
  1. {launchable-1.124.2 → launchable-1.124.3}/PKG-INFO +1 -1
  2. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/inspect/tests.py +15 -6
  3. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/build.py +12 -8
  4. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/tests.py +14 -8
  5. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/subset.py +24 -0
  6. {launchable-1.124.2 → launchable-1.124.3}/launchable/jar/exe_deploy.jar +0 -0
  7. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/launchable_client.py +23 -0
  8. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/PKG-INFO +1 -1
  9. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/SOURCES.txt +1 -0
  10. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +6 -9
  11. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +1 -0
  12. launchable-1.124.3/src/test/java/com/launchableinc/ingest/commits/GitFileTest.java +51 -0
  13. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_subset.py +230 -0
  14. {launchable-1.124.2 → launchable-1.124.3}/.bazelrc +0 -0
  15. {launchable-1.124.2 → launchable-1.124.3}/.bazelversion +0 -0
  16. {launchable-1.124.2 → launchable-1.124.3}/.editorconfig +0 -0
  17. {launchable-1.124.2 → launchable-1.124.3}/.github/release.yml +0 -0
  18. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/bazel-test.yml +0 -0
  19. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/e2e.yml +0 -0
  20. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/pre-commit.yml +0 -0
  21. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/python-package.yml +0 -0
  22. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/python-publish.yml +0 -0
  23. {launchable-1.124.2 → launchable-1.124.3}/.github/workflows/update_maven_install_json.yml +0 -0
  24. {launchable-1.124.2 → launchable-1.124.3}/.gitignore +0 -0
  25. {launchable-1.124.2 → launchable-1.124.3}/.pre-commit-config.yaml +0 -0
  26. {launchable-1.124.2 → launchable-1.124.3}/.python-version +0 -0
  27. {launchable-1.124.2 → launchable-1.124.3}/.tagpr +0 -0
  28. {launchable-1.124.2 → launchable-1.124.3}/CONTRIBUTING.md +0 -0
  29. {launchable-1.124.2 → launchable-1.124.3}/Dockerfile +0 -0
  30. {launchable-1.124.2 → launchable-1.124.3}/LICENSE.txt +0 -0
  31. {launchable-1.124.2 → launchable-1.124.3}/Pipfile +0 -0
  32. {launchable-1.124.2 → launchable-1.124.3}/README.md +0 -0
  33. {launchable-1.124.2 → launchable-1.124.3}/WORKSPACE +0 -0
  34. {launchable-1.124.2 → launchable-1.124.3}/build-java.sh +0 -0
  35. {launchable-1.124.2 → launchable-1.124.3}/launchable/__init__.py +0 -0
  36. {launchable-1.124.2 → launchable-1.124.3}/launchable/__main__.py +0 -0
  37. {launchable-1.124.2 → launchable-1.124.3}/launchable/app.py +0 -0
  38. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/__init__.py +0 -0
  39. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/compare/__init__.py +0 -0
  40. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/compare/subsets.py +0 -0
  41. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/detect_flakes.py +0 -0
  42. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/gate.py +0 -0
  43. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/helper.py +0 -0
  44. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/inspect/__init__.py +0 -0
  45. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/inspect/model.py +0 -0
  46. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/inspect/subset.py +0 -0
  47. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/__init__.py +0 -0
  48. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/attachment.py +0 -0
  49. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/case_event.py +0 -0
  50. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/commit.py +0 -0
  51. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/record/session.py +0 -0
  52. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/split_subset.py +0 -0
  53. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/stats/__init__.py +0 -0
  54. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/stats/test_sessions.py +0 -0
  55. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/test_path_writer.py +0 -0
  56. {launchable-1.124.2 → launchable-1.124.3}/launchable/commands/verify.py +0 -0
  57. {launchable-1.124.2 → launchable-1.124.3}/launchable/plugins/__init__.py +0 -0
  58. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/__init__.py +0 -0
  59. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/adb.py +0 -0
  60. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/ant.py +0 -0
  61. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/bazel.py +0 -0
  62. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/behave.py +0 -0
  63. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/codeceptjs.py +0 -0
  64. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/ctest.py +0 -0
  65. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/cts.py +0 -0
  66. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/cucumber.py +0 -0
  67. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/cypress.py +0 -0
  68. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/dotnet.py +0 -0
  69. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/file.py +0 -0
  70. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/flutter.py +0 -0
  71. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/go_test.py +0 -0
  72. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/googletest.py +0 -0
  73. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/gradle.py +0 -0
  74. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/jasmine.py +0 -0
  75. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/jest.py +0 -0
  76. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/karma.py +0 -0
  77. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/launchable.py +0 -0
  78. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/maven.py +0 -0
  79. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/minitest.py +0 -0
  80. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/nunit.py +0 -0
  81. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/playwright.py +0 -0
  82. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/prove.py +0 -0
  83. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/pytest.py +0 -0
  84. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/raw.py +0 -0
  85. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/robot.py +0 -0
  86. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/rspec.py +0 -0
  87. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/vitest.py +0 -0
  88. {launchable-1.124.2 → launchable-1.124.3}/launchable/test_runners/xctest.py +0 -0
  89. {launchable-1.124.2 → launchable-1.124.3}/launchable/testpath.py +0 -0
  90. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/__init__.py +0 -0
  91. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/authentication.py +0 -0
  92. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/ci_provider.py +0 -0
  93. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/click.py +0 -0
  94. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/commands.py +0 -0
  95. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/commit_ingester.py +0 -0
  96. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/common_tz.py +0 -0
  97. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/env_keys.py +0 -0
  98. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/exceptions.py +0 -0
  99. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/fail_fast_mode.py +0 -0
  100. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/file_name_pattern.py +0 -0
  101. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/git_log_parser.py +0 -0
  102. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/glob.py +0 -0
  103. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/gzipgen.py +0 -0
  104. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/http_client.py +0 -0
  105. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/java.py +0 -0
  106. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/link.py +0 -0
  107. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/logger.py +0 -0
  108. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/no_build.py +0 -0
  109. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/sax.py +0 -0
  110. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/session.py +0 -0
  111. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/subprocess.py +0 -0
  112. {launchable-1.124.2 → launchable-1.124.3}/launchable/utils/tracking.py +0 -0
  113. {launchable-1.124.2 → launchable-1.124.3}/launchable/version.py +0 -0
  114. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/dependency_links.txt +0 -0
  115. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/entry_points.txt +0 -0
  116. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/requires.txt +0 -0
  117. {launchable-1.124.2 → launchable-1.124.3}/launchable.egg-info/top_level.txt +0 -0
  118. {launchable-1.124.2 → launchable-1.124.3}/pyproject.toml +0 -0
  119. {launchable-1.124.2 → launchable-1.124.3}/renovate.json +0 -0
  120. {launchable-1.124.2 → launchable-1.124.3}/setup.cfg +0 -0
  121. {launchable-1.124.2 → launchable-1.124.3}/setup.py +0 -0
  122. {launchable-1.124.2 → launchable-1.124.3}/src/BUILD +0 -0
  123. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  124. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
  125. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +0 -0
  126. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
  127. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +0 -0
  128. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  129. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +0 -0
  130. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +0 -0
  131. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  132. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  133. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
  134. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  135. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  136. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
  137. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  138. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -0
  139. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  140. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  141. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
  142. {launchable-1.124.2 → launchable-1.124.3}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
  143. {launchable-1.124.2 → launchable-1.124.3}/src/maven_install.json +0 -0
  144. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  145. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +0 -0
  146. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +0 -0
  147. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
  148. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
  149. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +0 -0
  150. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  151. {launchable-1.124.2 → launchable-1.124.3}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  152. {launchable-1.124.2 → launchable-1.124.3}/test-runner/__main__.py +0 -0
  153. {launchable-1.124.2 → launchable-1.124.3}/tests/__init__.py +0 -0
  154. {launchable-1.124.2 → launchable-1.124.3}/tests/cli_test_case.py +0 -0
  155. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/__init__.py +0 -0
  156. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/compare/__init__.py +0 -0
  157. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/compare/test_subsets.py +0 -0
  158. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/inspect/test_model.py +0 -0
  159. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/inspect/test_subset.py +0 -0
  160. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/inspect/test_tests.py +0 -0
  161. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/__init__.py +0 -0
  162. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_attachment.py +0 -0
  163. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_build.py +0 -0
  164. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_case_event.py +0 -0
  165. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_commit.py +0 -0
  166. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_session.py +0 -0
  167. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/record/test_tests.py +0 -0
  168. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_api_error.py +0 -0
  169. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_detect_flakes.py +0 -0
  170. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_gate.py +0 -0
  171. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_helper.py +0 -0
  172. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_split_subset.py +0 -0
  173. {launchable-1.124.2 → launchable-1.124.3}/tests/commands/test_verify.py +0 -0
  174. {launchable-1.124.2 → launchable-1.124.3}/tests/data/adb/subset_result.json +0 -0
  175. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/junitreport/TEST-com.launchable.HelloWorldTest.xml +0 -0
  176. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/junitreport/TEST-com.launchable.library.CacheTest.xml +0 -0
  177. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  178. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/record_test_result.json +0 -0
  179. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/src/com/launchable/HelloWorld.java +0 -0
  180. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/src/com/launchable/HelloWorldTest.java +0 -0
  181. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/src/com/launchable/library/Cache.java +0 -0
  182. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/src/com/launchable/library/CacheTest.java +0 -0
  183. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ant/subset_result.json +0 -0
  184. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  185. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
  186. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  187. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  188. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  189. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  190. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  191. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  192. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  193. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  194. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  195. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  196. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  197. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  198. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  199. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  200. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  201. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  202. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  203. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/build_event.json +0 -0
  204. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/build_event_rest.json +0 -0
  205. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/record_test_result.json +0 -0
  206. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  207. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  208. {launchable-1.124.2 → launchable-1.124.3}/tests/data/bazel/subset_result.json +0 -0
  209. {launchable-1.124.2 → launchable-1.124.3}/tests/data/behave/record_test_result.json +0 -0
  210. {launchable-1.124.2 → launchable-1.124.3}/tests/data/behave/reports/report.xml +0 -0
  211. {launchable-1.124.2 → launchable-1.124.3}/tests/data/behave/subset_result.json +0 -0
  212. {launchable-1.124.2 → launchable-1.124.3}/tests/data/broken_xml/broken.xml +0 -0
  213. {launchable-1.124.2 → launchable-1.124.3}/tests/data/broken_xml/normal.xml +0 -0
  214. {launchable-1.124.2 → launchable-1.124.3}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
  215. {launchable-1.124.2 → launchable-1.124.3}/tests/data/codeceptjs/record_test_result.json +0 -0
  216. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  217. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ctest/ctest_list.json +0 -0
  218. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ctest/record_test_result.json +0 -0
  219. {launchable-1.124.2 → launchable-1.124.3}/tests/data/ctest/subset_result.json +0 -0
  220. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cts/record_test_result.json +0 -0
  221. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cts/subset_result.json +0 -0
  222. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cts/test_result.xml +0 -0
  223. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/features/foo/bar.feature +0 -0
  224. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  225. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/features/foo-bar.feature +0 -0
  226. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  227. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/record_test_json_result.json +0 -0
  228. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/record_test_result.json +0 -0
  229. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  230. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  231. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  232. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/report/dummy.xml +0 -0
  233. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cucumber/report/result.json +0 -0
  234. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cypress/empty.json +0 -0
  235. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cypress/empty.xml +0 -0
  236. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cypress/record_test_result.json +0 -0
  237. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cypress/subset_result.json +0 -0
  238. {launchable-1.124.2 → launchable-1.124.3}/tests/data/cypress/test-result.xml +0 -0
  239. {launchable-1.124.2 → launchable-1.124.3}/tests/data/dotnet/record_test_result.json +0 -0
  240. {launchable-1.124.2 → launchable-1.124.3}/tests/data/dotnet/test-result.xml +0 -0
  241. {launchable-1.124.2 → launchable-1.124.3}/tests/data/flutter/record_test_result.json +0 -0
  242. {launchable-1.124.2 → launchable-1.124.3}/tests/data/flutter/report.json +0 -0
  243. {launchable-1.124.2 → launchable-1.124.3}/tests/data/git_log_ingest/sample.out +0 -0
  244. {launchable-1.124.2 → launchable-1.124.3}/tests/data/go_test/record_test_result.json +0 -0
  245. {launchable-1.124.2 → launchable-1.124.3}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  246. {launchable-1.124.2 → launchable-1.124.3}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  247. {launchable-1.124.2 → launchable-1.124.3}/tests/data/go_test/subset_result.json +0 -0
  248. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/fail/output.xml +0 -0
  249. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/fail/record_test_result.json +0 -0
  250. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/output_a.xml +0 -0
  251. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/output_b.xml +0 -0
  252. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/record_test_result.json +0 -0
  253. {launchable-1.124.2 → launchable-1.124.3}/tests/data/googletest/subset_result.json +0 -0
  254. {launchable-1.124.2 → launchable-1.124.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/App2Test.java +0 -0
  255. {launchable-1.124.2 → launchable-1.124.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/AppTest.java +0 -0
  256. {launchable-1.124.2 → launchable-1.124.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/sub/App3Test.java +0 -0
  257. {launchable-1.124.2 → launchable-1.124.3}/tests/data/gradle/recursion/expected.json +0 -0
  258. {launchable-1.124.2 → launchable-1.124.3}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  259. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jasmine/README.md +0 -0
  260. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
  261. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jasmine/jasmine-test-results.json +0 -0
  262. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jasmine/record_test_result.json +0 -0
  263. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jasmine/subset_payload.json +0 -0
  264. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jest/junit.xml +0 -0
  265. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jest/record_test_result.json +0 -0
  266. {launchable-1.124.2 → launchable-1.124.3}/tests/data/jest/subset_result.json +0 -0
  267. {launchable-1.124.2 → launchable-1.124.3}/tests/data/karma/README.md +0 -0
  268. {launchable-1.124.2 → launchable-1.124.3}/tests/data/karma/record_test_result.json +0 -0
  269. {launchable-1.124.2 → launchable-1.124.3}/tests/data/karma/sample-report.json +0 -0
  270. {launchable-1.124.2 → launchable-1.124.3}/tests/data/karma/subset_payload.json +0 -0
  271. {launchable-1.124.2 → launchable-1.124.3}/tests/data/karma/subset_result.json +0 -0
  272. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/createdFile_1.lst +0 -0
  273. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/createdFile_2.lst +0 -0
  274. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/App2Test.java +0 -0
  275. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/AppTest.java +0 -0
  276. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
  277. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/list.lst +0 -0
  278. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/record_test_result.json +0 -0
  279. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/reports/TEST-1.xml +0 -0
  280. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/reports/TEST-2.xml +0 -0
  281. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/reports/TEST-nested.xml +0 -0
  282. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/reports/dummy.xml +0 -0
  283. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
  284. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_by_confidence_result.json +0 -0
  285. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_from_file_result.json +0 -0
  286. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_result.json +0 -0
  287. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
  288. {launchable-1.124.2 → launchable-1.124.3}/tests/data/maven/subset_with_exclude_rules_result.json +0 -0
  289. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  290. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  291. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  292. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  293. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/TEST-UserTest.xml +0 -0
  294. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/record_test_result.json +0 -0
  295. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/record_test_result_chunk1.json +0 -0
  296. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/record_test_result_chunk2.json +0 -0
  297. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/subset_result.json +0 -0
  298. {launchable-1.124.2 → launchable-1.124.3}/tests/data/minitest/test/example_test.rb +0 -0
  299. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/list.xml +0 -0
  300. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  301. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  302. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/output-linux.xml +0 -0
  303. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/output-windows.xml +0 -0
  304. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/record_test_result-linux.json +0 -0
  305. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/record_test_result-windows.json +0 -0
  306. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/src/.gitignore +0 -0
  307. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/src/Program.cs +0 -0
  308. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/src/README.md +0 -0
  309. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/src/Test.cs +0 -0
  310. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/src/calc.csproj +0 -0
  311. {launchable-1.124.2 → launchable-1.124.3}/tests/data/nunit/subset_result.json +0 -0
  312. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/packages/e2e/.gitkeep +0 -0
  313. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/playwright.config.ts +0 -0
  314. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/record_test_result.json +0 -0
  315. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/record_test_result_with_json.json +0 -0
  316. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/record_test_result_with_json_base.json +0 -0
  317. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/record_test_result_with_prefix.json +0 -0
  318. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/report.json +0 -0
  319. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/report.xml +0 -0
  320. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/report_with_json_base.json +0 -0
  321. {launchable-1.124.2 → launchable-1.124.3}/tests/data/playwright/report_with_prefix.json +0 -0
  322. {launchable-1.124.2 → launchable-1.124.3}/tests/data/prove/record_test_result.json +0 -0
  323. {launchable-1.124.2 → launchable-1.124.3}/tests/data/prove/report.xml +0 -0
  324. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/pytest.ini +0 -0
  325. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/record_test_result.json +0 -0
  326. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/record_test_result_json.json +0 -0
  327. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/report.json +0 -0
  328. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/report.xml +0 -0
  329. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/subset_result.json +0 -0
  330. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/conftest.py +0 -0
  331. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/fooo/__init__.py +0 -0
  332. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  333. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  334. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/funcs3_test.py +0 -0
  335. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/test_funcs1.py +0 -0
  336. {launchable-1.124.2 → launchable-1.124.3}/tests/data/pytest/tests/test_funcs2.py +0 -0
  337. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/dryrun.xml +0 -0
  338. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/output.xml +0 -0
  339. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/output_legacy.xml +0 -0
  340. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  341. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/record_test_legacy_result.json +0 -0
  342. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/record_test_result.json +0 -0
  343. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/single-output.xml +0 -0
  344. {launchable-1.124.2 → launchable-1.124.3}/tests/data/robot/subset_result.json +0 -0
  345. {launchable-1.124.2 → launchable-1.124.3}/tests/data/rspec/record_test_result.json +0 -0
  346. {launchable-1.124.2 → launchable-1.124.3}/tests/data/rspec/rspec.xml +0 -0
  347. {launchable-1.124.2 → launchable-1.124.3}/tests/data/vitest/record_test_result.json +0 -0
  348. {launchable-1.124.2 → launchable-1.124.3}/tests/data/vitest/report.xml +0 -0
  349. {launchable-1.124.2 → launchable-1.124.3}/tests/data/xctest/junit.xml +0 -0
  350. {launchable-1.124.2 → launchable-1.124.3}/tests/data/xctest/record_test_result.json +0 -0
  351. {launchable-1.124.2 → launchable-1.124.3}/tests/data/xctest/subset_result.json +0 -0
  352. {launchable-1.124.2 → launchable-1.124.3}/tests/helper.py +0 -0
  353. {launchable-1.124.2 → launchable-1.124.3}/tests/plugins/foo.py +0 -0
  354. {launchable-1.124.2 → launchable-1.124.3}/tests/test_cli_test_case.py +0 -0
  355. {launchable-1.124.2 → launchable-1.124.3}/tests/test_plugin.py +0 -0
  356. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/__init__.py +0 -0
  357. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_adb.py +0 -0
  358. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_ant.py +0 -0
  359. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_bazel.py +0 -0
  360. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_behave.py +0 -0
  361. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_codeceptjs.py +0 -0
  362. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_ctest.py +0 -0
  363. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_cts.py +0 -0
  364. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_cucumber.py +0 -0
  365. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_cypress.py +0 -0
  366. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_dotnet.py +0 -0
  367. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_go_test.py +0 -0
  368. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_googletest.py +0 -0
  369. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_gradle.py +0 -0
  370. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_jasmine.py +0 -0
  371. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_jest.py +0 -0
  372. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_karma.py +0 -0
  373. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_maven.py +0 -0
  374. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_minitest.py +0 -0
  375. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_nunit.py +0 -0
  376. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_playwright.py +0 -0
  377. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_prove.py +0 -0
  378. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_pytest.py +0 -0
  379. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_raw.py +0 -0
  380. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_robot.py +0 -0
  381. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_rspec.py +0 -0
  382. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_vitest.py +0 -0
  383. {launchable-1.124.2 → launchable-1.124.3}/tests/test_runners/test_xctest.py +0 -0
  384. {launchable-1.124.2 → launchable-1.124.3}/tests/test_session.py +0 -0
  385. {launchable-1.124.2 → launchable-1.124.3}/tests/test_testpath.py +0 -0
  386. {launchable-1.124.2 → launchable-1.124.3}/tests/test_version.py +0 -0
  387. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/__init__.py +0 -0
  388. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_authentication.py +0 -0
  389. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_click.py +0 -0
  390. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_fail_fast_mode.py +0 -0
  391. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_file_name_pattern.py +0 -0
  392. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_git_log_parser.py +0 -0
  393. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_glob.py +0 -0
  394. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_gzipgen.py +0 -0
  395. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_http_client.py +0 -0
  396. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_link.py +0 -0
  397. {launchable-1.124.2 → launchable-1.124.3}/tests/utils/test_logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: launchable
3
- Version: 1.124.2
3
+ Version: 1.124.3
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -56,8 +56,9 @@ class TestResultAbstractDisplay(metaclass=ABCMeta):
56
56
 
57
57
 
58
58
  class TestResultJSONDisplay(TestResultAbstractDisplay):
59
- def __init__(self, results: TestResults):
59
+ def __init__(self, results: TestResults, client: LaunchableClient):
60
60
  super().__init__(results)
61
+ self._client = client
61
62
 
62
63
  def display(self):
63
64
  result_json = {}
@@ -88,12 +89,20 @@ class TestResultJSONDisplay(TestResultAbstractDisplay):
88
89
  "created_at": result._created_at
89
90
  })
90
91
 
91
- org, workspace = ensure_org_workspace()
92
- result_json["test_session_app_url"] = "https://app.launchableinc.com/organizations/{}/workspaces/{}/test-sessions/{}".format( # noqa: E501
93
- org, workspace, self._results._test_session_id)
94
-
92
+ result_json["test_session_app_url"] = self._get_test_session_url()
95
93
  click.echo(json.dumps(result_json, indent=2))
96
94
 
95
+ def _get_test_session_url(self) -> str:
96
+ cbp_workspace = self._client.get_cbp_workspace()
97
+ if cbp_workspace:
98
+ org_cbp_id, ws_cbp_id = cbp_workspace
99
+ return "https://cloudbees.io/{}/{}/smart-tests/test-sessions/{}".format(
100
+ org_cbp_id, ws_cbp_id, self._results._test_session_id)
101
+ else:
102
+ org, workspace = ensure_org_workspace()
103
+ return "https://app.launchableinc.com/organizations/{}/workspaces/{}/test-sessions/{}".format(
104
+ org, workspace, self._results._test_session_id)
105
+
97
106
 
98
107
  class TestResultTableDisplay(TestResultAbstractDisplay):
99
108
  def __init__(self, results: TestResults):
@@ -179,7 +188,7 @@ def tests(context: click.core.Context, test_session_id: int, is_json_format: boo
179
188
 
180
189
  displayer: TestResultAbstractDisplay
181
190
  if is_json_format:
182
- displayer = TestResultJSONDisplay(test_results)
191
+ displayer = TestResultJSONDisplay(test_results, client=client)
183
192
  else:
184
193
  displayer = TestResultTableDisplay(test_results)
185
194
 
@@ -362,14 +362,18 @@ def build(
362
362
  header = ["Name", "Path", "HEAD Commit"]
363
363
  rows = [[w.name, w.dir, w.commit_hash] for w in ws]
364
364
  click.echo(tabulate(rows, header, tablefmt="github"))
365
- click.echo(
366
- "\nVisit https://app.launchableinc.com/organizations/{organization}/workspaces/"
367
- "{workspace}/data/builds/{build_id} to view this build and its test sessions"
368
- .format(
369
- organization=org,
370
- workspace=workspace,
371
- build_id=build_id,
372
- ))
365
+ url = _get_build_url(build_id, org, workspace)
366
+ click.echo("\nVisit {} to view this build and its test sessions".format(url))
367
+
368
+ def _get_build_url(build_id, org, workspace) -> str:
369
+ cbp_workspace = client.get_cbp_workspace()
370
+ if cbp_workspace:
371
+ org_cbp_id, ws_cbp_id = cbp_workspace
372
+ url = "https://cloudbees.io/{}/{}/smart-tests/data/builds/{}".format(org_cbp_id, ws_cbp_id, build_id)
373
+ else:
374
+ url = "https://app.launchableinc.com/organizations/{}/workspaces/{}/data/builds/{}".format(
375
+ org, workspace, build_id)
376
+ return url
373
377
 
374
378
  # all the logics at the high level
375
379
  if len(commits) == 0:
@@ -657,15 +657,21 @@ def tests(
657
657
  click.echo(click.style("\nTotal test duration is 0."
658
658
  "\nPlease check whether the test duration times in report files are correct.", "yellow"))
659
659
 
660
+ url = self._get_test_session_url()
660
661
  click.echo(
661
- "\nVisit https://app.launchableinc.com/organizations/{organization}/workspaces/"
662
- "{workspace}/test-sessions/{test_session_id} to view uploaded test results "
663
- "(or run `launchable inspect tests --test-session-id {test_session_id}`)"
664
- .format(
665
- organization=org,
666
- workspace=workspace,
667
- test_session_id=self.test_session_id,
668
- ))
662
+ "\nVisit {} to view uploaded test results "
663
+ "(or run `launchable inspect tests --test-session-id {}`)".format(url, self.test_session_id))
664
+
665
+ def _get_test_session_url(self) -> str:
666
+ cbp_workspace = client.get_cbp_workspace()
667
+ if cbp_workspace:
668
+ org_cbp_id, ws_cbp_id = cbp_workspace
669
+ url = "https://cloudbees.io/{}/{}/smart-tests/test-sessions/{}".format(
670
+ org_cbp_id, ws_cbp_id, self.test_session_id)
671
+ else:
672
+ url = "https://app.launchableinc.com/organizations/{}/workspaces/{}/test-sessions/{}".format(
673
+ org, workspace, self.test_session_id)
674
+ return url
669
675
 
670
676
  context.obj = RecordTests(dry_run=context.obj.dry_run)
671
677
 
@@ -223,6 +223,14 @@ LARGE_PAYLOAD_CONNECT_TIMEOUT = 60
223
223
  type=click.Choice(["one-commit", "feature-branch", "recurring"]),
224
224
  hidden=True, # control PTS v2 test selection behavior. Non-committed, so hidden for now.
225
225
  )
226
+ @click.option(
227
+ "--subset-id-file",
228
+ "subset_id_file",
229
+ help="Write the subset ID to a file",
230
+ metavar="FILE",
231
+ type=str,
232
+ hidden=True,
233
+ )
226
234
  @click.pass_context
227
235
  def subset(
228
236
  context: click.core.Context,
@@ -253,6 +261,7 @@ def subset(
253
261
  is_get_tests_from_guess: bool = False,
254
262
  use_case: Optional[str] = None,
255
263
  similarity: Optional[float] = None,
264
+ subset_id_file: Optional[str] = None,
256
265
  ):
257
266
  app = context.obj
258
267
  tracking_client = TrackingClient(Command.SUBSET, app=app)
@@ -392,6 +401,7 @@ def subset(
392
401
  self.is_get_tests_from_guess = is_get_tests_from_guess
393
402
  self.is_output_exclusion_rules = is_output_exclusion_rules
394
403
  self.is_get_tests_from_guess = is_get_tests_from_guess
404
+ self.subset_id_file = subset_id_file
395
405
  super(Optimize, self).__init__(app=app)
396
406
 
397
407
  def _default_output_handler(self, output: List[TestPath], rests: List[TestPath]):
@@ -566,6 +576,17 @@ def subset(
566
576
  if not found:
567
577
  warn_and_exit_if_fail_fast_mode("Nothing that looks like a test file in the current git repository.")
568
578
 
579
+ def _write_subset_id_to_file(self, subset_result: SubsetResult):
580
+ if not subset_result.subset_id:
581
+ print_error_and_die(
582
+ "Subset request did not return a subset ID. Please re-run the command.",
583
+ Tracking.ErrorEvent.INTERNAL_CLI_ERROR,
584
+ )
585
+
586
+ assert self.subset_id_file is not None # Early type guard
587
+ with open(self.subset_id_file, 'w', encoding='utf-8') as f:
588
+ f.write(str(subset_result.subset_id) + '\n')
589
+
569
590
  def request_subset(self) -> SubsetResult:
570
591
  test_runner = context.invoked_subcommand
571
592
  # temporarily extend the timeout because subset API response has become slow
@@ -648,6 +669,9 @@ def subset(
648
669
  else:
649
670
  self.output_handler(output_subset, output_rests)
650
671
 
672
+ if self.subset_id_file:
673
+ self._write_subset_id_to_file(subset_result)
674
+
651
675
  # When Launchable returns an error, the cli skips showing summary
652
676
  # report
653
677
  original_subset = subset_result.subset
@@ -25,6 +25,7 @@ class LaunchableClient:
25
25
  self.tracking_client = tracking_client
26
26
  self.organization, self.workspace = ensure_org_workspace()
27
27
  self._workspace_state_cache: Optional[Dict[str, Union[str, bool]]] = None
28
+ self._cbp_workspace_cache: Optional[Tuple[str, str]] = None
28
29
 
29
30
  def request(
30
31
  self,
@@ -106,6 +107,27 @@ class LaunchableClient:
106
107
  state = self._get_workspace_state()
107
108
  return state.get('pts_v2', False)
108
109
 
110
+ def get_cbp_workspace(self) -> Optional[Tuple[str, str]]:
111
+ """
112
+ Returns (org_cbp_id, workspace_cbp_id) if this is a CBP workspace, else None.
113
+ """
114
+ state = self._get_workspace_state()
115
+ if not state.get('is_cbp_workspace', False):
116
+ return None
117
+
118
+ if self._cbp_workspace_cache is not None:
119
+ return self._cbp_workspace_cache
120
+
121
+ try:
122
+ res = self.request("get", "cbp-workspace")
123
+ res.raise_for_status()
124
+ data = res.json()
125
+ self._cbp_workspace_cache = (data['organizationCbpId'], data['workspaceCbpId'])
126
+ return self._cbp_workspace_cache
127
+ except Exception as e:
128
+ self.print_exception_and_recover(e, "Failed to get CBP workspace info")
129
+ return None
130
+
109
131
  def _get_workspace_state(self) -> dict:
110
132
  """
111
133
  Get the current state of the workspace.
@@ -120,6 +142,7 @@ class LaunchableClient:
120
142
  self._workspace_state_cache = {
121
143
  'fail_fast_mode': state.get('isFailFastMode', False),
122
144
  'pts_v2': state.get('isPtsV2Enabled', False),
145
+ 'is_cbp_workspace': state.get('isCbpWorkspace', False),
123
146
  }
124
147
  return self._workspace_state_cache
125
148
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: launchable
3
- Version: 1.124.2
3
+ Version: 1.124.3
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -141,6 +141,7 @@ src/test/java/com/launchableinc/ingest/commits/AllTests.java
141
141
  src/test/java/com/launchableinc/ingest/commits/BUILD
142
142
  src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java
143
143
  src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java
144
+ src/test/java/com/launchableinc/ingest/commits/GitFileTest.java
144
145
  src/test/java/com/launchableinc/ingest/commits/MainTest.java
145
146
  src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java
146
147
  src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java
@@ -5,11 +5,10 @@ import org.eclipse.jgit.lib.ObjectLoader;
5
5
  import org.eclipse.jgit.lib.ObjectReader;
6
6
 
7
7
  import java.io.IOException;
8
- import java.io.InputStreamReader;
9
8
  import java.io.OutputStream;
10
- import java.io.Reader;
9
+ import java.nio.ByteBuffer;
11
10
  import java.nio.charset.CharacterCodingException;
12
- import java.nio.charset.StandardCharsets;
11
+ import java.nio.charset.CodingErrorAction;
13
12
 
14
13
  import static java.nio.charset.StandardCharsets.UTF_8;
15
14
  import static org.eclipse.jgit.lib.Constants.*;
@@ -67,12 +66,10 @@ final class GitFile implements VirtualFile {
67
66
  */
68
67
  public boolean isText() throws IOException {
69
68
  try {
70
- char[] c = new char[1024];
71
- try (Reader r = new InputStreamReader(open().openStream(), UTF_8)) {
72
- while (r.read(c)!= -1) {
73
- // Read the file until EOF.
74
- }
75
- }
69
+ UTF_8.newDecoder()
70
+ .onMalformedInput(CodingErrorAction.REPORT)
71
+ .onUnmappableCharacter(CodingErrorAction.REPORT)
72
+ .decode(ByteBuffer.wrap(open().getCachedBytes(Integer.MAX_VALUE)));
76
73
  return true;
77
74
  } catch (CharacterCodingException e) {
78
75
  return false;
@@ -10,6 +10,7 @@ import org.junit.runners.Suite.SuiteClasses;
10
10
  MainTest.class,
11
11
  FileChunkStreamerTest.class,
12
12
  SSLBypassTest.class,
13
+ GitFileTest.class,
13
14
  ProgressReportingConsumerTest.class
14
15
  })
15
16
  public class AllTests {}
@@ -0,0 +1,51 @@
1
+ package com.launchableinc.ingest.commits;
2
+
3
+ import static com.google.common.truth.Truth.assertThat;
4
+
5
+ import java.io.File;
6
+ import org.eclipse.jgit.api.Git;
7
+ import org.eclipse.jgit.lib.ObjectId;
8
+ import org.eclipse.jgit.lib.ObjectInserter;
9
+ import org.eclipse.jgit.lib.Repository;
10
+ import org.junit.Rule;
11
+ import org.junit.Test;
12
+ import org.junit.rules.TemporaryFolder;
13
+ import org.junit.runner.RunWith;
14
+ import org.junit.runners.JUnit4;
15
+
16
+ import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
17
+
18
+ @RunWith(JUnit4.class)
19
+ public class GitFileTest {
20
+
21
+ @Rule public TemporaryFolder tmp = new TemporaryFolder();
22
+
23
+ @Test
24
+ public void isText_textFile_returnsTrue() throws Exception {
25
+ assertThat(gitFileWithContent("public class Hello {}".getBytes()).isText()).isTrue();
26
+ }
27
+
28
+ @Test
29
+ public void isText_binaryFile_returnsFalse() throws Exception {
30
+ // 0xFF 0xFE is invalid UTF-8
31
+ assertThat(gitFileWithContent(new byte[]{(byte) 0xFF, (byte) 0xFE, 0x00, 0x01}).isText()).isFalse();
32
+ }
33
+
34
+ @Test
35
+ public void isText_utf8MultiByte_returnsTrue() throws Exception {
36
+ assertThat(gitFileWithContent("日本語テスト".getBytes(java.nio.charset.StandardCharsets.UTF_8)).isText()).isTrue();
37
+ }
38
+
39
+ private GitFile gitFileWithContent(byte[] content) throws Exception {
40
+ File repoDir = tmp.newFolder();
41
+ try (Git git = Git.init().setDirectory(repoDir).call()) {
42
+ Repository repo = git.getRepository();
43
+ ObjectId blobId;
44
+ try (ObjectInserter inserter = repo.newObjectInserter()) {
45
+ blobId = inserter.insert(OBJ_BLOB, content);
46
+ inserter.flush();
47
+ }
48
+ return new GitFile("test", "file", blobId, repo.newObjectReader());
49
+ }
50
+ }
51
+ }
@@ -687,3 +687,233 @@ class SubsetTest(CliTestCase):
687
687
  """
688
688
  payload = json.loads(gzip.decompress(responses.calls[1].request.body).decode())
689
689
  self.assertIn([{"type": "file", "name": "tests/commands/test_subset.py"}], payload.get("testPaths", []))
690
+
691
+ @responses.activate
692
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
693
+ def test_subset_id_file_not_set(self):
694
+ pipe = "test_1.py\ntest_2.py\n"
695
+ mock_json_response = {
696
+ "testPaths": [
697
+ [{"type": "file", "name": "test_1.py"}],
698
+ [{"type": "file", "name": "test_2.py"}],
699
+ ],
700
+ "testRunner": "file",
701
+ "rest": [],
702
+ "subsettingId": self.subsetting_id,
703
+ "summary": {
704
+ "subset": {"duration": 10, "candidates": 2, "rate": 100},
705
+ "rest": {"duration": 0, "candidates": 0, "rate": 0},
706
+ },
707
+ "isObservation": False,
708
+ }
709
+ responses.replace(
710
+ responses.POST,
711
+ "{}/intake/organizations/{}/workspaces/{}/subset".format(
712
+ get_base_url(), self.organization, self.workspace),
713
+ json=mock_json_response,
714
+ status=200,
715
+ )
716
+
717
+ sentinel = tempfile.NamedTemporaryFile(delete=False)
718
+ sentinel_path = sentinel.name
719
+ sentinel.close()
720
+ os.unlink(sentinel_path)
721
+
722
+ result = self.cli(
723
+ "subset",
724
+ "--session", self.session,
725
+ "file",
726
+ mix_stderr=False,
727
+ input=pipe,
728
+ )
729
+ self.assert_success(result)
730
+ self.assertEqual(result.stdout, "test_1.py\ntest_2.py\n")
731
+ self.assertFalse(os.path.exists(sentinel_path))
732
+
733
+ @responses.activate
734
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
735
+ def test_subset_id_file_written(self):
736
+ pipe = "test_1.py\ntest_2.py\n"
737
+ mock_json_response = {
738
+ "testPaths": [
739
+ [{"type": "file", "name": "test_1.py"}],
740
+ [{"type": "file", "name": "test_2.py"}],
741
+ ],
742
+ "testRunner": "file",
743
+ "rest": [],
744
+ "subsettingId": self.subsetting_id,
745
+ "summary": {
746
+ "subset": {"duration": 10, "candidates": 2, "rate": 100},
747
+ "rest": {"duration": 0, "candidates": 0, "rate": 0},
748
+ },
749
+ "isObservation": False,
750
+ }
751
+ responses.replace(
752
+ responses.POST,
753
+ "{}/intake/organizations/{}/workspaces/{}/subset".format(
754
+ get_base_url(), self.organization, self.workspace),
755
+ json=mock_json_response,
756
+ status=200,
757
+ )
758
+
759
+ with tempfile.NamedTemporaryFile(delete=False) as id_file:
760
+ id_file_path = id_file.name
761
+
762
+ try:
763
+ result = self.cli(
764
+ "subset",
765
+ "--session", self.session,
766
+ "--subset-id-file", id_file_path,
767
+ "file",
768
+ mix_stderr=False,
769
+ input=pipe,
770
+ )
771
+ self.assert_success(result)
772
+ self.assertEqual(result.stdout, "test_1.py\ntest_2.py\n")
773
+ with open(id_file_path) as f:
774
+ self.assertEqual(f.read(), "{}\n".format(self.subsetting_id))
775
+ finally:
776
+ os.unlink(id_file_path)
777
+
778
+ @responses.activate
779
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
780
+ def test_subset_id_file_with_target(self):
781
+ pipe = "test_1.py\ntest_2.py\ntest_3.py\n"
782
+ mock_json_response = {
783
+ "testPaths": [
784
+ [{"type": "file", "name": "test_1.py"}],
785
+ ],
786
+ "testRunner": "file",
787
+ "rest": [
788
+ [{"type": "file", "name": "test_2.py"}],
789
+ [{"type": "file", "name": "test_3.py"}],
790
+ ],
791
+ "subsettingId": self.subsetting_id,
792
+ "summary": {
793
+ "subset": {"duration": 5, "candidates": 1, "rate": 33},
794
+ "rest": {"duration": 10, "candidates": 2, "rate": 67},
795
+ },
796
+ "isObservation": False,
797
+ }
798
+ responses.replace(
799
+ responses.POST,
800
+ "{}/intake/organizations/{}/workspaces/{}/subset".format(
801
+ get_base_url(), self.organization, self.workspace),
802
+ json=mock_json_response,
803
+ status=200,
804
+ )
805
+
806
+ with tempfile.NamedTemporaryFile(delete=False) as id_file:
807
+ id_file_path = id_file.name
808
+
809
+ try:
810
+ result = self.cli(
811
+ "subset",
812
+ "--session", self.session,
813
+ "--target", "30%",
814
+ "--subset-id-file", id_file_path,
815
+ "file",
816
+ mix_stderr=False,
817
+ input=pipe,
818
+ )
819
+ self.assert_success(result)
820
+ self.assertEqual(result.stdout, "test_1.py\n")
821
+ with open(id_file_path) as f:
822
+ self.assertEqual(f.read(), "{}\n".format(self.subsetting_id))
823
+ finally:
824
+ os.unlink(id_file_path)
825
+
826
+ @responses.activate
827
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
828
+ def test_subset_id_file_with_rest(self):
829
+ pipe = "test_1.py\ntest_2.py\n"
830
+ mock_json_response = {
831
+ "testPaths": [
832
+ [{"type": "file", "name": "test_1.py"}],
833
+ ],
834
+ "testRunner": "file",
835
+ "rest": [
836
+ [{"type": "file", "name": "test_2.py"}],
837
+ ],
838
+ "subsettingId": self.subsetting_id,
839
+ "summary": {
840
+ "subset": {"duration": 5, "candidates": 1, "rate": 50},
841
+ "rest": {"duration": 5, "candidates": 1, "rate": 50},
842
+ },
843
+ "isObservation": False,
844
+ }
845
+ responses.replace(
846
+ responses.POST,
847
+ "{}/intake/organizations/{}/workspaces/{}/subset".format(
848
+ get_base_url(), self.organization, self.workspace),
849
+ json=mock_json_response,
850
+ status=200,
851
+ )
852
+
853
+ with tempfile.NamedTemporaryFile(delete=False) as id_file, \
854
+ tempfile.NamedTemporaryFile(delete=False) as rest_file:
855
+ id_file_path = id_file.name
856
+ rest_file_path = rest_file.name
857
+
858
+ try:
859
+ result = self.cli(
860
+ "subset",
861
+ "--session", self.session,
862
+ "--rest", rest_file_path,
863
+ "--subset-id-file", id_file_path,
864
+ "file",
865
+ mix_stderr=False,
866
+ input=pipe,
867
+ )
868
+ self.assert_success(result)
869
+ self.assertEqual(result.stdout, "test_1.py\n")
870
+ with open(id_file_path) as f:
871
+ self.assertEqual(f.read(), "{}\n".format(self.subsetting_id))
872
+ with open(rest_file_path) as f:
873
+ self.assertIn("test_2.py", f.read())
874
+ finally:
875
+ os.unlink(id_file_path)
876
+ os.unlink(rest_file_path)
877
+
878
+ @responses.activate
879
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
880
+ def test_subset_id_file_no_id_returned(self):
881
+ pipe = "test_1.py\n"
882
+ mock_json_response = {
883
+ "testPaths": [
884
+ [{"type": "file", "name": "test_1.py"}],
885
+ ],
886
+ "testRunner": "file",
887
+ "rest": [],
888
+ "subsettingId": "",
889
+ "summary": {
890
+ "subset": {"duration": 5, "candidates": 1, "rate": 100},
891
+ "rest": {"duration": 0, "candidates": 0, "rate": 0},
892
+ },
893
+ "isObservation": False,
894
+ }
895
+ responses.replace(
896
+ responses.POST,
897
+ "{}/intake/organizations/{}/workspaces/{}/subset".format(
898
+ get_base_url(), self.organization, self.workspace),
899
+ json=mock_json_response,
900
+ status=200,
901
+ )
902
+
903
+ with tempfile.NamedTemporaryFile(delete=False) as id_file:
904
+ id_file_path = id_file.name
905
+
906
+ try:
907
+ result = self.cli(
908
+ "subset",
909
+ "--session", self.session,
910
+ "--subset-id-file", id_file_path,
911
+ "file",
912
+ mix_stderr=False,
913
+ input=pipe,
914
+ )
915
+ self.assert_exit_code(result, 1)
916
+ self.assertIn("Subset request did not return a subset ID", result.stderr)
917
+ finally:
918
+ if os.path.exists(id_file_path):
919
+ os.unlink(id_file_path)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes