code-sandboxes 1.9.20__tar.gz → 1.9.21__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.9.20 → code_sandboxes-1.9.21}/PKG-INFO +1 -1
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/__version__.py +1 -1
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/attest.py +30 -1
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_attest.py +54 -15
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/build.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/environments-live.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/py-code-style.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/py-tests.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/py-typing.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.github/workflows/reusable-python.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.gitignore +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.licenserc.yaml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.pre-commit-config.yaml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/.vscode/settings.json +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/CHANGELOG.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/Dockerfile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/LICENSE +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/Makefile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/README.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/__init__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/base.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/bridge_mount.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/builds.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/cli.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/client.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/cloudflare_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/commands.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/console.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/contents.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/coreweave_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/datalayer_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/daytona_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/docker_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/e2b_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/__init__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/__main__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/accounts.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/__init__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/datalayer.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/daytona.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/e2b.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/managed.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/modal.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/bases.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/breaker.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/build_secrets.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/builders.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/canonical.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/conformance.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/constraints/sandbox-contract-v1.txt +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/constraints/wheelhouse/README.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/constraints/wheelhouse/jupyter_server-2.21.0+datalayer.1-py3-none-any.whl +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/contract.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/doctor/__init__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/doctor/build.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/doctor/datalayer_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/doctor/report.schema.json +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/errors.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/files.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/image_import.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/lifecycle.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/policy.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/redact.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/resolve.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/resolve_conda.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/schema.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/spec.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/eval_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/exceptions.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/filesystem.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/google_colab.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/google_colab_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/interfaces.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/jupyter_ingress.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/jupyter_server_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/kaggle.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/kaggle_execute.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/kaggle_live.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/kaggle_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/lifecycle.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/manage.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/modal_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/models.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/monty_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/provider_ingress.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/providers.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docker/Dockerfile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/.gitignore +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/LICENSE +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/Makefile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/README.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/babel.config.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/api-reference/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/api-reference/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/cli/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/cli/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/contribute/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/contribute/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/environments/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/environments/contract.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/environments/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/environments/specification.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/environments/spike-2026-09.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/examples/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/examples/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/guide/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/guide/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/install/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/install/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/provider-ingress.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/_category_.yml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/cloudflare.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/coreweave.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/datalayer.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/daytona.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/docker.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/e2b.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/eval.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/google-colab.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/index.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/jupyter-server.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/kaggle.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/modal.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docs/providers/monty.mdx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/docusaurus.config.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/package.json +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/sidebars.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow1.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow1.module.css +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow2.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow2.module.css +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow3.js +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/components/HomepageRow3.module.css +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/css/custom.css +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/pages/index.module.css +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/pages/markdown-page.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/theme/CustomDocItem.tsx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/src/theme/IconsTitle.tsx +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/bricks.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/building-construction.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/cloud-sun.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/cloud.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/collaboration.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/copy-left.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/logo.png +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/logo.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/personas/business.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/personas/devops.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/project/project-line.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/favicon.ico +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/jupyter.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/open-source.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/react-js.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/react-js2.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/ringed-planet.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/robot.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/rocket.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/shield.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/sparkles.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/streamlit.gif +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/super-hero.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/target.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/thumbs-up.svg +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/README.md +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/Makefile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/exec/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/Makefile +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/examples/repl/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/pyproject.toml +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/schemas/environment-v1alpha1.json +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/__init__.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/conftest.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_bridge_mount.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_builds.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_cli_exec.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_cli_repl.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_client.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_client_contents.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_client_files.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_client_outcome_error_output.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_cloudflare.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_commands_envelope.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_console.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_contents_contract.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_contents_live_matrix.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_coreweave.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_datalayer_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_daytona.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_e2b.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_accounts.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_bases.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_breaker.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_build_secrets.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_builders.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_canonical.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_conformance.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_constraints.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_contract.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_cross_variant_report.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_datalayer_builder.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_daytona_builder.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_doctor.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_e2b_builder.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_errors.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_image_import.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_lifecycle.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_live_matrix.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_managed_builders.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_modal_builder.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_redact.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_resolve.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_resolve_conda.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_environment_spec.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_eval.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_every_variant_has_a_real_interrupt.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_factory.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_google_colab.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_integration.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_jupyter_ingress.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_jupyter_server.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_jupyter_server_streaming.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_kaggle.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_kaggle_execute.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_kaggle_live.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_kaggle_session.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_kernel_client_compatibility.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_lifecycle_vocabulary.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_manage.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_manage_datalayer.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_modal_google_colab_sandbox.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_modal_session.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_models.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_output_line_fidelity.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_provider_catalog_names.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_provider_ingress.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_providers.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_sandboxes.py +0 -0
- {code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/tests/test_the_kill_relaunch_drill.py +0 -0
|
@@ -675,14 +675,43 @@ def attest_artifact(
|
|
|
675
675
|
answers the mapping the workflow stores: the scan's decision, the
|
|
676
676
|
signature, the SBOM and provenance references, and the size.
|
|
677
677
|
"""
|
|
678
|
+
variant = str(getattr(artifact, "variant", "") or "")
|
|
678
679
|
reference = str(getattr(artifact, "immutable_reference", "") or "")
|
|
680
|
+
if variant and variant != "datalayer":
|
|
681
|
+
# D-11 is about the Datalayer artifact: it lives in this platform's
|
|
682
|
+
# registry, the scanner reads it there, cosign signs that digest, and
|
|
683
|
+
# the Operator refuses to start what is unsigned. A managed artifact
|
|
684
|
+
# is none of those things — it lives in the owner's own provider
|
|
685
|
+
# account (D-8) and is referenced the way that provider names it: a
|
|
686
|
+
# Daytona snapshot uuid, an E2B build id, a Modal `im-…`. There is no
|
|
687
|
+
# digest in a repository to scan or sign, and no Operator starting it.
|
|
688
|
+
#
|
|
689
|
+
# Attesting one anyway is what the first real Daytona build did, and
|
|
690
|
+
# it failed *after* the snapshot was built — the work done, the
|
|
691
|
+
# artifact live at the provider, and the build recorded as failed
|
|
692
|
+
# (2026-09-17).
|
|
693
|
+
#
|
|
694
|
+
# Publishing is not weakened by this: E2-15's gate requires the
|
|
695
|
+
# **Datalayer** artifact to have passed its scan, and that one is
|
|
696
|
+
# still attested here.
|
|
697
|
+
if log:
|
|
698
|
+
log(f"{variant} artifacts are not attested: {reference} is not a digest in a registry")
|
|
699
|
+
return {
|
|
700
|
+
"scan_summary": {},
|
|
701
|
+
"sbom_ref": "",
|
|
702
|
+
"provenance_ref": "",
|
|
703
|
+
"signature_ref": "",
|
|
704
|
+
"size_bytes": size_bytes,
|
|
705
|
+
"signed_now": False,
|
|
706
|
+
"licenses": [],
|
|
707
|
+
}
|
|
679
708
|
registry, _, rest = reference.partition("/")
|
|
680
709
|
repository, _, digest = rest.partition("@")
|
|
681
710
|
if not (registry and repository and _DIGEST.match(digest)):
|
|
682
711
|
raise EnvironmentsError(
|
|
683
712
|
PROVIDER_ERROR,
|
|
684
713
|
f"`{reference}` is not a digest in a repository, so it cannot be attested",
|
|
685
|
-
detail={"reference": reference},
|
|
714
|
+
detail={"reference": reference, "variant": variant},
|
|
686
715
|
)
|
|
687
716
|
use = attestor or Attestor(
|
|
688
717
|
key=str(getattr(credential, "signing_key", "") or ""),
|
|
@@ -19,12 +19,13 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
import json
|
|
21
21
|
import subprocess
|
|
22
|
+
from types import SimpleNamespace
|
|
22
23
|
|
|
23
24
|
import pytest
|
|
24
25
|
|
|
25
26
|
from code_sandboxes.environments.attest import Attestor, attest_artifact, licenses_of, signature_tag
|
|
26
27
|
from code_sandboxes.environments.builders import ArtifactReference
|
|
27
|
-
from code_sandboxes.environments.errors import EnvironmentsError
|
|
28
|
+
from code_sandboxes.environments.errors import PROVIDER_ERROR, EnvironmentsError
|
|
28
29
|
from code_sandboxes.environments.policy import (
|
|
29
30
|
DEFAULT_POLICY,
|
|
30
31
|
Finding,
|
|
@@ -613,27 +614,25 @@ class TestAttestingAnArtifact:
|
|
|
613
614
|
assert cosign.argv == [], "a blocked artifact must not be signed"
|
|
614
615
|
|
|
615
616
|
def test_a_reference_that_is_not_a_digest_cannot_be_attested(self) -> None:
|
|
616
|
-
artifact
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
)
|
|
617
|
+
"""A `datalayer` artifact must be a digest in this platform's registry.
|
|
618
|
+
|
|
619
|
+
`attest_artifact` takes `artifact: Any`, so nothing guarantees every
|
|
620
|
+
caller went through the model validator that would have refused this.
|
|
621
|
+
"""
|
|
622
|
+
artifact = SimpleNamespace(variant="datalayer", immutable_reference="im-1234567890")
|
|
622
623
|
with pytest.raises(EnvironmentsError) as raised:
|
|
623
624
|
attest_artifact(artifact=artifact, attestor=an_attestor())
|
|
624
625
|
assert raised.value.code.code == "DL_ENV_PROVIDER_ERROR"
|
|
625
626
|
|
|
626
627
|
def test_a_malformed_digest_cannot_be_attested_either(self) -> None:
|
|
627
628
|
"""`sha256:bad` starts with `sha256:` too: only a whole one is
|
|
628
|
-
accepted (found on PR #27's Copilot review).
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
artifact =
|
|
633
|
-
variant="
|
|
629
|
+
accepted (found on PR #27's Copilot review). Asked of `datalayer`,
|
|
630
|
+
since that is the variant this check is for — `attest_artifact` takes
|
|
631
|
+
`artifact: Any`, so nothing guarantees every caller went through the
|
|
632
|
+
model validator that would have refused it."""
|
|
633
|
+
artifact = SimpleNamespace(
|
|
634
|
+
variant="datalayer",
|
|
634
635
|
immutable_reference=f"{REGISTRY}/{REPOSITORY}@sha256:bad",
|
|
635
|
-
provider_artifact_id="sha256:bad",
|
|
636
|
-
contract_version="sandbox-contract/v1",
|
|
637
636
|
)
|
|
638
637
|
with pytest.raises(EnvironmentsError) as raised:
|
|
639
638
|
attest_artifact(artifact=artifact, attestor=an_attestor())
|
|
@@ -749,3 +748,43 @@ class TestLicencesFromTheSbom:
|
|
|
749
748
|
"""Never a reason to fail a build: a licence list is worth having, not dying for."""
|
|
750
749
|
for document in (None, {}, {"packages": None}, {"components": [1, 2]}, "spdx"):
|
|
751
750
|
assert licenses_of(document) == []
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
class TestWhatIsAttestedAndWhatIsNot:
|
|
754
|
+
"""D-11 is about the Datalayer artifact, not every artifact.
|
|
755
|
+
|
|
756
|
+
It lives in this platform's registry: the scanner reads it there, cosign
|
|
757
|
+
signs that digest, and the Operator refuses to start what is unsigned. A
|
|
758
|
+
managed artifact is none of those things — it lives in the owner's own
|
|
759
|
+
provider account (D-8), named the way that provider names it.
|
|
760
|
+
"""
|
|
761
|
+
|
|
762
|
+
def _artifact(self, variant: str, reference: str):
|
|
763
|
+
return SimpleNamespace(variant=variant, immutable_reference=reference)
|
|
764
|
+
|
|
765
|
+
def test_a_daytona_snapshot_is_not_attested(self) -> None:
|
|
766
|
+
"""Its reference is a uuid, and attesting it anyway failed the first
|
|
767
|
+
real Daytona build *after* the snapshot was already built
|
|
768
|
+
(2026-09-17)."""
|
|
769
|
+
answer = attest_artifact(
|
|
770
|
+
artifact=self._artifact("daytona", "51d10ab0-d98d-4117-bdb5-918e98646c92"),
|
|
771
|
+
size_bytes=1234,
|
|
772
|
+
)
|
|
773
|
+
assert answer["scan_summary"] == {}
|
|
774
|
+
assert answer["signature_ref"] == ""
|
|
775
|
+
assert answer["signed_now"] is False
|
|
776
|
+
# What the provider told us is still recorded.
|
|
777
|
+
assert answer["size_bytes"] == 1234
|
|
778
|
+
|
|
779
|
+
def test_an_e2b_build_id_and_a_modal_image_id_are_not_either(self) -> None:
|
|
780
|
+
for variant, reference in (("e2b", "bld-123"), ("modal", "im-abc123")):
|
|
781
|
+
answer = attest_artifact(artifact=self._artifact(variant, reference))
|
|
782
|
+
assert answer["signed_now"] is False, variant
|
|
783
|
+
assert answer["scan_summary"] == {}, variant
|
|
784
|
+
|
|
785
|
+
def test_a_datalayer_artifact_that_is_not_a_digest_still_fails(self) -> None:
|
|
786
|
+
"""The check that matters is kept where it means something."""
|
|
787
|
+
with pytest.raises(EnvironmentsError) as raised:
|
|
788
|
+
attest_artifact(artifact=self._artifact("datalayer", "not-a-digest"))
|
|
789
|
+
assert raised.value.code is PROVIDER_ERROR
|
|
790
|
+
assert "cannot be attested" in str(raised.value)
|
|
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.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/__init__.py
RENAMED
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/datalayer.py
RENAMED
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/daytona.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/managed.py
RENAMED
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/adapters/modal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/build_secrets.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
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/doctor/__init__.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
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/code_sandboxes/environments/resolve_conda.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
|
|
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.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/personas/business.svg
RENAMED
|
File without changes
|
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/docs/static/img/datalayer/personas/devops.svg
RENAMED
|
File without changes
|
{code_sandboxes-1.9.20 → code_sandboxes-1.9.21}/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
|