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.
Files changed (194) hide show
  1. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/CHANGELOG.md +18 -0
  2. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/PKG-INFO +1 -1
  3. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/__version__.py +1 -1
  4. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/datalayer_sandbox.py +17 -6
  5. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +94 -0
  6. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/build.yml +0 -0
  7. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-code-style.yml +0 -0
  8. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-tests.yml +0 -0
  9. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/py-typing.yml +0 -0
  10. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.github/workflows/reusable-python.yml +0 -0
  11. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.gitignore +0 -0
  12. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.licenserc.yaml +0 -0
  13. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.pre-commit-config.yaml +0 -0
  14. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/.vscode/settings.json +0 -0
  15. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/Dockerfile +0 -0
  16. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/LICENSE +0 -0
  17. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/Makefile +0 -0
  18. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/README.md +0 -0
  19. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/__init__.py +0 -0
  20. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/base.py +0 -0
  21. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/bridge_mount.py +0 -0
  22. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/builds.py +0 -0
  23. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/cli.py +0 -0
  24. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/client.py +0 -0
  25. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/cloudflare_sandbox.py +0 -0
  26. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/commands.py +0 -0
  27. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/console.py +0 -0
  28. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/contents.py +0 -0
  29. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/coreweave_sandbox.py +0 -0
  30. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/daytona_sandbox.py +0 -0
  31. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/docker_sandbox.py +0 -0
  32. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/e2b_sandbox.py +0 -0
  33. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/eval_sandbox.py +0 -0
  34. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/exceptions.py +0 -0
  35. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/filesystem.py +0 -0
  36. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/google_colab.py +0 -0
  37. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/google_colab_sandbox.py +0 -0
  38. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/interfaces.py +0 -0
  39. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/jupyter_ingress.py +0 -0
  40. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/jupyter_server_sandbox.py +0 -0
  41. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle.py +0 -0
  42. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_execute.py +0 -0
  43. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_live.py +0 -0
  44. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/kaggle_sandbox.py +0 -0
  45. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/lifecycle.py +0 -0
  46. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/manage.py +0 -0
  47. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/modal_sandbox.py +0 -0
  48. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/models.py +0 -0
  49. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/monty_sandbox.py +0 -0
  50. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/provider_ingress.py +0 -0
  51. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/code_sandboxes/providers.py +0 -0
  52. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docker/Dockerfile +0 -0
  53. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/.gitignore +0 -0
  54. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/LICENSE +0 -0
  55. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/Makefile +0 -0
  56. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/README.md +0 -0
  57. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/babel.config.js +0 -0
  58. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/api-reference/_category_.yml +0 -0
  59. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/api-reference/index.mdx +0 -0
  60. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/cli/_category_.yml +0 -0
  61. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/cli/index.mdx +0 -0
  62. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/contribute/_category_.yml +0 -0
  63. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/contribute/index.mdx +0 -0
  64. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/examples/_category_.yml +0 -0
  65. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/examples/index.mdx +0 -0
  66. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/guide/_category_.yml +0 -0
  67. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/guide/index.mdx +0 -0
  68. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/index.mdx +0 -0
  69. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/install/_category_.yml +0 -0
  70. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/install/index.mdx +0 -0
  71. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/provider-ingress.mdx +0 -0
  72. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/_category_.yml +0 -0
  73. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/cloudflare.mdx +0 -0
  74. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/coreweave.mdx +0 -0
  75. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/datalayer.mdx +0 -0
  76. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/daytona.mdx +0 -0
  77. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/docker.mdx +0 -0
  78. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/e2b.mdx +0 -0
  79. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/eval.mdx +0 -0
  80. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/google-colab.mdx +0 -0
  81. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/index.mdx +0 -0
  82. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/jupyter-server.mdx +0 -0
  83. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/kaggle.mdx +0 -0
  84. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/modal.mdx +0 -0
  85. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docs/providers/monty.mdx +0 -0
  86. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/docusaurus.config.js +0 -0
  87. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/package.json +0 -0
  88. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/sidebars.js +0 -0
  89. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow1.js +0 -0
  90. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow1.module.css +0 -0
  91. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow2.js +0 -0
  92. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow2.module.css +0 -0
  93. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow3.js +0 -0
  94. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/components/HomepageRow3.module.css +0 -0
  95. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/css/custom.css +0 -0
  96. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/pages/index.module.css +0 -0
  97. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/pages/markdown-page.md +0 -0
  98. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/theme/CustomDocItem.tsx +0 -0
  99. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/src/theme/IconsTitle.tsx +0 -0
  100. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/bricks.svg +0 -0
  101. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/building-construction.svg +0 -0
  102. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/cloud-sun.svg +0 -0
  103. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/cloud.svg +0 -0
  104. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/collaboration.svg +0 -0
  105. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/copy-left.svg +0 -0
  106. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/logo.png +0 -0
  107. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/logo.svg +0 -0
  108. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/business.svg +0 -0
  109. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
  110. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/personas/devops.svg +0 -0
  111. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/datalayer/project/project-line.svg +0 -0
  112. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/favicon.ico +0 -0
  113. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/jupyter.svg +0 -0
  114. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/open-source.svg +0 -0
  115. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/react-js.svg +0 -0
  116. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/react-js2.svg +0 -0
  117. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/ringed-planet.svg +0 -0
  118. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/robot.svg +0 -0
  119. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/rocket.svg +0 -0
  120. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/shield.svg +0 -0
  121. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/sparkles.svg +0 -0
  122. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/streamlit.gif +0 -0
  123. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/super-hero.svg +0 -0
  124. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/target.svg +0 -0
  125. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/docs/static/img/thumbs-up.svg +0 -0
  126. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/README.md +0 -0
  127. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/Makefile +0 -0
  128. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/cloudflare_sandbox_example.py +0 -0
  129. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/coreweave_sandbox_example.py +0 -0
  130. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/datalayer_sandbox_example.py +0 -0
  131. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/daytona_sandbox_example.py +0 -0
  132. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/docker_sandbox_example.py +0 -0
  133. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/e2b_sandbox_example.py +0 -0
  134. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/eval_sandbox_example.py +0 -0
  135. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/google_colab_sandbox_example.py +0 -0
  136. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/jupyter_server_sandbox_example.py +0 -0
  137. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/kaggle_sandbox_example.py +0 -0
  138. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/modal_sandbox_example.py +0 -0
  139. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/exec/monty_sandbox_example.py +0 -0
  140. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/Makefile +0 -0
  141. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/cloudflare_sandbox_example.py +0 -0
  142. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/coreweave_sandbox_example.py +0 -0
  143. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/datalayer_sandbox_example.py +0 -0
  144. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/daytona_sandbox_example.py +0 -0
  145. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/docker_sandbox_example.py +0 -0
  146. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/e2b_sandbox_example.py +0 -0
  147. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/eval_sandbox_example.py +0 -0
  148. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/google_colab_sandbox_example.py +0 -0
  149. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/jupyter_server_sandbox_example.py +0 -0
  150. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/kaggle_sandbox_example.py +0 -0
  151. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/modal_sandbox_example.py +0 -0
  152. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/examples/repl/monty_sandbox_example.py +0 -0
  153. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/pyproject.toml +0 -0
  154. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/__init__.py +0 -0
  155. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/conftest.py +0 -0
  156. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_bridge_mount.py +0 -0
  157. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_builds.py +0 -0
  158. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cli_exec.py +0 -0
  159. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cli_repl.py +0 -0
  160. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client.py +0 -0
  161. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_contents.py +0 -0
  162. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_files.py +0 -0
  163. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_client_outcome_error_output.py +0 -0
  164. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_cloudflare.py +0 -0
  165. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_commands_envelope.py +0 -0
  166. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_console.py +0 -0
  167. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_contents_contract.py +0 -0
  168. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_contents_live_matrix.py +0 -0
  169. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_coreweave.py +0 -0
  170. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_datalayer_sandbox.py +0 -0
  171. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_daytona.py +0 -0
  172. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_e2b.py +0 -0
  173. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_eval.py +0 -0
  174. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_factory.py +0 -0
  175. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_google_colab.py +0 -0
  176. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_integration.py +0 -0
  177. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_ingress.py +0 -0
  178. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_server.py +0 -0
  179. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_jupyter_server_streaming.py +0 -0
  180. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle.py +0 -0
  181. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_execute.py +0 -0
  182. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_live.py +0 -0
  183. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kaggle_session.py +0 -0
  184. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_kernel_client_compatibility.py +0 -0
  185. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_lifecycle_vocabulary.py +0 -0
  186. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_manage.py +0 -0
  187. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_modal_google_colab_sandbox.py +0 -0
  188. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_modal_session.py +0 -0
  189. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_models.py +0 -0
  190. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_output_line_fidelity.py +0 -0
  191. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_provider_catalog_names.py +0 -0
  192. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_provider_ingress.py +0 -0
  193. {code_sandboxes-1.4.4 → code_sandboxes-1.4.5}/tests/test_providers.py +0 -0
  194. {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 —
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code_sandboxes
3
- Version: 1.4.4
3
+ Version: 1.4.5
4
4
  Project-URL: Home, https://github.com/datalayer/code-sandboxes
5
5
  Author-email: Datalayer <info@datalayer.io>
6
6
  License: BSD 3-Clause License
@@ -3,4 +3,4 @@
3
3
 
4
4
  """Code Sandboxes."""
5
5
 
6
- __version__ = "1.4.4"
6
+ __version__ = "1.4.5"
@@ -801,14 +801,23 @@ class DatalayerSandbox(Sandbox):
801
801
 
802
802
  started_at = time.time()
803
803
 
804
- # Set environment variables if provided
805
- if envs:
806
- env_code = "\n".join(f"import os; os.environ[{k!r}] = {v!r}" for k, v in envs.items())
807
- self._runtime.execute(env_code)
808
-
809
- # Execute the code
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] = []
@@ -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