Skip to content

fix(cli): re-prompt on invalid confirmation answers instead of cancelling - #1244

Open
kaggle-marvin wants to merge 1 commit into
mainfrom
marvin/confirmation-reprompt
Open

kaggle-marvin wants to merge 1 commit into
mainfrom
marvin/confirmation-reprompt

fix(cli): re-prompt on invalid confirmation answers instead of cancel…

8b4581b
Select commit
Loading
Failed to load commit list.
Google Cloud Build / kaggle-cli-branch-3-11-15 (kaggle-cicd) succeeded Nov 12, 2026 in 1m 55s

Summary

Build Information

Trigger kaggle-cli-branch-3-11-15
Build 4f8f8829-d392-4793-9df8-fd93548430ef
Start 2026-11-12T11:11:07-08:00
Duration 1m51.249s
Status SUCCESS

Steps

Step Status Duration
check_substitutions SUCCESS 32.771s
build-hatch-image SUCCESS 2.943s
tests SUCCESS 1m9.559s
lint SUCCESS 56.321s
download-secrets SUCCESS 7.639s
integration-tests SUCCESS 40.091s

Details

starting build "4f8f8829-d392-4793-9df8-fd93548430ef" using release legacy

FETCHSOURCE
From https://github.com/Kaggle/kaggle-cli
 * branch            8b4581b317c8eb56610bd6d32d3a57e082ade45a -> FETCH_HEAD
HEAD is now at 8b4581b fix(cli): re-prompt on invalid confirmation answers instead of cancelling
GitCommit:
8b4581b317c8eb56610bd6d32d3a57e082ade45a
BUILD
Starting Step #0 - "check_substitutions"
Starting Step #4 - "download-secrets"
Step #0 - "check_substitutions": Already have image (with digest): gcr.io/cloud-builders/docker
Step #4 - "download-secrets": Already have image (with digest): gcr.io/cloud-builders/gcloud
Step #0 - "check_substitutions": 3.11.15: Pulling from kaggle-cicd/tools/cli-builder
Step #0 - "check_substitutions": 1da3cb2f93f2: Pulling fs layer
Step #0 - "check_substitutions": 68b64c51cda3: Pulling fs layer
Step #0 - "check_substitutions": ec935196e6a0: Pulling fs layer
Step #0 - "check_substitutions": d74736caedd4: Pulling fs layer
Step #0 - "check_substitutions": a6d590218bc2: Pulling fs layer
Step #0 - "check_substitutions": a8f50fb62c65: Pulling fs layer
Step #0 - "check_substitutions": 435560346717: Pulling fs layer
Step #0 - "check_substitutions": 435560346717: Waiting
Step #0 - "check_substitutions": 9fcf9a0caf3f: Pulling fs layer
Step #0 - "check_substitutions": df2aa163dda3: Pulling fs layer
Step #0 - "check_substitutions": 9fcf9a0caf3f: Waiting
Step #0 - "check_substitutions": df2aa163dda3: Waiting
Step #0 - "check_substitutions": a6d590218bc2: Verifying Checksum
Step #0 - "check_substitutions": a6d590218bc2: Download complete
Step #0 - "check_substitutions": 435560346717: Verifying Checksum
Step #0 - "check_substitutions": 435560346717: Download complete
Step #0 - "check_substitutions": a8f50fb62c65: Verifying Checksum
Step #0 - "check_substitutions": a8f50fb62c65: Download complete
Step #0 - "check_substitutions": 68b64c51cda3: Verifying Checksum
Step #0 - "check_substitutions": 68b64c51cda3: Download complete
Step #0 - "check_substitutions": 9fcf9a0caf3f: Verifying Checksum
Step #0 - "check_substitutions": 9fcf9a0caf3f: Download complete
Step #0 - "check_substitutions": 1da3cb2f93f2: Verifying Checksum
Step #0 - "check_substitutions": 1da3cb2f93f2: Download complete
Step #0 - "check_substitutions": ec935196e6a0: Verifying Checksum
Step #0 - "check_substitutions": ec935196e6a0: Download complete
Step #0 - "check_substitutions": df2aa163dda3: Verifying Checksum
Step #0 - "check_substitutions": df2aa163dda3: Download complete
Finished Step #4 - "download-secrets"
Step #0 - "check_substitutions": d74736caedd4: Verifying Checksum
Step #0 - "check_substitutions": d74736caedd4: Download complete
Step #0 - "check_substitutions": 1da3cb2f93f2: Pull complete
Step #0 - "check_substitutions": 68b64c51cda3: Pull complete
Step #0 - "check_substitutions": ec935196e6a0: Pull complete
Step #0 - "check_substitutions": d74736caedd4: Pull complete
Step #0 - "check_substitutions": a6d590218bc2: Pull complete
Step #0 - "check_substitutions": a8f50fb62c65: Pull complete
Step #0 - "check_substitutions": 435560346717: Pull complete
Step #0 - "check_substitutions": 9fcf9a0caf3f: Pull complete
Step #0 - "check_substitutions": df2aa163dda3: Pull complete
Step #0 - "check_substitutions": Digest: sha256:eb25903f830e7acdd527d2ef756a4622e0252edc160ce6bf9fbe61248ef37b2f
Step #0 - "check_substitutions": Status: Downloaded newer image for us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Step #0 - "check_substitutions": us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Finished Step #0 - "check_substitutions"
Starting Step #1 - "build-hatch-image"
Step #1 - "build-hatch-image": Already have image (with digest): gcr.io/cloud-builders/docker
Step #1 - "build-hatch-image": Sending build context to Docker daemon  6.656kB

Step #1 - "build-hatch-image": Step 1/5 : ARG PYTHON_VERSION
Step #1 - "build-hatch-image": Step 2/5 : FROM python:${PYTHON_VERSION}
Step #1 - "build-hatch-image": 3.11.15: Pulling from library/python
Step #1 - "build-hatch-image": 1da3cb2f93f2: Already exists
Step #1 - "build-hatch-image": 68b64c51cda3: Already exists
Step #1 - "build-hatch-image": ec935196e6a0: Already exists
Step #1 - "build-hatch-image": d74736caedd4: Already exists
Step #1 - "build-hatch-image": a6d590218bc2: Already exists
Step #1 - "build-hatch-image": a8f50fb62c65: Already exists
Step #1 - "build-hatch-image": 435560346717: Already exists
Step #1 - "build-hatch-image": Digest: sha256:d0199e2a90bf7a206a485b115323a75bc946f30b463d704c5435a454aca084dd
Step #1 - "build-hatch-image": Status: Downloaded newer image for python:3.11.15
Step #1 - "build-hatch-image":  ---> a7c6a86c35ba
Step #1 - "build-hatch-image": Step 3/5 : RUN apt-get update && apt-get install -y --only-upgrade ca-certificates && rm -rf /var/lib/apt/lists/*
Step #1 - "build-hatch-image":  ---> Using cache
Step #1 - "build-hatch-image":  ---> a7040309aff1
Step #1 - "build-hatch-image": Step 4/5 : RUN python -m pip install --upgrade "pip>=26.2.2" "certifi>=2026.10.19" hatch==1.16.5
Step #1 - "build-hatch-image":  ---> Using cache
Step #1 - "build-hatch-image":  ---> ab43be3e7d19
Step #1 - "build-hatch-image": Step 5/5 : ENTRYPOINT ["hatch"]
Step #1 - "build-hatch-image":  ---> Using cache
Step #1 - "build-hatch-image":  ---> d49c99d0c0f1
Step #1 - "build-hatch-image": Successfully built d49c99d0c0f1
Step #1 - "build-hatch-image": Successfully tagged us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Finished Step #1 - "build-hatch-image"
Starting Step #5 - "integration-tests"
Starting Step #2 - "tests"
Starting Step #3 - "lint"
Step #3 - "lint": Already have image (with digest): us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Step #2 - "tests": Already have image (with digest): us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Step #5 - "integration-tests": Already have image (with digest): us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
Step #3 - "lint": Creating environment: lint
Step #2 - "tests": Creating environment: test
Step #5 - "integration-tests": Creating environment: test
Step #3 - "lint": Checking dependencies
Step #3 - "lint": Syncing dependencies
Step #2 - "tests": Installing project in development mode
Step #5 - "integration-tests": Installing project in development mode
Step #3 - "lint": cmd [1] | black --check --diff .
Step #3 - "lint": Skipping .ipynb files as Jupyter dependencies are not installed.
Step #3 - "lint": You can fix this by running ``pip install "black[jupyter]"``
Step #5 - "integration-tests": Checking dependencies
Step #2 - "tests": Checking dependencies
Step #5 - "integration-tests": Syncing dependencies
Step #2 - "tests": Syncing dependencies
Step #5 - "integration-tests": ============================= test session starts ==============================
Step #5 - "integration-tests": platform linux -- Python 3.11.15, pytest-9.2.0, pluggy-1.7.0
Step #5 - "integration-tests": rootdir: /workspace
Step #5 - "integration-tests": configfile: pyproject.toml
Step #5 - "integration-tests": plugins: cov-7.1.0, platformdirs-4.14.5
Step #5 - "integration-tests": collected 2 items
Step #5 - "integration-tests": 
Step #5 - "integration-tests": tests/integration/test_models.py ..                                      [100%]
Step #5 - "integration-tests": 
Step #5 - "integration-tests": ============================== 2 passed in 1.72s ===============================
Finished Step #5 - "integration-tests"
Step #2 - "tests": ============================= test session starts ==============================
Step #2 - "tests": platform linux -- Python 3.11.15, pytest-9.2.0, pluggy-1.7.0
Step #2 - "tests": rootdir: /workspace
Step #2 - "tests": configfile: pyproject.toml
Step #2 - "tests": testpaths: tests/unit
Step #2 - "tests": plugins: cov-7.1.0, platformdirs-4.14.5
Step #2 - "tests": collected 1458 items
Step #2 - "tests": 
Step #2 - "tests": tests/unit/test_authenticate.py .....................                    [  1%]
Step #2 - "tests": tests/unit/test_benchmarks_cli.py ...................................... [  4%]
Step #2 - "tests": ........................................................................ [  8%]
Step #3 - "lint": All done! ✨ 🍰 ✨
Step #3 - "lint": 81 files would be left unchanged.
Step #3 - "lint": cmd [2] | mypy --install-types --non-interactive src/kaggle tests
Step #2 - "tests": ........................................................................ [ 13%]
Step #2 - "tests": ........................................................................ [ 18%]
Step #2 - "tests": ..................................................                       [ 22%]
Step #2 - "tests": tests/unit/test_benchmarks_leaderboard.py ......................         [ 23%]
Step #2 - "tests": tests/unit/test_benchmarks_quota.py ..........                           [ 24%]
Step #2 - "tests": tests/unit/test_cli_benchmarks.py ................................       [ 26%]
Step #3 - "lint": Collecting types-PySocks
Step #3 - "lint":   Downloading types_pysocks-1.7.1.20260518-py3-none-any.whl.metadata (1.7 kB)
Step #3 - "lint": Collecting types-PyYAML
Step #3 - "lint":   Downloading types_pyyaml-6.0.12.20261111-py3-none-any.whl.metadata (1.8 kB)
Step #3 - "lint": Collecting types-Pygments
Step #3 - "lint":   Downloading types_pygments-2.21.0.20260819-py3-none-any.whl.metadata (2.2 kB)
Step #3 - "lint": Collecting types-bleach
Step #3 - "lint":   Downloading types_bleach-6.4.0.20260728-py3-none-any.whl.metadata (1.8 kB)
Step #3 - "lint": Collecting types-pexpect
Step #3 - "lint":   Downloading types_pexpect-4.9.0.20260518-py3-none-any.whl.metadata (1.7 kB)
Step #3 - "lint": Collecting types-protobuf
Step #3 - "lint":   Downloading types_protobuf-7.35.1.20260906-py3-none-any.whl.metadata (2.3 kB)
Step #2 - "tests": tests/unit/test_cli_commands.py ..............                           [ 27%]
Step #3 - "lint": Collecting types-python-dateutil
Step #3 - "lint":   Downloading types_python_dateutil-2.9.0.20261104-py3-none-any.whl.metadata (1.9 kB)
Step #3 - "lint": Collecting types-html5lib (from types-bleach)
Step #3 - "lint":   Downloading types_html5lib-1.1.11.20260518-py3-none-any.whl.metadata (1.8 kB)
Step #3 - "lint": Collecting types-webencodings (from types-html5lib->types-bleach)
Step #3 - "lint":   Downloading types_webencodings-0.6.0.20261104-py3-none-any.whl.metadata (1.9 kB)
Step #3 - "lint": Downloading types_pysocks-1.7.1.20260518-py3-none-any.whl (9.6 kB)
Step #3 - "lint": Downloading types_pyyaml-6.0.12.20261111-py3-none-any.whl (21 kB)
Step #3 - "lint": Downloading types_pygments-2.21.0.20260819-py3-none-any.whl (29 kB)
Step #3 - "lint": Downloading types_bleach-6.4.0.20260728-py3-none-any.whl (12 kB)
Step #3 - "lint": Downloading types_pexpect-4.9.0.20260518-py3-none-any.whl (17 kB)
Step #3 - "lint": Downloading types_protobuf-7.35.1.20260906-py3-none-any.whl (86 kB)
Step #3 - "lint": Downloading types_python_dateutil-2.9.0.20261104-py3-none-any.whl (18 kB)
Step #3 - "lint": Downloading types_html5lib-1.1.11.20260518-py3-none-any.whl (24 kB)
Step #3 - "lint": Downloading types_webencodings-0.6.0.20261104-py3-none-any.whl (8.6 kB)
Step #3 - "lint": Installing collected packages: types-webencodings, types-PyYAML, types-python-dateutil, types-PySocks, types-Pygments, types-protobuf, types-pexpect, types-html5lib, types-bleach
Step #3 - "lint": 
Step #3 - "lint": Successfully installed types-PySocks-1.7.1.20260518 types-PyYAML-6.0.12.20261111 types-Pygments-2.21.0.20260819 types-bleach-6.4.0.20260728 types-html5lib-1.1.11.20260518 types-pexpect-4.9.0.20260518 types-protobuf-7.35.1.20260906 types-python-dateutil-2.9.0.20261104 types-webencodings-0.6.0.20261104
Step #3 - "lint": 
Step #3 - "lint": [notice] A new release of pip is available: 26.2.2 -> 26.3
Step #3 - "lint": [notice] To update, run: pip install --upgrade pip
Step #2 - "tests": tests/unit/test_cli_competitions.py .................................... [ 30%]
Step #2 - "tests": ..........................                                               [ 31%]
Step #3 - "lint": src/kaggle/models/upload_file.py:127: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": src/kaggle/api/kaggle_api_extended.py:3539: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": src/kaggle/api/kaggle_api_extended.py:8335: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": src/kaggle/api/kaggle_api_extended.py:8810: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": tests/unit/test_upload_helpers.py:362: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": tests/backend/backend_tests.py:288: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs  [annotation-unchecked]
Step #3 - "lint": Installing missing stub packages:
Step #3 - "lint": /builder/home/lint/.local/share/hatch/env/virtual/kaggle/xS3fZVNL/lint/bin/python -m pip install types-PySocks types-PyYAML types-Pygments types-bleach types-pexpect types-protobuf types-python-dateutil
Step #3 - "lint": 
Step #3 - "lint": 
Step #3 - "lint": Success: no issues found in 80 source files
Finished Step #3 - "lint"
Step #2 - "tests": tests/unit/test_cli_datasets.py ...............................          [ 34%]
Step #2 - "tests": tests/unit/test_cli_errors.py ..............                             [ 34%]
Step #2 - "tests": tests/unit/test_cli_forums.py .......                                    [ 35%]
Step #2 - "tests": tests/unit/test_cli_kernels.py .................................         [ 37%]
Step #2 - "tests": tests/unit/test_cli_main.py ..........                                   [ 38%]
Step #2 - "tests": tests/unit/test_cli_models.py .......................................... [ 41%]
Step #2 - "tests": .                                                                        [ 41%]
Step #2 - "tests": tests/unit/test_cli_pagination.py .......                                [ 41%]
Step #2 - "tests": tests/unit/test_cli_search.py ......                                     [ 42%]
Step #2 - "tests": tests/unit/test_competition_add_host.py ............                     [ 43%]
Step #2 - "tests": tests/unit/test_competition_create.py ............                       [ 43%]
Step #2 - "tests": tests/unit/test_competition_create_page.py ........                      [ 44%]
Step #2 - "tests": tests/unit/test_competition_create_solution.py ..........                [ 45%]
Step #2 - "tests": tests/unit/test_competition_data_update.py ................              [ 46%]
Step #2 - "tests": tests/unit/test_competition_delete_page.py ........                      [ 46%]
Step #2 - "tests": tests/unit/test_competition_launch.py .........                          [ 47%]
Step #2 - "tests": tests/unit/test_competition_leaderboard_public.py .......                [ 47%]
Step #2 - "tests": tests/unit/test_competition_list_hosts.py ........                       [ 48%]
Step #2 - "tests": tests/unit/test_competition_settings_get.py ........                     [ 48%]
Step #2 - "tests": tests/unit/test_competition_settings_update.py ..................        [ 50%]
Step #2 - "tests": tests/unit/test_competition_solution_status.py ............              [ 51%]
Step #2 - "tests": tests/unit/test_competition_submission_download.py .........             [ 51%]
Step #2 - "tests": tests/unit/test_competition_submission_limits.py ........                [ 52%]
Step #2 - "tests": tests/unit/test_competition_submit.py ........................           [ 53%]
Step #2 - "tests": tests/unit/test_competition_submit_wait.py .........................     [ 55%]
Step #2 - "tests": tests/unit/test_competition_update_page.py ............                  [ 56%]
Step #2 - "tests": tests/unit/test_competitions_list.py .............                       [ 57%]
Step #2 - "tests": tests/unit/test_confirmation.py .....                                    [ 57%]
Step #2 - "tests": tests/unit/test_dataset_create.py ............................           [ 59%]
Step #2 - "tests": tests/unit/test_dataset_delete.py .......                                [ 60%]
Step #2 - "tests": tests/unit/test_dataset_download.py ........                             [ 60%]
Step #2 - "tests": tests/unit/test_dataset_list.py ................                         [ 61%]
Step #2 - "tests": tests/unit/test_dataset_metadata_update.py ............                  [ 62%]
Step #2 - "tests": tests/unit/test_dataset_status.py ..............                         [ 63%]
Step #2 - "tests": tests/unit/test_discussions_cli.py ..................................... [ 65%]
Step #2 - "tests": ..........................................................               [ 69%]
Step #2 - "tests": tests/unit/test_download_file_paths.py ....................              [ 71%]
Step #2 - "tests": tests/unit/test_download_resume.py ...................                   [ 72%]
Step #2 - "tests": tests/unit/test_download_unzip.py ..............................         [ 74%]
Step #2 - "tests": tests/unit/test_help_version_auth.py ..........                          [ 75%]
Step #2 - "tests": tests/unit/test_http_client.py ...                                       [ 75%]
Step #2 - "tests": tests/unit/test_ignore_patterns.py ....                                  [ 75%]
Step #2 - "tests": tests/unit/test_kernel_delete.py ..............                          [ 76%]
Step #2 - "tests": tests/unit/test_kernel_parsing.py .......                                [ 77%]
Step #2 - "tests": tests/unit/test_kernel_versions.py ..............                        [ 78%]
Step #2 - "tests": tests/unit/test_kernels_logs.py ........................                 [ 79%]
Step #2 - "tests": tests/unit/test_kernels_output_download.py ..                            [ 80%]
Step #2 - "tests": tests/unit/test_kernels_output_paths.py ...                              [ 80%]
Step #2 - "tests": tests/unit/test_kernels_pull.py ..........                               [ 80%]
Step #2 - "tests": tests/unit/test_kernels_push.py ...................                      [ 82%]
Step #2 - "tests": tests/unit/test_kernels_push_no_run.py .......                           [ 82%]
Step #2 - "tests": tests/unit/test_kernels_push_retired_accelerator.py .........            [ 83%]
Step #2 - "tests": tests/unit/test_model_create.py ........................................ [ 86%]
Step #2 - "tests": .............                                                            [ 86%]
Step #2 - "tests": tests/unit/test_model_delete.py ......                                   [ 87%]
Step #2 - "tests": tests/unit/test_model_download.py ...........                            [ 88%]
Step #2 - "tests": tests/unit/test_model_list.py ...........                                [ 88%]
Step #2 - "tests": tests/unit/test_parse_duration.py ...................                    [ 90%]
Step #2 - "tests": tests/unit/test_quota.py ...........                                     [ 90%]
Step #2 - "tests": tests/unit/test_retry_after.py .......................                   [ 92%]
Step #2 - "tests": tests/unit/test_search.py ....................................           [ 94%]
Step #2 - "tests": tests/unit/test_tar_extraction_safety.py ...                             [ 95%]
Step #2 - "tests": tests/unit/test_team_submissions.py ........                             [ 95%]
Step #2 - "tests": tests/unit/test_upload_file.py ..                                        [ 95%]
Step #2 - "tests": tests/unit/test_upload_helpers.py ...................................... [ 98%]
Step #2 - "tests": ......................                                                   [100%]
Step #2 - "tests": 
Step #2 - "tests": =============================== warnings summary ===============================
Step #2 - "tests": tests/unit/test_benchmarks_cli.py:827
Step #2 - "tests":   /workspace/tests/unit/test_benchmarks_cli.py:827: DeprecationWarning: invalid escape sequence '\('
Step #2 - "tests":     with patch("time.sleep"), pytest.raises(ValueError, match="run\(s\) failed"):
Step #2 - "tests": 
Step #2 - "tests": -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
Step #2 - "tests": ======================= 1458 passed, 1 warning in 31.39s =======================
Finished Step #2 - "tests"
PUSH
Pushing us-docker.pkg.dev/kaggle-cicd/tools/cli-builder:3.11.15
The push refers to repository [us-docker.pkg.dev/kaggle-cicd/tools/cli-builder]
0de978fb8e41: Preparing
d3be745dd956: Preparing
564572da079f: Preparing
a3febc6e4083: Preparing
a56591f400b5: Preparing
a471fb04aa22: Preparing
ff650be09e8c: Preparing
bfbbad6e30bd: Preparing
035cd7d3804a: Preparing
a3febc6e4083: Layer already exists
035cd7d3804a: Layer already exists
bfbbad6e30bd: Layer already exists
d3be745dd956: Layer already exists
ff650be09e8c: Layer already exists
a56591f400b5: Layer already exists
a471fb04aa22: Layer already exists
0de978fb8e41: Layer already exists
564572da079f: Layer already exists
3.11.15: digest: sha256:eb25903f830e7acdd527d2ef756a4622e0252edc160ce6bf9fbe61248ef37b2f size: 2219
DONE

Build Log: https://console.cloud.google.com/cloud-build/builds/4f8f8829-d392-4793-9df8-fd93548430ef?project=464139560241