launchable 1.124.0__tar.gz → 1.124.2__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 (396) hide show
  1. {launchable-1.124.0 → launchable-1.124.2}/PKG-INFO +1 -1
  2. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/robot.py +31 -19
  3. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/PKG-INFO +1 -1
  4. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/SOURCES.txt +2 -0
  5. launchable-1.124.2/tests/data/robot/output.xml +194 -0
  6. launchable-1.124.2/tests/data/robot/record_test_result.json +225 -0
  7. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_robot.py +10 -0
  8. {launchable-1.124.0 → launchable-1.124.2}/.bazelrc +0 -0
  9. {launchable-1.124.0 → launchable-1.124.2}/.bazelversion +0 -0
  10. {launchable-1.124.0 → launchable-1.124.2}/.editorconfig +0 -0
  11. {launchable-1.124.0 → launchable-1.124.2}/.github/release.yml +0 -0
  12. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/bazel-test.yml +0 -0
  13. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/e2e.yml +0 -0
  14. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/pre-commit.yml +0 -0
  15. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/python-package.yml +0 -0
  16. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/python-publish.yml +0 -0
  17. {launchable-1.124.0 → launchable-1.124.2}/.github/workflows/update_maven_install_json.yml +0 -0
  18. {launchable-1.124.0 → launchable-1.124.2}/.gitignore +0 -0
  19. {launchable-1.124.0 → launchable-1.124.2}/.pre-commit-config.yaml +0 -0
  20. {launchable-1.124.0 → launchable-1.124.2}/.python-version +0 -0
  21. {launchable-1.124.0 → launchable-1.124.2}/.tagpr +0 -0
  22. {launchable-1.124.0 → launchable-1.124.2}/CONTRIBUTING.md +0 -0
  23. {launchable-1.124.0 → launchable-1.124.2}/Dockerfile +0 -0
  24. {launchable-1.124.0 → launchable-1.124.2}/LICENSE.txt +0 -0
  25. {launchable-1.124.0 → launchable-1.124.2}/Pipfile +0 -0
  26. {launchable-1.124.0 → launchable-1.124.2}/README.md +0 -0
  27. {launchable-1.124.0 → launchable-1.124.2}/WORKSPACE +0 -0
  28. {launchable-1.124.0 → launchable-1.124.2}/build-java.sh +0 -0
  29. {launchable-1.124.0 → launchable-1.124.2}/launchable/__init__.py +0 -0
  30. {launchable-1.124.0 → launchable-1.124.2}/launchable/__main__.py +0 -0
  31. {launchable-1.124.0 → launchable-1.124.2}/launchable/app.py +0 -0
  32. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/__init__.py +0 -0
  33. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/compare/__init__.py +0 -0
  34. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/compare/subsets.py +0 -0
  35. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/detect_flakes.py +0 -0
  36. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/gate.py +0 -0
  37. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/helper.py +0 -0
  38. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/inspect/__init__.py +0 -0
  39. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/inspect/model.py +0 -0
  40. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/inspect/subset.py +0 -0
  41. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/inspect/tests.py +0 -0
  42. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/__init__.py +0 -0
  43. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/attachment.py +0 -0
  44. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/build.py +0 -0
  45. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/case_event.py +0 -0
  46. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/commit.py +0 -0
  47. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/session.py +0 -0
  48. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/record/tests.py +0 -0
  49. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/split_subset.py +0 -0
  50. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/stats/__init__.py +0 -0
  51. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/stats/test_sessions.py +0 -0
  52. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/subset.py +0 -0
  53. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/test_path_writer.py +0 -0
  54. {launchable-1.124.0 → launchable-1.124.2}/launchable/commands/verify.py +0 -0
  55. {launchable-1.124.0 → launchable-1.124.2}/launchable/jar/exe_deploy.jar +0 -0
  56. {launchable-1.124.0 → launchable-1.124.2}/launchable/plugins/__init__.py +0 -0
  57. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/__init__.py +0 -0
  58. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/adb.py +0 -0
  59. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/ant.py +0 -0
  60. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/bazel.py +0 -0
  61. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/behave.py +0 -0
  62. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/codeceptjs.py +0 -0
  63. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/ctest.py +0 -0
  64. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/cts.py +0 -0
  65. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/cucumber.py +0 -0
  66. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/cypress.py +0 -0
  67. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/dotnet.py +0 -0
  68. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/file.py +0 -0
  69. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/flutter.py +0 -0
  70. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/go_test.py +0 -0
  71. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/googletest.py +0 -0
  72. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/gradle.py +0 -0
  73. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/jasmine.py +0 -0
  74. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/jest.py +0 -0
  75. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/karma.py +0 -0
  76. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/launchable.py +0 -0
  77. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/maven.py +0 -0
  78. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/minitest.py +0 -0
  79. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/nunit.py +0 -0
  80. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/playwright.py +0 -0
  81. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/prove.py +0 -0
  82. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/pytest.py +0 -0
  83. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/raw.py +0 -0
  84. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/rspec.py +0 -0
  85. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/vitest.py +0 -0
  86. {launchable-1.124.0 → launchable-1.124.2}/launchable/test_runners/xctest.py +0 -0
  87. {launchable-1.124.0 → launchable-1.124.2}/launchable/testpath.py +0 -0
  88. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/__init__.py +0 -0
  89. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/authentication.py +0 -0
  90. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/ci_provider.py +0 -0
  91. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/click.py +0 -0
  92. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/commands.py +0 -0
  93. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/commit_ingester.py +0 -0
  94. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/common_tz.py +0 -0
  95. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/env_keys.py +0 -0
  96. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/exceptions.py +0 -0
  97. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/fail_fast_mode.py +0 -0
  98. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/file_name_pattern.py +0 -0
  99. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/git_log_parser.py +0 -0
  100. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/glob.py +0 -0
  101. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/gzipgen.py +0 -0
  102. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/http_client.py +0 -0
  103. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/java.py +0 -0
  104. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/launchable_client.py +0 -0
  105. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/link.py +0 -0
  106. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/logger.py +0 -0
  107. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/no_build.py +0 -0
  108. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/sax.py +0 -0
  109. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/session.py +0 -0
  110. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/subprocess.py +0 -0
  111. {launchable-1.124.0 → launchable-1.124.2}/launchable/utils/tracking.py +0 -0
  112. {launchable-1.124.0 → launchable-1.124.2}/launchable/version.py +0 -0
  113. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/dependency_links.txt +0 -0
  114. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/entry_points.txt +0 -0
  115. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/requires.txt +0 -0
  116. {launchable-1.124.0 → launchable-1.124.2}/launchable.egg-info/top_level.txt +0 -0
  117. {launchable-1.124.0 → launchable-1.124.2}/pyproject.toml +0 -0
  118. {launchable-1.124.0 → launchable-1.124.2}/renovate.json +0 -0
  119. {launchable-1.124.0 → launchable-1.124.2}/setup.cfg +0 -0
  120. {launchable-1.124.0 → launchable-1.124.2}/setup.py +0 -0
  121. {launchable-1.124.0 → launchable-1.124.2}/src/BUILD +0 -0
  122. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  123. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
  124. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +0 -0
  125. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
  126. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +0 -0
  127. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  128. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +0 -0
  129. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +0 -0
  130. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +0 -0
  131. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  132. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  133. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
  134. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  135. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  136. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
  137. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  138. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -0
  139. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  140. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  141. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
  142. {launchable-1.124.0 → launchable-1.124.2}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
  143. {launchable-1.124.0 → launchable-1.124.2}/src/maven_install.json +0 -0
  144. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +0 -0
  145. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  146. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +0 -0
  147. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +0 -0
  148. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
  149. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
  150. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +0 -0
  151. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  152. {launchable-1.124.0 → launchable-1.124.2}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  153. {launchable-1.124.0 → launchable-1.124.2}/test-runner/__main__.py +0 -0
  154. {launchable-1.124.0 → launchable-1.124.2}/tests/__init__.py +0 -0
  155. {launchable-1.124.0 → launchable-1.124.2}/tests/cli_test_case.py +0 -0
  156. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/__init__.py +0 -0
  157. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/compare/__init__.py +0 -0
  158. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/compare/test_subsets.py +0 -0
  159. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/inspect/test_model.py +0 -0
  160. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/inspect/test_subset.py +0 -0
  161. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/inspect/test_tests.py +0 -0
  162. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/__init__.py +0 -0
  163. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_attachment.py +0 -0
  164. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_build.py +0 -0
  165. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_case_event.py +0 -0
  166. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_commit.py +0 -0
  167. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_session.py +0 -0
  168. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/record/test_tests.py +0 -0
  169. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_api_error.py +0 -0
  170. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_detect_flakes.py +0 -0
  171. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_gate.py +0 -0
  172. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_helper.py +0 -0
  173. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_split_subset.py +0 -0
  174. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_subset.py +0 -0
  175. {launchable-1.124.0 → launchable-1.124.2}/tests/commands/test_verify.py +0 -0
  176. {launchable-1.124.0 → launchable-1.124.2}/tests/data/adb/subset_result.json +0 -0
  177. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/junitreport/TEST-com.launchable.HelloWorldTest.xml +0 -0
  178. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/junitreport/TEST-com.launchable.library.CacheTest.xml +0 -0
  179. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  180. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/record_test_result.json +0 -0
  181. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/src/com/launchable/HelloWorld.java +0 -0
  182. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/src/com/launchable/HelloWorldTest.java +0 -0
  183. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/src/com/launchable/library/Cache.java +0 -0
  184. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/src/com/launchable/library/CacheTest.java +0 -0
  185. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ant/subset_result.json +0 -0
  186. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  187. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
  188. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  189. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  190. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  191. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  192. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  193. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  194. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  195. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  196. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  197. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  198. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  199. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  200. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  201. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  202. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  203. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  204. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  205. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/build_event.json +0 -0
  206. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/build_event_rest.json +0 -0
  207. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/record_test_result.json +0 -0
  208. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  209. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  210. {launchable-1.124.0 → launchable-1.124.2}/tests/data/bazel/subset_result.json +0 -0
  211. {launchable-1.124.0 → launchable-1.124.2}/tests/data/behave/record_test_result.json +0 -0
  212. {launchable-1.124.0 → launchable-1.124.2}/tests/data/behave/reports/report.xml +0 -0
  213. {launchable-1.124.0 → launchable-1.124.2}/tests/data/behave/subset_result.json +0 -0
  214. {launchable-1.124.0 → launchable-1.124.2}/tests/data/broken_xml/broken.xml +0 -0
  215. {launchable-1.124.0 → launchable-1.124.2}/tests/data/broken_xml/normal.xml +0 -0
  216. {launchable-1.124.0 → launchable-1.124.2}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
  217. {launchable-1.124.0 → launchable-1.124.2}/tests/data/codeceptjs/record_test_result.json +0 -0
  218. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  219. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ctest/ctest_list.json +0 -0
  220. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ctest/record_test_result.json +0 -0
  221. {launchable-1.124.0 → launchable-1.124.2}/tests/data/ctest/subset_result.json +0 -0
  222. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cts/record_test_result.json +0 -0
  223. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cts/subset_result.json +0 -0
  224. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cts/test_result.xml +0 -0
  225. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/features/foo/bar.feature +0 -0
  226. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  227. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/features/foo-bar.feature +0 -0
  228. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  229. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/record_test_json_result.json +0 -0
  230. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/record_test_result.json +0 -0
  231. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  232. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  233. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  234. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/report/dummy.xml +0 -0
  235. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cucumber/report/result.json +0 -0
  236. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cypress/empty.json +0 -0
  237. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cypress/empty.xml +0 -0
  238. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cypress/record_test_result.json +0 -0
  239. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cypress/subset_result.json +0 -0
  240. {launchable-1.124.0 → launchable-1.124.2}/tests/data/cypress/test-result.xml +0 -0
  241. {launchable-1.124.0 → launchable-1.124.2}/tests/data/dotnet/record_test_result.json +0 -0
  242. {launchable-1.124.0 → launchable-1.124.2}/tests/data/dotnet/test-result.xml +0 -0
  243. {launchable-1.124.0 → launchable-1.124.2}/tests/data/flutter/record_test_result.json +0 -0
  244. {launchable-1.124.0 → launchable-1.124.2}/tests/data/flutter/report.json +0 -0
  245. {launchable-1.124.0 → launchable-1.124.2}/tests/data/git_log_ingest/sample.out +0 -0
  246. {launchable-1.124.0 → launchable-1.124.2}/tests/data/go_test/record_test_result.json +0 -0
  247. {launchable-1.124.0 → launchable-1.124.2}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  248. {launchable-1.124.0 → launchable-1.124.2}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  249. {launchable-1.124.0 → launchable-1.124.2}/tests/data/go_test/subset_result.json +0 -0
  250. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/fail/output.xml +0 -0
  251. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/fail/record_test_result.json +0 -0
  252. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/output_a.xml +0 -0
  253. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/output_b.xml +0 -0
  254. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/record_test_result.json +0 -0
  255. {launchable-1.124.0 → launchable-1.124.2}/tests/data/googletest/subset_result.json +0 -0
  256. {launchable-1.124.0 → launchable-1.124.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/App2Test.java +0 -0
  257. {launchable-1.124.0 → launchable-1.124.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/AppTest.java +0 -0
  258. {launchable-1.124.0 → launchable-1.124.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/sub/App3Test.java +0 -0
  259. {launchable-1.124.0 → launchable-1.124.2}/tests/data/gradle/recursion/expected.json +0 -0
  260. {launchable-1.124.0 → launchable-1.124.2}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  261. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jasmine/README.md +0 -0
  262. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
  263. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jasmine/jasmine-test-results.json +0 -0
  264. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jasmine/record_test_result.json +0 -0
  265. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jasmine/subset_payload.json +0 -0
  266. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jest/junit.xml +0 -0
  267. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jest/record_test_result.json +0 -0
  268. {launchable-1.124.0 → launchable-1.124.2}/tests/data/jest/subset_result.json +0 -0
  269. {launchable-1.124.0 → launchable-1.124.2}/tests/data/karma/README.md +0 -0
  270. {launchable-1.124.0 → launchable-1.124.2}/tests/data/karma/record_test_result.json +0 -0
  271. {launchable-1.124.0 → launchable-1.124.2}/tests/data/karma/sample-report.json +0 -0
  272. {launchable-1.124.0 → launchable-1.124.2}/tests/data/karma/subset_payload.json +0 -0
  273. {launchable-1.124.0 → launchable-1.124.2}/tests/data/karma/subset_result.json +0 -0
  274. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/createdFile_1.lst +0 -0
  275. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/createdFile_2.lst +0 -0
  276. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/App2Test.java +0 -0
  277. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/AppTest.java +0 -0
  278. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
  279. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/list.lst +0 -0
  280. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/record_test_result.json +0 -0
  281. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/reports/TEST-1.xml +0 -0
  282. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/reports/TEST-2.xml +0 -0
  283. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/reports/TEST-nested.xml +0 -0
  284. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/reports/dummy.xml +0 -0
  285. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
  286. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_by_confidence_result.json +0 -0
  287. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_from_file_result.json +0 -0
  288. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_result.json +0 -0
  289. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
  290. {launchable-1.124.0 → launchable-1.124.2}/tests/data/maven/subset_with_exclude_rules_result.json +0 -0
  291. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  292. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  293. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  294. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  295. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/TEST-UserTest.xml +0 -0
  296. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/record_test_result.json +0 -0
  297. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/record_test_result_chunk1.json +0 -0
  298. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/record_test_result_chunk2.json +0 -0
  299. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/subset_result.json +0 -0
  300. {launchable-1.124.0 → launchable-1.124.2}/tests/data/minitest/test/example_test.rb +0 -0
  301. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/list.xml +0 -0
  302. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  303. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  304. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/output-linux.xml +0 -0
  305. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/output-windows.xml +0 -0
  306. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/record_test_result-linux.json +0 -0
  307. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/record_test_result-windows.json +0 -0
  308. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/src/.gitignore +0 -0
  309. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/src/Program.cs +0 -0
  310. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/src/README.md +0 -0
  311. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/src/Test.cs +0 -0
  312. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/src/calc.csproj +0 -0
  313. {launchable-1.124.0 → launchable-1.124.2}/tests/data/nunit/subset_result.json +0 -0
  314. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/packages/e2e/.gitkeep +0 -0
  315. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/playwright.config.ts +0 -0
  316. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/record_test_result.json +0 -0
  317. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/record_test_result_with_json.json +0 -0
  318. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/record_test_result_with_json_base.json +0 -0
  319. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/record_test_result_with_prefix.json +0 -0
  320. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/report.json +0 -0
  321. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/report.xml +0 -0
  322. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/report_with_json_base.json +0 -0
  323. {launchable-1.124.0 → launchable-1.124.2}/tests/data/playwright/report_with_prefix.json +0 -0
  324. {launchable-1.124.0 → launchable-1.124.2}/tests/data/prove/record_test_result.json +0 -0
  325. {launchable-1.124.0 → launchable-1.124.2}/tests/data/prove/report.xml +0 -0
  326. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/pytest.ini +0 -0
  327. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/record_test_result.json +0 -0
  328. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/record_test_result_json.json +0 -0
  329. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/report.json +0 -0
  330. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/report.xml +0 -0
  331. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/subset_result.json +0 -0
  332. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/conftest.py +0 -0
  333. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/fooo/__init__.py +0 -0
  334. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  335. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  336. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/funcs3_test.py +0 -0
  337. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/test_funcs1.py +0 -0
  338. {launchable-1.124.0 → launchable-1.124.2}/tests/data/pytest/tests/test_funcs2.py +0 -0
  339. {launchable-1.124.0 → launchable-1.124.2}/tests/data/robot/dryrun.xml +0 -0
  340. /launchable-1.124.0/tests/data/robot/output.xml → /launchable-1.124.2/tests/data/robot/output_legacy.xml +0 -0
  341. {launchable-1.124.0 → launchable-1.124.2}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  342. /launchable-1.124.0/tests/data/robot/record_test_result.json → /launchable-1.124.2/tests/data/robot/record_test_legacy_result.json +0 -0
  343. {launchable-1.124.0 → launchable-1.124.2}/tests/data/robot/single-output.xml +0 -0
  344. {launchable-1.124.0 → launchable-1.124.2}/tests/data/robot/subset_result.json +0 -0
  345. {launchable-1.124.0 → launchable-1.124.2}/tests/data/rspec/record_test_result.json +0 -0
  346. {launchable-1.124.0 → launchable-1.124.2}/tests/data/rspec/rspec.xml +0 -0
  347. {launchable-1.124.0 → launchable-1.124.2}/tests/data/vitest/record_test_result.json +0 -0
  348. {launchable-1.124.0 → launchable-1.124.2}/tests/data/vitest/report.xml +0 -0
  349. {launchable-1.124.0 → launchable-1.124.2}/tests/data/xctest/junit.xml +0 -0
  350. {launchable-1.124.0 → launchable-1.124.2}/tests/data/xctest/record_test_result.json +0 -0
  351. {launchable-1.124.0 → launchable-1.124.2}/tests/data/xctest/subset_result.json +0 -0
  352. {launchable-1.124.0 → launchable-1.124.2}/tests/helper.py +0 -0
  353. {launchable-1.124.0 → launchable-1.124.2}/tests/plugins/foo.py +0 -0
  354. {launchable-1.124.0 → launchable-1.124.2}/tests/test_cli_test_case.py +0 -0
  355. {launchable-1.124.0 → launchable-1.124.2}/tests/test_plugin.py +0 -0
  356. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/__init__.py +0 -0
  357. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_adb.py +0 -0
  358. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_ant.py +0 -0
  359. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_bazel.py +0 -0
  360. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_behave.py +0 -0
  361. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_codeceptjs.py +0 -0
  362. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_ctest.py +0 -0
  363. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_cts.py +0 -0
  364. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_cucumber.py +0 -0
  365. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_cypress.py +0 -0
  366. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_dotnet.py +0 -0
  367. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_go_test.py +0 -0
  368. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_googletest.py +0 -0
  369. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_gradle.py +0 -0
  370. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_jasmine.py +0 -0
  371. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_jest.py +0 -0
  372. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_karma.py +0 -0
  373. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_maven.py +0 -0
  374. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_minitest.py +0 -0
  375. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_nunit.py +0 -0
  376. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_playwright.py +0 -0
  377. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_prove.py +0 -0
  378. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_pytest.py +0 -0
  379. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_raw.py +0 -0
  380. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_rspec.py +0 -0
  381. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_vitest.py +0 -0
  382. {launchable-1.124.0 → launchable-1.124.2}/tests/test_runners/test_xctest.py +0 -0
  383. {launchable-1.124.0 → launchable-1.124.2}/tests/test_session.py +0 -0
  384. {launchable-1.124.0 → launchable-1.124.2}/tests/test_testpath.py +0 -0
  385. {launchable-1.124.0 → launchable-1.124.2}/tests/test_version.py +0 -0
  386. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/__init__.py +0 -0
  387. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_authentication.py +0 -0
  388. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_click.py +0 -0
  389. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_fail_fast_mode.py +0 -0
  390. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_file_name_pattern.py +0 -0
  391. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_git_log_parser.py +0 -0
  392. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_glob.py +0 -0
  393. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_gzipgen.py +0 -0
  394. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_http_client.py +0 -0
  395. {launchable-1.124.0 → launchable-1.124.2}/tests/utils/test_link.py +0 -0
  396. {launchable-1.124.0 → launchable-1.124.2}/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.0
3
+ Version: 1.124.2
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -25,19 +25,29 @@ def parse_func(p: str) -> ET.ElementTree:
25
25
  nested_status = nested_status_node.get('status') if nested_status_node is not None else None
26
26
 
27
27
  if status is not None:
28
- start_time_str = status_node.get('starttime') if status_node is not None else ''
29
- end_time_str = status_node.get('endtime') if status_node is not None else ''
30
-
31
- if start_time_str != '' and end_time_str != '':
32
- start_time = datetime.strptime(str(start_time_str), DATETIME_FORMAT)
33
- end_time = datetime.strptime(str(end_time_str), DATETIME_FORMAT)
34
-
35
- duration = end_time - start_time
28
+ duration_seconds = None
29
+
30
+ if status_node is not None:
31
+ # RF 7.0+: elapsed attribute in seconds
32
+ elapsed_str = status_node.get('elapsed')
33
+ if elapsed_str is not None:
34
+ duration_seconds = float(elapsed_str)
35
+ else:
36
+ # RF < 7.0: starttime/endtime attributes
37
+ start_time_str = status_node.get('starttime', '')
38
+ end_time_str = status_node.get('endtime', '')
39
+ if start_time_str and end_time_str:
40
+ try:
41
+ start_time = datetime.strptime(start_time_str, DATETIME_FORMAT)
42
+ end_time = datetime.strptime(end_time_str, DATETIME_FORMAT)
43
+ duration_seconds = (end_time - start_time).total_seconds()
44
+ except ValueError:
45
+ duration_seconds = 0
36
46
 
37
47
  testcase = ET.SubElement(testsuite, "testcase", {
38
48
  "name": str(test_name),
39
49
  "classname": str(suite_name),
40
- "time": str(duration.total_seconds()) if duration is not None else '0',
50
+ "time": str(duration_seconds) if duration_seconds is not None else '0',
41
51
  })
42
52
 
43
53
  if status == "FAIL":
@@ -48,20 +58,22 @@ def parse_func(p: str) -> ET.ElementTree:
48
58
  if status == "NOT_RUN" or nested_status == 'NOT_RUN':
49
59
  skipped = ET.SubElement(testcase, "skipped") # noqa: F841
50
60
 
61
+ def find_leaf_suites(suite: ET.Element):
62
+ nested = suite.findall(SUITE_TAG_NAME)
63
+ if not nested:
64
+ return [suite]
65
+ leaves = []
66
+ for child in nested:
67
+ leaves.extend(find_leaf_suites(child))
68
+ return leaves
69
+
51
70
  original_tree = ET.parse(p)
52
71
  testsuite = ET.Element("testsuite", {"name": "robot"})
53
72
 
54
73
  SUITE_TAG_NAME = "suite"
55
- for suites in original_tree.findall(SUITE_TAG_NAME):
56
- nested_suites = suites.findall(SUITE_TAG_NAME)
57
-
58
- if nested_suites:
59
- # Run tests in a directory
60
- for suite in nested_suites:
61
- parse_suite(suite)
62
- else:
63
- # Run tests in a single file
64
- parse_suite(suites)
74
+ for top_suite in original_tree.findall(SUITE_TAG_NAME):
75
+ for leaf_suite in find_leaf_suites(top_suite):
76
+ parse_suite(leaf_suite)
65
77
 
66
78
  return ET.ElementTree(testsuite)
67
79
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: launchable
3
- Version: 1.124.0
3
+ Version: 1.124.2
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -340,7 +340,9 @@ tests/data/pytest/tests/fooo/filenameonly_test.py
340
340
  tests/data/pytest/tests/fooo/func4_test.py
341
341
  tests/data/robot/dryrun.xml
342
342
  tests/data/robot/output.xml
343
+ tests/data/robot/output_legacy.xml
343
344
  tests/data/robot/record_test_executed_only_one_file_result.json
345
+ tests/data/robot/record_test_legacy_result.json
344
346
  tests/data/robot/record_test_result.json
345
347
  tests/data/robot/single-output.xml
346
348
  tests/data/robot/subset_result.json
@@ -0,0 +1,194 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <robot generator="Robot 7.4.2 (Python 3.13.13 on darwin)" generated="2026-06-05T16:09:07.132972" rpa="false" schemaversion="5">
3
+ <suite id="s1" name="Robot" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot">
4
+ <suite id="s1-s1" name="Minus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/minus.robot">
5
+ <test id="s1-s1-t1" name="Check method" line="6">
6
+ <kw name="Result Is" owner="Calculator">
7
+ <arg>-1</arg>
8
+ <status status="NOT RUN" start="2026-06-05T16:09:07.159445" elapsed="0.000131"/>
9
+ </kw>
10
+ <status status="PASS" start="2026-06-05T16:09:07.159168" elapsed="0.000485"/>
11
+ </test>
12
+ <test id="s1-s1-t2" name="Minus method" line="9">
13
+ <kw name="Plus" owner="Calculator">
14
+ <arg>1</arg>
15
+ <status status="NOT RUN" start="2026-06-05T16:09:07.159987" elapsed="0.000048"/>
16
+ </kw>
17
+ <kw name="Minus" owner="Calculator">
18
+ <arg>1</arg>
19
+ <status status="NOT RUN" start="2026-06-05T16:09:07.160077" elapsed="0.000022"/>
20
+ </kw>
21
+ <kw name="Result Is" owner="Calculator">
22
+ <arg>0</arg>
23
+ <status status="NOT RUN" start="2026-06-05T16:09:07.160127" elapsed="0.000017"/>
24
+ </kw>
25
+ <status status="PASS" start="2026-06-05T16:09:07.159839" elapsed="0.000343"/>
26
+ </test>
27
+ <test id="s1-s1-t3" name="Minus method 2" line="14">
28
+ <kw name="Plus" owner="Calculator">
29
+ <arg>10</arg>
30
+ <status status="NOT RUN" start="2026-06-05T16:09:07.160348" elapsed="0.000022"/>
31
+ </kw>
32
+ <kw name="Minus" owner="Calculator">
33
+ <arg>20</arg>
34
+ <status status="NOT RUN" start="2026-06-05T16:09:07.160397" elapsed="0.000018"/>
35
+ </kw>
36
+ <kw name="Result Is" owner="Calculator">
37
+ <arg>-10</arg>
38
+ <status status="NOT RUN" start="2026-06-05T16:09:07.160441" elapsed="0.000017"/>
39
+ </kw>
40
+ <status status="PASS" start="2026-06-05T16:09:07.160261" elapsed="0.000229"/>
41
+ </test>
42
+ <status status="PASS" start="2026-06-05T16:09:07.156594" elapsed="0.004039"/>
43
+ </suite>
44
+ <suite id="s1-s2" name="Plus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/plus.robot">
45
+ <test id="s1-s2-t1" name="Check method" line="6">
46
+ <kw name="Result Is" owner="Calculator">
47
+ <arg>-1</arg>
48
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161408" elapsed="0.000022"/>
49
+ </kw>
50
+ <status status="PASS" start="2026-06-05T16:09:07.161320" elapsed="0.000143"/>
51
+ </test>
52
+ <test id="s1-s2-t2" name="Plus method" line="9">
53
+ <kw name="Plus" owner="Calculator">
54
+ <arg>1</arg>
55
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161589" elapsed="0.000019"/>
56
+ </kw>
57
+ <kw name="Plus" owner="Calculator">
58
+ <arg>1</arg>
59
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161634" elapsed="0.000016"/>
60
+ </kw>
61
+ <kw name="Result Is" owner="Calculator">
62
+ <arg>2</arg>
63
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161677" elapsed="0.000015"/>
64
+ </kw>
65
+ <status status="PASS" start="2026-06-05T16:09:07.161514" elapsed="0.000206"/>
66
+ </test>
67
+ <test id="s1-s2-t3" name="Plus method 2" line="14">
68
+ <kw name="Plus" owner="Calculator">
69
+ <arg>10</arg>
70
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161845" elapsed="0.000019"/>
71
+ </kw>
72
+ <kw name="Plus" owner="Calculator">
73
+ <arg>20</arg>
74
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161888" elapsed="0.000016"/>
75
+ </kw>
76
+ <kw name="Result Is" owner="Calculator">
77
+ <arg>30</arg>
78
+ <status status="NOT RUN" start="2026-06-05T16:09:07.161928" elapsed="0.000016"/>
79
+ </kw>
80
+ <status status="PASS" start="2026-06-05T16:09:07.161773" elapsed="0.000198"/>
81
+ </test>
82
+ <status status="PASS" start="2026-06-05T16:09:07.160774" elapsed="0.001270"/>
83
+ </suite>
84
+ <suite id="s1-s3" name="Tests" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/tests">
85
+ <suite id="s1-s3-s1" name="Minus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/tests/minus">
86
+ <suite id="s1-s3-s1-s1" name="Minus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/tests/minus/minus.robot">
87
+ <test id="s1-s3-s1-s1-t1" name="Check method" line="6">
88
+ <kw name="Result Is" owner="Calculator">
89
+ <arg>-1</arg>
90
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163194" elapsed="0.000020"/>
91
+ </kw>
92
+ <status status="PASS" start="2026-06-05T16:09:07.163105" elapsed="0.000143"/>
93
+ </test>
94
+ <test id="s1-s3-s1-s1-t2" name="Minus method" line="9">
95
+ <kw name="Plus" owner="Calculator">
96
+ <arg>1</arg>
97
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163370" elapsed="0.000018"/>
98
+ </kw>
99
+ <kw name="Minus" owner="Calculator">
100
+ <arg>1</arg>
101
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163413" elapsed="0.000016"/>
102
+ </kw>
103
+ <kw name="Result Is" owner="Calculator">
104
+ <arg>0</arg>
105
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163452" elapsed="0.000016"/>
106
+ </kw>
107
+ <status status="PASS" start="2026-06-05T16:09:07.163297" elapsed="0.000201"/>
108
+ </test>
109
+ <test id="s1-s3-s1-s1-t3" name="Minus method 2" line="14">
110
+ <kw name="Plus" owner="Calculator">
111
+ <arg>10</arg>
112
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163618" elapsed="0.000018"/>
113
+ </kw>
114
+ <kw name="Minus" owner="Calculator">
115
+ <arg>20</arg>
116
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163659" elapsed="0.000016"/>
117
+ </kw>
118
+ <kw name="Result Is" owner="Calculator">
119
+ <arg>-10</arg>
120
+ <status status="NOT RUN" start="2026-06-05T16:09:07.163698" elapsed="0.000016"/>
121
+ </kw>
122
+ <status status="PASS" start="2026-06-05T16:09:07.163546" elapsed="0.000198"/>
123
+ </test>
124
+ <status status="PASS" start="2026-06-05T16:09:07.162742" elapsed="0.001073"/>
125
+ </suite>
126
+ <status status="PASS" start="2026-06-05T16:09:07.162475" elapsed="0.001500"/>
127
+ </suite>
128
+ <suite id="s1-s3-s2" name="Plus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/tests/plus">
129
+ <suite id="s1-s3-s2-s1" name="Plus" source="/Users/ryabuki/src/github.com/cloudbees-oss/smart-tests-integration-examples/robot/tests/plus/plus.robot">
130
+ <test id="s1-s3-s2-s1-t1" name="Check method" line="6">
131
+ <kw name="Result Is" owner="Calculator">
132
+ <arg>-1</arg>
133
+ <status status="NOT RUN" start="2026-06-05T16:09:07.164810" elapsed="0.000018"/>
134
+ </kw>
135
+ <status status="PASS" start="2026-06-05T16:09:07.164730" elapsed="0.000128"/>
136
+ </test>
137
+ <test id="s1-s3-s2-s1-t2" name="Plus method" line="9">
138
+ <kw name="Plus" owner="Calculator">
139
+ <arg>1</arg>
140
+ <status status="NOT RUN" start="2026-06-05T16:09:07.164974" elapsed="0.000018"/>
141
+ </kw>
142
+ <kw name="Plus" owner="Calculator">
143
+ <arg>1</arg>
144
+ <status status="NOT RUN" start="2026-06-05T16:09:07.165015" elapsed="0.000016"/>
145
+ </kw>
146
+ <kw name="Result Is" owner="Calculator">
147
+ <arg>2</arg>
148
+ <status status="NOT RUN" start="2026-06-05T16:09:07.165053" elapsed="0.000014"/>
149
+ </kw>
150
+ <status status="PASS" start="2026-06-05T16:09:07.164905" elapsed="0.000191"/>
151
+ </test>
152
+ <test id="s1-s3-s2-s1-t3" name="Plus method 2" line="14">
153
+ <kw name="Plus" owner="Calculator">
154
+ <arg>10</arg>
155
+ <status status="NOT RUN" start="2026-06-05T16:09:07.165217" elapsed="0.000018"/>
156
+ </kw>
157
+ <kw name="Plus" owner="Calculator">
158
+ <arg>20</arg>
159
+ <status status="NOT RUN" start="2026-06-05T16:09:07.165258" elapsed="0.000017"/>
160
+ </kw>
161
+ <kw name="Result Is" owner="Calculator">
162
+ <arg>30</arg>
163
+ <status status="NOT RUN" start="2026-06-05T16:09:07.165296" elapsed="0.000015"/>
164
+ </kw>
165
+ <status status="PASS" start="2026-06-05T16:09:07.165143" elapsed="0.000196"/>
166
+ </test>
167
+ <status status="PASS" start="2026-06-05T16:09:07.164370" elapsed="0.001035"/>
168
+ </suite>
169
+ <status status="PASS" start="2026-06-05T16:09:07.164101" elapsed="0.001468"/>
170
+ </suite>
171
+ <status status="PASS" start="2026-06-05T16:09:07.162170" elapsed="0.003538"/>
172
+ </suite>
173
+ <status status="PASS" start="2026-06-05T16:09:07.134259" elapsed="0.031588"/>
174
+ </suite>
175
+ <statistics>
176
+ <total>
177
+ <stat pass="12" fail="0" skip="0">All Tests</stat>
178
+ </total>
179
+ <tag>
180
+ </tag>
181
+ <suite>
182
+ <stat name="Robot" id="s1" pass="12" fail="0" skip="0">Robot</stat>
183
+ <stat name="Minus" id="s1-s1" pass="3" fail="0" skip="0">Robot.Minus</stat>
184
+ <stat name="Plus" id="s1-s2" pass="3" fail="0" skip="0">Robot.Plus</stat>
185
+ <stat name="Tests" id="s1-s3" pass="6" fail="0" skip="0">Robot.Tests</stat>
186
+ <stat name="Minus" id="s1-s3-s1" pass="3" fail="0" skip="0">Robot.Tests.Minus</stat>
187
+ <stat name="Minus" id="s1-s3-s1-s1" pass="3" fail="0" skip="0">Robot.Tests.Minus.Minus</stat>
188
+ <stat name="Plus" id="s1-s3-s2" pass="3" fail="0" skip="0">Robot.Tests.Plus</stat>
189
+ <stat name="Plus" id="s1-s3-s2-s1" pass="3" fail="0" skip="0">Robot.Tests.Plus.Plus</stat>
190
+ </suite>
191
+ </statistics>
192
+ <errors>
193
+ </errors>
194
+ </robot>
@@ -0,0 +1,225 @@
1
+ {
2
+ "events": [
3
+ {
4
+ "type": "case",
5
+ "testPath": [
6
+ {
7
+ "type": "class",
8
+ "name": "Minus"
9
+ },
10
+ {
11
+ "type": "testcase",
12
+ "name": "Check method"
13
+ }
14
+ ],
15
+ "duration": 0.000485,
16
+ "status": 1,
17
+ "stdout": "",
18
+ "stderr": "",
19
+ "data": null
20
+ },
21
+ {
22
+ "type": "case",
23
+ "testPath": [
24
+ {
25
+ "type": "class",
26
+ "name": "Minus"
27
+ },
28
+ {
29
+ "type": "testcase",
30
+ "name": "Minus method"
31
+ }
32
+ ],
33
+ "duration": 0.000343,
34
+ "status": 1,
35
+ "stdout": "",
36
+ "stderr": "",
37
+ "data": null
38
+ },
39
+ {
40
+ "type": "case",
41
+ "testPath": [
42
+ {
43
+ "type": "class",
44
+ "name": "Minus"
45
+ },
46
+ {
47
+ "type": "testcase",
48
+ "name": "Minus method 2"
49
+ }
50
+ ],
51
+ "duration": 0.000229,
52
+ "status": 1,
53
+ "stdout": "",
54
+ "stderr": "",
55
+ "data": null
56
+ },
57
+ {
58
+ "type": "case",
59
+ "testPath": [
60
+ {
61
+ "type": "class",
62
+ "name": "Plus"
63
+ },
64
+ {
65
+ "type": "testcase",
66
+ "name": "Check method"
67
+ }
68
+ ],
69
+ "duration": 0.000143,
70
+ "status": 1,
71
+ "stdout": "",
72
+ "stderr": "",
73
+ "data": null
74
+ },
75
+ {
76
+ "type": "case",
77
+ "testPath": [
78
+ {
79
+ "type": "class",
80
+ "name": "Plus"
81
+ },
82
+ {
83
+ "type": "testcase",
84
+ "name": "Plus method"
85
+ }
86
+ ],
87
+ "duration": 0.000206,
88
+ "status": 1,
89
+ "stdout": "",
90
+ "stderr": "",
91
+ "data": null
92
+ },
93
+ {
94
+ "type": "case",
95
+ "testPath": [
96
+ {
97
+ "type": "class",
98
+ "name": "Plus"
99
+ },
100
+ {
101
+ "type": "testcase",
102
+ "name": "Plus method 2"
103
+ }
104
+ ],
105
+ "duration": 0.000198,
106
+ "status": 1,
107
+ "stdout": "",
108
+ "stderr": "",
109
+ "data": null
110
+ },
111
+ {
112
+ "type": "case",
113
+ "testPath": [
114
+ {
115
+ "type": "class",
116
+ "name": "Minus"
117
+ },
118
+ {
119
+ "type": "testcase",
120
+ "name": "Check method"
121
+ }
122
+ ],
123
+ "duration": 0.000143,
124
+ "status": 1,
125
+ "stdout": "",
126
+ "stderr": "",
127
+ "data": null
128
+ },
129
+ {
130
+ "type": "case",
131
+ "testPath": [
132
+ {
133
+ "type": "class",
134
+ "name": "Minus"
135
+ },
136
+ {
137
+ "type": "testcase",
138
+ "name": "Minus method"
139
+ }
140
+ ],
141
+ "duration": 0.000201,
142
+ "status": 1,
143
+ "stdout": "",
144
+ "stderr": "",
145
+ "data": null
146
+ },
147
+ {
148
+ "type": "case",
149
+ "testPath": [
150
+ {
151
+ "type": "class",
152
+ "name": "Minus"
153
+ },
154
+ {
155
+ "type": "testcase",
156
+ "name": "Minus method 2"
157
+ }
158
+ ],
159
+ "duration": 0.000198,
160
+ "status": 1,
161
+ "stdout": "",
162
+ "stderr": "",
163
+ "data": null
164
+ },
165
+ {
166
+ "type": "case",
167
+ "testPath": [
168
+ {
169
+ "type": "class",
170
+ "name": "Plus"
171
+ },
172
+ {
173
+ "type": "testcase",
174
+ "name": "Check method"
175
+ }
176
+ ],
177
+ "duration": 0.000128,
178
+ "status": 1,
179
+ "stdout": "",
180
+ "stderr": "",
181
+ "data": null
182
+ },
183
+ {
184
+ "type": "case",
185
+ "testPath": [
186
+ {
187
+ "type": "class",
188
+ "name": "Plus"
189
+ },
190
+ {
191
+ "type": "testcase",
192
+ "name": "Plus method"
193
+ }
194
+ ],
195
+ "duration": 0.000191,
196
+ "status": 1,
197
+ "stdout": "",
198
+ "stderr": "",
199
+ "data": null
200
+ },
201
+ {
202
+ "type": "case",
203
+ "testPath": [
204
+ {
205
+ "type": "class",
206
+ "name": "Plus"
207
+ },
208
+ {
209
+ "type": "testcase",
210
+ "name": "Plus method 2"
211
+ }
212
+ ],
213
+ "duration": 0.000196,
214
+ "status": 1,
215
+ "stdout": "",
216
+ "stderr": "",
217
+ "data": null
218
+ }
219
+ ],
220
+ "testRunner": "robot",
221
+ "group": "",
222
+ "noBuild": false,
223
+ "flavors": [],
224
+ "testSuite": ""
225
+ }
@@ -24,6 +24,16 @@ class RobotTest(CliTestCase):
24
24
  self.assert_success(result)
25
25
  self.assert_record_tests_payload("record_test_result.json")
26
26
 
27
+ # for RF < 7.0 legacy format (starttime/endtime attributes)
28
+ @responses.activate
29
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
30
+ def test_record_test_legacy(self):
31
+
32
+ result = self.cli('record', 'tests', '--session', self.session,
33
+ 'robot', str(self.test_files_dir) + "/output_legacy.xml")
34
+ self.assert_success(result)
35
+ self.assert_record_tests_payload("record_test_legacy_result.json")
36
+
27
37
  # for #637
28
38
  @responses.activate
29
39
  @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
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