modal 1.0.3.dev8__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 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(..., help="Space-separated KEY=VALUE items"),
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
- for arg in keyvalues:
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.dev8",
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.dev8",
97
+ version: str = "1.0.3.dev10",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev8
3
+ Version: 1.0.3.dev10
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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=9Na2pTVt0dajHjqeQIslZ9l1qZV1oTEX0ZfxR2X9w4s,8457
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
@@ -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=oLFEPZoyyeMUKPaJZ9JKKl5mfkQU80DGF9p0atotqig,5002
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.dev8.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
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=ILpE8xfs22gw9WWQLpPlTAtz4i-b9kO12KIIRnKTj9s,120
173
+ modal_version/__init__.py,sha256=jIkxlQhBAx09ofvdeJzNjAL4giGCLLafCLWcf4jKxBM,121
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal-1.0.3.dev8.dist-info/METADATA,sha256=koyzYQIvvwuxQ47sZW7NzzKQ5XBE7YaWmhejysY_3xg,2454
176
- modal-1.0.3.dev8.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.3.dev8.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.3.dev8.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.3.dev8.dist-info/RECORD,,
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
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.0.3.dev8"
4
+ __version__ = "1.0.3.dev10"