code-sandboxes 1.4.4__tar.gz → 1.4.5__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.
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/CHANGELOG.md +18 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/PKG-INFO +1 -1
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/__version__.py +1 -1
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/datalayer_sandbox.py +17 -6
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +94 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/build.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-code-style.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-tests.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-typing.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/reusable-python.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.gitignore +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.licenserc.yaml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.pre-commit-config.yaml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.vscode/settings.json +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/Dockerfile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/LICENSE +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/Makefile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/README.md +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/__init__.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/base.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/bridge_mount.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/builds.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/cli.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/client.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/cloudflare_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/commands.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/console.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/contents.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/coreweave_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/daytona_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/docker_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/e2b_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/eval_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/exceptions.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/filesystem.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/google_colab.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/google_colab_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/interfaces.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/jupyter_ingress.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/jupyter_server_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_execute.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_live.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/lifecycle.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/manage.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/modal_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/models.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/monty_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/provider_ingress.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/providers.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docker/Dockerfile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/.gitignore +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/LICENSE +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/Makefile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/README.md +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/babel.config.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/api-reference/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/api-reference/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/cli/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/cli/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/contribute/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/contribute/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/examples/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/examples/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/guide/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/guide/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/install/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/install/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/provider-ingress.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/_category_.yml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/cloudflare.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/coreweave.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/datalayer.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/daytona.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/docker.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/e2b.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/eval.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/google-colab.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/index.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/jupyter-server.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/kaggle.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/modal.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/monty.mdx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docusaurus.config.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/package.json +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/sidebars.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow1.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow1.module.css +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow2.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow2.module.css +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow3.js +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow3.module.css +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/css/custom.css +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/pages/index.module.css +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/pages/markdown-page.md +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/theme/CustomDocItem.tsx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/theme/IconsTitle.tsx +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/bricks.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/building-construction.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/cloud-sun.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/cloud.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/collaboration.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/copy-left.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/logo.png +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/logo.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/business.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/devops.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/project/project-line.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/favicon.ico +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/jupyter.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/open-source.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/react-js.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/react-js2.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/ringed-planet.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/robot.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/rocket.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/shield.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/sparkles.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/streamlit.gif +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/super-hero.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/target.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/thumbs-up.svg +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/README.md +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/Makefile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/Makefile +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/pyproject.toml +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/__init__.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/conftest.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_bridge_mount.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_builds.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cli_exec.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cli_repl.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_contents.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_files.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_outcome_error_output.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cloudflare.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_commands_envelope.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_console.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_contents_contract.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_contents_live_matrix.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_coreweave.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_datalayer_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_daytona.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_e2b.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_eval.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_factory.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_google_colab.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_integration.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_ingress.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_server.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_server_streaming.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_execute.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_live.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_session.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kernel_client_compatibility.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_lifecycle_vocabulary.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_manage.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_modal_google_colab_sandbox.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_modal_session.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_models.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_output_line_fidelity.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_provider_catalog_names.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_provider_ingress.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_providers.py +0 -0
- {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_sandboxes.py +0 -0
|
@@ -8,6 +8,24 @@
|
|
|
8
8
|
|
|
9
9
|
## Unreleased
|
|
10
10
|
|
|
11
|
+
- A Datalayer sandbox says when it is running code, so an interrupt can reach
|
|
12
|
+
it. `Sandbox.interrupt` refuses before it delegates — `if not
|
|
13
|
+
self._executing_event.is_set(): return False` — and `run_code` never set that
|
|
14
|
+
event, so `is_executing` was always False, every interrupt was refused at the
|
|
15
|
+
door, and the refusal was reported as "no code was running" to a caller
|
|
16
|
+
watching a cell run.
|
|
17
|
+
|
|
18
|
+
This is the other half of the interrupt fix released in 1.4.4, and the
|
|
19
|
+
measurement said so: with `_do_interrupt` implemented and deployed, cancelling
|
|
20
|
+
a two-minute cell ten seconds in still left the kernel busy for **60.5
|
|
21
|
+
seconds**. Implementing the interrupt changed nothing while nothing could call
|
|
22
|
+
it. Both are needed, and the package's tests now hold them together.
|
|
23
|
+
|
|
24
|
+
Five variants — cloudflare, coreweave, daytona, e2b, modal — implement
|
|
25
|
+
`_do_interrupt` and never mark execution either, so their interrupts are
|
|
26
|
+
unreachable in the same way. Pinned as known rather than fixed blind, since
|
|
27
|
+
none can be measured from here.
|
|
28
|
+
|
|
11
29
|
- `DatalayerSandbox` can be interrupted. It neither implemented `_do_interrupt`
|
|
12
30
|
nor read the flag the base class sets, so the default ran instead: it sets a
|
|
13
31
|
flag, returns `True`, and stops nothing. Everything above believed it —
|
|
@@ -801,14 +801,23 @@ class DatalayerSandbox(Sandbox):
|
|
|
801
801
|
|
|
802
802
|
started_at = time.time()
|
|
803
803
|
|
|
804
|
-
#
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
#
|
|
804
|
+
# **Say that code is running, because `interrupt()` will not act
|
|
805
|
+
# unless it can see that.** `Sandbox.interrupt` returns `False`
|
|
806
|
+
# before reaching `_do_interrupt` when `_executing_event` is clear,
|
|
807
|
+
# and this variant never set it — so `is_executing` was always False,
|
|
808
|
+
# every interrupt was refused at the door, and the refusal was
|
|
809
|
+
# reported as "no code was running" to a caller watching a cell run.
|
|
810
|
+
# Implementing `_do_interrupt` alone did not fix cancellation for
|
|
811
|
+
# exactly this reason: nothing ever called it.
|
|
810
812
|
execution_timeout = timeout or self.config.timeout
|
|
813
|
+
self._interrupt_requested.clear()
|
|
814
|
+
self._executing_event.set()
|
|
811
815
|
try:
|
|
816
|
+
# Set environment variables if provided
|
|
817
|
+
if envs:
|
|
818
|
+
env_code = "\n".join(f"import os; os.environ[{k!r}] = {v!r}" for k, v in envs.items())
|
|
819
|
+
self._runtime.execute(env_code)
|
|
820
|
+
|
|
812
821
|
response = self._runtime.execute(code, timeout=execution_timeout)
|
|
813
822
|
except Exception as e:
|
|
814
823
|
# Infrastructure failure - couldn't execute the code
|
|
@@ -822,6 +831,8 @@ class DatalayerSandbox(Sandbox):
|
|
|
822
831
|
started_at=started_at,
|
|
823
832
|
completed_at=time.time(),
|
|
824
833
|
)
|
|
834
|
+
finally:
|
|
835
|
+
self._executing_event.clear()
|
|
825
836
|
|
|
826
837
|
# Parse the response
|
|
827
838
|
stdout_messages: list[OutputMessage] = []
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_a_datalayer_sandbox_can_be_interrupted.py
RENAMED
|
@@ -160,3 +160,97 @@ class TestTheChainReachesAKernel:
|
|
|
160
160
|
from code_sandboxes.jupyter_server_sandbox import JupyterServerSandbox
|
|
161
161
|
|
|
162
162
|
assert "_do_interrupt" in JupyterServerSandbox.__dict__
|
|
163
|
+
|
|
164
|
+
class TestTheInterruptIsReached:
|
|
165
|
+
"""`_do_interrupt` was necessary and not sufficient, which the first
|
|
166
|
+
measurement after deploying it said plainly: still 60.5 seconds.
|
|
167
|
+
|
|
168
|
+
`Sandbox.interrupt` refuses before it delegates::
|
|
169
|
+
|
|
170
|
+
if not self._executing_event.is_set():
|
|
171
|
+
return False
|
|
172
|
+
self._interrupt_requested.set()
|
|
173
|
+
return self._do_interrupt()
|
|
174
|
+
|
|
175
|
+
`DatalayerSandbox.run_code` never set that event, so `is_executing` was
|
|
176
|
+
always False and every interrupt was refused at the door — and reported
|
|
177
|
+
as "no code was running" to a caller watching a cell run. Two guards,
|
|
178
|
+
both needed: one that the door opens, one that what is behind it works.
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
def test_run_code_says_that_code_is_running(self):
|
|
182
|
+
import threading
|
|
183
|
+
|
|
184
|
+
from code_sandboxes.datalayer_sandbox import DatalayerSandbox
|
|
185
|
+
|
|
186
|
+
seen = []
|
|
187
|
+
|
|
188
|
+
class _Runtime:
|
|
189
|
+
sandbox_client = None
|
|
190
|
+
|
|
191
|
+
def execute(self, code, timeout=None):
|
|
192
|
+
seen.append(sandbox._executing_event.is_set())
|
|
193
|
+
raise RuntimeError("stop here; the flag is what is under test")
|
|
194
|
+
|
|
195
|
+
sandbox = DatalayerSandbox.__new__(DatalayerSandbox)
|
|
196
|
+
sandbox._started = True
|
|
197
|
+
sandbox._runtime = _Runtime()
|
|
198
|
+
sandbox._executing_event = threading.Event()
|
|
199
|
+
sandbox._interrupt_requested = threading.Event()
|
|
200
|
+
sandbox._connect = lambda: None
|
|
201
|
+
sandbox._sandbox_id = "sb_test"
|
|
202
|
+
|
|
203
|
+
class _Config:
|
|
204
|
+
timeout = 30
|
|
205
|
+
|
|
206
|
+
sandbox.config = _Config()
|
|
207
|
+
sandbox.run_code("print(1)")
|
|
208
|
+
|
|
209
|
+
assert seen == [True], "the sandbox ran code without saying it was running"
|
|
210
|
+
assert not sandbox._executing_event.is_set(), "the flag outlived the execution"
|
|
211
|
+
|
|
212
|
+
def test_every_variant_that_can_be_interrupted_says_when_it_runs(self):
|
|
213
|
+
"""The pair, held together: implementing `_do_interrupt` while never
|
|
214
|
+
setting the event is a fix that changes nothing, and that is the
|
|
215
|
+
mistake this file exists to stop repeating."""
|
|
216
|
+
import importlib
|
|
217
|
+
import inspect
|
|
218
|
+
import pkgutil
|
|
219
|
+
|
|
220
|
+
import code_sandboxes
|
|
221
|
+
from code_sandboxes.base import Sandbox
|
|
222
|
+
|
|
223
|
+
mute = set()
|
|
224
|
+
for module in pkgutil.iter_modules(code_sandboxes.__path__):
|
|
225
|
+
if not module.name.endswith("_sandbox"):
|
|
226
|
+
continue
|
|
227
|
+
loaded = importlib.import_module(f"code_sandboxes.{module.name}")
|
|
228
|
+
source = inspect.getsource(loaded)
|
|
229
|
+
for name in dir(loaded):
|
|
230
|
+
value = getattr(loaded, name)
|
|
231
|
+
if (
|
|
232
|
+
isinstance(value, type)
|
|
233
|
+
and issubclass(value, Sandbox)
|
|
234
|
+
and value is not Sandbox
|
|
235
|
+
and value.__module__ == loaded.__name__
|
|
236
|
+
and "_do_interrupt" in value.__dict__
|
|
237
|
+
and "_executing_event.set()" not in source
|
|
238
|
+
):
|
|
239
|
+
mute.add(f"{module.name}.{name}")
|
|
240
|
+
|
|
241
|
+
# Not exemptions — the same unreachable interrupt, pinned. The gate in
|
|
242
|
+
# `Sandbox.interrupt` is held for every variant, so these five ask a
|
|
243
|
+
# provider to stop work and are refused before they can: each one has
|
|
244
|
+
# a written interrupt that nothing can call. Left as found rather than
|
|
245
|
+
# fixed blind, because none of them can be measured from here.
|
|
246
|
+
known = {
|
|
247
|
+
"cloudflare_sandbox.CloudflareSandbox",
|
|
248
|
+
"coreweave_sandbox.CoreWeaveSandbox",
|
|
249
|
+
"daytona_sandbox.DaytonaSandbox",
|
|
250
|
+
"e2b_sandbox.E2BSandbox",
|
|
251
|
+
"modal_sandbox.ModalSandbox",
|
|
252
|
+
}
|
|
253
|
+
assert mute - known == set(), (
|
|
254
|
+
f"these implement an interrupt nothing can reach: {mute - known}"
|
|
255
|
+
)
|
|
256
|
+
assert known - mute == set(), f"reachable now — drop from the pinned set: {known - mute}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/business.svg
RENAMED
|
File without changes
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/data-scientist.svg
RENAMED
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/project/project-line.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/jupyter_server_sandbox_example.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/jupyter_server_sandbox_example.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|