smart-tests-cli 2.3.1__tar.gz → 2.4.0__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.0/CLAUDE.md +2 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/PKG-INFO +4 -1
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/README.md +3 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/__main__.py +2 -0
- smart_tests_cli-2.4.0/smart_tests/commands/gate.py +70 -0
- smart_tests_cli-2.4.0/smart_tests/commands/record/attachment.py +151 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/commit.py +3 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/subset.py +10 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/jar/exe_deploy.jar +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/bazel.py +0 -1
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/maven.py +25 -4
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/commands.py +1 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/PKG-INFO +4 -1
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/SOURCES.txt +15 -2
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/BUILD +1 -0
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java +8 -0
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java +80 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +8 -8
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +298 -168
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java +45 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +22 -7
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +8 -2
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +6 -5
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java +10 -0
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java +8 -0
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java +67 -0
- smart_tests_cli-2.4.0/src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java +101 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +4 -2
- smart_tests_cli-2.4.0/src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java +93 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +15 -15
- smart_tests_cli-2.4.0/src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java +124 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +5 -4
- smart_tests_cli-2.4.0/src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java +95 -0
- smart_tests_cli-2.4.0/tests/commands/record/test_attachment.py +160 -0
- smart_tests_cli-2.4.0/tests/commands/test_gate.py +126 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/subset_by_absolute_time_result.json +4 -1
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/subset_by_confidence_result.json +4 -1
- smart_tests_cli-2.4.0/tests/data/maven/subset_result.json +20 -0
- smart_tests_cli-2.3.1/tests/data/maven/subset_result.json → smart_tests_cli-2.4.0/tests/data/maven/subset_with_exclude_rules_result.json +1 -1
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_maven.py +19 -0
- smart_tests_cli-2.4.0/tests/utils/__init__.py +0 -0
- smart_tests_cli-2.3.1/smart_tests/commands/record/attachment.py +0 -40
- smart_tests_cli-2.3.1/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -74
- smart_tests_cli-2.3.1/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +0 -31
- smart_tests_cli-2.3.1/tests/commands/record/test_attachment.py +0 -43
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.bazelrc +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.bazelversion +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.editorconfig +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/release.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/workflows/bazel-test.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/workflows/e2e.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/workflows/publish.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/workflows/test.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.github/workflows/update_maven_install_json.yml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.gitignore +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.pre-commit-config.yaml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.python-version +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/.tagpr +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/CONTRIBUTING.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/Dockerfile +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/LICENSE.txt +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/WORKSPACE +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/build-java.sh +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/pyproject.toml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/renovate.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/setup.cfg +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/setup.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/app.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/README.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/argument.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/command.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/decorators.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/exceptions.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/option.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/parameter.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/args4p/typer/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/compare/subsets.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/detect_flakes.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/inspect/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/inspect/model.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/inspect/subset.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/build.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/case_event.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/session.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/record/tests.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/stats/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/stats/test_sessions.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/test_path_writer.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/commands/verify.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/plugins/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/adb.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/ant.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/behave.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/codeceptjs.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/ctest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/cts.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/cucumber.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/cypress.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/dotnet.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/file.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/flutter.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/go_test.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/googletest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/gradle.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/jasmine.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/jest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/karma.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/minitest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/nunit.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/playwright.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/prove.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/pytest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/raw.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/robot.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/rspec.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/smart_tests.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/vitest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/test_runners/xctest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/testpath.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/authentication.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/ci_provider.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/commit_ingester.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/common_tz.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/edit_distance.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/env_keys.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/exceptions.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/fail_fast_mode.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/file_name_pattern.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/git_log_parser.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/glob.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/gzipgen.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/http_client.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/input_snapshot.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/java.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/link.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/logger.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/no_build.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/sax.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/session.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/smart_tests_client.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/subprocess.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/tracking.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/utils/typer_types.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests/version.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/entry_points.txt +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/requires.txt +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/smart_tests_cli.egg-info/top_level.txt +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/BUILD +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/Main.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/maven_install.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/MainTest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/test-runner/__main__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/converters/test_converters.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_badcode.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_badinput.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_command.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_decorators.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_help.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_parameter.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/args4p/test_typer.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/cli_test_case.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/compare/test_subsets.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/inspect/test_model.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/inspect/test_subset.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/test_build.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/test_case_event.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/test_commit.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/test_session.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/record/test_tests.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/test_api_error.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/test_detect_flakes.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/test_subset.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/commands/test_verify.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/adb/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/src/com/example/library/Cache.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ant/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/build_event.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/build_event_rest.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/bazel/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/behave/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/behave/reports/report.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/behave/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/broken_xml/broken.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/broken_xml/normal.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/codeceptjs/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ctest/Testing/latest/Test.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ctest/ctest_list.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ctest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/ctest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cts/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cts/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cts/test_result.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/features/foo/bar.feature +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/features/foo-bar.feature +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/record_test_json_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/report/dummy.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cucumber/report/result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cypress/empty.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cypress/empty.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cypress/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cypress/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/cypress/test-result.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/dotnet/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/dotnet/test-result.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/flutter/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/flutter/report.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/git_log_ingest/sample.out +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/go_test/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/go_test/reportv1/reportv1.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/go_test/reportv2/reportv2.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/go_test/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/fail/output.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/fail/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/output_a.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/output_b.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/googletest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/gradle/recursion/expected.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jasmine/README.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jasmine/jasmine-test-results-v3.99.0.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jasmine/jasmine-test-results.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jasmine/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jasmine/subset_payload.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jest/junit.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/jest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/karma/README.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/karma/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/karma/sample-report.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/karma/subset_payload.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/karma/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/createdFile_1.lst +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/createdFile_2.lst +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
- /smart_tests_cli-2.3.1/tests/data/pytest/tests/fooo/__init__.py → /smart_tests_cli-2.4.0/tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/list.lst +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/reports/TEST-1.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/reports/TEST-2.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/reports/TEST-nested.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/reports/dummy.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/subset_from_file_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/TEST-UserTest.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/record_test_result_chunk1.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/record_test_result_chunk2.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/minitest/test/example_test.rb +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/list.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/output-linux.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/output-windows.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/record_test_result-linux.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/record_test_result-windows.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/src/.gitignore +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/src/Program.cs +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/src/README.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/src/Test.cs +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/src/calc.csproj +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/nunit/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/playwright/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/playwright/record_test_result_with_json.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/playwright/report.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/playwright/report.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/prove/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/prove/report.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/pytest.ini +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/record_test_result_json.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/report.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/report.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/conftest.py +0 -0
- {smart_tests_cli-2.3.1/tests/test_runners → smart_tests_cli-2.4.0/tests/data/pytest/tests/fooo}/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/funcs3_test.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/test_funcs1.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/pytest/tests/test_funcs2.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/dryrun.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/output.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/single-output.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/robot/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/rspec/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/rspec/rspec.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/vitest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/vitest/report.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/xctest/junit.xml +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/xctest/record_test_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/data/xctest/subset_result.json +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/helper.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/plugins/foo.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_cli_test_case.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_plugin.py +0 -0
- {smart_tests_cli-2.3.1/tests/utils → smart_tests_cli-2.4.0/tests/test_runners}/__init__.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_adb.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_ant.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_bazel.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_behave.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_codeceptjs.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_ctest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_cts.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_cucumber.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_cypress.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_dotnet.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_go_test.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_googletest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_gradle.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_jasmine.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_jest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_karma.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_minitest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_nunit.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_playwright.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_prove.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_pytest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_raw.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_robot.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_rspec.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_vitest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_runners/test_xctest.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_testpath.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/test_version.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_authentication.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_edit_distance.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_fail_fast_mode.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_file_name_pattern.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_git_log_parser.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_glob.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_gzipgen.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_http_client.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_link.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_logger.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_session.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_typer.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tests/utils/test_typer_types.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tools/README.md +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/tools/generate_reference.py +0 -0
- {smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/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.0
|
|
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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: smart-tests-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
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
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
.pre-commit-config.yaml
|
|
6
6
|
.python-version
|
|
7
7
|
.tagpr
|
|
8
|
+
CLAUDE.md
|
|
8
9
|
CONTRIBUTING.md
|
|
9
10
|
Dockerfile
|
|
10
11
|
LICENSE.txt
|
|
@@ -38,6 +39,7 @@ smart_tests/args4p/converters/__init__.py
|
|
|
38
39
|
smart_tests/args4p/typer/__init__.py
|
|
39
40
|
smart_tests/commands/__init__.py
|
|
40
41
|
smart_tests/commands/detect_flakes.py
|
|
42
|
+
smart_tests/commands/gate.py
|
|
41
43
|
smart_tests/commands/subset.py
|
|
42
44
|
smart_tests/commands/test_path_writer.py
|
|
43
45
|
smart_tests/commands/verify.py
|
|
@@ -124,9 +126,12 @@ src/BUILD
|
|
|
124
126
|
src/maven_install.json
|
|
125
127
|
src/main/java/com/launchableinc/ingest/commits/Authenticator.java
|
|
126
128
|
src/main/java/com/launchableinc/ingest/commits/BUILD
|
|
129
|
+
src/main/java/com/launchableinc/ingest/commits/BackgroundWorkStatus.java
|
|
130
|
+
src/main/java/com/launchableinc/ingest/commits/BoundedExecutorService.java
|
|
127
131
|
src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java
|
|
128
132
|
src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java
|
|
129
133
|
src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java
|
|
134
|
+
src/main/java/com/launchableinc/ingest/commits/ConcurrentConsumer.java
|
|
130
135
|
src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java
|
|
131
136
|
src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java
|
|
132
137
|
src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java
|
|
@@ -134,22 +139,27 @@ src/main/java/com/launchableinc/ingest/commits/GitFile.java
|
|
|
134
139
|
src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java
|
|
135
140
|
src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java
|
|
136
141
|
src/main/java/com/launchableinc/ingest/commits/IOConsumer.java
|
|
142
|
+
src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionProgress.java
|
|
143
|
+
src/main/java/com/launchableinc/ingest/commits/JSAsyncFileCollectionResponse.java
|
|
137
144
|
src/main/java/com/launchableinc/ingest/commits/JSCommit.java
|
|
138
145
|
src/main/java/com/launchableinc/ingest/commits/JSFileChange.java
|
|
146
|
+
src/main/java/com/launchableinc/ingest/commits/LaunchableHttpClient.java
|
|
139
147
|
src/main/java/com/launchableinc/ingest/commits/Main.java
|
|
140
148
|
src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java
|
|
141
|
-
src/main/java/com/launchableinc/ingest/commits/
|
|
149
|
+
src/main/java/com/launchableinc/ingest/commits/ProgressReporter.java
|
|
142
150
|
src/main/java/com/launchableinc/ingest/commits/SSLBypass.java
|
|
143
151
|
src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java
|
|
144
152
|
src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java
|
|
145
153
|
src/main/java/com/launchableinc/ingest/commits/VirtualFile.java
|
|
146
154
|
src/test/java/com/launchableinc/ingest/commits/AllTests.java
|
|
147
155
|
src/test/java/com/launchableinc/ingest/commits/BUILD
|
|
156
|
+
src/test/java/com/launchableinc/ingest/commits/BoundedExecutorServiceTest.java
|
|
148
157
|
src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java
|
|
158
|
+
src/test/java/com/launchableinc/ingest/commits/ConcurrentConsumerTest.java
|
|
149
159
|
src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java
|
|
150
160
|
src/test/java/com/launchableinc/ingest/commits/MainTest.java
|
|
151
161
|
src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java
|
|
152
|
-
src/test/java/com/launchableinc/ingest/commits/
|
|
162
|
+
src/test/java/com/launchableinc/ingest/commits/ProgressReporterTest.java
|
|
153
163
|
src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java
|
|
154
164
|
src/test/java/com/launchableinc/ingest/commits/java8-compat.sh
|
|
155
165
|
test-runner/__main__.py
|
|
@@ -173,6 +183,7 @@ tests/args4p/converters/test_converters.py
|
|
|
173
183
|
tests/commands/__init__.py
|
|
174
184
|
tests/commands/test_api_error.py
|
|
175
185
|
tests/commands/test_detect_flakes.py
|
|
186
|
+
tests/commands/test_gate.py
|
|
176
187
|
tests/commands/test_subset.py
|
|
177
188
|
tests/commands/test_verify.py
|
|
178
189
|
tests/commands/compare/__init__.py
|
|
@@ -293,8 +304,10 @@ tests/data/maven/subset_by_confidence_result.json
|
|
|
293
304
|
tests/data/maven/subset_from_file_result.json
|
|
294
305
|
tests/data/maven/subset_result.json
|
|
295
306
|
tests/data/maven/subset_scan_test_compile_lst_result.json
|
|
307
|
+
tests/data/maven/subset_with_exclude_rules_result.json
|
|
296
308
|
tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java
|
|
297
309
|
tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java
|
|
310
|
+
tests/data/maven/java/test/src/java/com/launchableinc/rocket_car_maven/e2e/E2ETest.java
|
|
298
311
|
tests/data/maven/reports/TEST-1.xml
|
|
299
312
|
tests/data/maven/reports/TEST-2.xml
|
|
300
313
|
tests/data/maven/reports/TEST-nested.xml
|
{smart_tests_cli-2.3.1 → smart_tests_cli-2.4.0}/src/main/java/com/launchableinc/ingest/commits/BUILD
RENAMED
|
@@ -11,6 +11,7 @@ java_library(
|
|
|
11
11
|
"@maven//:com_fasterxml_jackson_core_jackson_core",
|
|
12
12
|
"@maven//:com_fasterxml_jackson_core_jackson_databind",
|
|
13
13
|
"@maven//:com_google_guava_guava",
|
|
14
|
+
"@maven//:commons_io_commons_io",
|
|
14
15
|
"@maven//:org_apache_commons_commons_compress",
|
|
15
16
|
"@maven//:org_apache_httpcomponents_httpclient",
|
|
16
17
|
"@maven//:org_apache_httpcomponents_httpcore",
|
smart_tests_cli-2.4.0/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
|
+
}
|
|
@@ -2,7 +2,6 @@ package com.launchableinc.ingest.commits;
|
|
|
2
2
|
|
|
3
3
|
import org.apache.http.entity.ContentProducer;
|
|
4
4
|
|
|
5
|
-
import java.io.Closeable;
|
|
6
5
|
import java.io.IOException;
|
|
7
6
|
import java.io.OutputStream;
|
|
8
7
|
import java.io.UncheckedIOException;
|
|
@@ -12,13 +11,13 @@ import java.util.List;
|
|
|
12
11
|
/**
|
|
13
12
|
* Accepts T, buffers them, and writes them out as a batch.
|
|
14
13
|
*/
|
|
15
|
-
abstract class ChunkStreamer<T> implements FlushableConsumer<T
|
|
14
|
+
abstract class ChunkStreamer<T> implements FlushableConsumer<T> {
|
|
16
15
|
/**
|
|
17
16
|
* Encapsulation of how batches are sent.
|
|
18
17
|
*/
|
|
19
18
|
private final IOConsumer<ContentProducer> sender;
|
|
20
19
|
private final int chunkSize;
|
|
21
|
-
private
|
|
20
|
+
private List<T> spool = new ArrayList<>();
|
|
22
21
|
|
|
23
22
|
ChunkStreamer(IOConsumer<ContentProducer> sender, int chunkSize) {
|
|
24
23
|
this.sender = sender;
|
|
@@ -48,11 +47,12 @@ abstract class ChunkStreamer<T> implements FlushableConsumer<T>, Closeable {
|
|
|
48
47
|
return;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
// let sender own the list -- do not reuse
|
|
51
|
+
// for this to work, we need to resolve `this.spool` here, not in the lambda
|
|
52
|
+
List<T> ref = this.spool;
|
|
53
|
+
this.spool = new ArrayList<>();
|
|
54
|
+
|
|
55
|
+
sender.accept(os -> writeTo(ref,os));
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
protected abstract void writeTo(List<T> spool, OutputStream os) throws IOException;
|