smart-tests-cli 2.3.2__tar.gz → 2.4.1__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.
- smart_tests_cli-2.4.1/.dockerignore +4 -0
- smart_tests_cli-2.4.1/CLAUDE.md +2 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/PKG-INFO +4 -1
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/README.md +3 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/__main__.py +2 -0
- smart_tests_cli-2.4.1/smart_tests/commands/gate.py +70 -0
- smart_tests_cli-2.4.1/smart_tests/commands/record/attachment.py +151 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/commit.py +3 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/subset.py +10 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/jar/exe_deploy.jar +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/bazel.py +0 -1
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/maven.py +25 -4
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/smart_tests.py +10 -6
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/commands.py +1 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/session.py +16 -2
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/PKG-INFO +4 -1
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/SOURCES.txt +21 -2
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java +8 -0
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java +80 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +8 -8
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +277 -168
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java +45 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +22 -7
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +8 -2
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +6 -5
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java +10 -0
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java +8 -0
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java +67 -0
- smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java +101 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +4 -2
- smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java +93 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +15 -15
- smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java +124 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +5 -4
- smart_tests_cli-2.4.1/src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java +95 -0
- smart_tests_cli-2.4.1/tests/commands/record/test_attachment.py +160 -0
- smart_tests_cli-2.4.1/tests/commands/test_gate.py +126 -0
- smart_tests_cli-2.4.1/tests/data/file/record_test_result.json +53 -0
- smart_tests_cli-2.4.1/tests/data/file/record_test_result_custom_attribute.json +45 -0
- smart_tests_cli-2.4.1/tests/data/file/result.xml +9 -0
- smart_tests_cli-2.4.1/tests/data/file/result_custom_attribute.xml +9 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_by_absolute_time_result.json +4 -1
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_by_confidence_result.json +4 -1
- smart_tests_cli-2.4.1/tests/data/maven/subset_result.json +20 -0
- smart_tests_cli-2.3.2/tests/data/maven/subset_result.json → smart_tests_cli-2.4.1/tests/data/maven/subset_with_exclude_rules_result.json +1 -1
- smart_tests_cli-2.4.1/tests/test_runners/test_file.py +41 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_maven.py +19 -0
- smart_tests_cli-2.4.1/tests/utils/__init__.py +0 -0
- smart_tests_cli-2.4.1/tests/utils/test_session.py +89 -0
- smart_tests_cli-2.3.2/smart_tests/commands/record/attachment.py +0 -40
- smart_tests_cli-2.3.2/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -74
- smart_tests_cli-2.3.2/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +0 -31
- smart_tests_cli-2.3.2/tests/commands/record/test_attachment.py +0 -43
- smart_tests_cli-2.3.2/tests/utils/test_session.py +0 -48
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.bazelrc +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.bazelversion +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.editorconfig +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/release.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/bazel-test.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/e2e.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/publish.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/test.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.github/workflows/update_maven_install_json.yml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.gitignore +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.pre-commit-config.yaml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.python-version +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/.tagpr +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/CONTRIBUTING.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/Dockerfile +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/LICENSE.txt +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/WORKSPACE +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/build-java.sh +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/pyproject.toml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/renovate.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/setup.cfg +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/setup.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/app.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/README.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/argument.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/command.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/decorators.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/exceptions.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/option.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/parameter.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/args4p/typer/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/compare/subsets.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/detect_flakes.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/model.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/inspect/subset.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/build.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/case_event.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/session.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/record/tests.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/stats/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/stats/test_sessions.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/test_path_writer.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/commands/verify.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/plugins/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/adb.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/ant.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/behave.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/codeceptjs.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/ctest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cts.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cucumber.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/cypress.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/dotnet.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/file.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/flutter.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/go_test.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/googletest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/gradle.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/jasmine.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/jest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/karma.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/minitest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/nunit.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/playwright.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/prove.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/pytest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/raw.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/robot.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/rspec.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/vitest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/test_runners/xctest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/testpath.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/authentication.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/ci_provider.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/commit_ingester.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/common_tz.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/edit_distance.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/env_keys.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/exceptions.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/fail_fast_mode.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/file_name_pattern.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/git_log_parser.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/glob.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/gzipgen.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/http_client.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/input_snapshot.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/java.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/link.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/logger.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/no_build.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/sax.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/smart_tests_client.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/subprocess.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/tracking.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/utils/typer_types.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests/version.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/entry_points.txt +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/requires.txt +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/smart_tests_cli.egg-info/top_level.txt +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/BUILD +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/maven_install.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/test-runner/__main__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/converters/test_converters.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_badcode.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_badinput.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_command.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_decorators.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_help.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_parameter.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/args4p/test_typer.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/cli_test_case.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/compare/test_subsets.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/inspect/test_model.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/inspect/test_subset.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_build.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_case_event.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_commit.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_session.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/record/test_tests.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_api_error.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_detect_flakes.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_subset.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/commands/test_verify.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/adb/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/library/Cache.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ant/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/build_event.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/build_event_rest.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/bazel/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/reports/report.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/behave/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/broken_xml/broken.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/broken_xml/normal.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/codeceptjs/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/Testing/latest/Test.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/ctest_list.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/ctest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cts/test_result.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo/bar.feature +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/foo-bar.feature +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/record_test_json_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/dummy.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cucumber/report/result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/empty.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/empty.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/cypress/test-result.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/dotnet/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/dotnet/test-result.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/flutter/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/flutter/report.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/git_log_ingest/sample.out +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/reportv1/reportv1.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/reportv2/reportv2.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/go_test/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/fail/output.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/fail/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/output_a.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/output_b.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/googletest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/recursion/expected.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/README.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/jasmine-test-results.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jasmine/subset_payload.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/junit.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/jest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/README.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/sample-report.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/subset_payload.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/karma/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/createdFile_1.lst +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/createdFile_2.lst +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
- /smart_tests_cli-2.3.2/tests/data/pytest/tests/fooo/__init__.py → /smart_tests_cli-2.4.1/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/list.lst +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-1.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-2.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/TEST-nested.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/reports/dummy.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_from_file_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/TEST-UserTest.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result_chunk1.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/record_test_result_chunk2.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/minitest/test/example_test.rb +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/list.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/output-linux.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/output-windows.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/record_test_result-linux.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/record_test_result-windows.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/.gitignore +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/Program.cs +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/README.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/Test.cs +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/src/calc.csproj +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/nunit/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/record_test_result_with_json.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/report.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/playwright/report.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/prove/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/prove/report.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/pytest.ini +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/record_test_result_json.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/report.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/report.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/conftest.py +0 -0
- {smart_tests_cli-2.3.2/tests/test_runners → smart_tests_cli-2.4.1/tests/data/pytest/tests/fooo}/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/funcs3_test.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/test_funcs1.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/pytest/tests/test_funcs2.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/dryrun.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/output.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/single-output.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/robot/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/rspec/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/rspec/rspec.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/vitest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/vitest/report.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/junit.xml +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/data/xctest/subset_result.json +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/helper.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/plugins/foo.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_cli_test_case.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_plugin.py +0 -0
- {smart_tests_cli-2.3.2/tests/utils → smart_tests_cli-2.4.1/tests/test_runners}/__init__.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_adb.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_ant.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_bazel.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_behave.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_codeceptjs.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_ctest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cts.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cucumber.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_cypress.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_dotnet.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_go_test.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_googletest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_gradle.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_jasmine.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_jest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_karma.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_minitest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_nunit.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_playwright.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_prove.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_pytest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_raw.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_robot.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_rspec.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_vitest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_runners/test_xctest.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_testpath.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/test_version.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_authentication.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_edit_distance.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_fail_fast_mode.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_file_name_pattern.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_git_log_parser.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_glob.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_gzipgen.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_http_client.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_link.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_logger.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_typer.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tests/utils/test_typer_types.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tools/README.md +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/tools/generate_reference.py +0 -0
- {smart_tests_cli-2.3.2 → smart_tests_cli-2.4.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: smart-tests-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: Smart Tests CLI
|
|
5
5
|
Author-email: CloudBees <support@cloudbees.com>
|
|
6
6
|
License: Apache Software License v2
|
|
@@ -53,6 +53,9 @@ source .venv/bin/activate
|
|
|
53
53
|
uv run <command>
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
From this shell, run `pip install -e .` to create `launchable` wrapper script from the workspace.
|
|
57
|
+
This is useful to test the CLI with real/local server.
|
|
58
|
+
|
|
56
59
|
## Run tests cli
|
|
57
60
|
|
|
58
61
|
```shell
|
|
@@ -8,6 +8,7 @@ from smart_tests.app import Application
|
|
|
8
8
|
from smart_tests.args4p.command import Group
|
|
9
9
|
from smart_tests.commands.compare import compare
|
|
10
10
|
from smart_tests.commands.detect_flakes import detect_flakes
|
|
11
|
+
from smart_tests.commands.gate import gate
|
|
11
12
|
from smart_tests.commands.inspect import inspect
|
|
12
13
|
from smart_tests.commands.record import record
|
|
13
14
|
from smart_tests.commands.stats import stats
|
|
@@ -23,6 +24,7 @@ cli.add_command(inspect)
|
|
|
23
24
|
cli.add_command(stats)
|
|
24
25
|
cli.add_command(compare)
|
|
25
26
|
cli.add_command(detect_flakes)
|
|
27
|
+
cli.add_command(gate)
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
def _load_test_runners():
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
from http import HTTPStatus
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
from requests import Response
|
|
8
|
+
from tabulate import tabulate
|
|
9
|
+
|
|
10
|
+
from smart_tests.utils.tracking import TrackingClient
|
|
11
|
+
from .. import args4p
|
|
12
|
+
from ..app import Application
|
|
13
|
+
from ..args4p import typer
|
|
14
|
+
|
|
15
|
+
from ..utils.commands import Command
|
|
16
|
+
from ..utils.session import SessionId
|
|
17
|
+
from ..utils.smart_tests_client import SmartTestsClient
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@args4p.command()
|
|
21
|
+
def gate(app_instance: Application,
|
|
22
|
+
session: Annotated[SessionId, SessionId.as_option()],
|
|
23
|
+
is_json_format: Annotated[bool, typer.Option(
|
|
24
|
+
"--json",
|
|
25
|
+
help="display JSON format")] = False):
|
|
26
|
+
tracking_client = TrackingClient(Command.GATE, app=app_instance)
|
|
27
|
+
client = SmartTestsClient(tracking_client=tracking_client, app=app_instance)
|
|
28
|
+
try:
|
|
29
|
+
res: Response = client.request("get", "gate", params={"session-id": session.test_part})
|
|
30
|
+
|
|
31
|
+
if res.status_code == HTTPStatus.NOT_FOUND:
|
|
32
|
+
click.echo(click.style(
|
|
33
|
+
"Gate data currently not available for this workspace.", 'yellow'), err=True)
|
|
34
|
+
sys.exit()
|
|
35
|
+
|
|
36
|
+
res.raise_for_status()
|
|
37
|
+
|
|
38
|
+
res_json = res.json()
|
|
39
|
+
|
|
40
|
+
if is_json_format:
|
|
41
|
+
display_as_json(res)
|
|
42
|
+
else:
|
|
43
|
+
display_as_table(res)
|
|
44
|
+
|
|
45
|
+
# Exit with failure status if gate failed
|
|
46
|
+
if res_json.get('status') == 'FAILED':
|
|
47
|
+
sys.exit(1)
|
|
48
|
+
|
|
49
|
+
except Exception as e:
|
|
50
|
+
client.print_exception_and_recover(e, "Warning: failed to fetch gate status")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def display_as_json(res: Response):
|
|
54
|
+
res_json = res.json()
|
|
55
|
+
click.echo(json.dumps(res_json, indent=2))
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def display_as_table(res: Response):
|
|
59
|
+
headers = ["Status", "Quarantined (Ignored)", "Actionable Failures"]
|
|
60
|
+
res_json = res.json()
|
|
61
|
+
|
|
62
|
+
status_icon = "PASSED" if res_json.get('status') == 'PASSED' else "FAILED"
|
|
63
|
+
|
|
64
|
+
rows = [[
|
|
65
|
+
status_icon,
|
|
66
|
+
res_json.get('quarantinedFailures', 0),
|
|
67
|
+
res_json.get('actionableFailures', 0)
|
|
68
|
+
]]
|
|
69
|
+
|
|
70
|
+
click.echo(tabulate(rows, headers, tablefmt="github"))
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import fnmatch
|
|
2
|
+
import tarfile
|
|
3
|
+
import zipfile
|
|
4
|
+
from io import BytesIO
|
|
5
|
+
from typing import Annotated, List, Tuple
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
import smart_tests.args4p.typer as typer
|
|
10
|
+
from smart_tests.utils.session import SessionId, get_session
|
|
11
|
+
|
|
12
|
+
from ... import args4p
|
|
13
|
+
from ...app import Application
|
|
14
|
+
from ...utils.fail_fast_mode import warn_and_exit_if_fail_fast_mode
|
|
15
|
+
from ...utils.smart_tests_client import SmartTestsClient
|
|
16
|
+
from tabulate import tabulate
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AttachmentStatus:
|
|
20
|
+
SUCCESS = "✓ Recorded successfully"
|
|
21
|
+
FAILED = "⚠ Failed to record"
|
|
22
|
+
SKIPPED_NON_TEXT = "⚠ Skipped: not a valid text file"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@args4p.command(help="Record attachment information")
|
|
26
|
+
def attachment(
|
|
27
|
+
app: Application,
|
|
28
|
+
session: Annotated[SessionId, SessionId.as_option()],
|
|
29
|
+
attachments: Annotated[List[str], typer.Argument(
|
|
30
|
+
multiple=True,
|
|
31
|
+
help="Attachment files to upload"
|
|
32
|
+
)],
|
|
33
|
+
include_patterns: Annotated[List[str], typer.Option(
|
|
34
|
+
'--include',
|
|
35
|
+
help='Include only files matching pattern (e.g., "*.log"). Can be specified multiple times.',
|
|
36
|
+
type=str,
|
|
37
|
+
multiple=True,
|
|
38
|
+
)] = []
|
|
39
|
+
):
|
|
40
|
+
client = SmartTestsClient(app=app)
|
|
41
|
+
summary_rows = []
|
|
42
|
+
try:
|
|
43
|
+
# Note: Call get_session method to check test session exists
|
|
44
|
+
_ = get_session(session, client)
|
|
45
|
+
for a in attachments:
|
|
46
|
+
# If zip file
|
|
47
|
+
if zipfile.is_zipfile(a):
|
|
48
|
+
with zipfile.ZipFile(a, 'r') as zip_file:
|
|
49
|
+
for zip_info in zip_file.infolist():
|
|
50
|
+
if zip_info.is_dir():
|
|
51
|
+
continue
|
|
52
|
+
|
|
53
|
+
if not matches_include_patterns(zip_info.filename, include_patterns):
|
|
54
|
+
continue
|
|
55
|
+
|
|
56
|
+
file_content = zip_file.read(zip_info.filename)
|
|
57
|
+
|
|
58
|
+
if not valid_utf8_file(file_content):
|
|
59
|
+
summary_rows.append(
|
|
60
|
+
[zip_info.filename, AttachmentStatus.SKIPPED_NON_TEXT])
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
status = post_attachment(
|
|
64
|
+
client, session, file_content, zip_info.filename)
|
|
65
|
+
summary_rows.append([zip_info.filename, status])
|
|
66
|
+
|
|
67
|
+
# If tar file (tar, tar.gz, tar.bz2, tgz, etc.)
|
|
68
|
+
elif tarfile.is_tarfile(a):
|
|
69
|
+
with tarfile.open(a, 'r:*') as tar_file:
|
|
70
|
+
for tar_info in tar_file:
|
|
71
|
+
if tar_info.isdir():
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
if not matches_include_patterns(tar_info.name, include_patterns):
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
file_obj = tar_file.extractfile(tar_info)
|
|
78
|
+
if file_obj is None:
|
|
79
|
+
continue
|
|
80
|
+
|
|
81
|
+
file_content = file_obj.read()
|
|
82
|
+
|
|
83
|
+
if not valid_utf8_file(file_content):
|
|
84
|
+
summary_rows.append(
|
|
85
|
+
[tar_info.name, AttachmentStatus.SKIPPED_NON_TEXT])
|
|
86
|
+
continue
|
|
87
|
+
|
|
88
|
+
status = post_attachment(
|
|
89
|
+
client, session, file_content, tar_info.name)
|
|
90
|
+
summary_rows.append([tar_info.name, status])
|
|
91
|
+
|
|
92
|
+
else:
|
|
93
|
+
with open(a, mode='rb') as f:
|
|
94
|
+
file_content = f.read()
|
|
95
|
+
|
|
96
|
+
if not valid_utf8_file(file_content):
|
|
97
|
+
summary_rows.append(
|
|
98
|
+
[a, AttachmentStatus.SKIPPED_NON_TEXT])
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
status = post_attachment(client, session, file_content, a)
|
|
102
|
+
summary_rows.append([a, status])
|
|
103
|
+
except Exception as e:
|
|
104
|
+
client.print_exception_and_recover(e)
|
|
105
|
+
|
|
106
|
+
display_summary_as_table(summary_rows)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def matches_include_patterns(filename: str, include_patterns: List[str]) -> bool:
|
|
110
|
+
"""
|
|
111
|
+
Check if a file should be included based on the include patterns.
|
|
112
|
+
If no patterns are specified, all files are included.
|
|
113
|
+
"""
|
|
114
|
+
if not include_patterns:
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
for pattern in include_patterns:
|
|
118
|
+
if fnmatch.fnmatch(filename, pattern):
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def valid_utf8_file(file_content: bytes) -> bool:
|
|
125
|
+
# Check for null bytes (binary files)
|
|
126
|
+
if b'\x00' in file_content:
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
file_content.decode('utf-8')
|
|
131
|
+
return True
|
|
132
|
+
except UnicodeDecodeError:
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def post_attachment(client: SmartTestsClient, session: SessionId, file_content: bytes, filename: str) -> str:
|
|
137
|
+
try:
|
|
138
|
+
res = client.request(
|
|
139
|
+
"post", session.subpath("attachment"), compress=True, payload=BytesIO(file_content),
|
|
140
|
+
additional_headers={"Content-Disposition": "attachment;filename=\"{}\"".format(filename)})
|
|
141
|
+
res.raise_for_status()
|
|
142
|
+
return AttachmentStatus.SUCCESS
|
|
143
|
+
except Exception as e:
|
|
144
|
+
click.echo("Failed to upload {}: {}".format(
|
|
145
|
+
filename, str(e)), err=True)
|
|
146
|
+
return AttachmentStatus.FAILED
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def display_summary_as_table(rows):
|
|
150
|
+
headers = ["File", "Status"]
|
|
151
|
+
click.echo(tabulate(rows, headers, tablefmt="github"))
|
|
@@ -101,6 +101,9 @@ def exec_jar(name: str, source: str, max_days: int, app: Application, is_collect
|
|
|
101
101
|
# using subprocess.check_out with shell=False and a list of command to prevent vulnerability
|
|
102
102
|
# https://knowledge-base.secureflag.com/vulnerabilities/code_injection/os_command_injection_python.html
|
|
103
103
|
command = [java]
|
|
104
|
+
debug_opts = os.getenv("LAUNCHABLE_JAVA_DEBUG")
|
|
105
|
+
if debug_opts:
|
|
106
|
+
command.extend(debug_opts.split())
|
|
104
107
|
command.extend(_build_proxy_option(os.getenv("HTTPS_PROXY")))
|
|
105
108
|
command.extend([
|
|
106
109
|
"-jar",
|
|
@@ -115,6 +115,10 @@ class Subset(TestPathWriter):
|
|
|
115
115
|
help="Subsetting by confidence from 0% to 100%",
|
|
116
116
|
metavar="PERCENTAGE"
|
|
117
117
|
)] = None,
|
|
118
|
+
similarity: Annotated[float | None, typer.Option(
|
|
119
|
+
type=floatType(min=0.0, max=1.0),
|
|
120
|
+
help='subsetting by similarity from 0 to 1.0. Tests scoring above this value are included in the subset.',
|
|
121
|
+
)] = None,
|
|
118
122
|
goal_spec: Annotated[str | None, typer.Option(
|
|
119
123
|
help="Subsetting by programmatic goal definition",
|
|
120
124
|
metavar="GOAL_SPEC"
|
|
@@ -262,6 +266,7 @@ class Subset(TestPathWriter):
|
|
|
262
266
|
self.target = target
|
|
263
267
|
self.time = time
|
|
264
268
|
self.confidence = confidence
|
|
269
|
+
self.similarity = similarity
|
|
265
270
|
self.goal_spec = goal_spec
|
|
266
271
|
self.base_path = base_path
|
|
267
272
|
self.base_path_explicitly_set = (base_path is not None)
|
|
@@ -413,6 +418,11 @@ class Subset(TestPathWriter):
|
|
|
413
418
|
"type": "subset-by-goal-spec",
|
|
414
419
|
"goal": self.goal_spec
|
|
415
420
|
}
|
|
421
|
+
elif self.similarity is not None:
|
|
422
|
+
payload["goal"] = {
|
|
423
|
+
"type": "subset-by-similarity",
|
|
424
|
+
"similarity": self.similarity
|
|
425
|
+
}
|
|
416
426
|
else:
|
|
417
427
|
payload['useServerSideOptimizationTarget'] = True
|
|
418
428
|
|
|
Binary file
|
|
@@ -89,7 +89,6 @@ def record_tests(
|
|
|
89
89
|
if ts.findtext('system-out', '') == "" and ts.findtext('system-err', '') == "":
|
|
90
90
|
logfile = path.join(path.dirname(report), 'test.log')
|
|
91
91
|
if path.exists(logfile):
|
|
92
|
-
print("Found {}".format(logfile))
|
|
93
92
|
for x in ts.findall('system-out'):
|
|
94
93
|
ts.remove(x)
|
|
95
94
|
with open(logfile, 'r', encoding='utf-8', errors='replace') as log_file:
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import glob
|
|
2
2
|
import os
|
|
3
|
-
|
|
3
|
+
import re
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
from typing import Dict, List, Tuple
|
|
4
6
|
|
|
5
7
|
import click
|
|
6
8
|
|
|
7
9
|
import smart_tests.args4p.typer as typer
|
|
8
10
|
from smart_tests.utils import glob as uglob
|
|
9
11
|
from smart_tests.utils.java import junit5_nested_class_path_builder
|
|
10
|
-
|
|
12
|
+
from . import smart_tests
|
|
13
|
+
from ..args4p.exceptions import BadCmdLineException
|
|
11
14
|
from ..commands.record.tests import RecordTests
|
|
12
15
|
from ..commands.subset import Subset
|
|
13
|
-
from . import smart_tests
|
|
14
16
|
|
|
15
17
|
# Surefire has the default inclusion pattern
|
|
16
18
|
# https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#includes
|
|
@@ -66,8 +68,21 @@ def subset(
|
|
|
66
68
|
help="Scan testCompile/default-testCompile/createdFiles.lst for *.lst files generated by `mvn compile` and "
|
|
67
69
|
"use them as test inputs."
|
|
68
70
|
)] = False,
|
|
71
|
+
exclude_rules: Annotated[List[str], typer.Option(
|
|
72
|
+
"--exclude",
|
|
73
|
+
multiple=True,
|
|
74
|
+
help="Exclude tests matching the given Python regular expression pattern. Can be specified multiple times."
|
|
75
|
+
)] = [],
|
|
69
76
|
):
|
|
70
77
|
|
|
78
|
+
# Compile exclude rules
|
|
79
|
+
compiled_exclude_rules = []
|
|
80
|
+
for rule in exclude_rules:
|
|
81
|
+
try:
|
|
82
|
+
compiled_exclude_rules.append(re.compile(rule))
|
|
83
|
+
except re.error as e:
|
|
84
|
+
raise BadCmdLineException("Invalid regular expression '{}': {}".format(rule, e))
|
|
85
|
+
|
|
71
86
|
def file2class_test_path(f: str) -> List[Dict[str, str]]:
|
|
72
87
|
# remove extension
|
|
73
88
|
f, _ = os.path.splitext(f)
|
|
@@ -78,7 +93,13 @@ def subset(
|
|
|
78
93
|
|
|
79
94
|
def file2test(f: str) -> List | None:
|
|
80
95
|
if is_file(f):
|
|
81
|
-
|
|
96
|
+
test_path = file2class_test_path(f)
|
|
97
|
+
|
|
98
|
+
for pattern in compiled_exclude_rules:
|
|
99
|
+
if pattern.search(test_path[0]["name"]):
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
return test_path
|
|
82
103
|
else:
|
|
83
104
|
return None
|
|
84
105
|
|
|
@@ -169,16 +169,20 @@ class CommonRecordTestImpls:
|
|
|
169
169
|
source_roots: Annotated[list[str], typer.Argument(
|
|
170
170
|
multiple=True,
|
|
171
171
|
help="Source directories containing test report files"
|
|
172
|
-
)]
|
|
172
|
+
)],
|
|
173
|
+
file_path_attribute: Annotated[list[str], typer.Option(
|
|
174
|
+
"--file-path-attribute",
|
|
175
|
+
multiple=True,
|
|
176
|
+
help="Attributes to look for file paths in test reports (e.g., name, classname, file, filepath)"
|
|
177
|
+
)] = ["file", "filepath"]):
|
|
173
178
|
def path_builder(
|
|
174
179
|
case: TestCase, suite: TestSuite, report_file: str
|
|
175
180
|
) -> TestPath:
|
|
176
181
|
def find_filename():
|
|
177
182
|
"""look for what looks like file names from test reports"""
|
|
178
183
|
for e in [case, suite]:
|
|
179
|
-
for a in
|
|
180
|
-
filepath
|
|
181
|
-
if filepath:
|
|
184
|
+
for a in file_path_attribute:
|
|
185
|
+
if filepath := e._elem.attrib.get(a):
|
|
182
186
|
return filepath
|
|
183
187
|
return None # failing to find a test name
|
|
184
188
|
|
|
@@ -188,9 +192,9 @@ class CommonRecordTestImpls:
|
|
|
188
192
|
|
|
189
193
|
# default test path in `subset` expects to have this file name
|
|
190
194
|
test_path = [client.make_file_path_component(filepath)]
|
|
191
|
-
if suite.name:
|
|
195
|
+
if suite.name and suite.name != filepath:
|
|
192
196
|
test_path.append({"type": "testsuite", "name": suite.name})
|
|
193
|
-
if case.name:
|
|
197
|
+
if case.name and case.name != filepath:
|
|
194
198
|
test_path.append({"type": "testcase", "name": case.name})
|
|
195
199
|
return test_path
|
|
196
200
|
|
|
@@ -30,9 +30,23 @@ class SessionId:
|
|
|
30
30
|
'''This is the method in which we parse the user input, so be defensive'''
|
|
31
31
|
if id.startswith('@'):
|
|
32
32
|
file_path = id[1:]
|
|
33
|
+
# Earlier versions of PowerShell write Unicode BOM when redirecting output to a file.
|
|
34
|
+
# https://github.com/PowerShell/PowerShell/issues/8592
|
|
35
|
+
# Since we tell people to redirect `record session` output to a file, here we can
|
|
36
|
+
# encounter such files. Here's the scheme to cope with this.
|
|
37
|
+
#
|
|
38
|
+
# First we try utf-8-sig, which handles UTF-8 BOM correctly.
|
|
39
|
+
# our session ID only uses ASCII chars, so unless the writer used non ascii compatible encoding
|
|
40
|
+
# (e.g., EBCDIC but those are very very unlikely), this will read the file correctly.
|
|
41
|
+
# If the writer used UTF-16 (e.g., legacy PowerShell on Windows), we'll get a decode error, and
|
|
42
|
+
# then we try UTF-16, which handles BOM correctly.
|
|
33
43
|
try:
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
try:
|
|
45
|
+
with open(file_path, 'r', encoding='utf-8-sig') as f:
|
|
46
|
+
id = f.read().strip()
|
|
47
|
+
except UnicodeDecodeError:
|
|
48
|
+
with open(file_path, 'r', encoding='utf-16') as f:
|
|
49
|
+
id = f.read().strip()
|
|
36
50
|
except FileNotFoundError:
|
|
37
51
|
raise BadCmdLineException(f"Session file '{file_path}' not found.")
|
|
38
52
|
except IOError as e:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: smart-tests-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: Smart Tests CLI
|
|
5
5
|
Author-email: CloudBees <support@cloudbees.com>
|
|
6
6
|
License: Apache Software License v2
|
|
@@ -53,6 +53,9 @@ source .venv/bin/activate
|
|
|
53
53
|
uv run <command>
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
From this shell, run `pip install -e .` to create `launchable` wrapper script from the workspace.
|
|
57
|
+
This is useful to test the CLI with real/local server.
|
|
58
|
+
|
|
56
59
|
## Run tests cli
|
|
57
60
|
|
|
58
61
|
```shell
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
.bazelrc
|
|
2
2
|
.bazelversion
|
|
3
|
+
.dockerignore
|
|
3
4
|
.editorconfig
|
|
4
5
|
.gitignore
|
|
5
6
|
.pre-commit-config.yaml
|
|
6
7
|
.python-version
|
|
7
8
|
.tagpr
|
|
9
|
+
CLAUDE.md
|
|
8
10
|
CONTRIBUTING.md
|
|
9
11
|
Dockerfile
|
|
10
12
|
LICENSE.txt
|
|
@@ -38,6 +40,7 @@ smart_tests/args4p/converters/__init__.py
|
|
|
38
40
|
smart_tests/args4p/typer/__init__.py
|
|
39
41
|
smart_tests/commands/__init__.py
|
|
40
42
|
smart_tests/commands/detect_flakes.py
|
|
43
|
+
smart_tests/commands/gate.py
|
|
41
44
|
smart_tests/commands/subset.py
|
|
42
45
|
smart_tests/commands/test_path_writer.py
|
|
43
46
|
smart_tests/commands/verify.py
|
|
@@ -124,9 +127,12 @@ src/BUILD
|
|
|
124
127
|
src/maven_install.json
|
|
125
128
|
src/main/java/com/launchableinc/ingest/commits/Authenticator.java
|
|
126
129
|
src/main/java/com/launchableinc/ingest/commits/BUILD
|
|
130
|
+
src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java
|
|
131
|
+
src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java
|
|
127
132
|
src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java
|
|
128
133
|
src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java
|
|
129
134
|
src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java
|
|
135
|
+
src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java
|
|
130
136
|
src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java
|
|
131
137
|
src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java
|
|
132
138
|
src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java
|
|
@@ -134,22 +140,27 @@ src/main/java/com/launchableinc/ingest/commits/GitFile.java
|
|
|
134
140
|
src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java
|
|
135
141
|
src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java
|
|
136
142
|
src/main/java/com/launchableinc/ingest/commits/IOConsumer.java
|
|
143
|
+
src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java
|
|
144
|
+
src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java
|
|
137
145
|
src/main/java/com/launchableinc/ingest/commits/JSCommit.java
|
|
138
146
|
src/main/java/com/launchableinc/ingest/commits/JSFileChange.java
|
|
147
|
+
src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java
|
|
139
148
|
src/main/java/com/launchableinc/ingest/commits/Main.java
|
|
140
149
|
src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java
|
|
141
|
-
src/main/java/com/launchableinc/ingest/commits/
|
|
150
|
+
src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java
|
|
142
151
|
src/main/java/com/launchableinc/ingest/commits/SSLBypass.java
|
|
143
152
|
src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java
|
|
144
153
|
src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java
|
|
145
154
|
src/main/java/com/launchableinc/ingest/commits/VirtualFile.java
|
|
146
155
|
src/test/java/com/launchableinc/ingest/commits/AllTests.java
|
|
147
156
|
src/test/java/com/launchableinc/ingest/commits/BUILD
|
|
157
|
+
src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java
|
|
148
158
|
src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java
|
|
159
|
+
src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java
|
|
149
160
|
src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java
|
|
150
161
|
src/test/java/com/launchableinc/ingest/commits/MainTest.java
|
|
151
162
|
src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java
|
|
152
|
-
src/test/java/com/launchableinc/ingest/commits/
|
|
163
|
+
src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java
|
|
153
164
|
src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java
|
|
154
165
|
src/test/java/com/launchableinc/ingest/commits/java8-compat.sh
|
|
155
166
|
test-runner/__main__.py
|
|
@@ -173,6 +184,7 @@ tests/args4p/converters/test_converters.py
|
|
|
173
184
|
tests/commands/__init__.py
|
|
174
185
|
tests/commands/test_api_error.py
|
|
175
186
|
tests/commands/test_detect_flakes.py
|
|
187
|
+
tests/commands/test_gate.py
|
|
176
188
|
tests/commands/test_subset.py
|
|
177
189
|
tests/commands/test_verify.py
|
|
178
190
|
tests/commands/compare/__init__.py
|
|
@@ -253,6 +265,10 @@ tests/data/cypress/subset_result.json
|
|
|
253
265
|
tests/data/cypress/test-result.xml
|
|
254
266
|
tests/data/dotnet/record_test_result.json
|
|
255
267
|
tests/data/dotnet/test-result.xml
|
|
268
|
+
tests/data/file/record_test_result.json
|
|
269
|
+
tests/data/file/record_test_result_custom_attribute.json
|
|
270
|
+
tests/data/file/result.xml
|
|
271
|
+
tests/data/file/result_custom_attribute.xml
|
|
256
272
|
tests/data/flutter/record_test_result.json
|
|
257
273
|
tests/data/flutter/report.json
|
|
258
274
|
tests/data/git_log_ingest/sample.out
|
|
@@ -293,8 +309,10 @@ tests/data/maven/subset_by_confidence_result.json
|
|
|
293
309
|
tests/data/maven/subset_from_file_result.json
|
|
294
310
|
tests/data/maven/subset_result.json
|
|
295
311
|
tests/data/maven/subset_scan_test_compile_lst_result.json
|
|
312
|
+
tests/data/maven/subset_with_exclude_rules_result.json
|
|
296
313
|
tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java
|
|
297
314
|
tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java
|
|
315
|
+
tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java
|
|
298
316
|
tests/data/maven/reports/TEST-1.xml
|
|
299
317
|
tests/data/maven/reports/TEST-2.xml
|
|
300
318
|
tests/data/maven/reports/TEST-nested.xml
|
|
@@ -366,6 +384,7 @@ tests/test_runners/test_cts.py
|
|
|
366
384
|
tests/test_runners/test_cucumber.py
|
|
367
385
|
tests/test_runners/test_cypress.py
|
|
368
386
|
tests/test_runners/test_dotnet.py
|
|
387
|
+
tests/test_runners/test_file.py
|
|
369
388
|
tests/test_runners/test_go_test.py
|
|
370
389
|
tests/test_runners/test_googletest.py
|
|
371
390
|
tests/test_runners/test_gradle.py
|
smart_tests_cli-2.4.1/src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
package com.launchableinc.ingest.commits;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.concurrent.AbstractExecutorService;
|
|
5
|
+
import java.util.concurrent.ExecutorService;
|
|
6
|
+
import java.util.concurrent.Executors;
|
|
7
|
+
import java.util.concurrent.RejectedExecutionException;
|
|
8
|
+
import java.util.concurrent.Semaphore;
|
|
9
|
+
import java.util.concurrent.TimeUnit;
|
|
10
|
+
import java.util.concurrent.atomic.AtomicInteger;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* {@link ExecutorService} decorator that limits the number of concurrent tasks,
|
|
14
|
+
* and make the caller block when the limit is reached.
|
|
15
|
+
*/
|
|
16
|
+
class BoundedExecutorService extends AbstractExecutorService {
|
|
17
|
+
private final ExecutorService delegate;
|
|
18
|
+
private final Semaphore semaphore;
|
|
19
|
+
/** # of threads that are blocked trying to {@link #execute(Runnable)}. Just for diagnostics. */
|
|
20
|
+
private final AtomicInteger blockCount = new AtomicInteger(0);
|
|
21
|
+
|
|
22
|
+
BoundedExecutorService(int limit) {
|
|
23
|
+
this(Executors.newFixedThreadPool(limit), limit);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
BoundedExecutorService(ExecutorService delegate, int limit) {
|
|
27
|
+
this.delegate = delegate;
|
|
28
|
+
this.semaphore = new Semaphore(limit);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public void execute(Runnable command) {
|
|
33
|
+
try {
|
|
34
|
+
blockCount.incrementAndGet();
|
|
35
|
+
semaphore.acquire();
|
|
36
|
+
} catch (InterruptedException e) {
|
|
37
|
+
throw new RejectedExecutionException(e);
|
|
38
|
+
} finally {
|
|
39
|
+
blockCount.decrementAndGet();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
delegate.execute(() -> {
|
|
44
|
+
try {
|
|
45
|
+
command.run();
|
|
46
|
+
} finally {
|
|
47
|
+
semaphore.release();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
} catch (RejectedExecutionException e) {
|
|
51
|
+
semaphore.release();
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@Override
|
|
57
|
+
public void shutdown() {
|
|
58
|
+
delegate.shutdown();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@Override
|
|
62
|
+
public List<Runnable> shutdownNow() {
|
|
63
|
+
return delegate.shutdownNow();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Override
|
|
67
|
+
public boolean isShutdown() {
|
|
68
|
+
return delegate.isShutdown();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public boolean isTerminated() {
|
|
73
|
+
return delegate.isTerminated();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@Override
|
|
77
|
+
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
|
|
78
|
+
return delegate.awaitTermination(timeout, unit);
|
|
79
|
+
}
|
|
80
|
+
}
|