smart-tests-cli 2.2.0__tar.gz → 2.3.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.2.0 → smart_tests_cli-2.3.0}/PKG-INFO +1 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/build.py +1 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/session.py +3 -4
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/subset.py +190 -3
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/test_path_writer.py +4 -4
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/verify.py +5 -15
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/jar/exe_deploy.jar +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/file.py +1 -11
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/go_test.py +1 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/gradle.py +2 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/jasmine.py +1 -7
- smart_tests_cli-2.3.0/smart_tests/test_runners/karma.py +174 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/maven.py +2 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/playwright.py +1 -8
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/prove.py +1 -8
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/smart_tests.py +19 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/vitest.py +1 -8
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/authentication.py +6 -1
- smart_tests_cli-2.3.0/smart_tests/utils/input_snapshot.py +50 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/smart_tests_client.py +2 -9
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/PKG-INFO +1 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/SOURCES.txt +12 -2
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/BUILD +1 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CommitGraphCollector.java +197 -150
- smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +28 -0
- smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/CommitIngester.java → smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/Main.java +4 -4
- smart_tests_cli-2.3.0/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +56 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/AllTests.java +1 -1
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/CommitGraphCollectorTest.java +49 -8
- smart_tests_cli-2.2.0/src/test/java/com/launchableinc/ingest/commits/CommitIngesterTest.java → smart_tests_cli-2.3.0/src/test/java/com/launchableinc/ingest/commits/MainTest.java +14 -8
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/ProgressReportingConsumerTest.java +1 -15
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_session.py +21 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_subset.py +194 -0
- smart_tests_cli-2.3.0/tests/data/jasmine/README.md +41 -0
- smart_tests_cli-2.3.0/tests/data/jasmine/jasmine-test-results-v3.99.0.json +150 -0
- smart_tests_cli-2.3.0/tests/data/karma/README.md +164 -0
- smart_tests_cli-2.3.0/tests/data/karma/record_test_result.json +189 -0
- smart_tests_cli-2.3.0/tests/data/karma/sample-report.json +360 -0
- smart_tests_cli-2.3.0/tests/data/karma/subset_payload.json +16 -0
- smart_tests_cli-2.3.0/tests/data/karma/subset_result.json +22 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_jasmine.py +12 -0
- smart_tests_cli-2.3.0/tests/test_runners/test_karma.py +48 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_authentication.py +0 -6
- smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/FlushableConsumer.java +0 -14
- smart_tests_cli-2.2.0/src/main/java/com/launchableinc/ingest/commits/VirtualFile.java +0 -26
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.bazelrc +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.bazelversion +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.editorconfig +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/release.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/bazel-test.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/e2e.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/publish.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/test.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.github/workflows/update_maven_install_json.yml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.gitignore +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.pre-commit-config.yaml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.python-version +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/.tagpr +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/CONTRIBUTING.md +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/Dockerfile +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/LICENSE.txt +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/README.md +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/WORKSPACE +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/build-java.sh +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/pyproject.toml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/renovate.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/setup.cfg +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/setup.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/__main__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/app.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/README.md +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/argument.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/command.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/decorators.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/exceptions.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/option.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/parameter.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/args4p/typer/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/compare/subsets.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/detect_flakes.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/model.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/inspect/subset.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/attachment.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/case_event.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/commit.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/record/tests.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/stats/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/commands/stats/test_sessions.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/plugins/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/adb.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/ant.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/bazel.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/behave.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/codeceptjs.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/ctest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cts.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cucumber.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/cypress.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/dotnet.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/flutter.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/googletest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/jest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/minitest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/nunit.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/pytest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/raw.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/robot.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/rspec.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/test_runners/xctest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/testpath.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/ci_provider.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/commands.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/commit_ingester.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/common_tz.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/edit_distance.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/env_keys.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/exceptions.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/fail_fast_mode.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/file_name_pattern.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/git_log_parser.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/glob.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/gzipgen.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/http_client.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/java.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/link.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/logger.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/no_build.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/sax.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/session.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/subprocess.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/tracking.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/utils/typer_types.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests/version.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/dependency_links.txt +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/entry_points.txt +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/requires.txt +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/smart_tests_cli.egg-info/top_level.txt +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/BUILD +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/Authenticator.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ChunkStreamer.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CommitChunkStreamer.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/CountingDiffFormatter.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/FileChunkStreamer.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitFile.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitHubActionsAuthenticator.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/GitHubIdTokenAuthenticator.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/IOConsumer.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/JSCommit.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/JSFileChange.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ObjectRevFilter.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/ProgressReportingConsumer.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/SSLBypass.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/TokenAuthenticator.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/main/java/com/launchableinc/ingest/commits/TreeReceiver.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/maven_install.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/BUILD +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/FileChunkStreamerTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/PassThroughTreeReceiverImpl.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/SSLBypassTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/src/test/java/com/launchableinc/ingest/commits/java8-compat.sh +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/test-runner/__main__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/converters/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/converters/test_converters.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_badcode.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_badinput.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_command.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_decorators.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_help.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_parameter.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/args4p/test_typer.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/cli_test_case.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/compare/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/compare/test_subsets.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/inspect/test_model.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/inspect/test_subset.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_attachment.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_build.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_case_event.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_commit.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/record/test_tests.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_api_error.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_detect_flakes.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/commands/test_verify.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/adb/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TEST-com.example.HelloWorldTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TEST-com.example.library.CacheTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/junitreport/TESTS-TestSuites.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/HelloWorld.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/HelloWorldTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/library/Cache.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/src/com/example/library/CacheTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ant/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.log +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test1/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test2/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test3/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test4/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test5/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test6/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test7/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test8/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.cache_status +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/bazel-testlogs/src/test/java/com/ninjinkun/mylib_test9/test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/build_event.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/build_event_rest.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_with_build_event_json_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/record_test_with_multiple_build_event_json_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/bazel/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/reports/report.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/behave/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/broken_xml/broken.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/broken_xml/normal.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/codeceptjs/codeceptjs-result.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/codeceptjs/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/Testing/latest/Test.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/ctest_list.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/ctest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cts/test_result.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo/bar.feature +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/foo-bar.feature +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/features/is_it_friday_yet.feature +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/record_test_json_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-foo-bar.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-foo-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/TEST-features-is_it_friday_yet.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/dummy.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cucumber/report/result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/empty.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/empty.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/cypress/test-result.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/dotnet/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/dotnet/test-result.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/flutter/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/flutter/report.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/git_log_ingest/sample.out +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/reportv1/reportv1.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/reportv2/reportv2.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/go_test/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/fail/output.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/fail/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/output_a.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/output_b.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/googletest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/App2Test.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/AppTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/java/app/src/test/java/com/example/sample_app_gradle/sub/App3Test.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/recursion/expected.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/gradle/recursion/foo/bar/reports/1.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/jasmine-test-results.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jasmine/subset_payload.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/junit.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/jest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/createdFile_1.lst +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/createdFile_2.lst +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/App2Test.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/java/test/src/java/com/example/sample_app_maven/AppTest.java +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/list.lst +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-1.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-2.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/TEST-nested.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/reports/dummy.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_by_absolute_time_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_by_confidence_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_from_file_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/maven/subset_scan_test_compile_lst_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-Admin_UserTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-Admin_UserTest_ChildlenTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserControllerTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserCopyTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/TEST-UserTest.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result_chunk1.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/record_test_result_chunk2.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/minitest/test/example_test.rb +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/list.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/nunit-reporter-bug-with-nested-type.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/output-linux.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/output-windows.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/record_test_result-linux.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/record_test_result-windows.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/.gitignore +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/Program.cs +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/README.md +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/Test.cs +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/src/calc.csproj +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/nunit/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/record_test_result_with_json.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/report.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/playwright/report.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/prove/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/prove/report.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/pytest.ini +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/record_test_result_json.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/report.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/report.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/conftest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/filenameonly_test.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/fooo/func4_test.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/funcs3_test.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/test_funcs1.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/pytest/tests/test_funcs2.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/dryrun.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/output.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/record_test_executed_only_one_file_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/single-output.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/robot/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/rspec/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/rspec/rspec.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/vitest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/vitest/report.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/junit.xml +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/record_test_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/data/xctest/subset_result.json +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/helper.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/plugins/foo.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_cli_test_case.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_plugin.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_adb.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_ant.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_bazel.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_behave.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_codeceptjs.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_ctest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cts.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cucumber.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_cypress.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_dotnet.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_go_test.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_googletest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_gradle.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_jest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_maven.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_minitest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_nunit.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_playwright.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_prove.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_pytest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_raw.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_robot.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_rspec.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_vitest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_runners/test_xctest.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_testpath.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/test_version.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/__init__.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_edit_distance.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_fail_fast_mode.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_file_name_pattern.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_git_log_parser.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_glob.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_gzipgen.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_http_client.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_link.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_logger.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_session.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_typer.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tests/utils/test_typer_types.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tools/README.md +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/tools/generate_reference.py +0 -0
- {smart_tests_cli-2.2.0 → smart_tests_cli-2.3.0}/uv.lock +0 -0
|
@@ -337,7 +337,7 @@ def build(
|
|
|
337
337
|
def report(ws: List[Workspace], build_id: str):
|
|
338
338
|
org, workspace = get_org_workspace()
|
|
339
339
|
click.echo(
|
|
340
|
-
f"
|
|
340
|
+
f"Smart Tests recorded build {build_name} to workspace {org} / {workspace} with commits from "
|
|
341
341
|
f"{len(ws)} {'repositories' if len(ws) > 1 else 'repository'}: \n")
|
|
342
342
|
|
|
343
343
|
header = ["Name", "Path", "HEAD Commit"]
|
|
@@ -24,19 +24,18 @@ TEST_SESSION_NAME_RULE = re.compile("^[a-zA-Z0-9][a-zA-Z0-9_.-]*$")
|
|
|
24
24
|
@args4p.command(help="Record session information")
|
|
25
25
|
def session(
|
|
26
26
|
app: Application,
|
|
27
|
-
build_name: Annotated[str, typer.Option(
|
|
27
|
+
build_name: Annotated[str | None, typer.Option(
|
|
28
28
|
"--build",
|
|
29
29
|
help="Build name",
|
|
30
30
|
metavar="NAME",
|
|
31
|
-
|
|
32
|
-
)],
|
|
31
|
+
)] = None,
|
|
33
32
|
test_suite: Annotated[str, typer.Option(
|
|
34
33
|
"--test-suite",
|
|
35
34
|
help="Set test suite name. A test suite is a collection of test sessions. Setting a test suite allows you to "
|
|
36
35
|
"manage data over test sessions and lineages.",
|
|
37
36
|
metavar="NAME",
|
|
38
37
|
required=True
|
|
39
|
-
)],
|
|
38
|
+
)] = "",
|
|
40
39
|
flavors: Annotated[List[KeyValue], typer.Option(
|
|
41
40
|
"--flavor",
|
|
42
41
|
help="Flavors",
|
|
@@ -28,8 +28,9 @@ from ..testpath import FilePathNormalizer, TestPath
|
|
|
28
28
|
from ..utils.env_keys import REPORT_ERROR_KEY
|
|
29
29
|
from ..utils.fail_fast_mode import (FailFastModeValidateParams, fail_fast_mode_validate,
|
|
30
30
|
set_fail_fast_mode, warn_and_exit_if_fail_fast_mode)
|
|
31
|
+
from ..utils.input_snapshot import InputSnapshotId
|
|
31
32
|
from ..utils.smart_tests_client import SmartTestsClient
|
|
32
|
-
from ..utils.typer_types import Duration, Percentage, parse_duration, parse_percentage
|
|
33
|
+
from ..utils.typer_types import Duration, Fraction, Percentage, parse_duration, parse_fraction, parse_percentage
|
|
33
34
|
from .test_path_writer import TestPathWriter
|
|
34
35
|
|
|
35
36
|
|
|
@@ -174,6 +175,23 @@ class Subset(TestPathWriter):
|
|
|
174
175
|
type=fileText(mode="r"),
|
|
175
176
|
metavar="FILE"
|
|
176
177
|
)] = None,
|
|
178
|
+
input_snapshot_id: Annotated[InputSnapshotId | None, InputSnapshotId.as_option()] = None,
|
|
179
|
+
print_input_snapshot_id: Annotated[bool, typer.Option(
|
|
180
|
+
"--print-input-snapshot-id",
|
|
181
|
+
help="Print the input snapshot ID returned from the server instead of the subset results"
|
|
182
|
+
)] = False,
|
|
183
|
+
bin_target: Annotated[Fraction | None, typer.Option(
|
|
184
|
+
"--bin",
|
|
185
|
+
help="Split subset into bins, e.g. --bin 1/4",
|
|
186
|
+
metavar="INDEX/COUNT",
|
|
187
|
+
type=parse_fraction
|
|
188
|
+
)] = None,
|
|
189
|
+
same_bin_files: Annotated[List[str], typer.Option(
|
|
190
|
+
"--same-bin",
|
|
191
|
+
help="Keep all tests listed in the file together when splitting; one test per line",
|
|
192
|
+
metavar="FILE",
|
|
193
|
+
multiple=True
|
|
194
|
+
)] = [],
|
|
177
195
|
is_get_tests_from_guess: Annotated[bool, typer.Option(
|
|
178
196
|
"--get-tests-from-guess",
|
|
179
197
|
help="Get subset list from guessed tests"
|
|
@@ -255,9 +273,15 @@ class Subset(TestPathWriter):
|
|
|
255
273
|
self.ignore_flaky_tests_above = ignore_flaky_tests_above
|
|
256
274
|
self.prioritize_tests_failed_within_hours = prioritize_tests_failed_within_hours
|
|
257
275
|
self.prioritized_tests_mapping_file = prioritized_tests_mapping_file
|
|
276
|
+
self.input_snapshot_id = input_snapshot_id.value if input_snapshot_id else None
|
|
277
|
+
self.print_input_snapshot_id = print_input_snapshot_id
|
|
278
|
+
self.bin_target = bin_target
|
|
279
|
+
self.same_bin_files = list(same_bin_files)
|
|
258
280
|
self.is_get_tests_from_guess = is_get_tests_from_guess
|
|
259
281
|
self.use_case = use_case
|
|
260
282
|
|
|
283
|
+
self._validate_print_input_snapshot_option()
|
|
284
|
+
|
|
261
285
|
self.file_path_normalizer = FilePathNormalizer(base_path, no_base_path_inference=no_base_path_inference)
|
|
262
286
|
|
|
263
287
|
self.test_paths: list[list[dict[str, str]]] = []
|
|
@@ -305,7 +329,7 @@ class Subset(TestPathWriter):
|
|
|
305
329
|
"""
|
|
306
330
|
|
|
307
331
|
# To avoid the cli continue to wait from stdin
|
|
308
|
-
if self.
|
|
332
|
+
if self._should_skip_stdin():
|
|
309
333
|
return []
|
|
310
334
|
|
|
311
335
|
if sys.stdin.isatty():
|
|
@@ -404,8 +428,103 @@ class Subset(TestPathWriter):
|
|
|
404
428
|
if self.use_case:
|
|
405
429
|
payload['changesUnderTest'] = self.use_case.value
|
|
406
430
|
|
|
431
|
+
if self.input_snapshot_id is not None:
|
|
432
|
+
payload['subsettingId'] = self.input_snapshot_id
|
|
433
|
+
|
|
434
|
+
split_subset = self._build_split_subset_payload()
|
|
435
|
+
if split_subset:
|
|
436
|
+
payload['splitSubset'] = split_subset
|
|
437
|
+
|
|
407
438
|
return payload
|
|
408
439
|
|
|
440
|
+
def _build_split_subset_payload(self) -> dict[str, Any] | None:
|
|
441
|
+
if self.bin_target is None:
|
|
442
|
+
if self.same_bin_files:
|
|
443
|
+
print_error_and_die(
|
|
444
|
+
"--same-bin option requires --bin option.\nPlease set --bin option to use --same-bin",
|
|
445
|
+
self.tracking_client,
|
|
446
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
447
|
+
)
|
|
448
|
+
return None
|
|
449
|
+
|
|
450
|
+
slice_index = self.bin_target.numerator
|
|
451
|
+
slice_count = self.bin_target.denominator
|
|
452
|
+
|
|
453
|
+
if slice_index <= 0 or slice_count <= 0:
|
|
454
|
+
print_error_and_die(
|
|
455
|
+
"Invalid --bin value. Both index and count must be positive integers.",
|
|
456
|
+
self.tracking_client,
|
|
457
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
if slice_count < slice_index:
|
|
461
|
+
print_error_and_die(
|
|
462
|
+
"Invalid --bin value. The numerator cannot exceed the denominator.",
|
|
463
|
+
self.tracking_client,
|
|
464
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
same_bins = self._read_same_bin_files()
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
"sliceIndex": slice_index,
|
|
471
|
+
"sliceCount": slice_count,
|
|
472
|
+
"sameBins": same_bins,
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
def _read_same_bin_files(self) -> list[list[TestPath]]:
|
|
476
|
+
if not self.same_bin_files:
|
|
477
|
+
return []
|
|
478
|
+
|
|
479
|
+
formatter = self.same_bin_formatter
|
|
480
|
+
if formatter is None:
|
|
481
|
+
print_error_and_die(
|
|
482
|
+
"--same-bin is not supported for this test runner.",
|
|
483
|
+
self.tracking_client,
|
|
484
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
same_bins: list[list[TestPath]] = []
|
|
488
|
+
seen_tests: set[str] = set()
|
|
489
|
+
|
|
490
|
+
for same_bin_file in self.same_bin_files:
|
|
491
|
+
try:
|
|
492
|
+
with open(same_bin_file, "r", encoding="utf-8") as fp:
|
|
493
|
+
tests = [line.strip() for line in fp if line.strip()]
|
|
494
|
+
except OSError as exc:
|
|
495
|
+
print_error_and_die(
|
|
496
|
+
f"Failed to read --same-bin file '{same_bin_file}': {exc}",
|
|
497
|
+
self.tracking_client,
|
|
498
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
unique_tests = list(dict.fromkeys(tests))
|
|
502
|
+
|
|
503
|
+
group: list[TestPath] = []
|
|
504
|
+
for test in unique_tests:
|
|
505
|
+
if test in seen_tests:
|
|
506
|
+
print_error_and_die(
|
|
507
|
+
f"Error: test '{test}' is listed in multiple --same-bin files.",
|
|
508
|
+
self.tracking_client,
|
|
509
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
510
|
+
)
|
|
511
|
+
seen_tests.add(test)
|
|
512
|
+
|
|
513
|
+
# For type check
|
|
514
|
+
assert formatter is not None, "--same -bin is not supported for this test runner"
|
|
515
|
+
formatted = formatter(test)
|
|
516
|
+
if not formatted:
|
|
517
|
+
print_error_and_die(
|
|
518
|
+
f"Failed to parse test '{test}' from --same-bin file {same_bin_file}",
|
|
519
|
+
self.tracking_client,
|
|
520
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
521
|
+
)
|
|
522
|
+
group.append(formatted)
|
|
523
|
+
|
|
524
|
+
same_bins.append(group)
|
|
525
|
+
|
|
526
|
+
return same_bins
|
|
527
|
+
|
|
409
528
|
def _collect_potential_test_files(self):
|
|
410
529
|
LOOSE_TEST_FILE_PATTERN = r'(\.(test|spec)\.|_test\.|Test\.|Spec\.|test/|tests/|__tests__/|src/test/)'
|
|
411
530
|
EXCLUDE_PATTERN = r'(BUILD|Makefile|Dockerfile|LICENSE|.gitignore|.gitkeep|.keep|id_rsa|rsa|blank|taglib)|\.(xml|json|jsonl|txt|yml|yaml|toml|md|png|jpg|jpeg|gif|svg|sql|html|css|graphql|proto|gz|zip|rz|bzl|conf|config|snap|pem|crt|key|lock|jpi|hpi|jelly|properties|jar|ini|mod|sum|bmp|env|envrc|sh)$' # noqa E501
|
|
@@ -463,13 +582,75 @@ class Subset(TestPathWriter):
|
|
|
463
582
|
e, "Warning: the service failed to subset. Falling back to running all tests")
|
|
464
583
|
return SubsetResult.from_test_paths(self.test_paths)
|
|
465
584
|
|
|
585
|
+
def _requires_test_input(self) -> bool:
|
|
586
|
+
return (
|
|
587
|
+
self.input_snapshot_id is None
|
|
588
|
+
and not self.is_get_tests_from_previous_sessions # noqa: W503
|
|
589
|
+
and len(self.test_paths) == 0 # noqa: W503
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
def _should_skip_stdin(self) -> bool:
|
|
593
|
+
if self.is_get_tests_from_previous_sessions or self.is_get_tests_from_guess:
|
|
594
|
+
return True
|
|
595
|
+
|
|
596
|
+
if self.input_snapshot_id is not None:
|
|
597
|
+
if not sys.stdin.isatty():
|
|
598
|
+
warn_and_exit_if_fail_fast_mode(
|
|
599
|
+
"Warning: --input-snapshot-id is set so stdin will be ignored."
|
|
600
|
+
)
|
|
601
|
+
return True
|
|
602
|
+
return False
|
|
603
|
+
|
|
604
|
+
def _validate_print_input_snapshot_option(self):
|
|
605
|
+
if not self.print_input_snapshot_id:
|
|
606
|
+
return
|
|
607
|
+
|
|
608
|
+
conflicts: list[str] = []
|
|
609
|
+
option_checks = [
|
|
610
|
+
("--target", self.target is not None),
|
|
611
|
+
("--time", self.time is not None),
|
|
612
|
+
("--confidence", self.confidence is not None),
|
|
613
|
+
("--goal-spec", self.goal_spec is not None),
|
|
614
|
+
("--rest", self.rest is not None),
|
|
615
|
+
("--bin", self.bin_target is not None),
|
|
616
|
+
("--same-bin", bool(self.same_bin_files)),
|
|
617
|
+
("--ignore-new-tests", self.ignore_new_tests),
|
|
618
|
+
("--ignore-flaky-tests-above", self.ignore_flaky_tests_above is not None),
|
|
619
|
+
("--prioritize-tests-failed-within-hours", self.prioritize_tests_failed_within_hours is not None),
|
|
620
|
+
("--prioritized-tests-mapping", self.prioritized_tests_mapping_file is not None),
|
|
621
|
+
("--get-tests-from-previous-sessions", self.is_get_tests_from_previous_sessions),
|
|
622
|
+
("--get-tests-from-guess", self.is_get_tests_from_guess),
|
|
623
|
+
("--output-exclusion-rules", self.is_output_exclusion_rules),
|
|
624
|
+
("--non-blocking", self.is_non_blocking),
|
|
625
|
+
]
|
|
626
|
+
|
|
627
|
+
for option_name, is_set in option_checks:
|
|
628
|
+
if is_set:
|
|
629
|
+
conflicts.append(option_name)
|
|
630
|
+
|
|
631
|
+
if conflicts:
|
|
632
|
+
conflict_list = ", ".join(conflicts)
|
|
633
|
+
print_error_and_die(
|
|
634
|
+
f"--print-input-snapshot-id cannot be used with {conflict_list}.",
|
|
635
|
+
self.tracking_client,
|
|
636
|
+
Tracking.ErrorEvent.USER_ERROR,
|
|
637
|
+
)
|
|
638
|
+
|
|
639
|
+
def _print_input_snapshot_id_value(self, subset_result: SubsetResult):
|
|
640
|
+
if not subset_result.subset_id:
|
|
641
|
+
raise click.ClickException(
|
|
642
|
+
"Subset request did not return an input snapshot ID. Please re-run the command."
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
click.echo(subset_result.subset_id)
|
|
646
|
+
|
|
466
647
|
def run(self):
|
|
467
648
|
"""called after tests are scanned to compute the optimized order"""
|
|
468
649
|
|
|
469
650
|
if self.is_get_tests_from_guess:
|
|
470
651
|
self._collect_potential_test_files()
|
|
471
652
|
|
|
472
|
-
if
|
|
653
|
+
if self._requires_test_input():
|
|
473
654
|
if self.input_given:
|
|
474
655
|
print_error_and_die("ERROR: Given arguments did not match any tests. They appear to be incorrect/non-existent.", tracking_client, Tracking.ErrorEvent.USER_ERROR) # noqa E501
|
|
475
656
|
else:
|
|
@@ -488,6 +669,12 @@ class Subset(TestPathWriter):
|
|
|
488
669
|
|
|
489
670
|
if len(subset_result.subset) == 0:
|
|
490
671
|
warn_and_exit_if_fail_fast_mode("Error: no tests found matching the path.")
|
|
672
|
+
if self.print_input_snapshot_id:
|
|
673
|
+
self._print_input_snapshot_id_value(subset_result)
|
|
674
|
+
return
|
|
675
|
+
|
|
676
|
+
if self.print_input_snapshot_id:
|
|
677
|
+
self._print_input_snapshot_id_value(subset_result)
|
|
491
678
|
return
|
|
492
679
|
|
|
493
680
|
# TODO(Konboi): split subset isn't provided for smart-tests initial release
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from os.path import join
|
|
2
|
-
from typing import Callable,
|
|
2
|
+
from typing import Callable, List
|
|
3
3
|
|
|
4
4
|
import click
|
|
5
5
|
|
|
@@ -19,7 +19,7 @@ class TestPathWriter(object):
|
|
|
19
19
|
|
|
20
20
|
def __init__(self, app: Application):
|
|
21
21
|
self.formatter = self.default_formatter
|
|
22
|
-
self._same_bin_formatter: Callable[[str],
|
|
22
|
+
self._same_bin_formatter: Callable[[str], TestPath] | None = None
|
|
23
23
|
self.separator = "\n"
|
|
24
24
|
self.app = app
|
|
25
25
|
|
|
@@ -43,9 +43,9 @@ class TestPathWriter(object):
|
|
|
43
43
|
for t in test_paths))
|
|
44
44
|
|
|
45
45
|
@property
|
|
46
|
-
def same_bin_formatter(self) -> Callable[[str],
|
|
46
|
+
def same_bin_formatter(self) -> Callable[[str], TestPath] | None:
|
|
47
47
|
return self._same_bin_formatter
|
|
48
48
|
|
|
49
49
|
@same_bin_formatter.setter
|
|
50
|
-
def same_bin_formatter(self, v: Callable[[str],
|
|
50
|
+
def same_bin_formatter(self, v: Callable[[str], TestPath]):
|
|
51
51
|
self._same_bin_formatter = v
|
|
@@ -7,13 +7,13 @@ from typing import List
|
|
|
7
7
|
import click
|
|
8
8
|
|
|
9
9
|
import smart_tests.args4p.typer as typer
|
|
10
|
-
from smart_tests.utils.commands import Command
|
|
11
|
-
from smart_tests.utils.env_keys import TOKEN_KEY
|
|
12
10
|
from smart_tests.utils.tracking import Tracking, TrackingClient
|
|
13
11
|
|
|
14
12
|
from .. import args4p
|
|
15
13
|
from ..app import Application
|
|
16
|
-
from ..utils.authentication import get_org_workspace
|
|
14
|
+
from ..utils.authentication import ensure_org_workspace, get_org_workspace
|
|
15
|
+
from ..utils.commands import Command
|
|
16
|
+
from ..utils.env_keys import TOKEN_KEY
|
|
17
17
|
from ..utils.java import get_java_command
|
|
18
18
|
from ..utils.smart_tests_client import SmartTestsClient
|
|
19
19
|
from ..utils.typer_types import emoji
|
|
@@ -82,18 +82,8 @@ def verify(app_instance: Application):
|
|
|
82
82
|
click.echo("Java command: " + repr(java))
|
|
83
83
|
click.echo("smart-tests version: " + repr(version))
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
"Could not identify Smart Tests organization/workspace. "
|
|
88
|
-
"Please confirm if you set SMART_TESTS_TOKEN or SMART_TESTS_ORGANIZATION and SMART_TESTS_WORKSPACE "
|
|
89
|
-
"environment variables"
|
|
90
|
-
)
|
|
91
|
-
tracking_client.send_error_event(
|
|
92
|
-
event_name=Tracking.ErrorEvent.INTERNAL_CLI_ERROR,
|
|
93
|
-
stack_trace=msg
|
|
94
|
-
)
|
|
95
|
-
click.secho(msg, fg='red', err=True)
|
|
96
|
-
raise typer.Exit(1)
|
|
85
|
+
# raise an error here after we print out the basic diagnostics if LAUNCHABLE_TOKEN is not set.
|
|
86
|
+
ensure_org_workspace()
|
|
97
87
|
|
|
98
88
|
try:
|
|
99
89
|
res = client.request("get", "verification")
|
|
Binary file
|
|
@@ -2,19 +2,9 @@
|
|
|
2
2
|
# The most bare-bone versions of the test runner support
|
|
3
3
|
#
|
|
4
4
|
|
|
5
|
-
from ..commands.subset import Subset
|
|
6
5
|
from . import smart_tests
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
@smart_tests.subset
|
|
10
|
-
def subset(client: Subset):
|
|
11
|
-
# read lines as test file names
|
|
12
|
-
for t in client.stdin():
|
|
13
|
-
client.test_path(t.rstrip("\n"))
|
|
14
|
-
|
|
15
|
-
client.run()
|
|
16
|
-
|
|
17
|
-
|
|
7
|
+
subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
|
|
18
8
|
record_tests = smart_tests.CommonRecordTestImpls(__name__).file_profile_report_files()
|
|
19
9
|
smart_tests.CommonDetectFlakesImpls(__name__).detect_flakes()
|
|
20
10
|
# split_subset = launchable.CommonSplitSubsetImpls(__name__).split_subset()
|
|
@@ -27,13 +27,7 @@ def record_tests(
|
|
|
27
27
|
client.run()
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
def subset(client):
|
|
32
|
-
# read lines as test file names
|
|
33
|
-
for t in client.stdin():
|
|
34
|
-
client.test_path(t.rstrip("\n"))
|
|
35
|
-
|
|
36
|
-
client.run()
|
|
30
|
+
subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
|
|
37
31
|
|
|
38
32
|
|
|
39
33
|
class JSONReportParser:
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import Annotated, Dict, Generator, List
|
|
3
|
+
|
|
4
|
+
import click
|
|
5
|
+
|
|
6
|
+
from ..args4p import typer
|
|
7
|
+
from ..commands.record.case_event import CaseEvent
|
|
8
|
+
from ..testpath import TestPath
|
|
9
|
+
from . import smart_tests
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@smart_tests.record.tests
|
|
13
|
+
def record_tests(client,
|
|
14
|
+
reports: Annotated[List[str], typer.Argument(multiple=True, help="Test report files to process")],
|
|
15
|
+
):
|
|
16
|
+
client.parse_func = JSONReportParser(client).parse_func
|
|
17
|
+
|
|
18
|
+
for r in reports:
|
|
19
|
+
client.report(r)
|
|
20
|
+
client.run()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@smart_tests.subset
|
|
24
|
+
def subset(client, _with: Annotated[str | None, typer.Option(
|
|
25
|
+
'--with', help='Format output for specific test runner (e.g., "ng" for Angular CLI)')] = None, ):
|
|
26
|
+
"""
|
|
27
|
+
Usage:
|
|
28
|
+
find src -name "*.spec.ts" -o -name "*.spec.js" > test-list.txt
|
|
29
|
+
cat test-list.txt | launchable subset --target 10% karma
|
|
30
|
+
|
|
31
|
+
# Output in ng test format
|
|
32
|
+
find src -name "*.spec.ts" | launchable subset --target 10% karma --with ng
|
|
33
|
+
"""
|
|
34
|
+
for t in client.stdin():
|
|
35
|
+
path = t.strip()
|
|
36
|
+
if path:
|
|
37
|
+
client.test_path(path)
|
|
38
|
+
|
|
39
|
+
if _with == 'ng':
|
|
40
|
+
client.formatter = lambda x: "--include={}".format(x[0]['name'])
|
|
41
|
+
client.separator = " "
|
|
42
|
+
|
|
43
|
+
client.run()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class JSONReportParser:
|
|
47
|
+
"""
|
|
48
|
+
Sample Karma report format:
|
|
49
|
+
{
|
|
50
|
+
"browsers": {...},
|
|
51
|
+
"result": {
|
|
52
|
+
"24461741": [
|
|
53
|
+
{
|
|
54
|
+
"fullName": "path/to/spec.ts should do something",
|
|
55
|
+
"description": "should do something",
|
|
56
|
+
"id": "spec0",
|
|
57
|
+
"log": [],
|
|
58
|
+
"skipped": false,
|
|
59
|
+
"disabled": false,
|
|
60
|
+
"pending": false,
|
|
61
|
+
"success": true,
|
|
62
|
+
"suite": [
|
|
63
|
+
"path/to/spec.ts"
|
|
64
|
+
],
|
|
65
|
+
"time": 92,
|
|
66
|
+
"executedExpectationsCount": 1,
|
|
67
|
+
"passedExpectations": [...],
|
|
68
|
+
"properties": null
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
"summary": {...}
|
|
73
|
+
}
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def __init__(self, client):
|
|
77
|
+
self.client = client
|
|
78
|
+
|
|
79
|
+
def parse_func(self, report_file: str) -> Generator[Dict, None, None]: # type: ignore
|
|
80
|
+
data: Dict
|
|
81
|
+
with open(report_file, 'r') as json_file:
|
|
82
|
+
try:
|
|
83
|
+
data = json.load(json_file)
|
|
84
|
+
except Exception:
|
|
85
|
+
click.echo(
|
|
86
|
+
click.style("Error: Failed to load Json report file: {}".format(report_file), fg='red'), err=True)
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
if not self._validate_report_format(data):
|
|
90
|
+
click.echo(
|
|
91
|
+
"Error: {} does not appear to be valid Karma report format. "
|
|
92
|
+
"Make sure you are using karma-json-reporter or a compatible reporter.".format(
|
|
93
|
+
report_file), err=True)
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
results = data.get("result", {})
|
|
97
|
+
for browser_id, specs in results.items():
|
|
98
|
+
if isinstance(specs, list):
|
|
99
|
+
for event in self._parse_specs(specs):
|
|
100
|
+
yield event
|
|
101
|
+
|
|
102
|
+
def _validate_report_format(self, data: Dict) -> bool:
|
|
103
|
+
if not isinstance(data, dict):
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
if "result" not in data:
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
results = data.get("result", {})
|
|
110
|
+
if not isinstance(results, dict):
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
for browser_id, specs in results.items():
|
|
114
|
+
if not isinstance(specs, list):
|
|
115
|
+
return False
|
|
116
|
+
|
|
117
|
+
for spec in specs:
|
|
118
|
+
if not isinstance(spec, dict):
|
|
119
|
+
return False
|
|
120
|
+
# Check for required fields
|
|
121
|
+
if "suite" not in spec or "time" not in spec:
|
|
122
|
+
return False
|
|
123
|
+
# Field suite should have at least one element (filename)
|
|
124
|
+
suite = spec.get("suite", [])
|
|
125
|
+
if not isinstance(suite, list) or len(suite) == 0:
|
|
126
|
+
return False
|
|
127
|
+
|
|
128
|
+
return True
|
|
129
|
+
|
|
130
|
+
def _parse_specs(self, specs: List[Dict]) -> List[Dict]:
|
|
131
|
+
events: List[Dict] = []
|
|
132
|
+
|
|
133
|
+
for spec in specs:
|
|
134
|
+
# TODO:
|
|
135
|
+
# In NextWorld, test filepaths are included in the suite tag
|
|
136
|
+
# But generally in a Karma test report, a suite tag can be any string
|
|
137
|
+
# For the time being let's get filepaths from the suite tag,
|
|
138
|
+
# until we find a standard way to include filepaths in the test reports
|
|
139
|
+
suite = spec.get("suite", [])
|
|
140
|
+
filename = suite[0] if suite else ""
|
|
141
|
+
|
|
142
|
+
test_path: TestPath = [
|
|
143
|
+
self.client.make_file_path_component(filename),
|
|
144
|
+
{"type": "testcase", "name": spec.get("fullName", spec.get("description", ""))}
|
|
145
|
+
]
|
|
146
|
+
|
|
147
|
+
duration_msec = spec.get("time", 0)
|
|
148
|
+
status = self._case_event_status_from_spec(spec)
|
|
149
|
+
stderr = self._parse_stderr(spec)
|
|
150
|
+
|
|
151
|
+
events.append(CaseEvent.create(
|
|
152
|
+
test_path=test_path,
|
|
153
|
+
duration_secs=duration_msec / 1000 if duration_msec else 0,
|
|
154
|
+
status=status,
|
|
155
|
+
stderr=stderr
|
|
156
|
+
))
|
|
157
|
+
|
|
158
|
+
return events
|
|
159
|
+
|
|
160
|
+
def _case_event_status_from_spec(self, spec: Dict) -> int:
|
|
161
|
+
if spec.get("skipped", False) or spec.get("disabled", False) or spec.get("pending", False):
|
|
162
|
+
return CaseEvent.TEST_SKIPPED
|
|
163
|
+
|
|
164
|
+
if spec.get("success", False):
|
|
165
|
+
return CaseEvent.TEST_PASSED
|
|
166
|
+
else:
|
|
167
|
+
return CaseEvent.TEST_FAILED
|
|
168
|
+
|
|
169
|
+
def _parse_stderr(self, spec: Dict) -> str:
|
|
170
|
+
log_messages = spec.get("log", [])
|
|
171
|
+
if not log_messages:
|
|
172
|
+
return ""
|
|
173
|
+
|
|
174
|
+
return "\n".join(str(msg) for msg in log_messages if msg)
|
|
@@ -13,7 +13,6 @@ import smart_tests.args4p.typer as typer
|
|
|
13
13
|
from ..args4p.exceptions import BadCmdLineException
|
|
14
14
|
from ..commands.record.case_event import CaseEvent, CaseEventGenerator
|
|
15
15
|
from ..commands.record.tests import RecordTests
|
|
16
|
-
from ..commands.subset import Subset
|
|
17
16
|
from ..testpath import TestPath
|
|
18
17
|
from . import smart_tests
|
|
19
18
|
|
|
@@ -63,13 +62,7 @@ def record_tests(
|
|
|
63
62
|
client.run()
|
|
64
63
|
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
def subset(client: Subset):
|
|
68
|
-
# read lines as test file names
|
|
69
|
-
for t in client.stdin():
|
|
70
|
-
client.test_path(t.rstrip("\n"))
|
|
71
|
-
|
|
72
|
-
client.run()
|
|
65
|
+
subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
|
|
73
66
|
|
|
74
67
|
|
|
75
68
|
class JSONReportParser:
|
|
@@ -7,7 +7,6 @@ import smart_tests.args4p.typer as typer
|
|
|
7
7
|
|
|
8
8
|
from ..args4p.exceptions import BadCmdLineException
|
|
9
9
|
from ..commands.record.tests import RecordTests
|
|
10
|
-
from ..commands.subset import Subset
|
|
11
10
|
from ..testpath import TestPath
|
|
12
11
|
from . import smart_tests
|
|
13
12
|
|
|
@@ -19,13 +18,7 @@ def remove_leading_number_and_dash(input_string: str) -> str:
|
|
|
19
18
|
return result
|
|
20
19
|
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
def subset(client: Subset):
|
|
24
|
-
# read lines as test file names
|
|
25
|
-
for t in client.stdin():
|
|
26
|
-
client.test_path(t.rstrip("\n"))
|
|
27
|
-
|
|
28
|
-
client.run()
|
|
21
|
+
subset = smart_tests.CommonSubsetImpls(__name__).scan_stdin()
|
|
29
22
|
|
|
30
23
|
|
|
31
24
|
@smart_tests.record.tests
|