isolate 0.12.9__py3-none-any.whl → 0.12.11__py3-none-any.whl
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.
- isolate/__init__.py +2 -0
- isolate/_isolate_version.py +16 -0
- isolate/_version.py +6 -0
- isolate/backends/_base.py +6 -4
- isolate/backends/common.py +7 -7
- isolate/backends/conda.py +1 -2
- isolate/backends/pyenv.py +8 -5
- isolate/backends/remote.py +3 -2
- isolate/connections/common.py +3 -1
- isolate/connections/grpc/_base.py +15 -12
- isolate/connections/grpc/agent.py +8 -4
- isolate/connections/ipc/_base.py +6 -4
- isolate/connections/ipc/agent.py +4 -1
- isolate/exceptions.py +2 -0
- isolate/logs.py +0 -1
- isolate/server/health/__init__.py +4 -1
- isolate/server/server.py +6 -5
- {isolate-0.12.9.dist-info → isolate-0.12.11.dist-info}/METADATA +46 -21
- {isolate-0.12.9.dist-info → isolate-0.12.11.dist-info}/RECORD +28 -24
- {isolate-0.12.9.dist-info → isolate-0.12.11.dist-info}/WHEEL +2 -1
- isolate-0.12.11.dist-info/entry_points.txt +6 -0
- isolate-0.12.11.dist-info/top_level.txt +1 -0
- isolate-0.12.9.dist-info/entry_points.txt +0 -7
- {isolate-0.12.9.dist-info → isolate-0.12.11.dist-info}/LICENSE +0 -0
isolate/__init__.py
CHANGED
|
@@ -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.11'
|
|
16
|
+
__version_tuple__ = version_tuple = (0, 12, 11)
|
isolate/_version.py
ADDED
isolate/backends/_base.py
CHANGED
|
@@ -12,6 +12,7 @@ from typing import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
from isolate.backends.settings import DEFAULT_SETTINGS, IsolateSettings
|
|
15
|
+
from isolate.exceptions import IsolateException
|
|
15
16
|
from isolate.logs import Log, LogLevel, LogSource
|
|
16
17
|
|
|
17
18
|
__all__ = [
|
|
@@ -27,7 +28,7 @@ CallResultType = TypeVar("CallResultType")
|
|
|
27
28
|
BasicCallable = Callable[[], CallResultType]
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
class EnvironmentCreationError(
|
|
31
|
+
class EnvironmentCreationError(IsolateException):
|
|
31
32
|
"""Raised when the environment cannot be created."""
|
|
32
33
|
|
|
33
34
|
|
|
@@ -73,13 +74,14 @@ class BaseEnvironment(Generic[ConnectionKeyType]):
|
|
|
73
74
|
def open_connection(
|
|
74
75
|
self, connection_key: ConnectionKeyType
|
|
75
76
|
) -> EnvironmentConnection:
|
|
76
|
-
"""Return a new connection to the environment with using the
|
|
77
|
+
"""Return a new connection to the environment with using the
|
|
78
|
+
`connection_key`."""
|
|
77
79
|
raise NotImplementedError
|
|
78
80
|
|
|
79
81
|
@contextmanager
|
|
80
82
|
def connect(self) -> Iterator[EnvironmentConnection]:
|
|
81
|
-
"""Create the given environment (if it already doesn't exist) and establish a
|
|
82
|
-
to it."""
|
|
83
|
+
"""Create the given environment (if it already doesn't exist) and establish a
|
|
84
|
+
connection to it."""
|
|
83
85
|
connection_key = self.create()
|
|
84
86
|
with self.open_connection(connection_key) as connection:
|
|
85
87
|
yield connection
|
isolate/backends/common.py
CHANGED
|
@@ -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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
+
)
|
isolate/backends/conda.py
CHANGED
isolate/backends/pyenv.py
CHANGED
|
@@ -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
|
|
47
|
-
# use versions/$version as the key and $root as the base directory
|
|
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
|
-
|
|
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
|
|
137
|
-
"install it first. If it is not in your PATH,
|
|
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)
|
isolate/backends/remote.py
CHANGED
|
@@ -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
|
|
55
|
-
" manually by using the 'force_create' flag on the
|
|
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 = []
|
isolate/connections/common.py
CHANGED
|
@@ -8,6 +8,8 @@ from typing import TYPE_CHECKING, Any, Iterator, cast
|
|
|
8
8
|
|
|
9
9
|
from tblib import Traceback, TracebackParseError
|
|
10
10
|
|
|
11
|
+
from isolate.exceptions import IsolateException
|
|
12
|
+
|
|
11
13
|
if TYPE_CHECKING:
|
|
12
14
|
from typing import Protocol
|
|
13
15
|
|
|
@@ -21,7 +23,7 @@ AGENT_SIGNATURE = "IS_ISOLATE_AGENT"
|
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
@dataclass
|
|
24
|
-
class SerializationError(
|
|
26
|
+
class SerializationError(IsolateException):
|
|
25
27
|
"""An error that happened during the serialization process."""
|
|
26
28
|
|
|
27
29
|
message: str
|
|
@@ -16,10 +16,11 @@ from isolate.connections.common import serialize_object
|
|
|
16
16
|
from isolate.connections.grpc import agent, definitions
|
|
17
17
|
from isolate.connections.grpc.configuration import get_default_options
|
|
18
18
|
from isolate.connections.grpc.interface import from_grpc
|
|
19
|
+
from isolate.exceptions import IsolateException
|
|
19
20
|
from isolate.logs import LogLevel, LogSource
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
class AgentError(
|
|
23
|
+
class AgentError(IsolateException):
|
|
23
24
|
"""An internal problem caused by (most probably) the agent."""
|
|
24
25
|
|
|
25
26
|
|
|
@@ -49,8 +50,8 @@ class GRPCExecutionBase(EnvironmentConnection):
|
|
|
49
50
|
channel_status.result(timeout=max_wait_timeout)
|
|
50
51
|
except grpc.FutureTimeoutError:
|
|
51
52
|
raise AgentError(
|
|
52
|
-
|
|
53
|
-
"in time."
|
|
53
|
+
"Couldn't connect to the gRPC server in the agent "
|
|
54
|
+
f"(listening at {address}) in time."
|
|
54
55
|
)
|
|
55
56
|
stub = definitions.AgentStub(channel)
|
|
56
57
|
stub._channel = channel # type: ignore
|
|
@@ -69,15 +70,16 @@ class GRPCExecutionBase(EnvironmentConnection):
|
|
|
69
70
|
# ---------
|
|
70
71
|
# 1. [controller]: Spawn the agent.
|
|
71
72
|
# 2. [agent]: Start listening at the given address.
|
|
72
|
-
# 3. [controller]: Await *at most* max_wait_timeout seconds for the agent to
|
|
73
|
-
# if it doesn't do it until then,
|
|
74
|
-
#
|
|
75
|
-
#
|
|
73
|
+
# 3. [controller]: Await *at most* max_wait_timeout seconds for the agent to
|
|
74
|
+
# be available if it doesn't do it until then,
|
|
75
|
+
# raise an AgentError.
|
|
76
|
+
# 4. [controller]: If the server is available, then establish the bridge and
|
|
77
|
+
# pass the 'function' as the input.
|
|
76
78
|
# 5. [agent]: Receive the function, deserialize it, start the execution.
|
|
77
|
-
# 6. [controller]: Watch agent for logs (stdout/stderr), and as soon as they
|
|
78
|
-
# call the log handler.
|
|
79
|
-
# 7. [agent]: Once the execution of the function is finished, send the
|
|
80
|
-
# using the same serialization method.
|
|
79
|
+
# 6. [controller]: Watch agent for logs (stdout/stderr), and as soon as they
|
|
80
|
+
# appear call the log handler.
|
|
81
|
+
# 7. [agent]: Once the execution of the function is finished, send the
|
|
82
|
+
# result using the same serialization method.
|
|
81
83
|
# 8. [controller]: Receive the result back and return it.
|
|
82
84
|
|
|
83
85
|
method = self.environment.settings.serialization_method
|
|
@@ -106,7 +108,8 @@ class GRPCExecutionBase(EnvironmentConnection):
|
|
|
106
108
|
return cast(CallResultType, from_grpc(partial_result.result))
|
|
107
109
|
|
|
108
110
|
raise AgentError(
|
|
109
|
-
"No result object was received from the agent
|
|
111
|
+
"No result object was received from the agent "
|
|
112
|
+
"(it never set is_complete to True)."
|
|
110
113
|
)
|
|
111
114
|
|
|
112
115
|
|
|
@@ -22,11 +22,12 @@ from isolate.connections.common import SerializationError, serialize_object
|
|
|
22
22
|
from isolate.connections.grpc import definitions
|
|
23
23
|
from isolate.connections.grpc.configuration import get_default_options
|
|
24
24
|
from isolate.connections.grpc.interface import from_grpc, to_grpc
|
|
25
|
+
from isolate.exceptions import IsolateException
|
|
25
26
|
from isolate.logs import Log, LogLevel, LogSource
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
@dataclass
|
|
29
|
-
class AbortException(
|
|
30
|
+
class AbortException(IsolateException):
|
|
30
31
|
message: str
|
|
31
32
|
|
|
32
33
|
|
|
@@ -101,7 +102,8 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
101
102
|
) -> Generator[definitions.PartialRunResult, None, Any]:
|
|
102
103
|
if function.was_it_raised:
|
|
103
104
|
raise AbortException(
|
|
104
|
-
f"The {function_kind} function must be callable,
|
|
105
|
+
f"The {function_kind} function must be callable, "
|
|
106
|
+
"not a raised exception."
|
|
105
107
|
)
|
|
106
108
|
|
|
107
109
|
try:
|
|
@@ -113,7 +115,8 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
113
115
|
|
|
114
116
|
if not callable(function):
|
|
115
117
|
raise AbortException(
|
|
116
|
-
f"The {function_kind} function must be callable,
|
|
118
|
+
f"The {function_kind} function must be callable, "
|
|
119
|
+
f"not {type(function).__name__}."
|
|
117
120
|
)
|
|
118
121
|
|
|
119
122
|
yield from self.log(f"Starting the execution of the {function_kind} function.")
|
|
@@ -146,7 +149,8 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
146
149
|
stringized_tb, source=LogSource.USER, level=LogLevel.STDERR
|
|
147
150
|
)
|
|
148
151
|
raise AbortException(
|
|
149
|
-
|
|
152
|
+
"Error while serializing the execution result "
|
|
153
|
+
f"(object of type {type(result)})."
|
|
150
154
|
)
|
|
151
155
|
except BaseException:
|
|
152
156
|
yield from self.log(traceback.format_exc(), level=LogLevel.ERROR)
|
isolate/connections/ipc/_base.py
CHANGED
|
@@ -111,10 +111,12 @@ class IsolatedProcessConnection(EnvironmentConnection):
|
|
|
111
111
|
# 4. [controller]: Accept the incoming connection request
|
|
112
112
|
# 5. [controller]: Send the executable over the established bridge
|
|
113
113
|
# 6. [agent]: Receive the executable from the bridge
|
|
114
|
-
# 7. [agent]: Execute the executable and once done send the result
|
|
115
|
-
#
|
|
116
|
-
#
|
|
117
|
-
#
|
|
114
|
+
# 7. [agent]: Execute the executable and once done send the result
|
|
115
|
+
# back
|
|
116
|
+
# 8. [controller]: Loop until either the isolated process exits or sends
|
|
117
|
+
# any data (will be interpreted as a tuple of two
|
|
118
|
+
# mutually exclusive objects, either a result object or
|
|
119
|
+
# an exception to be raised).
|
|
118
120
|
#
|
|
119
121
|
|
|
120
122
|
self.log("Starting the controller bridge.")
|
isolate/connections/ipc/agent.py
CHANGED
|
@@ -161,7 +161,10 @@ def main() -> int:
|
|
|
161
161
|
assert not options.with_pdb, "--with-pdb can't be used in the debug mode"
|
|
162
162
|
message = "=" * 60
|
|
163
163
|
message += "\n" * 3
|
|
164
|
-
message +=
|
|
164
|
+
message += (
|
|
165
|
+
"Debug mode successfully activated. "
|
|
166
|
+
"You can start your debugging session with the following command:\n"
|
|
167
|
+
)
|
|
165
168
|
message += (
|
|
166
169
|
f" $ {_get_shell_bootstrap()}\\\n "
|
|
167
170
|
f"{sys.executable} {os.path.abspath(__file__)} "
|
isolate/exceptions.py
ADDED
isolate/logs.py
CHANGED
|
@@ -2,7 +2,10 @@ from isolate.server.health.health_pb2 import ( # noqa: F401
|
|
|
2
2
|
HealthCheckRequest,
|
|
3
3
|
HealthCheckResponse,
|
|
4
4
|
)
|
|
5
|
-
from isolate.server.health.health_pb2_grpc import
|
|
5
|
+
from isolate.server.health.health_pb2_grpc import ( # noqa: F401
|
|
6
|
+
HealthServicer,
|
|
7
|
+
HealthStub,
|
|
8
|
+
)
|
|
6
9
|
from isolate.server.health.health_pb2_grpc import ( # noqa: F401
|
|
7
10
|
add_HealthServicer_to_server as register_health,
|
|
8
11
|
)
|
isolate/server/server.py
CHANGED
|
@@ -31,14 +31,14 @@ from isolate.server import definitions, health
|
|
|
31
31
|
from isolate.server.health_server import HealthServicer
|
|
32
32
|
from isolate.server.interface import from_grpc, to_grpc
|
|
33
33
|
|
|
34
|
-
EMPTY_MESSAGE_INTERVAL = float(os.getenv("ISOLATE_EMPTY_MESSAGE_INTERVAL", 600))
|
|
35
|
-
MAX_GRPC_WAIT_TIMEOUT = float(os.getenv("ISOLATE_MAX_GRPC_WAIT_TIMEOUT", 10.0))
|
|
34
|
+
EMPTY_MESSAGE_INTERVAL = float(os.getenv("ISOLATE_EMPTY_MESSAGE_INTERVAL", "600"))
|
|
35
|
+
MAX_GRPC_WAIT_TIMEOUT = float(os.getenv("ISOLATE_MAX_GRPC_WAIT_TIMEOUT", "10.0"))
|
|
36
36
|
|
|
37
37
|
# Whether to inherit all the packages from the current environment or not.
|
|
38
38
|
INHERIT_FROM_LOCAL = os.getenv("ISOLATE_INHERIT_FROM_LOCAL") == "1"
|
|
39
39
|
|
|
40
40
|
# Number of threads that the gRPC server will use.
|
|
41
|
-
MAX_THREADS = int(os.getenv("MAX_THREADS", 5))
|
|
41
|
+
MAX_THREADS = int(os.getenv("MAX_THREADS", "5"))
|
|
42
42
|
_AGENT_REQUIREMENTS_TXT = os.getenv("AGENT_REQUIREMENTS_TXT")
|
|
43
43
|
|
|
44
44
|
if _AGENT_REQUIREMENTS_TXT is not None:
|
|
@@ -296,8 +296,9 @@ class IsolateServicer(definitions.IsolateServicer):
|
|
|
296
296
|
def watch_queue_until_completed(
|
|
297
297
|
self, queue: Queue, is_completed: Callable[[], bool]
|
|
298
298
|
) -> Iterator[definitions.PartialRunResult]:
|
|
299
|
-
"""Watch the given queue until the is_completed function returns True.
|
|
300
|
-
if the function is completed, this function might not
|
|
299
|
+
"""Watch the given queue until the is_completed function returns True.
|
|
300
|
+
Note that even if the function is completed, this function might not
|
|
301
|
+
finish until the queue is empty.
|
|
301
302
|
"""
|
|
302
303
|
|
|
303
304
|
timer = time.monotonic()
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: isolate
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.11
|
|
4
4
|
Summary: Managed isolated environments for Python
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Requires-Python: >=3.8
|
|
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: dev
|
|
20
|
+
Requires-Dist: isolate[test] ; extra == 'dev'
|
|
21
|
+
Provides-Extra: test
|
|
22
|
+
Requires-Dist: isolate[build] ; extra == 'test'
|
|
23
|
+
Requires-Dist: pytest ; extra == 'test'
|
|
24
|
+
Requires-Dist: cloudpickle >=2.2.0 ; extra == 'test'
|
|
25
|
+
Requires-Dist: dill >=0.3.5.1 ; extra == 'test'
|
|
26
|
+
Requires-Dist: pytest-rerunfailures ; extra == 'test'
|
|
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
|
+
|
|
@@ -1,24 +1,31 @@
|
|
|
1
|
-
isolate/__init__.py,sha256=
|
|
1
|
+
isolate/__init__.py,sha256=uXOKnONs7sXgARNgElwr4_A1sKoA6ACHVEvs3IDiX1M,127
|
|
2
|
+
isolate/_isolate_version.py,sha256=ibxkEhOolH4KTxmT7hKzBWG_rM1opxjT5eTo3nE8TdM,415
|
|
3
|
+
isolate/_version.py,sha256=05pXvy-yr5t3I1m9JMn42Ilzpg7fa8IB2J8a3G7t1cU,274
|
|
4
|
+
isolate/exceptions.py,sha256=ki-f7khY-Yo1J8nPdy5IP-aZhQyLUP9pp3dE0moEVKw,44
|
|
5
|
+
isolate/logs.py,sha256=R_AHUVYD18z_PhtK_mDWi9Gch79CxmwHY09hUDShtwg,2079
|
|
6
|
+
isolate/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
isolate/registry.py,sha256=hpzv4HI7iihG5I7i5r8Pb257ibhEKY18xQcG-w1-BgI,1590
|
|
2
8
|
isolate/backends/__init__.py,sha256=LLrSM7UnDFW8tIT5oYlE1wVJrxKcaj_v7cFwvTjQTlc,119
|
|
3
|
-
isolate/backends/_base.py,sha256=
|
|
4
|
-
isolate/backends/common.py,sha256=
|
|
5
|
-
isolate/backends/conda.py,sha256=
|
|
9
|
+
isolate/backends/_base.py,sha256=senNj-k2Dp2DkyxmZy7WxzsexmPfU6_DBo7bbZDqTLQ,4167
|
|
10
|
+
isolate/backends/common.py,sha256=ZiU0Vkz78qaPH_3ThV28OcHi8QgXie4aBrkPXCJuNBM,8321
|
|
11
|
+
isolate/backends/conda.py,sha256=OIQrpt_VffW2PjPOIzp-JvonW4e7rDQ1ASHOEjyzD8E,7646
|
|
6
12
|
isolate/backends/local.py,sha256=woxe4dmXuEHxWKsGNndoRA1_sP6yG-dg6tlFZni0mZc,1360
|
|
7
|
-
isolate/backends/pyenv.py,sha256=
|
|
8
|
-
isolate/backends/remote.py,sha256=
|
|
13
|
+
isolate/backends/pyenv.py,sha256=G-OIwESUOU5TqqumwsKVUhRiFQzxB1xrPn-bGm4LQoI,5428
|
|
14
|
+
isolate/backends/remote.py,sha256=qUm54mpqk0kaEfbPZl962Td3_P3qcpyVcfGdKfmkJHs,4234
|
|
9
15
|
isolate/backends/settings.py,sha256=AiPYpzeon_AHS3ewSIKc0TMF4XrNdM32EFvgSTH2odE,3291
|
|
10
16
|
isolate/backends/virtualenv.py,sha256=DiBAiybOLWMxJobIRaH4AgDn9agY5VrVPaSQObQa1Lo,6989
|
|
11
17
|
isolate/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
18
|
isolate/common/timestamp.py,sha256=seh7FrMRH4i1SCQavA8d-7z8qi0pP8lYYhd29gTPMwE,367
|
|
13
19
|
isolate/connections/__init__.py,sha256=oa0PNo7ZQ0StPIDvKnJ02_CNVMyfOhxJ3M1C0VMvj9c,627
|
|
20
|
+
isolate/connections/common.py,sha256=cPpNhD7adMLfV7lE7tKuUwIBkjRLfbh3AtJykJgS1bQ,3554
|
|
14
21
|
isolate/connections/_local/__init__.py,sha256=6FtCKRSFBvTvjm5LNlNA-mieKEq3J7DZZRPcXVedERo,146
|
|
15
22
|
isolate/connections/_local/_base.py,sha256=qCx2M8kbxuPTruj9kH5z005LU2FaC0BkLxsgY-sXRlg,6214
|
|
16
23
|
isolate/connections/_local/agent_startup.py,sha256=swCs6Q0yVkDw7w-RftizHSMyJDM7DQwuP3TB0qI1ucg,1552
|
|
17
|
-
isolate/connections/common.py,sha256=PAfBGKZNUdtFlZQlw3_nQaUCKQXTnEkxzNNRV_i4R2A,3498
|
|
18
24
|
isolate/connections/grpc/__init__.py,sha256=tcesLxlC36P6wSg2lBcO2egsJWMbSKwc8zFXhWac3YU,85
|
|
19
|
-
isolate/connections/grpc/_base.py,sha256=
|
|
20
|
-
isolate/connections/grpc/agent.py,sha256=
|
|
25
|
+
isolate/connections/grpc/_base.py,sha256=hfGy_kFjifpK3zHD0_OTqpTF6CTOZH6abNnET4XLwE8,5613
|
|
26
|
+
isolate/connections/grpc/agent.py,sha256=D5icvO9zwsXDWB3xvRGSVl5OfkRH37bQ3VZdBdotg9c,7752
|
|
21
27
|
isolate/connections/grpc/configuration.py,sha256=50YvGGHA9uyKg74xU_gc73j7bsFk973uIpMhmw2HhxY,788
|
|
28
|
+
isolate/connections/grpc/interface.py,sha256=yt63kytgXRXrTnjePGJVdXz4LJJVSSrNkJCF1yz6FIE,2270
|
|
22
29
|
isolate/connections/grpc/definitions/__init__.py,sha256=Z0453Bbjoq-Oxm2Wfi9fae-BFf8YsZwmuh88strmvxo,459
|
|
23
30
|
isolate/connections/grpc/definitions/agent.proto,sha256=Hx11hHc8PKwhWzyasViLeq7JL33KsRex2-iibfWruTw,568
|
|
24
31
|
isolate/connections/grpc/definitions/agent_pb2.py,sha256=FeK2Pivl6WFdK0HhV7O_0CIopACJ3vbcXYszWeA-hwA,1344
|
|
@@ -28,29 +35,26 @@ isolate/connections/grpc/definitions/common.proto,sha256=4W1upvDIPezNj-Ab6FVNa-7
|
|
|
28
35
|
isolate/connections/grpc/definitions/common_pb2.py,sha256=kU4hYQ04B2LNcjCjXb9m1ukb8wWVXLuASsANvXQZFbE,2344
|
|
29
36
|
isolate/connections/grpc/definitions/common_pb2.pyi,sha256=J624Xc1Fp91ZFF8zdjJk1KCHNfHc2gRY8i3Aj1ofzKo,6887
|
|
30
37
|
isolate/connections/grpc/definitions/common_pb2_grpc.py,sha256=xYOs94SXiNYAlFodACnsXW5QovLsHY5tCk3p76RH5Zc,158
|
|
31
|
-
isolate/connections/grpc/interface.py,sha256=yt63kytgXRXrTnjePGJVdXz4LJJVSSrNkJCF1yz6FIE,2270
|
|
32
38
|
isolate/connections/ipc/__init__.py,sha256=j2Mbsph2mRhAWmkMyrtPOz0VG-e75h1OOZLwzs6pXUo,131
|
|
33
|
-
isolate/connections/ipc/_base.py,sha256=
|
|
34
|
-
isolate/connections/ipc/agent.py,sha256=
|
|
35
|
-
isolate/logs.py,sha256=crqCg1PLoFbeNx-GS7v9cw3C9PL59SUXAi_qTyLSHNg,2080
|
|
36
|
-
isolate/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
isolate/registry.py,sha256=hpzv4HI7iihG5I7i5r8Pb257ibhEKY18xQcG-w1-BgI,1590
|
|
39
|
+
isolate/connections/ipc/_base.py,sha256=iXCcgRU0c1Q0FDfm9nXVvjGwi-_6nCgkQZPATFaSu7Q,8494
|
|
40
|
+
isolate/connections/ipc/agent.py,sha256=Wcoi5nA5RPPCll60sih9nTnFtM1JXM2QEUfSbjZUgjs,6828
|
|
38
41
|
isolate/server/__init__.py,sha256=7R3GuWmxuqe0q28rVqETJN9OCrP_-Svjv9h0NR1GFL0,79
|
|
42
|
+
isolate/server/health_server.py,sha256=yN7F1Q28DdX8-Zk3gef7XcQEE25XwlHwzV5GBM75aQM,1249
|
|
43
|
+
isolate/server/interface.py,sha256=nGbjdxrN0p9m1LNdeds8NIoJOwPYW2NM6ktmbhfG4_s,687
|
|
44
|
+
isolate/server/server.py,sha256=x8e6q-soR8UQC4KLUT9wa4AE3IjZi9Ia_VmOEtZEiDo,13608
|
|
39
45
|
isolate/server/definitions/__init__.py,sha256=f_Q3pdjMuZrjgNlbM60btFKiB1Vg8cnVyKEbp0RmU0A,572
|
|
40
46
|
isolate/server/definitions/server.proto,sha256=08wnvXkK-Kco6OQaUkwm__dYSNvgOFhHO1GWRDT6y_Y,731
|
|
41
47
|
isolate/server/definitions/server_pb2.py,sha256=fSH9U5UeTHUj8cQo9JIW5ie2Pr-0ATtm5pLL-MteaCA,1825
|
|
42
48
|
isolate/server/definitions/server_pb2.pyi,sha256=JaI_Xd72MIyhb0pYvLBjJxpckS8Rhg9ZKbziauRQXkE,3306
|
|
43
49
|
isolate/server/definitions/server_pb2_grpc.py,sha256=MsnTuwgwQM1Hw7S234DOABv9s2trf0TaVib4jh4u_6c,2548
|
|
44
|
-
isolate/server/health/__init__.py,sha256=
|
|
50
|
+
isolate/server/health/__init__.py,sha256=sy349GRK2YGX9KFKqDxM-jdYtBpMXjZu1QwBkjn0SsM,337
|
|
45
51
|
isolate/server/health/health.proto,sha256=wE2_QD0OQAblKkEBG7sALLXEOj1mOLKG-FbC4tFopWE,455
|
|
46
52
|
isolate/server/health/health_pb2.py,sha256=mCnDq0-frAddHopN_g_LueHddbW-sN5kOfntJDlAvUY,1783
|
|
47
53
|
isolate/server/health/health_pb2.pyi,sha256=boMRHMlX770EuccQCFTeRgf_KA_VMgW7l9GZIwxvMok,2546
|
|
48
54
|
isolate/server/health/health_pb2_grpc.py,sha256=JRluct2W4af83OYxwmcCn0vRc78zf04Num0vBApuPEo,4005
|
|
49
|
-
isolate/
|
|
50
|
-
isolate/
|
|
51
|
-
isolate/
|
|
52
|
-
isolate-0.12.
|
|
53
|
-
isolate-0.12.
|
|
54
|
-
isolate-0.12.
|
|
55
|
-
isolate-0.12.9.dist-info/entry_points.txt,sha256=QXWwDC7bzMidCWvv7WrIKvlWneFKA21c3SDMVvgHpT4,281
|
|
56
|
-
isolate-0.12.9.dist-info/RECORD,,
|
|
55
|
+
isolate-0.12.11.dist-info/LICENSE,sha256=427vuyirL5scgBLqA9UWcdnxKrtSGc0u_JfUupk6lAA,11359
|
|
56
|
+
isolate-0.12.11.dist-info/METADATA,sha256=0bXODbgwNbrAgoSXUV41ycHm2jHpCdYn-jD6tGwlne4,3154
|
|
57
|
+
isolate-0.12.11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
58
|
+
isolate-0.12.11.dist-info/entry_points.txt,sha256=XQ_nl-8MR94UnekxbBJRNGlY-lZ_Qh50N4mzwFDdwV8,290
|
|
59
|
+
isolate-0.12.11.dist-info/top_level.txt,sha256=W9QJBHcq5WXRkbOXf25bvftzFsOZZN4n1DAatdroZrs,8
|
|
60
|
+
isolate-0.12.11.dist-info/RECORD,,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
[isolate.backends]
|
|
2
|
+
conda = isolate.backends.conda:CondaEnvironment
|
|
3
|
+
isolate-server = isolate.backends.remote:IsolateServer
|
|
4
|
+
local = isolate.backends.local:LocalPythonEnvironment
|
|
5
|
+
pyenv = isolate.backends.pyenv:PyenvEnvironment
|
|
6
|
+
virtualenv = isolate.backends.virtualenv:VirtualPythonEnvironment
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
isolate
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
[isolate.backends]
|
|
2
|
-
conda=isolate.backends.conda:CondaEnvironment
|
|
3
|
-
isolate-server=isolate.backends.remote:IsolateServer
|
|
4
|
-
local=isolate.backends.local:LocalPythonEnvironment
|
|
5
|
-
pyenv=isolate.backends.pyenv:PyenvEnvironment
|
|
6
|
-
virtualenv=isolate.backends.virtualenv:VirtualPythonEnvironment
|
|
7
|
-
|
|
File without changes
|