modal 1.0.3.dev7__py3-none-any.whl → 1.0.3.dev10__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.
- modal/cli/secret.py +43 -4
- modal/client.pyi +2 -2
- modal/functions.pyi +6 -6
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/METADATA +1 -1
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/RECORD +10 -10
- modal_version/__init__.py +1 -1
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/WHEEL +0 -0
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/entry_points.txt +0 -0
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.3.dev7.dist-info → modal-1.0.3.dev10.dist-info}/top_level.txt +0 -0
modal/cli/secret.py
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# Copyright Modal Labs 2022
|
2
|
+
import json
|
2
3
|
import os
|
3
4
|
import platform
|
4
5
|
import subprocess
|
6
|
+
from pathlib import Path
|
5
7
|
from tempfile import NamedTemporaryFile
|
6
8
|
from typing import Optional
|
7
9
|
|
@@ -48,14 +50,17 @@ async def list_(env: Optional[str] = ENV_OPTION, json: bool = False):
|
|
48
50
|
@secret_cli.command("create", help="Create a new secret.")
|
49
51
|
@synchronizer.create_blocking
|
50
52
|
async def create(
|
51
|
-
secret_name,
|
52
|
-
keyvalues: list[str] = typer.Argument(
|
53
|
+
secret_name: str,
|
54
|
+
keyvalues: Optional[list[str]] = typer.Argument(default=None, help="Space-separated KEY=VALUE items."),
|
53
55
|
env: Optional[str] = ENV_OPTION,
|
56
|
+
from_dotenv: Optional[Path] = typer.Option(default=None, help="Path to a .env file to load secrets from."),
|
57
|
+
from_json: Optional[Path] = typer.Option(default=None, help="Path to a JSON file to load secrets from."),
|
54
58
|
force: bool = typer.Option(False, "--force", help="Overwrite the secret if it already exists."),
|
55
59
|
):
|
56
60
|
env = ensure_env(env)
|
57
61
|
env_dict = {}
|
58
|
-
|
62
|
+
|
63
|
+
for arg in keyvalues or []:
|
59
64
|
if "=" in arg:
|
60
65
|
key, value = arg.split("=", 1)
|
61
66
|
if value == "-":
|
@@ -63,17 +68,51 @@ async def create(
|
|
63
68
|
env_dict[key] = value
|
64
69
|
else:
|
65
70
|
raise click.UsageError(
|
66
|
-
"""Each item should be of the form <KEY>=VALUE. To enter secrets using your $EDITOR, use `<KEY>=-`.
|
71
|
+
"""Each item should be of the form <KEY>=VALUE. To enter secrets using your $EDITOR, use `<KEY>=-`. To
|
72
|
+
enter secrets from environment variables, use `<KEY>="$ENV_VAR"`.
|
67
73
|
|
68
74
|
E.g.
|
69
75
|
|
70
76
|
modal secret create my-credentials username=john password=-
|
77
|
+
modal secret create my-credentials username=john password="$PASSWORD"
|
71
78
|
"""
|
72
79
|
)
|
73
80
|
|
81
|
+
if from_dotenv:
|
82
|
+
if not from_dotenv.is_file():
|
83
|
+
raise click.UsageError(f"Could not read .env file at {from_dotenv}")
|
84
|
+
|
85
|
+
try:
|
86
|
+
from dotenv import dotenv_values
|
87
|
+
except ImportError:
|
88
|
+
raise ImportError(
|
89
|
+
"Need the `python-dotenv` package installed. You can install it by running `pip install python-dotenv`."
|
90
|
+
)
|
91
|
+
|
92
|
+
try:
|
93
|
+
env_dict.update(dotenv_values(from_dotenv))
|
94
|
+
except Exception as e:
|
95
|
+
raise click.UsageError(f"Could not parse .env file at {from_dotenv}: {e}")
|
96
|
+
|
97
|
+
if from_json:
|
98
|
+
if not from_json.is_file():
|
99
|
+
raise click.UsageError(f"Could not read JSON file at {from_json}")
|
100
|
+
|
101
|
+
try:
|
102
|
+
with from_json.open("r") as f:
|
103
|
+
env_dict.update(json.load(f))
|
104
|
+
except Exception as e:
|
105
|
+
raise click.UsageError(f"Could not parse JSON file at {from_json}: {e}")
|
106
|
+
|
74
107
|
if not env_dict:
|
75
108
|
raise click.UsageError("You need to specify at least one key for your secret")
|
76
109
|
|
110
|
+
for k, v in env_dict.items():
|
111
|
+
if not isinstance(k, str) or not k:
|
112
|
+
raise click.UsageError(f"Invalid key: '{k}'")
|
113
|
+
if not isinstance(v, str):
|
114
|
+
raise click.UsageError(f"Non-string value for secret '{k}'")
|
115
|
+
|
77
116
|
# Create secret
|
78
117
|
await _Secret.create_deployed(secret_name, env_dict, overwrite=force)
|
79
118
|
|
modal/client.pyi
CHANGED
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "1.0.3.
|
34
|
+
version: str = "1.0.3.dev10",
|
35
35
|
): ...
|
36
36
|
def is_closed(self) -> bool: ...
|
37
37
|
@property
|
@@ -94,7 +94,7 @@ class Client:
|
|
94
94
|
server_url: str,
|
95
95
|
client_type: int,
|
96
96
|
credentials: typing.Optional[tuple[str, str]],
|
97
|
-
version: str = "1.0.3.
|
97
|
+
version: str = "1.0.3.dev10",
|
98
98
|
): ...
|
99
99
|
def is_closed(self) -> bool: ...
|
100
100
|
@property
|
modal/functions.pyi
CHANGED
@@ -227,11 +227,11 @@ class Function(
|
|
227
227
|
|
228
228
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
229
229
|
|
230
|
-
class __remote_spec(typing_extensions.Protocol[
|
230
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
231
231
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
232
232
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
233
233
|
|
234
|
-
remote: __remote_spec[modal._functions.
|
234
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
235
235
|
|
236
236
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
237
237
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -246,12 +246,12 @@ class Function(
|
|
246
246
|
self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
|
247
247
|
) -> modal._functions.OriginalReturnType: ...
|
248
248
|
|
249
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
249
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
250
250
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
251
251
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
252
252
|
|
253
253
|
_experimental_spawn: ___experimental_spawn_spec[
|
254
|
-
modal._functions.
|
254
|
+
modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
|
255
255
|
]
|
256
256
|
|
257
257
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
@@ -260,11 +260,11 @@ class Function(
|
|
260
260
|
|
261
261
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
262
262
|
|
263
|
-
class __spawn_spec(typing_extensions.Protocol[
|
263
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
264
264
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
265
265
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
266
266
|
|
267
|
-
spawn: __spawn_spec[modal._functions.
|
267
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
268
268
|
|
269
269
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
|
270
270
|
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=NZ_rJ9TuMfiNiLg8-gOFgufD5flGtXWPHOZI0gdD3hE,46585
|
|
22
22
|
modal/app.pyi,sha256=4-b_vbe3lNAqQPcMRpQCEDsE1zsVkQRJGUql9B7HvbM,22659
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=OwISJvkgMb-rHm9Gc4i-7YcDgGiZgwJ7F_PzwZH7a6Q,16847
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=rTH-MVJfJ4vb8MxMw0S7TY-WHYUE-Nx-pguORk3Mcpo,8459
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
28
28
|
modal/cls.py,sha256=dBbeARwOWftlKd1cwtM0cHFtQWSWkwVXwVmOV4w0SyI,37907
|
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
|
39
39
|
modal/file_io.pyi,sha256=oB7x-rKq7bmm8cA7Z7W9C9yeko7KK9m9i5GidFnkGK4,9569
|
40
40
|
modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw,6516
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
|
-
modal/functions.pyi,sha256=
|
42
|
+
modal/functions.pyi,sha256=5T58OucdNU4I-LqhBdwsWSAGka-Wa8nP2GcZ5K1bOL0,16236
|
43
43
|
modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
|
44
44
|
modal/image.py,sha256=yrI9DCw7GAck3d788GCHJom-_yU55zNu7reNapBhlgE,93284
|
45
45
|
modal/image.pyi,sha256=2xjB6XOZDtm_chDdd90UoIj8pnDt5hCg6bOmu5fNaA4,25625
|
@@ -131,7 +131,7 @@ modal/cli/network_file_system.py,sha256=DoIdY8I42DjFdTtaYuRKNm7GC6vY0QtA4mk6694f
|
|
131
131
|
modal/cli/profile.py,sha256=0TYhgRSGUvQZ5LH9nkl6iZllEvAjDniES264dE57wOM,3201
|
132
132
|
modal/cli/queues.py,sha256=1OzC9HdCkbNz6twF3US4FZmIhuVRQ01GOfBY42ux61A,4533
|
133
133
|
modal/cli/run.py,sha256=DPa-yQ9o7vjqwvs_TAOvVJxS51yVn__ZGCnbkORL37g,23972
|
134
|
-
modal/cli/secret.py,sha256=
|
134
|
+
modal/cli/secret.py,sha256=2bngl3Gb6THXkQ2eWZIN9pOHeOFJqiSNo_waUCVYgns,6611
|
135
135
|
modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
|
136
136
|
modal/cli/utils.py,sha256=9Q7DIUX78-c19zBQNA7EtkgqIFatvHWUVGHwUIeBX_0,3366
|
137
137
|
modal/cli/volume.py,sha256=h0Lk4CWe37L8X1kOpCj_KXfGGCEZf799fkX6Tbd6BPg,10734
|
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
147
147
|
modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
148
148
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
149
149
|
modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
|
150
|
-
modal-1.0.3.
|
150
|
+
modal-1.0.3.dev10.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
151
151
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
152
152
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
153
153
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -170,10 +170,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
170
170
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
171
171
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
172
172
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
173
|
-
modal_version/__init__.py,sha256=
|
173
|
+
modal_version/__init__.py,sha256=jIkxlQhBAx09ofvdeJzNjAL4giGCLLafCLWcf4jKxBM,121
|
174
174
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
175
|
-
modal-1.0.3.
|
176
|
-
modal-1.0.3.
|
177
|
-
modal-1.0.3.
|
178
|
-
modal-1.0.3.
|
179
|
-
modal-1.0.3.
|
175
|
+
modal-1.0.3.dev10.dist-info/METADATA,sha256=_6WLpgYUUS5ZswXJBe_uJlb-yH1euaG4QkwlgX_Gm_c,2455
|
176
|
+
modal-1.0.3.dev10.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
177
|
+
modal-1.0.3.dev10.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
178
|
+
modal-1.0.3.dev10.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
179
|
+
modal-1.0.3.dev10.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|