isolate 0.12.8__tar.gz → 0.12.10__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.

Potentially problematic release.


This version of isolate might be problematic. Click here for more details.

Files changed (86) hide show
  1. isolate-0.12.10/.github/workflows/release.yml +50 -0
  2. isolate-0.12.10/.github/workflows/test.yml +68 -0
  3. isolate-0.12.10/.gitignore +125 -0
  4. isolate-0.12.10/.pre-commit-config.yaml +28 -0
  5. {isolate-0.12.8 → isolate-0.12.10}/PKG-INFO +46 -21
  6. {isolate-0.12.8 → isolate-0.12.10}/README.md +25 -0
  7. isolate-0.12.10/cliff.toml +53 -0
  8. isolate-0.12.10/pyproject.toml +67 -0
  9. isolate-0.12.10/setup.cfg +4 -0
  10. isolate-0.12.10/src/isolate/__init__.py +3 -0
  11. isolate-0.12.10/src/isolate/_isolate_version.py +16 -0
  12. isolate-0.12.10/src/isolate/_version.py +6 -0
  13. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/_base.py +4 -3
  14. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/common.py +7 -7
  15. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/conda.py +2 -3
  16. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/pyenv.py +8 -5
  17. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/remote.py +3 -2
  18. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/_base.py +13 -11
  19. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/agent.py +6 -3
  20. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/ipc/_base.py +6 -4
  21. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/ipc/agent.py +4 -1
  22. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/logs.py +0 -1
  23. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health/__init__.py +4 -1
  24. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/server.py +6 -5
  25. isolate-0.12.10/src/isolate.egg-info/PKG-INFO +86 -0
  26. isolate-0.12.10/src/isolate.egg-info/SOURCES.txt +82 -0
  27. isolate-0.12.10/src/isolate.egg-info/dependency_links.txt +1 -0
  28. isolate-0.12.10/src/isolate.egg-info/entry_points.txt +6 -0
  29. isolate-0.12.10/src/isolate.egg-info/requires.txt +21 -0
  30. isolate-0.12.10/src/isolate.egg-info/top_level.txt +1 -0
  31. isolate-0.12.10/tests/__init__.py +0 -0
  32. isolate-0.12.10/tests/conftest.py +25 -0
  33. isolate-0.12.10/tests/test_backends.py +856 -0
  34. isolate-0.12.10/tests/test_concurrency.py +64 -0
  35. isolate-0.12.10/tests/test_connections.py +211 -0
  36. isolate-0.12.10/tests/test_isolate.py +42 -0
  37. isolate-0.12.10/tests/test_log.py +35 -0
  38. isolate-0.12.10/tests/test_serialization.py +65 -0
  39. isolate-0.12.10/tests/test_server.py +659 -0
  40. isolate-0.12.10/tools/Dockerfile +53 -0
  41. isolate-0.12.10/tools/agent_requirements.txt +4 -0
  42. isolate-0.12.10/tools/protobuf-requirements.txt +8 -0
  43. isolate-0.12.10/tools/regen_grpc.py +83 -0
  44. isolate-0.12.10/tools/requirements.txt +6 -0
  45. isolate-0.12.10/tools/test_agent_requirements.txt +4 -0
  46. isolate-0.12.8/pyproject.toml +0 -44
  47. isolate-0.12.8/src/isolate/__init__.py +0 -1
  48. {isolate-0.12.8 → isolate-0.12.10}/LICENSE +0 -0
  49. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/__init__.py +0 -0
  50. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/local.py +0 -0
  51. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/settings.py +0 -0
  52. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/backends/virtualenv.py +0 -0
  53. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/common/__init__.py +0 -0
  54. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/common/timestamp.py +0 -0
  55. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/__init__.py +0 -0
  56. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/_local/__init__.py +0 -0
  57. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/_local/_base.py +0 -0
  58. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/_local/agent_startup.py +0 -0
  59. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/common.py +0 -0
  60. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/__init__.py +0 -0
  61. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/configuration.py +0 -0
  62. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/__init__.py +0 -0
  63. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/agent.proto +0 -0
  64. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/agent_pb2.py +0 -0
  65. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/agent_pb2.pyi +0 -0
  66. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/agent_pb2_grpc.py +0 -0
  67. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/common.proto +0 -0
  68. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/common_pb2.py +0 -0
  69. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/common_pb2.pyi +0 -0
  70. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/definitions/common_pb2_grpc.py +0 -0
  71. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/grpc/interface.py +0 -0
  72. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/connections/ipc/__init__.py +0 -0
  73. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/py.typed +0 -0
  74. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/registry.py +0 -0
  75. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/__init__.py +0 -0
  76. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/definitions/__init__.py +0 -0
  77. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/definitions/server.proto +0 -0
  78. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/definitions/server_pb2.py +0 -0
  79. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/definitions/server_pb2.pyi +0 -0
  80. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/definitions/server_pb2_grpc.py +0 -0
  81. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health/health.proto +0 -0
  82. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health/health_pb2.py +0 -0
  83. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health/health_pb2.pyi +0 -0
  84. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health/health_pb2_grpc.py +0 -0
  85. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/health_server.py +0 -0
  86. {isolate-0.12.8 → isolate-0.12.10}/src/isolate/server/interface.py +0 -0
@@ -0,0 +1,50 @@
1
+ name: PyPI release
2
+
3
+ on:
4
+ release:
5
+ types:
6
+ - published
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ with:
14
+ fetch-depth: 0
15
+
16
+ - uses: actions/setup-python@v2
17
+ with:
18
+ python-version: "3.9"
19
+
20
+ - name: Install deps
21
+ run: python -m pip install --upgrade pip setuptools_scm build
22
+
23
+ - name: Build
24
+ run: python -m build
25
+
26
+ - name: Upload dist
27
+ uses: actions/upload-artifact@v4
28
+ with:
29
+ name: dist
30
+ path: dist
31
+
32
+ pypi-publish:
33
+ name: Upload release to PyPI
34
+ runs-on: ubuntu-latest
35
+ needs: build
36
+ environment:
37
+ name: pypi
38
+ url: https://pypi.org/p/isolate
39
+ permissions:
40
+ id-token: write
41
+ steps:
42
+ - name: Download dist
43
+ uses: actions/download-artifact@v4
44
+ with:
45
+ name: dist
46
+ path: dist
47
+
48
+ - name: Publish package distributions to PyPI
49
+ uses: pypa/gh-action-pypi-publish@release/v1
50
+
@@ -0,0 +1,68 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ schedule:
10
+ - cron: '30 5 * * *' # every day at 5:30 UTC
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ${{ matrix.os }}
19
+ strategy:
20
+ fail-fast: true
21
+
22
+ matrix:
23
+ os: [ubuntu-latest]
24
+ python: ["3.8", "3.9", "3.10", "3.11"]
25
+ include:
26
+ - os: macos-latest
27
+ python: "3.8"
28
+ - os: macos-latest
29
+ python: "3.11"
30
+ steps:
31
+ - uses: actions/checkout@v3
32
+
33
+ - uses: actions/setup-python@v3
34
+ with:
35
+ python-version: ${{ matrix.python }}
36
+
37
+ - name: Install mamba
38
+ uses: mamba-org/setup-micromamba@v1
39
+ with:
40
+ environment-name: ci
41
+ create-args: >-
42
+ python=${{ matrix.python }}
43
+ condarc: |
44
+ channels:
45
+ - anaconda
46
+ - conda-forge
47
+ - pytorch
48
+
49
+ - uses: actions/checkout@v3
50
+ with:
51
+ repository: pyenv/pyenv
52
+ ref: v2.3.6
53
+ path: pyenv
54
+
55
+ - name: Install dependencies
56
+ run: |
57
+ python -m pip install -e ".[test]"
58
+
59
+ - name: Install uv
60
+ run: |
61
+ python -m pip install uv
62
+
63
+ - uses: pre-commit/action@v3.0.1
64
+
65
+ - name: Test
66
+ run: |
67
+ export ISOLATE_PYENV_EXECUTABLE=pyenv/bin/pyenv
68
+ python -m pytest -vvv
@@ -0,0 +1,125 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+
53
+ # Translations
54
+ *.mo
55
+ *.pot
56
+
57
+ # Django stuff:
58
+ *.log
59
+ local_settings.py
60
+ db.sqlite3
61
+ db.sqlite3-journal
62
+
63
+ # Flask stuff:
64
+ instance/
65
+ .webassets-cache
66
+
67
+ # Scrapy stuff:
68
+ .scrapy
69
+
70
+ # Sphinx documentation
71
+ docs/_build/
72
+
73
+ # PyBuilder
74
+ target/
75
+
76
+ # Jupyter Notebook
77
+ .ipynb_checkpoints
78
+
79
+ # IPython
80
+ profile_default/
81
+ ipython_config.py
82
+
83
+ # pyenv
84
+ .python-version
85
+
86
+ # anti lolenv
87
+ Pipfile*
88
+
89
+ # celery beat schedule file
90
+ celerybeat-schedule
91
+
92
+ # SageMath parsed files
93
+ *.sage.py
94
+
95
+ # Environments
96
+ .env
97
+ .venv
98
+ env/
99
+ venv/
100
+ ENV/
101
+ env.bak/
102
+ venv.bak/
103
+
104
+ # Spyder project settings
105
+ .spyderproject
106
+ .spyproject
107
+
108
+ # Rope project settings
109
+ .ropeproject
110
+
111
+ # mkdocs documentation
112
+ /site
113
+
114
+ # mypy
115
+ .mypy_cache/
116
+ .dmypy.json
117
+ dmypy.json
118
+
119
+ # Pyre type checker
120
+ .pyre/
121
+
122
+ # vim
123
+ *.swp
124
+
125
+ /src/isolate/_isolate_version.py
@@ -0,0 +1,28 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: 'v0.3.4'
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix, --exit-non-zero-on-fix]
7
+ exclude: ".*(_pb2.py|_pb2.pyi|_pb2_grpc.py)$"
8
+ - id: ruff-format
9
+ exclude: ".*(_pb2.py|_pb2.pyi|_pb2_grpc.py)$"
10
+ - repo: https://github.com/asottile/setup-cfg-fmt
11
+ rev: v1.20.1
12
+ hooks:
13
+ - id: setup-cfg-fmt
14
+ - repo: https://github.com/pre-commit/mirrors-mypy
15
+ rev: v1.2.0
16
+ hooks:
17
+ - id: mypy
18
+ args:
19
+ - --disallow-incomplete-defs
20
+ - --ignore-missing-imports
21
+ - --no-warn-no-return
22
+ exclude: ".*(_pb2.py|_pb2.pyi|_pb2_grpc.py)$"
23
+ additional_dependencies: [types-protobuf]
24
+ - repo: https://github.com/codespell-project/codespell
25
+ rev: v2.1.0
26
+ hooks:
27
+ - id: codespell
28
+ exclude: ".*(_pb2.py|_pb2.pyi|_pb2_grpc.py)$"
@@ -1,28 +1,29 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isolate
3
- Version: 0.12.8
3
+ Version: 0.12.10
4
4
  Summary: Managed isolated environments for Python
5
- Home-page: https://github.com/fal-ai/isolate
6
- Author: Features & Labels
7
- Author-email: hello@fal.ai
8
- Requires-Python: >=3.8,<4.0
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.8
11
- Classifier: Programming Language :: Python :: 3.9
12
- Classifier: Programming Language :: Python :: 3.10
13
- Classifier: Programming Language :: Python :: 3.11
14
- Provides-Extra: build
15
- Provides-Extra: grpc
16
- Provides-Extra: server
17
- Requires-Dist: PyYAML (>=6.0) ; extra == "build"
18
- Requires-Dist: grpcio (>=1.49)
19
- Requires-Dist: importlib-metadata (>=4.4) ; python_version < "3.10"
20
- Requires-Dist: platformdirs
21
- Requires-Dist: protobuf
22
- Requires-Dist: tblib (>=1.7.0)
23
- Requires-Dist: virtualenv (>=20.4) ; extra == "build"
24
- Project-URL: Repository, https://github.com/fal-ai/isolate
5
+ Author-email: Features & Labels <hello@fal.ai>
6
+ Project-URL: Issues, https://github.com/fal-ai/isolate/issues
7
+ Project-URL: Source, https://github.com/fal-ai/isolate
8
+ Requires-Python: >=3.8
25
9
  Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: grpcio>=1.49
12
+ Requires-Dist: protobuf
13
+ Requires-Dist: tblib>=1.7.0
14
+ Requires-Dist: platformdirs
15
+ Requires-Dist: importlib-metadata>=4.4; python_version < "3.10"
16
+ Provides-Extra: build
17
+ Requires-Dist: virtualenv>=20.4; extra == "build"
18
+ Requires-Dist: PyYAML>=6.0; extra == "build"
19
+ Provides-Extra: test
20
+ Requires-Dist: isolate[build]; extra == "test"
21
+ Requires-Dist: pytest; extra == "test"
22
+ Requires-Dist: cloudpickle>=2.2.0; extra == "test"
23
+ Requires-Dist: dill>=0.3.5.1; extra == "test"
24
+ Requires-Dist: pytest-rerunfailures; extra == "test"
25
+ Provides-Extra: dev
26
+ Requires-Dist: isolate[test]; extra == "dev"
26
27
 
27
28
  # Isolate
28
29
 
@@ -59,3 +60,27 @@ different) and can change it without any loss. Isolate is working towards a futu
59
60
  transititon is as seamless as the transition from your local environment to the remote
60
61
  environment.
61
62
 
63
+ ## Contributing
64
+
65
+ ### Installing in editable mode with dev dependencies
66
+
67
+ ```
68
+ pip install -e '.[dev]'
69
+ ```
70
+
71
+ ### Running tests
72
+
73
+ ```
74
+ pytest
75
+ ```
76
+
77
+ ### Pre-commit
78
+
79
+ ```
80
+ pre-commit install
81
+ ```
82
+
83
+ ### Commit format
84
+
85
+ Please follow [conventional commits specification](https://www.conventionalcommits.org/) for descriptions/messages.
86
+
@@ -32,3 +32,28 @@ this problem lacked a universal interface which one can simply define a set of r
32
32
  different) and can change it without any loss. Isolate is working towards a future where this
33
33
  transititon is as seamless as the transition from your local environment to the remote
34
34
  environment.
35
+
36
+ ## Contributing
37
+
38
+ ### Installing in editable mode with dev dependencies
39
+
40
+ ```
41
+ pip install -e '.[dev]'
42
+ ```
43
+
44
+ ### Running tests
45
+
46
+ ```
47
+ pytest
48
+ ```
49
+
50
+ ### Pre-commit
51
+
52
+ ```
53
+ pre-commit install
54
+ ```
55
+
56
+ ### Commit format
57
+
58
+ Please follow [conventional commits specification](https://www.conventionalcommits.org/) for descriptions/messages.
59
+
@@ -0,0 +1,53 @@
1
+ # configuration file for git-cliff (0.1.0)
2
+
3
+ [changelog]
4
+ body = """
5
+ {% if version %}\
6
+ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
7
+ {% else %}\
8
+ ## [new changes]
9
+ {% endif %}\
10
+ {% for group, commits in commits | group_by(attribute="group") %}
11
+ ### {{ group | upper_first }}
12
+ {% for commit in commits %}
13
+ - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
14
+ {% endfor %}
15
+ {% endfor %}\n
16
+ """
17
+ # remove the leading and trailing whitespace from the template
18
+ trim = true
19
+
20
+ [git]
21
+ # parse the commits based on https://www.conventionalcommits.org
22
+ conventional_commits = true
23
+ # filter out the commits that are not conventional
24
+ filter_unconventional = true
25
+ # regex for preprocessing the commit messages
26
+ commit_preprocessors = [
27
+ { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/fal-ai/isolate/pull/${2}))"},
28
+ ]
29
+ # regex for parsing and grouping commits
30
+ commit_parsers = [
31
+ { message = "^feat", group = "Features"},
32
+ { message = "^fix", group = "Bug Fixes"},
33
+ { message = "^doc", group = "Documentation"},
34
+ { message = "^perf", group = "Performance"},
35
+ { message = "^refactor", group = "Refactor"},
36
+ { message = "^style", group = "Styling"},
37
+ { message = "^test", group = "Testing"},
38
+ { message = "^chore\\(release\\): prepare for", skip = true},
39
+ { message = "^chore", group = "Miscellaneous Tasks"},
40
+ { body = ".*security", group = "Security"},
41
+ ]
42
+ # filter out the commits that are not matched by commit parsers
43
+ filter_commits = true
44
+ # glob pattern for matching git tags
45
+ tag_pattern = "v[0-9]*"
46
+ # regex for skipping tags
47
+ skip_tags = "v0.1.0-beta.1"
48
+ # regex for ignoring tags
49
+ ignore_tags = ""
50
+ # sort the tags chronologically
51
+ date_order = false
52
+ # sort the commits inside sections by oldest/newest order
53
+ sort_commits = "oldest"
@@ -0,0 +1,67 @@
1
+ [build-system]
2
+ requires = ["setuptools", "wheel", "setuptools_scm[toml]>=7"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [tool.setuptools_scm]
6
+ version_file = "src/isolate/_isolate_version.py"
7
+
8
+ [tool.setuptools.packages.find]
9
+ where = ["src"]
10
+ include = ["isolate"]
11
+ namespaces = false
12
+
13
+ [project]
14
+ name = "isolate"
15
+ dynamic = ["version"]
16
+ readme = "README.md"
17
+ description = "Managed isolated environments for Python"
18
+ authors = [{ name = "Features & Labels", email = "hello@fal.ai"}]
19
+ requires-python = ">=3.8"
20
+ dependencies = [
21
+ "grpcio>=1.49",
22
+ "protobuf",
23
+ # These are non-intrusive packages with no transitive dependencies.
24
+ # They are also used in the agents themselves.
25
+ "tblib>=1.7.0",
26
+ "platformdirs",
27
+ # For 3.10 and later, importlib-metadata's newer versions are included in the
28
+ # standard library.
29
+ 'importlib-metadata>=4.4; python_version < "3.10"',
30
+ ]
31
+
32
+ [project.urls]
33
+ Issues = "https://github.com/fal-ai/isolate/issues"
34
+ Source = "https://github.com/fal-ai/isolate"
35
+
36
+ [project.optional-dependencies]
37
+ build = [
38
+ # The following are build-related dependencies, and their usage sites are heavily
39
+ # guarded with optional_import() calls.
40
+ "virtualenv>=20.4",
41
+ "PyYAML>=6.0",
42
+ ]
43
+ test = [
44
+ "isolate[build]",
45
+ "pytest",
46
+ "cloudpickle>=2.2.0",
47
+ "dill>=0.3.5.1",
48
+ "pytest-rerunfailures",
49
+ ]
50
+ dev = [
51
+ "isolate[test]",
52
+ ]
53
+
54
+
55
+ [project.entry-points."isolate.backends"]
56
+ "virtualenv" = "isolate.backends.virtualenv:VirtualPythonEnvironment"
57
+ "conda" = "isolate.backends.conda:CondaEnvironment"
58
+ "local" = "isolate.backends.local:LocalPythonEnvironment"
59
+ "isolate-server" = "isolate.backends.remote:IsolateServer"
60
+ "pyenv" = "isolate.backends.pyenv:PyenvEnvironment"
61
+
62
+ [tool.ruff]
63
+ target-version = "py38"
64
+ exclude = ["*_pb2.py", "*_pb2.pyi", "*_pb2_grpc.py"]
65
+
66
+ [tool.ruff.lint]
67
+ select = ["E", "F", "W", "PLC", "PLE", "PLW", "I", "UP"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ from isolate.registry import prepare_environment # noqa: F401
2
+
3
+ from ._version import __version__, version_tuple # noqa: F401
@@ -0,0 +1,16 @@
1
+ # file generated by setuptools_scm
2
+ # don't change, don't track in version control
3
+ TYPE_CHECKING = False
4
+ if TYPE_CHECKING:
5
+ from typing import Tuple, Union
6
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
7
+ else:
8
+ VERSION_TUPLE = object
9
+
10
+ version: str
11
+ __version__: str
12
+ __version_tuple__: VERSION_TUPLE
13
+ version_tuple: VERSION_TUPLE
14
+
15
+ __version__ = version = '0.12.10'
16
+ __version_tuple__ = version_tuple = (0, 12, 10)
@@ -0,0 +1,6 @@
1
+ try:
2
+ from ._isolate_version import version as __version__ # type: ignore[import]
3
+ from ._isolate_version import version_tuple # type: ignore[import]
4
+ except ImportError:
5
+ __version__ = "UNKNOWN"
6
+ version_tuple = (0, 0, __version__) # type: ignore[assignment]
@@ -73,13 +73,14 @@ class BaseEnvironment(Generic[ConnectionKeyType]):
73
73
  def open_connection(
74
74
  self, connection_key: ConnectionKeyType
75
75
  ) -> EnvironmentConnection:
76
- """Return a new connection to the environment with using the `connection_key`."""
76
+ """Return a new connection to the environment with using the
77
+ `connection_key`."""
77
78
  raise NotImplementedError
78
79
 
79
80
  @contextmanager
80
81
  def connect(self) -> Iterator[EnvironmentConnection]:
81
- """Create the given environment (if it already doesn't exist) and establish a connection
82
- to it."""
82
+ """Create the given environment (if it already doesn't exist) and establish a
83
+ connection to it."""
83
84
  connection_key = self.create()
84
85
  with self.open_connection(connection_key) as connection:
85
86
  yield connection
@@ -246,10 +246,10 @@ def get_executable(command: str, home: str | None = None) -> Path:
246
246
  binary_path = shutil.which(command, path=path)
247
247
  if binary_path is not None:
248
248
  return Path(binary_path)
249
- else:
250
- # TODO: we should probably show some instructions on how you
251
- # can install conda here.
252
- raise FileNotFoundError(
253
- f"Could not find the {command} executable. If the {command} executable is not available by default, please point isolate "
254
- f" to the path where the {command} binary is available '{home}'."
255
- )
249
+ # TODO: we should probably show some instructions on how you
250
+ # can install conda here.
251
+ raise FileNotFoundError(
252
+ f"Could not find the {command} executable. "
253
+ f"If the {command} executable is not available by default, please point "
254
+ f"isolate to the path where the {command} binary is available '{home}'."
255
+ )
@@ -161,7 +161,7 @@ class CondaEnvironment(BaseEnvironment[Path]):
161
161
  def _run_create(self, env_path: str, env_name: str) -> None:
162
162
  if self._exec_command == "conda":
163
163
  self._run_conda(
164
- "env", "create", "--force", "--prefix", env_path, "-f", env_name
164
+ "env", "create", "--yes", "--prefix", env_path, "-f", env_name
165
165
  )
166
166
  else:
167
167
  self._run_conda("env", "create", "--prefix", env_path, "-f", env_name)
@@ -212,5 +212,4 @@ def _depends_on(
212
212
  continue
213
213
 
214
214
  return True
215
- else:
216
- return False
215
+ return False
@@ -43,8 +43,9 @@ class PyenvEnvironment(BaseEnvironment[Path]):
43
43
  pyenv = _get_pyenv_executable()
44
44
  env_path = self.settings.cache_dir_for(self)
45
45
  with self.settings.cache_lock_for(env_path):
46
- # PyEnv installs* the Python versions under $root/versions/$version, where we
47
- # use versions/$version as the key and $root as the base directory (for pyenv).
46
+ # PyEnv installs* the Python versions under $root/versions/$version, where
47
+ # we use versions/$version as the key and $root as the base directory
48
+ # (for pyenv).
48
49
  #
49
50
  # [0]: https://github.com/pyenv/pyenv#locating-pyenv-provided-python-installations
50
51
  pyenv_root = env_path.parent.parent
@@ -126,15 +127,17 @@ def _get_pyenv_executable() -> Path:
126
127
  if _PYENV_EXECUTABLE_PATH:
127
128
  if not os.path.exists(_PYENV_EXECUTABLE_PATH):
128
129
  raise EnvironmentCreationError(
129
- f"Path to pyenv executable not found! ISOLATE_PYENV_EXECUTABLE variable: {_PYENV_EXECUTABLE_PATH!r}"
130
+ "Path to pyenv executable not found! ISOLATE_PYENV_EXECUTABLE "
131
+ f"variable: {_PYENV_EXECUTABLE_PATH!r}"
130
132
  )
131
133
  return Path(_PYENV_EXECUTABLE_PATH)
132
134
 
133
135
  pyenv_path = shutil.which(_PYENV_EXECUTABLE_NAME)
134
136
  if pyenv_path is None:
135
137
  raise FileNotFoundError(
136
- "Could not find the pyenv executable. If pyenv is not already installed in your system, please"
137
- "install it first. If it is not in your PATH, then point ISOLATE_PYENV_COMMAND to the absolute path of the"
138
+ "Could not find the pyenv executable. If pyenv is not already installed "
139
+ "in your system, please install it first. If it is not in your PATH, "
140
+ "then point ISOLATE_PYENV_COMMAND to the absolute path of the "
138
141
  "pyenv executable."
139
142
  )
140
143
  return Path(pyenv_path)
@@ -51,8 +51,9 @@ class IsolateServer(BaseEnvironment[List[EnvironmentDefinition]]):
51
51
  def create(self, *, force: bool = False) -> list[EnvironmentDefinition]:
52
52
  if force is True:
53
53
  raise NotImplementedError(
54
- "Only individual environments can be forcibly created, please set them up"
55
- " manually by using the 'force_create' flag on the environment definition."
54
+ "Only individual environments can be forcibly created, please set "
55
+ "them up manually by using the 'force_create' flag on the "
56
+ "environment definition."
56
57
  )
57
58
 
58
59
  envs = []