modal 1.0.3.dev7__tar.gz → 1.0.3.dev10__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 (184) hide show
  1. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/PKG-INFO +1 -1
  2. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/secret.py +43 -4
  3. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/client.pyi +2 -2
  4. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/functions.pyi +6 -6
  5. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_version/__init__.py +1 -1
  7. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/LICENSE +0 -0
  8. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/README.md +0 -0
  9. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/__init__.py +0 -0
  10. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/__main__.py +0 -0
  11. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_clustered_functions.py +0 -0
  12. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_functions.py +0 -0
  15. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_ipython.py +0 -0
  16. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_location.py +0 -0
  17. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_object.py +0 -0
  18. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_output.py +0 -0
  19. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_partial_function.py +0 -0
  20. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_pty.py +0 -0
  21. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_resolver.py +0 -0
  22. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_resources.py +0 -0
  23. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/__init__.py +0 -0
  24. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/asgi.py +0 -0
  25. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/execution_context.py +0 -0
  28. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/telemetry.py +0 -0
  31. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_runtime/user_code_imports.py +0 -0
  32. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_serialization.py +0 -0
  33. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_traceback.py +0 -0
  34. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_tunnel.py +0 -0
  35. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_tunnel.pyi +0 -0
  36. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_type_manager.py +0 -0
  37. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/__init__.py +0 -0
  38. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/app_utils.py +0 -0
  39. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/async_utils.py +0 -0
  40. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/function_utils.py +0 -0
  45. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/git_utils.py +0 -0
  46. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/hash_utils.py +0 -0
  49. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/http_utils.py +0 -0
  50. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/logger.py +0 -0
  52. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/mount_utils.py +0 -0
  53. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/name_utils.py +0 -0
  54. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/package_utils.py +0 -0
  55. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/shell_utils.py +0 -0
  58. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_utils/time_utils.py +0 -0
  59. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_vendor/__init__.py +0 -0
  60. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_vendor/tblib.py +0 -0
  63. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/_watcher.py +0 -0
  64. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/app.py +0 -0
  65. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/app.pyi +0 -0
  66. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/call_graph.py +0 -0
  67. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/__init__.py +0 -0
  68. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/_download.py +0 -0
  69. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/_traceback.py +0 -0
  70. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/app.py +0 -0
  71. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/cluster.py +0 -0
  72. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/config.py +0 -0
  73. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/container.py +0 -0
  74. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/dict.py +0 -0
  75. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/entry_point.py +0 -0
  76. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/environment.py +0 -0
  77. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/import_refs.py +0 -0
  78. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/launch.py +0 -0
  79. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/network_file_system.py +0 -0
  80. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/profile.py +0 -0
  81. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/programs/__init__.py +0 -0
  82. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/programs/run_jupyter.py +0 -0
  83. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/programs/vscode.py +0 -0
  84. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/queues.py +0 -0
  85. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/run.py +0 -0
  86. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/token.py +0 -0
  87. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/utils.py +0 -0
  88. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cli/volume.py +0 -0
  89. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/client.py +0 -0
  90. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cloud_bucket_mount.py +0 -0
  91. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cloud_bucket_mount.pyi +0 -0
  92. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cls.py +0 -0
  93. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/cls.pyi +0 -0
  94. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/config.py +0 -0
  95. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/container_process.py +0 -0
  96. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/container_process.pyi +0 -0
  97. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/dict.py +0 -0
  98. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/dict.pyi +0 -0
  99. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/environments.py +0 -0
  100. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/environments.pyi +0 -0
  101. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/exception.py +0 -0
  102. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/experimental/__init__.py +0 -0
  103. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/experimental/ipython.py +0 -0
  104. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/file_io.py +0 -0
  105. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/file_io.pyi +0 -0
  106. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/file_pattern_matcher.py +0 -0
  107. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/functions.py +0 -0
  108. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/gpu.py +0 -0
  109. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/image.py +0 -0
  110. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/image.pyi +0 -0
  111. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/io_streams.py +0 -0
  112. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/io_streams.pyi +0 -0
  113. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/mount.py +0 -0
  114. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/mount.pyi +0 -0
  115. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/network_file_system.py +0 -0
  116. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/network_file_system.pyi +0 -0
  117. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/object.py +0 -0
  118. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/object.pyi +0 -0
  119. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/output.py +0 -0
  120. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/parallel_map.py +0 -0
  121. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/parallel_map.pyi +0 -0
  122. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/partial_function.py +0 -0
  123. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/partial_function.pyi +0 -0
  124. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/proxy.py +0 -0
  125. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/proxy.pyi +0 -0
  126. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/py.typed +0 -0
  127. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/queue.py +0 -0
  128. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/queue.pyi +0 -0
  129. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/2023.12.312.txt +0 -0
  130. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/2023.12.txt +0 -0
  131. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/2024.04.txt +0 -0
  132. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/2024.10.txt +0 -0
  133. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/PREVIEW.txt +0 -0
  134. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/README.md +0 -0
  135. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/requirements/base-images.json +0 -0
  136. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/retries.py +0 -0
  137. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/runner.py +0 -0
  138. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/runner.pyi +0 -0
  139. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/running_app.py +0 -0
  140. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/sandbox.py +0 -0
  141. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/sandbox.pyi +0 -0
  142. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/schedule.py +0 -0
  143. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/scheduler_placement.py +0 -0
  144. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/secret.py +0 -0
  145. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/secret.pyi +0 -0
  146. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/serving.py +0 -0
  147. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/serving.pyi +0 -0
  148. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/snapshot.py +0 -0
  149. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/snapshot.pyi +0 -0
  150. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/stream_type.py +0 -0
  151. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/token_flow.py +0 -0
  152. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/token_flow.pyi +0 -0
  153. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/volume.py +0 -0
  154. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal/volume.pyi +0 -0
  155. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api.proto +0 -0
  168. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options.proto +0 -0
  176. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_proto/py.typed +0 -0
  182. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/modal_version/__main__.py +0 -0
  183. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/pyproject.toml +0 -0
  184. {modal-1.0.3.dev7 → modal-1.0.3.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev7
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
@@ -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
 
@@ -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.dev7",
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.dev7",
97
+ version: str = "1.0.3.dev10",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self]
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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self
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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self]
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev7
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
@@ -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.dev7"
4
+ __version__ = "1.0.3.dev10"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes