launchable 1.87.0__tar.gz → 1.87.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 (327) hide show
  1. {launchable-1.87.0 → launchable-1.87.2}/.github/workflows/bazel-test.yml +1 -1
  2. {launchable-1.87.0 → launchable-1.87.2}/.github/workflows/python-package.yml +1 -1
  3. {launchable-1.87.0 → launchable-1.87.2}/.github/workflows/python-publish.yml +1 -1
  4. {launchable-1.87.0 → launchable-1.87.2}/PKG-INFO +1 -1
  5. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/case_event.py +15 -1
  6. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/launchable.py +28 -24
  7. launchable-1.87.2/launchable/test_runners/minitest.py +33 -0
  8. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/nunit.py +1 -13
  9. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/PKG-INFO +1 -1
  10. {launchable-1.87.0 → launchable-1.87.2}/tests/cli_test_case.py +1 -1
  11. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/record_test_result.json +28 -2
  12. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/record_test_result_chunk1.json +15 -10
  13. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/record_test_result_chunk2.json +9 -6
  14. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_minitest.py +21 -0
  15. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_raw.py +31 -20
  16. launchable-1.87.0/launchable/test_runners/minitest.py +0 -5
  17. {launchable-1.87.0 → launchable-1.87.2}/.bazelrc +0 -0
  18. {launchable-1.87.0 → launchable-1.87.2}/.bazelversion +0 -0
  19. {launchable-1.87.0 → launchable-1.87.2}/.editorconfig +0 -0
  20. {launchable-1.87.0 → launchable-1.87.2}/.github/release.yml +0 -0
  21. {launchable-1.87.0 → launchable-1.87.2}/.github/workflows/e2e.yml +0 -0
  22. {launchable-1.87.0 → launchable-1.87.2}/.github/workflows/update_maven_install_json.yml +0 -0
  23. {launchable-1.87.0 → launchable-1.87.2}/.gitignore +0 -0
  24. {launchable-1.87.0 → launchable-1.87.2}/.pre-commit-config.yaml +0 -0
  25. {launchable-1.87.0 → launchable-1.87.2}/.python-version +0 -0
  26. {launchable-1.87.0 → launchable-1.87.2}/.tagpr +0 -0
  27. {launchable-1.87.0 → launchable-1.87.2}/CONTRIBUTING.md +0 -0
  28. {launchable-1.87.0 → launchable-1.87.2}/Dockerfile +0 -0
  29. {launchable-1.87.0 → launchable-1.87.2}/LICENSE.txt +0 -0
  30. {launchable-1.87.0 → launchable-1.87.2}/Pipfile +0 -0
  31. {launchable-1.87.0 → launchable-1.87.2}/README.md +0 -0
  32. {launchable-1.87.0 → launchable-1.87.2}/WORKSPACE +0 -0
  33. {launchable-1.87.0 → launchable-1.87.2}/launchable/__init__.py +0 -0
  34. {launchable-1.87.0 → launchable-1.87.2}/launchable/__main__.py +0 -0
  35. {launchable-1.87.0 → launchable-1.87.2}/launchable/app.py +0 -0
  36. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/__init__.py +0 -0
  37. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/helper.py +0 -0
  38. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/inspect/__init__.py +0 -0
  39. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/inspect/subset.py +0 -0
  40. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/inspect/tests.py +0 -0
  41. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/__init__.py +0 -0
  42. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/attachment.py +0 -0
  43. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/build.py +0 -0
  44. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/commit.py +0 -0
  45. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/session.py +0 -0
  46. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/record/tests.py +0 -0
  47. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/split_subset.py +0 -0
  48. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/stats/__init__.py +0 -0
  49. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/stats/test_sessions.py +0 -0
  50. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/subset.py +0 -0
  51. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/test_path_writer.py +0 -0
  52. {launchable-1.87.0 → launchable-1.87.2}/launchable/commands/verify.py +0 -0
  53. {launchable-1.87.0 → launchable-1.87.2}/launchable/jar/exe_deploy.jar +0 -0
  54. {launchable-1.87.0 → launchable-1.87.2}/launchable/plugins/__init__.py +0 -0
  55. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/__init__.py +0 -0
  56. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/adb.py +0 -0
  57. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/ant.py +0 -0
  58. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/bazel.py +0 -0
  59. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/behave.py +0 -0
  60. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/ctest.py +0 -0
  61. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/cts.py +0 -0
  62. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/cucumber.py +0 -0
  63. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/cypress.py +0 -0
  64. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/dotnet.py +0 -0
  65. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/file.py +0 -0
  66. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/go_test.py +0 -0
  67. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/googletest.py +0 -0
  68. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/gradle.py +0 -0
  69. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/jest.py +0 -0
  70. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/maven.py +0 -0
  71. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/playwright.py +0 -0
  72. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/prove.py +0 -0
  73. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/pytest.py +0 -0
  74. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/raw.py +0 -0
  75. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/robot.py +0 -0
  76. {launchable-1.87.0 → launchable-1.87.2}/launchable/test_runners/rspec.py +0 -0
  77. {launchable-1.87.0 → launchable-1.87.2}/launchable/testpath.py +0 -0
  78. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/__init__.py +0 -0
  79. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/authentication.py +0 -0
  80. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/ci_provider.py +0 -0
  81. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/click.py +0 -0
  82. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/commit_ingester.py +0 -0
  83. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/env_keys.py +0 -0
  84. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/exceptions.py +0 -0
  85. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/file_name_pattern.py +0 -0
  86. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/git_log_parser.py +0 -0
  87. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/glob.py +0 -0
  88. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/gzipgen.py +0 -0
  89. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/http_client.py +0 -0
  90. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/java.py +0 -0
  91. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/key_value_type.py +0 -0
  92. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/launchable_client.py +0 -0
  93. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/link.py +0 -0
  94. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/logger.py +0 -0
  95. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/no_build.py +0 -0
  96. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/sax.py +0 -0
  97. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/session.py +0 -0
  98. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/subprocess.py +0 -0
  99. {launchable-1.87.0 → launchable-1.87.2}/launchable/utils/tracking.py +0 -0
  100. {launchable-1.87.0 → launchable-1.87.2}/launchable/version.py +0 -0
  101. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/SOURCES.txt +0 -0
  102. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/dependency_links.txt +0 -0
  103. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/entry_points.txt +0 -0
  104. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/requires.txt +0 -0
  105. {launchable-1.87.0 → launchable-1.87.2}/launchable.egg-info/top_level.txt +0 -0
  106. {launchable-1.87.0 → launchable-1.87.2}/pyproject.toml +0 -0
  107. {launchable-1.87.0 → launchable-1.87.2}/renovate.json +0 -0
  108. {launchable-1.87.0 → launchable-1.87.2}/setup.cfg +0 -0
  109. {launchable-1.87.0 → launchable-1.87.2}/setup.py +0 -0
  110. {launchable-1.87.0 → launchable-1.87.2}/src/BUILD +0 -0
  111. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
  112. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
  113. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +0 -0
  114. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/CommitIngester.java +0 -0
  115. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
  116. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
  117. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
  118. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
  119. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
  120. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
  121. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
  122. {launchable-1.87.0 → launchable-1.87.2}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
  123. {launchable-1.87.0 → launchable-1.87.2}/src/maven_install.json +0 -0
  124. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +0 -0
  125. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
  126. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +0 -0
  127. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/CommitIngesterTest.java +0 -0
  128. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
  129. {launchable-1.87.0 → launchable-1.87.2}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
  130. {launchable-1.87.0 → launchable-1.87.2}/test-runner/__main__.py +0 -0
  131. {launchable-1.87.0 → launchable-1.87.2}/tests/__init__.py +0 -0
  132. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/__init__.py +0 -0
  133. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/inspect/__init__.py +0 -0
  134. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/inspect/test_subset.py +0 -0
  135. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/inspect/test_tests.py +0 -0
  136. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/__init__.py +0 -0
  137. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/test_attachment.py +0 -0
  138. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/test_build.py +0 -0
  139. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/test_commit.py +0 -0
  140. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/test_session.py +0 -0
  141. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/record/test_tests.py +0 -0
  142. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/test_api_error.py +0 -0
  143. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/test_helper.py +0 -0
  144. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/test_split_subset.py +0 -0
  145. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/test_subset.py +0 -0
  146. {launchable-1.87.0 → launchable-1.87.2}/tests/commands/test_verify.py +0 -0
  147. {launchable-1.87.0 → launchable-1.87.2}/tests/data/adb/subset_result.json +0 -0
  148. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/junitreport/TEST-com.launchable.HelloWorldTest.xml +0 -0
  149. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/junitreport/TEST-com.launchable.library.CacheTest.xml +0 -0
  150. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
  151. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/record_test_result.json +0 -0
  152. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/src/com/launchable/HelloWorld.java +0 -0
  153. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/src/com/launchable/HelloWorldTest.java +0 -0
  154. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/src/com/launchable/library/Cache.java +0 -0
  155. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/src/com/launchable/library/CacheTest.java +0 -0
  156. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ant/subset_result.json +0 -0
  157. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
  158. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
  159. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
  160. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
  161. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
  162. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
  163. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
  164. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
  165. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
  166. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
  167. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
  168. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
  169. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
  170. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
  171. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
  172. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
  173. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
  174. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
  175. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/build_event.json +0 -0
  176. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/build_event_rest.json +0 -0
  177. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/record_test_result.json +0 -0
  178. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
  179. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
  180. {launchable-1.87.0 → launchable-1.87.2}/tests/data/bazel/subset_result.json +0 -0
  181. {launchable-1.87.0 → launchable-1.87.2}/tests/data/behave/record_test_result.json +0 -0
  182. {launchable-1.87.0 → launchable-1.87.2}/tests/data/behave/reports/report.xml +0 -0
  183. {launchable-1.87.0 → launchable-1.87.2}/tests/data/behave/subset_result.json +0 -0
  184. {launchable-1.87.0 → launchable-1.87.2}/tests/data/broken_xml/broken.xml +0 -0
  185. {launchable-1.87.0 → launchable-1.87.2}/tests/data/broken_xml/normal.xml +0 -0
  186. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ctest/Testing/latest/Test.xml +0 -0
  187. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ctest/ctest_list.json +0 -0
  188. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ctest/record_test_result.json +0 -0
  189. {launchable-1.87.0 → launchable-1.87.2}/tests/data/ctest/subset_result.json +0 -0
  190. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cts/record_test_result.json +0 -0
  191. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cts/subset_result.json +0 -0
  192. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cts/test_result.xml +0 -0
  193. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/features/foo/bar.feature +0 -0
  194. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
  195. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/features/foo-bar.feature +0 -0
  196. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
  197. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/record_test_json_result.json +0 -0
  198. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/record_test_result.json +0 -0
  199. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
  200. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
  201. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
  202. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/report/dummy.xml +0 -0
  203. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cucumber/report/result.json +0 -0
  204. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cypress/empty.json +0 -0
  205. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cypress/empty.xml +0 -0
  206. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cypress/record_test_result.json +0 -0
  207. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cypress/subset_result.json +0 -0
  208. {launchable-1.87.0 → launchable-1.87.2}/tests/data/cypress/test-result.xml +0 -0
  209. {launchable-1.87.0 → launchable-1.87.2}/tests/data/dotnet/record_test_result.json +0 -0
  210. {launchable-1.87.0 → launchable-1.87.2}/tests/data/dotnet/test-result.xml +0 -0
  211. {launchable-1.87.0 → launchable-1.87.2}/tests/data/git_log_ingest/sample.out +0 -0
  212. {launchable-1.87.0 → launchable-1.87.2}/tests/data/go_test/record_test_result.json +0 -0
  213. {launchable-1.87.0 → launchable-1.87.2}/tests/data/go_test/reportv1/reportv1.xml +0 -0
  214. {launchable-1.87.0 → launchable-1.87.2}/tests/data/go_test/reportv2/reportv2.xml +0 -0
  215. {launchable-1.87.0 → launchable-1.87.2}/tests/data/go_test/subset_result.json +0 -0
  216. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/fail/output.xml +0 -0
  217. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/fail/record_test_result.json +0 -0
  218. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/output_a.xml +0 -0
  219. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/output_b.xml +0 -0
  220. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/record_test_result.json +0 -0
  221. {launchable-1.87.0 → launchable-1.87.2}/tests/data/googletest/subset_result.json +0 -0
  222. {launchable-1.87.0 → launchable-1.87.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/App2Test.java +0 -0
  223. {launchable-1.87.0 → launchable-1.87.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/AppTest.java +0 -0
  224. {launchable-1.87.0 → launchable-1.87.2}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/sub/App3Test.java +0 -0
  225. {launchable-1.87.0 → launchable-1.87.2}/tests/data/gradle/recursion/expected.json +0 -0
  226. {launchable-1.87.0 → launchable-1.87.2}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
  227. {launchable-1.87.0 → launchable-1.87.2}/tests/data/jest/junit.xml +0 -0
  228. {launchable-1.87.0 → launchable-1.87.2}/tests/data/jest/record_test_result.json +0 -0
  229. {launchable-1.87.0 → launchable-1.87.2}/tests/data/jest/subset_result.json +0 -0
  230. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/createdFile_1.lst +0 -0
  231. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/createdFile_2.lst +0 -0
  232. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/App2Test.java +0 -0
  233. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/AppTest.java +0 -0
  234. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/list.lst +0 -0
  235. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/record_test_result.json +0 -0
  236. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/reports/TEST-1.xml +0 -0
  237. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/reports/TEST-2.xml +0 -0
  238. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/reports/dummy.xml +0 -0
  239. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
  240. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/subset_by_confidence_result.json +0 -0
  241. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/subset_from_file_result.json +0 -0
  242. {launchable-1.87.0 → launchable-1.87.2}/tests/data/maven/subset_result.json +0 -0
  243. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
  244. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
  245. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
  246. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
  247. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/TEST-UserTest.xml +0 -0
  248. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/subset_result.json +0 -0
  249. {launchable-1.87.0 → launchable-1.87.2}/tests/data/minitest/test/example_test.rb +0 -0
  250. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/list.xml +0 -0
  251. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
  252. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
  253. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/output-linux.xml +0 -0
  254. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/output-windows.xml +0 -0
  255. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/record_test_result-linux.json +0 -0
  256. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/record_test_result-windows.json +0 -0
  257. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/src/.gitignore +0 -0
  258. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/src/Program.cs +0 -0
  259. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/src/README.md +0 -0
  260. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/src/Test.cs +0 -0
  261. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/src/calc.csproj +0 -0
  262. {launchable-1.87.0 → launchable-1.87.2}/tests/data/nunit/subset_result.json +0 -0
  263. {launchable-1.87.0 → launchable-1.87.2}/tests/data/playwright/record_test_result.json +0 -0
  264. {launchable-1.87.0 → launchable-1.87.2}/tests/data/playwright/record_test_result_with_json.json +0 -0
  265. {launchable-1.87.0 → launchable-1.87.2}/tests/data/playwright/report.json +0 -0
  266. {launchable-1.87.0 → launchable-1.87.2}/tests/data/playwright/report.xml +0 -0
  267. {launchable-1.87.0 → launchable-1.87.2}/tests/data/prove/record_test_result.json +0 -0
  268. {launchable-1.87.0 → launchable-1.87.2}/tests/data/prove/report.xml +0 -0
  269. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/record_test_result.json +0 -0
  270. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/record_test_result_json.json +0 -0
  271. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/report.json +0 -0
  272. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/report.xml +0 -0
  273. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/subset_result.json +0 -0
  274. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/conftest.py +0 -0
  275. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/fooo/__init__.py +0 -0
  276. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
  277. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
  278. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/funcs3_test.py +0 -0
  279. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/test_funcs1.py +0 -0
  280. {launchable-1.87.0 → launchable-1.87.2}/tests/data/pytest/tests/test_funcs2.py +0 -0
  281. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/dryrun.xml +0 -0
  282. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/output.xml +0 -0
  283. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
  284. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/record_test_result.json +0 -0
  285. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/single-output.xml +0 -0
  286. {launchable-1.87.0 → launchable-1.87.2}/tests/data/robot/subset_result.json +0 -0
  287. {launchable-1.87.0 → launchable-1.87.2}/tests/data/rspec/record_test_result.json +0 -0
  288. {launchable-1.87.0 → launchable-1.87.2}/tests/data/rspec/rspec.xml +0 -0
  289. {launchable-1.87.0 → launchable-1.87.2}/tests/helper.py +0 -0
  290. {launchable-1.87.0 → launchable-1.87.2}/tests/plugins/foo.py +0 -0
  291. {launchable-1.87.0 → launchable-1.87.2}/tests/test_cli_test_case.py +0 -0
  292. {launchable-1.87.0 → launchable-1.87.2}/tests/test_plugin.py +0 -0
  293. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/__init__.py +0 -0
  294. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_adb.py +0 -0
  295. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_ant.py +0 -0
  296. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_bazel.py +0 -0
  297. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_behave.py +0 -0
  298. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_ctest.py +0 -0
  299. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_cts.py +0 -0
  300. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_cucumber.py +0 -0
  301. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_cypress.py +0 -0
  302. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_dotnet.py +0 -0
  303. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_go_test.py +0 -0
  304. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_googletest.py +0 -0
  305. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_gradle.py +0 -0
  306. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_jest.py +0 -0
  307. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_maven.py +0 -0
  308. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_nunit.py +0 -0
  309. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_playwright.py +0 -0
  310. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_prove.py +0 -0
  311. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_pytest.py +0 -0
  312. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_robot.py +0 -0
  313. {launchable-1.87.0 → launchable-1.87.2}/tests/test_runners/test_rspec.py +0 -0
  314. {launchable-1.87.0 → launchable-1.87.2}/tests/test_session.py +0 -0
  315. {launchable-1.87.0 → launchable-1.87.2}/tests/test_testpath.py +0 -0
  316. {launchable-1.87.0 → launchable-1.87.2}/tests/test_version.py +0 -0
  317. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/__init__.py +0 -0
  318. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_authentication.py +0 -0
  319. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_click.py +0 -0
  320. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_file_name_pattern.py +0 -0
  321. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_git_log_parser.py +0 -0
  322. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_glob.py +0 -0
  323. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_gzipgen.py +0 -0
  324. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_http_client.py +0 -0
  325. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_key_value_type.py +0 -0
  326. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_link.py +0 -0
  327. {launchable-1.87.0 → launchable-1.87.2}/tests/utils/test_logger.py +0 -0
@@ -16,7 +16,7 @@ jobs:
16
16
  test:
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
19
+ - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
20
20
  - name: Set up JDK 8
21
21
  uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
22
22
  with:
@@ -39,7 +39,7 @@ jobs:
39
39
  python-version: [3.6, 3.7, 3.8, 3.9, "3.10", "3.11", "3.12"]
40
40
 
41
41
  steps:
42
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
42
+ - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
43
43
  with:
44
44
  fetch-depth: 0
45
45
  - name: Set up Python ${{ matrix.python-version }}
@@ -19,7 +19,7 @@ jobs:
19
19
  outputs:
20
20
  tag: ${{ steps.run-tagpr.outputs.tag }}
21
21
  steps:
22
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
22
+ - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
23
23
  - id: run-tagpr
24
24
  uses: Songmu/tagpr@4c8e0c433614e5915a7049413885246b854dfd4e # v1.2.0
25
25
  env:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: launchable
3
- Version: 1.87.0
3
+ Version: 1.87.2
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -2,6 +2,9 @@ import datetime
2
2
  import sys
3
3
  from typing import Callable, Dict, Optional, Any
4
4
 
5
+ import dateutil.parser
6
+ from dateutil.tz import tzlocal
7
+
5
8
  from junitparser import Error, Failure, Skipped, TestCase, TestSuite, IntAttr # type: ignore
6
9
 
7
10
  from ...testpath import FilePathNormalizer, TestPath
@@ -151,6 +154,17 @@ class CaseEvent:
151
154
  def create(cls, test_path: TestPath, duration_secs: float, status,
152
155
  stdout: Optional[str] = None, stderr: Optional[str] = None,
153
156
  timestamp: Optional[str] = None, data: Optional[Dict] = None) -> Dict:
157
+ def _timestamp(ts: Optional[str] = None):
158
+ if ts is None:
159
+ return datetime.datetime.now(datetime.timezone.utc).isoformat()
160
+ try:
161
+ date = dateutil.parser.parse(ts)
162
+ if date.tzinfo is None:
163
+ return date.replace(tzinfo=tzlocal()).isoformat()
164
+ return date.isoformat()
165
+ except Exception:
166
+ return datetime.datetime.now(datetime.timezone.utc).isoformat()
167
+
154
168
  """
155
169
  Builds a JSON representation of CaseEvent from arbitrary set of values
156
170
 
@@ -165,7 +179,7 @@ class CaseEvent:
165
179
  "status": status,
166
180
  "stdout": stdout or "",
167
181
  "stderr": stderr or "",
168
- "created_at": timestamp or datetime.datetime.now(datetime.timezone.utc).isoformat(),
182
+ "createdAt": _timestamp(timestamp),
169
183
  "data": data
170
184
  }
171
185
 
@@ -104,33 +104,37 @@ class CommonRecordTestImpls:
104
104
 
105
105
  @click.argument('source_roots', required=True, nargs=-1)
106
106
  def record_tests(client, source_roots):
107
- # client type: RecordTests in def launchable.commands.record.tests.tests
108
- # Accept both file names and GLOB patterns
109
- # Simple globs like '*.xml' can be dealt with by shell, but
110
- # not all shells consistently deal with advanced GLOBS like '**'
111
- # so it's worth supporting it here.
112
- for root in source_roots:
113
- match = False
114
- for t in glob.iglob(root, recursive=True):
115
- match = True
116
- if os.path.isdir(t):
117
- client.scan(t, file_mask)
118
- else:
119
- client.report(t)
120
-
121
- if not match:
122
- # By following the shell convention, if the file doesn't exist or GLOB doesn't match anything,
123
- # raise it as an error. Note this can happen for reasons other than a configuration error.
124
- # For example, if a build catastrophically failed and no
125
- # tests got run.
126
- click.echo("No matches found: {}".format(root), err=True)
127
- # intentionally exiting with zero
128
- return
129
-
130
- client.run()
107
+ CommonRecordTestImpls.load_report_files(client=client, source_roots=source_roots, file_mask=file_mask)
131
108
 
132
109
  return wrap(record_tests, record_tests_cmd, self.cmdname)
133
110
 
111
+ @classmethod
112
+ def load_report_files(cls, client, source_roots, file_mask="*.xml"):
113
+ # client type: RecordTests in def launchable.commands.record.tests.tests
114
+ # Accept both file names and GLOB patterns
115
+ # Simple globs like '*.xml' can be dealt with by shell, but
116
+ # not all shells consistently deal with advanced GLOBS like '**'
117
+ # so it's worth supporting it here.
118
+ for root in source_roots:
119
+ match = False
120
+ for t in glob.iglob(root, recursive=True):
121
+ match = True
122
+ if os.path.isdir(t):
123
+ client.scan(t, file_mask)
124
+ else:
125
+ client.report(t)
126
+
127
+ if not match:
128
+ # By following the shell convention, if the file doesn't exist or GLOB doesn't match anything,
129
+ # raise it as an error. Note this can happen for reasons other than a configuration error.
130
+ # For example, if a build catastrophically failed and no
131
+ # tests got run.
132
+ click.echo("No matches found: {}".format(root), err=True)
133
+ # intentionally exiting with zero
134
+ return
135
+
136
+ client.run()
137
+
134
138
 
135
139
  class CommonSplitSubsetImpls:
136
140
  def __init__(
@@ -0,0 +1,33 @@
1
+ import glob
2
+ import os
3
+ from . import launchable
4
+ from junitparser import TestCase, TestSuite # type: ignore
5
+ from ..testpath import TestPath
6
+ import click
7
+
8
+ subset = launchable.CommonSubsetImpls(__name__).scan_files('*_test.rb')
9
+ split_subset = launchable.CommonSplitSubsetImpls(__name__).split_subset()
10
+
11
+ TEST_PATH_ORDER = {"file": 1, "class": 2, "testcase": 3}
12
+
13
+
14
+ @click.argument('reports', required=True, nargs=-1)
15
+ @launchable.record.tests
16
+ def record_tests(client, reports):
17
+ default_path_builder = client.path_builder
18
+
19
+ def path_builder(case: TestCase, suite: TestSuite, report_file: str) -> TestPath:
20
+ test_path = default_path_builder(case, suite, report_file)
21
+ if not any(item.get("type") == "class" for item in test_path):
22
+ # mintiest-ci sets a class name in name attribute in testsuite tag.
23
+ # https://github.com/CircleCI-Public/minitest-ci/blob/v3.4.0/lib/minitest/ci_plugin.rb#L86-L87
24
+ # https://github.com/CircleCI-Public/minitest-ci/blob/v3.4.0/lib/minitest/ci_plugin.rb#L132
25
+ classname = suite._elem.attrib.get("name")
26
+ if classname:
27
+ test_path.append({"type": "class", "name": classname})
28
+ test_path = sorted(test_path, key=lambda x: TEST_PATH_ORDER[x["type"]])
29
+ return test_path
30
+
31
+ client.path_builder = path_builder
32
+
33
+ launchable.CommonRecordTestImpls.load_report_files(client=client, source_roots=reports)
@@ -154,20 +154,8 @@ split_subset = launchable.CommonSplitSubsetImpls(__name__, formatter=lambda x: '
154
154
  @click.argument('report_xml', required=True, nargs=-1)
155
155
  @launchable.record.tests
156
156
  def record_tests(client, report_xml):
157
- # TODO: copied from ctest -- promote this pattern
158
- for root in report_xml:
159
- match = False
160
- for t in glob.iglob(root, recursive=True):
161
- match = True
162
- if os.path.isdir(t):
163
- client.scan(t, "*.xml")
164
- else:
165
- client.report(t)
166
- if not match:
167
- click.echo("No matches found: {}".format(root), err=True)
168
-
169
157
  client.parse_func = nunit_parse_func
170
- client.run()
158
+ launchable.CommonRecordTestImpls.load_report_files(client=client, source_roots=report_xml)
171
159
 
172
160
 
173
161
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: launchable
3
- Version: 1.87.0
3
+ Version: 1.87.2
4
4
  Summary: Launchable CLI
5
5
  Home-page: https://launchableinc.com/
6
6
  Author: Launchable, Inc.
@@ -231,7 +231,7 @@ class CliTestCase(unittest.TestCase):
231
231
 
232
232
  # Remove timestamp because it depends on the machine clock
233
233
  for c in payload['events']:
234
- del c['created_at']
234
+ del c['createdAt']
235
235
  # metadata includes server dependent data
236
236
  del payload['metadata']
237
237
 
@@ -7,6 +7,10 @@
7
7
  {
8
8
  "type": "testcase",
9
9
  "name": "test_should_save_user_with_name"
10
+ },
11
+ {
12
+ "type": "class",
13
+ "name": "UserCopyTest"
10
14
  }
11
15
  ],
12
16
  "duration": 1.602778,
@@ -22,6 +26,10 @@
22
26
  {
23
27
  "type": "testcase",
24
28
  "name": "test_should_not_save_user_without_name"
29
+ },
30
+ {
31
+ "type": "class",
32
+ "name": "UserCopyTest"
25
33
  }
26
34
  ],
27
35
  "duration": 1.606243,
@@ -37,6 +45,10 @@
37
45
  {
38
46
  "type": "testcase",
39
47
  "name": "test_should_not_save_user_without_name"
48
+ },
49
+ {
50
+ "type": "class",
51
+ "name": "Admin::UserTest"
40
52
  }
41
53
  ],
42
54
  "duration": 1.611738,
@@ -52,6 +64,10 @@
52
64
  {
53
65
  "type": "testcase",
54
66
  "name": "test_should_save_user_with_name"
67
+ },
68
+ {
69
+ "type": "class",
70
+ "name": "Admin::UserTest"
55
71
  }
56
72
  ],
57
73
  "duration": 1.607029,
@@ -67,6 +83,10 @@
67
83
  {
68
84
  "type": "testcase",
69
85
  "name": "test_should_not_save_user_without_name_2"
86
+ },
87
+ {
88
+ "type": "class",
89
+ "name": "UserTest"
70
90
  }
71
91
  ],
72
92
  "duration": 1.614255,
@@ -82,6 +102,10 @@
82
102
  {
83
103
  "type": "testcase",
84
104
  "name": "test_should_save_user_with_name"
105
+ },
106
+ {
107
+ "type": "class",
108
+ "name": "UserControllerTest"
85
109
  }
86
110
  ],
87
111
  "duration": 1.617726,
@@ -97,7 +121,8 @@
97
121
  {
98
122
  "type": "testcase",
99
123
  "name": "test_should_not_save_user_without_name"
100
- }
124
+ },
125
+ { "type": "class", "name": "UserControllerTest" }
101
126
  ],
102
127
  "duration": 1.611985,
103
128
  "status": 1,
@@ -109,7 +134,8 @@
109
134
  "type": "case",
110
135
  "testPath": [
111
136
  { "type": "file", "name": "test/models/admin/user_test.rb" },
112
- { "type": "testcase", "name": "test_child" }
137
+ { "type": "testcase", "name": "test_child" },
138
+ { "type": "class", "name": "Admin::UserTest::ChildlenTest" }
113
139
  ],
114
140
  "duration": 1.599567,
115
141
  "status": 1,
@@ -7,13 +7,14 @@
7
7
  {
8
8
  "type": "testcase",
9
9
  "name": "test_should_save_user_with_name"
10
- }
10
+ },
11
+ { "type": "class", "name": "UserCopyTest" }
11
12
  ],
12
13
  "duration": 1.602778,
13
14
  "status": 1,
14
15
  "stdout": "",
15
16
  "stderr": "",
16
- "created_at": "2020-12-23T13:10:01+09:00",
17
+ "createdAt": "2020-12-23T13:10:01+09:00",
17
18
  "data": null
18
19
  },
19
20
  {
@@ -23,13 +24,14 @@
23
24
  {
24
25
  "type": "testcase",
25
26
  "name": "test_should_not_save_user_without_name"
26
- }
27
+ },
28
+ { "type": "class", "name": "UserCopyTest" }
27
29
  ],
28
30
  "duration": 1.606243,
29
31
  "status": 1,
30
32
  "stdout": "",
31
33
  "stderr": "",
32
- "created_at": "2020-12-23T13:10:01+09:00",
34
+ "createdAt": "2020-12-23T13:10:01+09:00",
33
35
  "data": null
34
36
  },
35
37
  {
@@ -39,13 +41,14 @@
39
41
  {
40
42
  "type": "testcase",
41
43
  "name": "test_should_not_save_user_without_name"
42
- }
44
+ },
45
+ { "type": "class", "name": "Admin::UserTest" }
43
46
  ],
44
47
  "duration": 1.611738,
45
48
  "status": 1,
46
49
  "stdout": "",
47
50
  "stderr": "",
48
- "created_at": "2020-12-23T13:10:01+09:00",
51
+ "createdAt": "2020-12-23T13:10:01+09:00",
49
52
  "data": null
50
53
  },
51
54
  {
@@ -55,13 +58,14 @@
55
58
  {
56
59
  "type": "testcase",
57
60
  "name": "test_should_save_user_with_name"
58
- }
61
+ },
62
+ { "type": "class", "name": "Admin::UserTest" }
59
63
  ],
60
64
  "duration": 1.607029,
61
65
  "status": 1,
62
66
  "stdout": "",
63
67
  "stderr": "",
64
- "created_at": "2020-12-23T13:10:01+09:00",
68
+ "createdAt": "2020-12-23T13:10:01+09:00",
65
69
  "data": null
66
70
  },
67
71
  {
@@ -71,13 +75,14 @@
71
75
  {
72
76
  "type": "testcase",
73
77
  "name": "test_should_not_save_user_without_name_2"
74
- }
78
+ },
79
+ { "type": "class", "name": "UserTest" }
75
80
  ],
76
81
  "duration": 1.614255,
77
82
  "status": 1,
78
83
  "stdout": "",
79
84
  "stderr": "",
80
- "created_at": "2020-12-23T13:10:01+09:00",
85
+ "createdAt": "2020-12-23T13:10:01+09:00",
81
86
  "data": null
82
87
  }
83
88
  ],
@@ -7,13 +7,14 @@
7
7
  {
8
8
  "type": "testcase",
9
9
  "name": "test_should_save_user_with_name"
10
- }
10
+ },
11
+ { "type": "class", "name": "UserControllerTest" }
11
12
  ],
12
13
  "duration": 1.617726,
13
14
  "status": 1,
14
15
  "stdout": "",
15
16
  "stderr": "",
16
- "created_at": "2020-12-23T13:10:01+09:00",
17
+ "createdAt": "2020-12-23T13:10:01+09:00",
17
18
  "data": null
18
19
  },
19
20
  {
@@ -23,26 +24,28 @@
23
24
  {
24
25
  "type": "testcase",
25
26
  "name": "test_should_not_save_user_without_name"
26
- }
27
+ },
28
+ { "type": "class", "name": "UserControllerTest" }
27
29
  ],
28
30
  "duration": 1.611985,
29
31
  "status": 1,
30
32
  "stdout": "",
31
33
  "stderr": "",
32
- "created_at": "2020-12-23T13:10:01+09:00",
34
+ "createdAt": "2020-12-23T13:10:01+09:00",
33
35
  "data": null
34
36
  },
35
37
  {
36
38
  "type": "case",
37
39
  "testPath": [
38
40
  { "type": "file", "name": "test/models/admin/user_test.rb" },
39
- { "type": "testcase", "name": "test_child" }
41
+ { "type": "testcase", "name": "test_child" },
42
+ { "type": "class", "name": "Admin::UserTest::ChildlenTest" }
40
43
  ],
41
44
  "duration": 1.599567,
42
45
  "status": 1,
43
46
  "stdout": "",
44
47
  "stderr": "",
45
- "created_at": "2020-12-23T13:10:01+09:00",
48
+ "createdAt": "2020-12-23T13:10:01+09:00",
46
49
  "data": null
47
50
  }
48
51
  ],
@@ -20,6 +20,27 @@ class MinitestTest(CliTestCase):
20
20
  self.assert_success(result)
21
21
  self.assert_record_tests_payload('record_test_result.json')
22
22
 
23
+ # For testing https://github.com/launchableinc/cli/pull/846/files#r1591707246.
24
+ @responses.activate
25
+ @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
26
+ def test_record_test_minitest_test_path_order(self):
27
+ with tempfile.TemporaryDirectory() as tempdir:
28
+ test_path_file = os.path.join(tempdir, 'tests.xml')
29
+ with open(test_path_file, 'w') as f:
30
+ f.write("""<?xml version="1.0" encoding="UTF-8"?>
31
+ <testsuite time='1.614255' skipped='0' failures='0' errors='0' name="UserTest" assertions='1' tests='1' timestamp="2020-12-23T13:10:01+09:00">
32
+ <testcase time='1.614255' file="test/models/open_class_user_test.rb" name="test_should_not_save_user_without_name_2" assertions='1'>
33
+ </testcase>
34
+ </testsuite>""") # noqa: E501
35
+ result = self.cli('record', 'tests', '--session', self.session, 'minitest', test_path_file)
36
+ self.assert_success(result)
37
+ payload = json.loads(gzip.decompress(self.find_request('/events').request.body).decode())
38
+ self.assertEqual(
39
+ payload['events'][0]['testPath'],
40
+ [{'type': 'file', 'name': 'test/models/open_class_user_test.rb'},
41
+ {'type': 'class', 'name': 'UserTest'},
42
+ {'type': 'testcase', 'name': 'test_should_not_save_user_without_name_2'}])
43
+
23
44
  @responses.activate
24
45
  @mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
25
46
  def test_record_test_minitest_chunked(self):
@@ -4,6 +4,9 @@ import os
4
4
  import tempfile
5
5
  from unittest import mock
6
6
 
7
+ import dateutil.parser
8
+ from dateutil.tz import tzlocal
9
+
7
10
  import responses # type: ignore
8
11
 
9
12
  from launchable.utils.http_client import get_base_url
@@ -138,25 +141,30 @@ class RawTest(CliTestCase):
138
141
  test_path_file = os.path.join(tempdir, 'tests.json')
139
142
  test_path_file2 = os.path.join(tempdir, 'tests_2.json')
140
143
  test_path_file3 = os.path.join(tempdir, 'tests_3.json')
144
+ # These timestamp variables are defined for testing timezone.
145
+ test_ruby_timestamp = dateutil.parser.parse("2021-10-05T12:34:00")
146
+ test_python_timestamp = dateutil.parser.parse("2021-10-05T12:34:56")
147
+ test_go_timestamp = dateutil.parser.parse("2021-10-05T12:35:30")
148
+ test_java_timestamp = dateutil.parser.parse("2021-10-05T12:36:10")
141
149
  with open(test_path_file, 'w') as f:
142
150
  f.write('\n'.join([
143
151
  '{',
144
152
  ' "testCases": [',
145
153
  ' {',
146
- ' "testPath": "file=a.py#class=classA",',
154
+ ' "testPath": "file=test_ruby.py#class=classA",',
147
155
  ' "duration": 42,',
148
156
  ' "status": "TEST_PASSED",',
149
157
  ' "stdout": "This is stdout",',
150
158
  ' "stderr": "This is stderr",',
151
- ' "createdAt": "2021-10-05T12:34:00"',
159
+ f' "createdAt": "{test_ruby_timestamp}"',
152
160
  ' }',
153
161
  ' ,{',
154
- ' "testPath": "file=aa.py#class=classAA",',
162
+ ' "testPath": "file=test_python.py#class=classAA",',
155
163
  ' "duration": 12,',
156
164
  ' "status": "TEST_PASSED",',
157
165
  ' "stdout": "This is stdout",',
158
166
  ' "stderr": "This is stderr",',
159
- ' "createdAt": "2021-10-05T12:34:56",',
167
+ f' "createdAt": "{test_python_timestamp}",',
160
168
  ' "data": {',
161
169
  ' "lineNumber": 5',
162
170
  ' }',
@@ -170,12 +178,12 @@ class RawTest(CliTestCase):
170
178
  '{',
171
179
  ' "testCases": [',
172
180
  ' {',
173
- ' "testPath": "file=b.py#class=classB",',
181
+ ' "testPath": "file=test_go.py#class=classB",',
174
182
  ' "duration": 32,',
175
183
  ' "status": "TEST_PASSED",',
176
184
  ' "stdout": "This is stdout",',
177
185
  ' "stderr": "This is stderr",',
178
- ' "createdAt": "2021-10-05T12:34:56"',
186
+ f' "createdAt": "{test_go_timestamp}"',
179
187
  ' }',
180
188
  ' ]',
181
189
  '}',
@@ -189,7 +197,7 @@ class RawTest(CliTestCase):
189
197
  ' "testPathComponents": [',
190
198
  ' {',
191
199
  ' "type": "file",',
192
- ' "name": "login/test_a.py"',
200
+ ' "name": "test_java.py"',
193
201
  ' },',
194
202
  ' {',
195
203
  ' "type": "class",',
@@ -204,7 +212,7 @@ class RawTest(CliTestCase):
204
212
  ' "status": "TEST_PASSED",',
205
213
  ' "stdout": "This is stdout",',
206
214
  ' "stderr": "This is stderr",',
207
- ' "createdAt": "2021-10-05T12:34:56"',
215
+ f' "createdAt": "{test_java_timestamp}"',
208
216
  ' }',
209
217
  ' ]',
210
218
  '}',
@@ -223,33 +231,33 @@ class RawTest(CliTestCase):
223
231
  'events': [
224
232
  {
225
233
  'testPath': [
226
- {'type': 'file', 'name': 'a.py'},
234
+ {'type': 'file', 'name': 'test_ruby.py'},
227
235
  {'type': 'class', 'name': 'classA'},
228
236
  ],
229
237
  'duration': 42,
230
238
  'status': 1,
231
239
  'stdout': 'This is stdout',
232
240
  'stderr': 'This is stderr',
233
- 'created_at': '2021-10-05T12:34:00',
241
+ 'createdAt': test_ruby_timestamp.replace(tzinfo=tzlocal()).isoformat(),
234
242
  'data': None,
235
243
  'type': 'case',
236
244
  },
237
245
  {
238
246
  'testPath': [
239
- {'type': 'file', 'name': 'b.py'},
247
+ {'type': 'file', 'name': 'test_go.py'},
240
248
  {'type': 'class', 'name': 'classB'},
241
249
  ],
242
250
  'duration': 32,
243
251
  'status': 1,
244
252
  'stdout': 'This is stdout',
245
253
  'stderr': 'This is stderr',
246
- 'created_at': '2021-10-05T12:34:56',
254
+ 'createdAt': test_go_timestamp.replace(tzinfo=tzlocal()).isoformat(),
247
255
  'data': None,
248
256
  'type': 'case',
249
257
  },
250
258
  {
251
259
  'testPath': [
252
- {'type': 'file', 'name': 'login/test_a.py'},
260
+ {'type': 'file', 'name': 'test_java.py'},
253
261
  {'type': 'class', 'name': 'class1'},
254
262
  {'type': 'testcase', 'name': 'testcase#899'},
255
263
  ],
@@ -257,20 +265,20 @@ class RawTest(CliTestCase):
257
265
  'status': 1,
258
266
  'stdout': 'This is stdout',
259
267
  'stderr': 'This is stderr',
260
- 'created_at': '2021-10-05T12:34:56',
268
+ 'createdAt': test_java_timestamp.replace(tzinfo=tzlocal()).isoformat(),
261
269
  'data': None,
262
270
  'type': 'case',
263
271
  },
264
272
  {
265
273
  'testPath': [
266
- {'type': 'file', 'name': 'aa.py'},
274
+ {'type': 'file', 'name': 'test_python.py'},
267
275
  {'type': 'class', 'name': 'classAA'},
268
276
  ],
269
277
  'duration': 12,
270
278
  'status': 1,
271
279
  'stdout': 'This is stdout',
272
280
  'stderr': 'This is stderr',
273
- 'created_at': '2021-10-05T12:34:56',
281
+ 'createdAt': test_python_timestamp.replace(tzinfo=tzlocal()).isoformat(),
274
282
  'data': {"lineNumber": 5},
275
283
  'type': 'case',
276
284
  },
@@ -286,11 +294,14 @@ class RawTest(CliTestCase):
286
294
  with tempfile.TemporaryDirectory() as tempdir:
287
295
  test_path_file = os.path.join(tempdir, 'tests.xml')
288
296
  test_path_file2 = os.path.join(tempdir, 'tests_2.xml')
297
+ # These timestamp variables are defined for testing timezone.
298
+ timestamp1 = dateutil.parser.parse("2021-10-05T12:34:00")
299
+ timestamp2 = dateutil.parser.parse("2021-10-05T12:34:56")
289
300
  with open(test_path_file, 'w') as f:
290
301
  f.write('\n'.join([
291
302
  '<?xml version="1.0" encoding="UTF-8"?>',
292
303
  '<testsuites name="test_suite_name1" tests="1" failures="0" errors="0" time="10.123">',
293
- ' <testsuite name="test_suite_name2" errors="0" failures="0" skipped="0" timestamp="2021-10-05T12:34:00" time="10.123" tests="1">', # noqa: E501
304
+ f' <testsuite name="test_suite_name2" errors="0" failures="0" skipped="0" timestamp="{timestamp1}" time="10.123" tests="1">', # noqa: E501
294
305
  ' <testcase classname="test_class_name" name="test_case_name" time="10.123">',
295
306
  ' </testcase>',
296
307
  ' </testsuite>',
@@ -301,7 +312,7 @@ class RawTest(CliTestCase):
301
312
  f2.write('\n'.join([
302
313
  '<?xml version="1.0" encoding="UTF-8"?>',
303
314
  '<testsuites name="test_suite_name3" tests="1" failures="0" errors="0" time="12.345">',
304
- ' <testsuite name="test_suite_name4" errors="0" failures="0" skipped="0" timestamp="2021-10-05T12:34:56" time="12.345" tests="1">', # noqa: E501
315
+ f' <testsuite name="test_suite_name4" errors="0" failures="0" skipped="0" timestamp="{timestamp2}" time="12.345" tests="1">', # noqa: E501
305
316
  ' <testcase classname="test_class_name2" name="test_case_name2" time="12.345">',
306
317
  ' </testcase>',
307
318
  ' </testsuite>',
@@ -332,7 +343,7 @@ class RawTest(CliTestCase):
332
343
  'status': 1,
333
344
  'stdout': '',
334
345
  'stderr': '',
335
- 'created_at': '2021-10-05T12:34:00',
346
+ 'createdAt': timestamp1.replace(tzinfo=tzlocal()).isoformat(),
336
347
  'data': None,
337
348
  'type': 'case',
338
349
  },
@@ -345,7 +356,7 @@ class RawTest(CliTestCase):
345
356
  'status': 1,
346
357
  'stdout': '',
347
358
  'stderr': '',
348
- 'created_at': '2021-10-05T12:34:56',
359
+ 'createdAt': timestamp2.replace(tzinfo=tzlocal()).isoformat(),
349
360
  'data': None,
350
361
  'type': 'case',
351
362
  },
@@ -1,5 +0,0 @@
1
- from . import launchable
2
-
3
- subset = launchable.CommonSubsetImpls(__name__).scan_files('*_test.rb')
4
- split_subset = launchable.CommonSplitSubsetImpls(__name__).split_subset()
5
- record_tests = launchable.CommonRecordTestImpls(__name__).report_files()
File without changes
File without changes