launchable 1.98.0__tar.gz → 1.98.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {launchable-1.98.0 → launchable-1.98.3}/.github/workflows/bazel-test.yml +1 -1
- {launchable-1.98.0 → launchable-1.98.3}/.github/workflows/python-package.yml +8 -5
- {launchable-1.98.0 → launchable-1.98.3}/.github/workflows/python-publish.yml +1 -1
- {launchable-1.98.0 → launchable-1.98.3}/.github/workflows/update_maven_install_json.yml +1 -1
- {launchable-1.98.0 → launchable-1.98.3}/PKG-INFO +4 -3
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/subset.py +39 -11
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/gradle.py +3 -19
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/maven.py +6 -1
- launchable-1.98.3/launchable/utils/java.py +58 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/PKG-INFO +4 -3
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/SOURCES.txt +1 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/requires.txt +1 -1
- {launchable-1.98.0 → launchable-1.98.3}/setup.cfg +1 -1
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/record_test_result.json +18 -0
- launchable-1.98.3/tests/data/maven/reports/TEST-nested.xml +4 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_maven.py +43 -0
- launchable-1.98.0/launchable/utils/java.py +0 -29
- {launchable-1.98.0 → launchable-1.98.3}/.bazelrc +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.bazelversion +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.editorconfig +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.github/release.yml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.github/workflows/e2e.yml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.gitignore +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.pre-commit-config.yaml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.python-version +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/.tagpr +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/CONTRIBUTING.md +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/Dockerfile +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/LICENSE.txt +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/Pipfile +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/README.md +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/WORKSPACE +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/build-java.sh +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/__main__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/app.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/helper.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/inspect/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/inspect/subset.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/inspect/tests.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/attachment.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/build.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/case_event.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/commit.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/session.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/record/tests.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/split_subset.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/stats/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/stats/test_sessions.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/test_path_writer.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/commands/verify.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/jar/exe_deploy.jar +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/plugins/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/adb.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/ant.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/bazel.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/behave.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/ctest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/cts.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/cucumber.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/cypress.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/dotnet.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/file.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/flutter.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/go_test.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/googletest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/jest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/launchable.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/minitest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/nunit.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/playwright.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/prove.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/pytest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/raw.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/robot.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/test_runners/rspec.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/testpath.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/authentication.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/ci_provider.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/click.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/commit_ingester.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/env_keys.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/exceptions.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/file_name_pattern.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/git_log_parser.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/glob.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/gzipgen.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/http_client.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/launchable_client.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/link.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/logger.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/no_build.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/sax.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/session.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/subprocess.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/utils/tracking.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable/version.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/dependency_links.txt +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/entry_points.txt +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/launchable.egg-info/top_level.txt +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/pyproject.toml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/renovate.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/setup.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/BUILD +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/CommitIngester.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/maven_install.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/CommitIngesterTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/test-runner/__main__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/cli_test_case.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/inspect/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/inspect/test_subset.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/inspect/test_tests.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/test_attachment.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/test_build.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/test_commit.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/test_session.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/record/test_tests.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/test_api_error.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/test_helper.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/test_split_subset.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/test_subset.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/commands/test_verify.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/adb/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/junitreport/TEST-com.launchable.HelloWorldTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/junitreport/TEST-com.launchable.library.CacheTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/src/com/launchable/HelloWorld.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/src/com/launchable/HelloWorldTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/src/com/launchable/library/Cache.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/src/com/launchable/library/CacheTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ant/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/build_event.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/build_event_rest.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/bazel/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/behave/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/behave/reports/report.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/behave/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/broken_xml/broken.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/broken_xml/normal.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ctest/Testing/latest/Test.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ctest/ctest_list.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ctest/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/ctest/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cts/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cts/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cts/test_result.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/features/foo/bar.feature +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/features/foo-bar.feature +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/record_test_json_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/report/dummy.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cucumber/report/result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cypress/empty.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cypress/empty.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cypress/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cypress/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/cypress/test-result.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/dotnet/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/dotnet/test-result.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/flutter/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/flutter/report.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/git_log_ingest/sample.out +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/go_test/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/go_test/reportv1/reportv1.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/go_test/reportv2/reportv2.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/go_test/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/fail/output.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/fail/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/output_a.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/output_b.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/googletest/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/App2Test.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/AppTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/gradle/java/app/src/test/java/com/launchableinc/rocket_car_gradle/sub/App3Test.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/gradle/recursion/expected.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/jest/junit.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/jest/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/jest/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/createdFile_1.lst +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/createdFile_2.lst +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/App2Test.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/AppTest.java +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/list.lst +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/reports/TEST-1.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/reports/TEST-2.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/reports/dummy.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/subset_by_confidence_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/subset_from_file_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/maven/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/TEST-UserTest.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/record_test_result_chunk1.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/record_test_result_chunk2.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/minitest/test/example_test.rb +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/list.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/output-linux.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/output-windows.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/record_test_result-linux.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/record_test_result-windows.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/src/.gitignore +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/src/Program.cs +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/src/README.md +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/src/Test.cs +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/src/calc.csproj +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/nunit/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/playwright/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/playwright/record_test_result_with_json.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/playwright/report.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/playwright/report.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/prove/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/prove/report.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/pytest.ini +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/record_test_result_json.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/report.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/report.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/conftest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/fooo/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/funcs3_test.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/test_funcs1.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/pytest/tests/test_funcs2.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/dryrun.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/output.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/single-output.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/robot/subset_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/rspec/record_test_result.json +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/data/rspec/rspec.xml +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/helper.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/plugins/foo.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_cli_test_case.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_plugin.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_adb.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_ant.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_bazel.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_behave.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_ctest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_cts.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_cucumber.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_cypress.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_dotnet.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_go_test.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_googletest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_gradle.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_jest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_minitest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_nunit.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_playwright.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_prove.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_pytest.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_raw.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_robot.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_runners/test_rspec.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_session.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_testpath.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/test_version.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/__init__.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_authentication.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_click.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_file_name_pattern.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_git_log_parser.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_glob.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_gzipgen.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_http_client.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_link.py +0 -0
- {launchable-1.98.0 → launchable-1.98.3}/tests/utils/test_logger.py +0 -0
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
- name: Setup Bazel
|
|
26
26
|
uses: bazelbuild/setup-bazelisk@b39c379c82683a5f25d34f0d062761f62693e0b2 # v3.0.0
|
|
27
27
|
- name: Cache Bazel outputs
|
|
28
|
-
uses: actions/cache@
|
|
28
|
+
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
|
29
29
|
with:
|
|
30
30
|
path: "~/.cache/bazel"
|
|
31
31
|
key: bazel
|
|
@@ -31,12 +31,15 @@ permissions:
|
|
|
31
31
|
|
|
32
32
|
jobs:
|
|
33
33
|
build:
|
|
34
|
-
|
|
35
34
|
runs-on: ${{ matrix.os }}
|
|
36
35
|
strategy:
|
|
37
36
|
matrix:
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
# Python 3.6 is not supported on Ubuntu 22.04.
|
|
38
|
+
os: [ubuntu-22.04, windows-latest]
|
|
39
|
+
python-version: [3.7, 3.8, 3.9, "3.10", "3.11", "3.12"]
|
|
40
|
+
include:
|
|
41
|
+
- os: windows-latest
|
|
42
|
+
python-version: 3.6
|
|
40
43
|
|
|
41
44
|
steps:
|
|
42
45
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
@@ -53,7 +56,7 @@ jobs:
|
|
|
53
56
|
distribution: 'temurin'
|
|
54
57
|
- name: Install specific dependencies in 3.6
|
|
55
58
|
if: matrix.python-version == '3.6'
|
|
56
|
-
uses: nick-fields/retry@
|
|
59
|
+
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
|
|
57
60
|
with:
|
|
58
61
|
max_attempts: 3
|
|
59
62
|
timeout_minutes: 5
|
|
@@ -64,7 +67,7 @@ jobs:
|
|
|
64
67
|
pipenv install --dev --python ${{ matrix.python-version }}
|
|
65
68
|
- name: Install dependencies
|
|
66
69
|
if: matrix.python-version != '3.6'
|
|
67
|
-
uses: nick-fields/retry@
|
|
70
|
+
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
|
|
68
71
|
with:
|
|
69
72
|
max_attempts: 3
|
|
70
73
|
timeout_minutes: 5
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
- name: Setup Bazel
|
|
22
22
|
uses: bazelbuild/setup-bazelisk@b39c379c82683a5f25d34f0d062761f62693e0b2 # v3.0.0
|
|
23
23
|
- name: Cache Bazel outputs
|
|
24
|
-
uses: actions/cache@
|
|
24
|
+
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
|
25
25
|
with:
|
|
26
26
|
path: "~/.cache/bazel"
|
|
27
27
|
key: bazel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: launchable
|
|
3
|
-
Version: 1.98.
|
|
3
|
+
Version: 1.98.3
|
|
4
4
|
Summary: Launchable CLI
|
|
5
5
|
Home-page: https://launchableinc.com/
|
|
6
6
|
Author: Launchable, Inc.
|
|
@@ -13,7 +13,7 @@ Requires-Python: >=3.6
|
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE.txt
|
|
15
15
|
Requires-Dist: click<8.1,>=8.0; python_version == "3.6"
|
|
16
|
-
Requires-Dist: click
|
|
16
|
+
Requires-Dist: click<8.2,>=8.1; python_version > "3.6"
|
|
17
17
|
Requires-Dist: requests>=2.25; python_version >= "3.6"
|
|
18
18
|
Requires-Dist: urllib3>=1.26
|
|
19
19
|
Requires-Dist: junitparser>=2.0.0
|
|
@@ -21,6 +21,7 @@ Requires-Dist: setuptools
|
|
|
21
21
|
Requires-Dist: more_itertools>=7.1.0; python_version >= "3.6"
|
|
22
22
|
Requires-Dist: python-dateutil
|
|
23
23
|
Requires-Dist: tabulate
|
|
24
|
+
Dynamic: license-file
|
|
24
25
|
|
|
25
26
|
# Usage
|
|
26
27
|
|
|
@@ -159,6 +159,14 @@ from .test_path_writer import TestPathWriter
|
|
|
159
159
|
help="If you want to only send test reports, please use this option",
|
|
160
160
|
is_flag=True,
|
|
161
161
|
)
|
|
162
|
+
@click.option(
|
|
163
|
+
'--session-name',
|
|
164
|
+
'session_name',
|
|
165
|
+
help='test session name',
|
|
166
|
+
required=False,
|
|
167
|
+
type=str,
|
|
168
|
+
metavar='SESSION_NAME',
|
|
169
|
+
)
|
|
162
170
|
@click.option(
|
|
163
171
|
'--lineage',
|
|
164
172
|
'lineage',
|
|
@@ -210,6 +218,7 @@ def subset(
|
|
|
210
218
|
ignore_flaky_tests_above: Optional[float],
|
|
211
219
|
links: Sequence[Tuple[str, str]] = (),
|
|
212
220
|
is_no_build: bool = False,
|
|
221
|
+
session_name: Optional[str] = None,
|
|
213
222
|
lineage: Optional[str] = None,
|
|
214
223
|
prioritize_tests_failed_within_hours: Optional[int] = None,
|
|
215
224
|
prioritized_tests_mapping_file: Optional[TextIO] = None,
|
|
@@ -263,18 +272,37 @@ def subset(
|
|
|
263
272
|
session_id = None
|
|
264
273
|
tracking_client = TrackingClient(Tracking.Command.SUBSET, app=app)
|
|
265
274
|
try:
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
275
|
+
if session_name:
|
|
276
|
+
if not build_name:
|
|
277
|
+
raise click.UsageError(
|
|
278
|
+
'--build option is required when you use a --session-name option ')
|
|
279
|
+
sub_path = "builds/{}/test_session_names/{}".format(build_name, session_name)
|
|
280
|
+
client = LaunchableClient(test_runner=context.invoked_subcommand, app=context.obj, tracking_client=tracking_client)
|
|
281
|
+
res = client.request("get", sub_path)
|
|
282
|
+
res.raise_for_status()
|
|
283
|
+
session_id = "builds/{}/test_sessions/{}".format(build_name, res.json().get("id"))
|
|
284
|
+
else:
|
|
285
|
+
session_id = find_or_create_session(
|
|
286
|
+
context=context,
|
|
287
|
+
session=session,
|
|
288
|
+
build_name=build_name,
|
|
289
|
+
flavor=flavor,
|
|
290
|
+
is_observation=is_observation,
|
|
291
|
+
links=links,
|
|
292
|
+
is_no_build=is_no_build,
|
|
293
|
+
lineage=lineage,
|
|
294
|
+
tracking_client=tracking_client,
|
|
295
|
+
test_suite=test_suite,
|
|
296
|
+
)
|
|
297
|
+
except click.UsageError as e:
|
|
298
|
+
click.echo(
|
|
299
|
+
click.style(
|
|
300
|
+
str(e),
|
|
301
|
+
fg="red"),
|
|
302
|
+
err=True,
|
|
277
303
|
)
|
|
304
|
+
tracking_client.send_error_event(event_name=Tracking.ErrorEvent.USER_ERROR, stack_trace=str(e))
|
|
305
|
+
sys.exit(1)
|
|
278
306
|
except Exception as e:
|
|
279
307
|
tracking_client.send_error_event(
|
|
280
308
|
event_name=Tracking.ErrorEvent.INTERNAL_CLI_ERROR,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Dict, List
|
|
3
|
-
from unittest import TestCase, TestSuite
|
|
4
3
|
|
|
5
4
|
import click
|
|
6
5
|
|
|
7
|
-
from
|
|
6
|
+
from launchable.utils.java import junit5_nested_class_path_builder
|
|
7
|
+
|
|
8
8
|
from ..utils.file_name_pattern import jvm_test_pattern
|
|
9
9
|
from . import launchable
|
|
10
10
|
|
|
@@ -109,21 +109,5 @@ def to_class_file(class_name: str):
|
|
|
109
109
|
@click.argument('reports', required=True, nargs=-1)
|
|
110
110
|
@launchable.record.tests
|
|
111
111
|
def record_tests(client, reports):
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def path_builder(case: TestCase, suite: TestSuite,
|
|
115
|
-
report_file: str) -> TestPath:
|
|
116
|
-
"""
|
|
117
|
-
With @Nested tests in JUnit 5, test class names have inner class names
|
|
118
|
-
like com.launchableinc.rocket_car_gradle.AppTest$InnerClass.
|
|
119
|
-
It causes a problem in subsetting bacause Launchable CLI can't detect inner classes in subsetting.
|
|
120
|
-
So, we need to ignore the inner class names. The inner class name is separated by $.
|
|
121
|
-
Note: Launchable allows to use $ in test paths. But we decided ignoring it in this case
|
|
122
|
-
beause $ in the class name is not a common case.
|
|
123
|
-
"""
|
|
124
|
-
test_path = default_path_builder(case, suite, report_file)
|
|
125
|
-
return [{**item, "name": item["name"].split("$")[0]} if item["type"] == "class" else item for item in test_path]
|
|
126
|
-
|
|
127
|
-
client.path_builder = path_builder
|
|
128
|
-
|
|
112
|
+
client.path_builder = junit5_nested_class_path_builder(client.path_builder)
|
|
129
113
|
launchable.CommonRecordTestImpls.load_report_files(client=client, source_roots=reports)
|
|
@@ -4,6 +4,7 @@ from typing import Dict, List, Optional
|
|
|
4
4
|
import click
|
|
5
5
|
|
|
6
6
|
from launchable.utils import glob
|
|
7
|
+
from launchable.utils.java import junit5_nested_class_path_builder
|
|
7
8
|
|
|
8
9
|
from . import launchable
|
|
9
10
|
|
|
@@ -113,4 +114,8 @@ def split_subset(client):
|
|
|
113
114
|
#
|
|
114
115
|
# So to collectly find tests without duplications, we need to find surefire-reports/TEST-*.xml
|
|
115
116
|
# not surefire-reports/**/TEST-*.xml nor surefire-reports/*.xml
|
|
116
|
-
|
|
117
|
+
@click.argument('reports', required=True, nargs=-1)
|
|
118
|
+
@launchable.record.tests
|
|
119
|
+
def record_tests(client, reports):
|
|
120
|
+
client.path_builder = junit5_nested_class_path_builder(client.path_builder)
|
|
121
|
+
launchable.CommonRecordTestImpls.load_report_files(client=client, source_roots=reports)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import subprocess
|
|
4
|
+
import sys
|
|
5
|
+
from typing import Callable
|
|
6
|
+
from unittest import TestCase, TestSuite
|
|
7
|
+
|
|
8
|
+
from launchable.testpath import TestPath
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_java_command():
|
|
12
|
+
if shutil.which("java"):
|
|
13
|
+
return "java"
|
|
14
|
+
|
|
15
|
+
if os.access(os.path.expandvars("$JAVA_HOME/bin/java"), os.X_OK):
|
|
16
|
+
return os.path.expandvars("$JAVA_HOME/bin/java")
|
|
17
|
+
|
|
18
|
+
return None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def cygpath(p):
|
|
22
|
+
# When running in Cygwin ported Python (as opposed to Windows native Python), the paths we deal with are in
|
|
23
|
+
# the cygwin format. But when we invoke Windows native Java (and there's no Cygwin ported Java), those parameters
|
|
24
|
+
# need to be in the Windows path format.
|
|
25
|
+
#
|
|
26
|
+
# In Cygwin aware world, it is always the responsibility of the Cygwin process calling Windows native process to
|
|
27
|
+
# do this conversion, so here we are.
|
|
28
|
+
#
|
|
29
|
+
# Cygwin ported Python is not to be confused with Windows native Python running in Windows with cygwin.
|
|
30
|
+
# So tests like CYGWIN env var, "uname" are incorrect.
|
|
31
|
+
if sys.platform == 'cygwin':
|
|
32
|
+
p = subprocess.check_output(['cygpath', '-w', p]).decode().strip()
|
|
33
|
+
return p
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def junit5_nested_class_path_builder(
|
|
37
|
+
default_path_builder: Callable[[TestCase, TestSuite, str], TestPath]) -> Callable[[TestCase, TestSuite, str], TestPath]:
|
|
38
|
+
"""
|
|
39
|
+
Creates a path builder function that handles JUnit 5 nested class names.
|
|
40
|
+
|
|
41
|
+
With @Nested tests in JUnit 5, test class names have inner class names
|
|
42
|
+
like com.launchableinc.rocket_car.NestedTest$InnerClass.
|
|
43
|
+
It causes a problem in subsetting because Launchable CLI can't detect inner classes in subsetting.
|
|
44
|
+
So, we need to ignore the inner class names. The inner class name is separated by $.
|
|
45
|
+
Note: Launchable allows $ in test paths. But we decided to remove it in this case
|
|
46
|
+
because $ in the class name is not a common case.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
default_path_builder: The original path builder function to wrap
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
A function that wraps the default path builder and handles nested class names
|
|
53
|
+
"""
|
|
54
|
+
def path_builder(case: TestCase, suite: TestSuite, report_file: str) -> TestPath:
|
|
55
|
+
test_path = default_path_builder(case, suite, report_file)
|
|
56
|
+
return [{**item, "name": item["name"].split("$")[0]} if item["type"] == "class" else item for item in test_path]
|
|
57
|
+
|
|
58
|
+
return path_builder
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: launchable
|
|
3
|
-
Version: 1.98.
|
|
3
|
+
Version: 1.98.3
|
|
4
4
|
Summary: Launchable CLI
|
|
5
5
|
Home-page: https://launchableinc.com/
|
|
6
6
|
Author: Launchable, Inc.
|
|
@@ -13,7 +13,7 @@ Requires-Python: >=3.6
|
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE.txt
|
|
15
15
|
Requires-Dist: click<8.1,>=8.0; python_version == "3.6"
|
|
16
|
-
Requires-Dist: click
|
|
16
|
+
Requires-Dist: click<8.2,>=8.1; python_version > "3.6"
|
|
17
17
|
Requires-Dist: requests>=2.25; python_version >= "3.6"
|
|
18
18
|
Requires-Dist: urllib3>=1.26
|
|
19
19
|
Requires-Dist: junitparser>=2.0.0
|
|
@@ -21,6 +21,7 @@ Requires-Dist: setuptools
|
|
|
21
21
|
Requires-Dist: more_itertools>=7.1.0; python_version >= "3.6"
|
|
22
22
|
Requires-Dist: python-dateutil
|
|
23
23
|
Requires-Dist: tabulate
|
|
24
|
+
Dynamic: license-file
|
|
24
25
|
|
|
25
26
|
# Usage
|
|
26
27
|
|
|
@@ -241,6 +241,7 @@ tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/App2Test.
|
|
|
241
241
|
tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/AppTest.java
|
|
242
242
|
tests/data/maven/reports/TEST-1.xml
|
|
243
243
|
tests/data/maven/reports/TEST-2.xml
|
|
244
|
+
tests/data/maven/reports/TEST-nested.xml
|
|
244
245
|
tests/data/maven/reports/dummy.xml
|
|
245
246
|
tests/data/minitest/TEST-Admin_UserTest.xml
|
|
246
247
|
tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml
|
|
@@ -18,6 +18,24 @@
|
|
|
18
18
|
"stderr": "",
|
|
19
19
|
"data": null
|
|
20
20
|
},
|
|
21
|
+
{
|
|
22
|
+
"type": "case",
|
|
23
|
+
"testPath": [
|
|
24
|
+
{
|
|
25
|
+
"type": "class",
|
|
26
|
+
"name": "com.launchableinc.rocket_car_maven.NestedTest"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"type": "testcase",
|
|
30
|
+
"name": "shouldAnswerWithTrue"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"duration": 0.001,
|
|
34
|
+
"status": 1,
|
|
35
|
+
"stdout": "",
|
|
36
|
+
"stderr": "",
|
|
37
|
+
"data": null
|
|
38
|
+
},
|
|
21
39
|
{
|
|
22
40
|
"type": "case",
|
|
23
41
|
"testPath": [
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="com.launchableinc.rocket_car_maven.NestedTest$InnerClass" time="0.023" tests="1" errors="0" skipped="0" failures="0">
|
|
3
|
+
<testcase name="shouldAnswerWithTrue" classname="com.launchableinc.rocket_car_maven.NestedTest$InnerClass" time="0.001" />
|
|
4
|
+
</testsuite>
|
|
@@ -129,6 +129,49 @@ class MavenTest(CliTestCase):
|
|
|
129
129
|
self.assert_success(result)
|
|
130
130
|
self.assert_record_tests_payload("record_test_result.json")
|
|
131
131
|
|
|
132
|
+
@responses.activate
|
|
133
|
+
@mock.patch.dict(os.environ, {"LAUNCHABLE_TOKEN": CliTestCase.launchable_token})
|
|
134
|
+
def test_record_test_maven_with_nested_class(self):
|
|
135
|
+
"""Verify that class names containing $ (inner class marker) are processed correctly during test recording"""
|
|
136
|
+
# Test the path_builder function directly by extracting it from the maven module
|
|
137
|
+
from unittest import TestCase as UnitTestCase
|
|
138
|
+
from unittest import TestSuite as UnitTestSuite
|
|
139
|
+
|
|
140
|
+
# Extract the implementation from maven.py directly
|
|
141
|
+
# This gets the implementation without going through the CLI/Click command
|
|
142
|
+
def create_custom_path_builder(default_path_builder):
|
|
143
|
+
def path_builder(case, suite, report_file):
|
|
144
|
+
test_path = default_path_builder(case, suite, report_file)
|
|
145
|
+
return [{**item, "name": item["name"].split("$")[0]} if item["type"] == "class" else item for item in test_path]
|
|
146
|
+
return path_builder
|
|
147
|
+
|
|
148
|
+
# Mock the default path builder that would return a class with $ in it
|
|
149
|
+
def default_path_builder(case, suite, report_file):
|
|
150
|
+
return [{"type": "class", "name": "com.launchableinc.rocket_car_maven.NestedTest$InnerClass"}]
|
|
151
|
+
|
|
152
|
+
# Create our custom path builder function
|
|
153
|
+
custom_path_builder = create_custom_path_builder(default_path_builder)
|
|
154
|
+
|
|
155
|
+
# Test it directly with dummy inputs
|
|
156
|
+
test_case = UnitTestCase()
|
|
157
|
+
test_suite = UnitTestSuite()
|
|
158
|
+
report_file = "TEST-nested.xml"
|
|
159
|
+
|
|
160
|
+
# Call the path_builder
|
|
161
|
+
result_path = custom_path_builder(test_case, test_suite, report_file)
|
|
162
|
+
|
|
163
|
+
# Verify the result - it should remove everything after $
|
|
164
|
+
self.assertEqual(result_path[0]["name"], "com.launchableinc.rocket_car_maven.NestedTest")
|
|
165
|
+
self.assertNotIn("$", result_path[0]["name"])
|
|
166
|
+
|
|
167
|
+
# Now run the actual CLI command to ensure integration works
|
|
168
|
+
result = self.cli('record', 'tests', '--session', self.session,
|
|
169
|
+
'maven',
|
|
170
|
+
str(self.test_files_dir) + "/maven/reports/TEST-1.xml",
|
|
171
|
+
str(self.test_files_dir) + "/maven/reports/TEST-2.xml",
|
|
172
|
+
str(self.test_files_dir) + "/maven/reports/TEST-nested.xml")
|
|
173
|
+
self.assert_success(result)
|
|
174
|
+
|
|
132
175
|
def test_glob(self):
|
|
133
176
|
for x in [
|
|
134
177
|
'foo/BarTest.java',
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import shutil
|
|
3
|
-
import subprocess
|
|
4
|
-
import sys
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_java_command():
|
|
8
|
-
if shutil.which("java"):
|
|
9
|
-
return "java"
|
|
10
|
-
|
|
11
|
-
if os.access(os.path.expandvars("$JAVA_HOME/bin/java"), os.X_OK):
|
|
12
|
-
return os.path.expandvars("$JAVA_HOME/bin/java")
|
|
13
|
-
|
|
14
|
-
return None
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def cygpath(p):
|
|
18
|
-
# When running in Cygwin ported Python (as opposed to Windows native Python), the paths we deal with are in
|
|
19
|
-
# the cygwin format. But when we invoke Windows native Java (and there's no Cygwin ported Java), those parameters
|
|
20
|
-
# need to be in the Windows path format.
|
|
21
|
-
#
|
|
22
|
-
# In Cygwin aware world, it is always the responsibility of the Cygwin process calling Windows native process to
|
|
23
|
-
# do this conversion, so here we are.
|
|
24
|
-
#
|
|
25
|
-
# Cygwin ported Python is not to be confused with Windows native Python running in Windows with cygwin.
|
|
26
|
-
# So tests like CYGWIN env var, "uname" are incorrect.
|
|
27
|
-
if sys.platform == 'cygwin':
|
|
28
|
-
p = subprocess.check_output(['cygpath', '-w', p]).decode().strip()
|
|
29
|
-
return p
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|