modal 1.1.2.dev2__tar.gz → 1.1.2.dev3__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 modal might be problematic. Click here for more details.

Files changed (188) hide show
  1. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/PKG-INFO +1 -1
  2. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/client.pyi +2 -2
  3. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/file_pattern_matcher.py +25 -16
  4. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/functions.pyi +6 -6
  5. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/image.pyi +5 -5
  6. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_version/__init__.py +1 -1
  8. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/LICENSE +0 -0
  9. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/README.md +0 -0
  10. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/__init__.py +0 -0
  11. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/__main__.py +0 -0
  12. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_clustered_functions.py +0 -0
  13. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_container_entrypoint.py +0 -0
  15. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_functions.py +0 -0
  16. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_ipython.py +0 -0
  17. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_location.py +0 -0
  18. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_object.py +0 -0
  19. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_output.py +0 -0
  20. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_partial_function.py +0 -0
  21. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_pty.py +0 -0
  22. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_resolver.py +0 -0
  23. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_resources.py +0 -0
  24. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/__init__.py +0 -0
  25. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/asgi.py +0 -0
  26. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/container_io_manager.py +0 -0
  27. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
  28. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/execution_context.py +0 -0
  29. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/execution_context.pyi +0 -0
  30. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  31. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/telemetry.py +0 -0
  32. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_runtime/user_code_imports.py +0 -0
  33. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_serialization.py +0 -0
  34. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_traceback.py +0 -0
  35. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_tunnel.py +0 -0
  36. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_tunnel.pyi +0 -0
  37. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_type_manager.py +0 -0
  38. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/__init__.py +0 -0
  39. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/app_utils.py +0 -0
  40. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/async_utils.py +0 -0
  41. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/auth_token_manager.py +0 -0
  42. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/logger.py +0 -0
  54. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/_watcher.py +0 -0
  66. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/app.py +0 -0
  67. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/app.pyi +0 -0
  68. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/2023.12.312.txt +0 -0
  69. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/2023.12.txt +0 -0
  70. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/2024.04.txt +0 -0
  71. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/2024.10.txt +0 -0
  72. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/2025.06.txt +0 -0
  73. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/PREVIEW.txt +0 -0
  74. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/README.md +0 -0
  75. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/builder/base-images.json +0 -0
  76. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/call_graph.py +0 -0
  77. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/__init__.py +0 -0
  78. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/_download.py +0 -0
  79. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/_traceback.py +0 -0
  80. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/app.py +0 -0
  81. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/cluster.py +0 -0
  82. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/config.py +0 -0
  83. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/container.py +0 -0
  84. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/dict.py +0 -0
  85. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/entry_point.py +0 -0
  86. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/environment.py +0 -0
  87. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/import_refs.py +0 -0
  88. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/launch.py +0 -0
  89. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/network_file_system.py +0 -0
  90. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/profile.py +0 -0
  91. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/programs/__init__.py +0 -0
  92. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/programs/run_jupyter.py +0 -0
  93. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/programs/vscode.py +0 -0
  94. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/queues.py +0 -0
  95. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/run.py +0 -0
  96. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/secret.py +0 -0
  97. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/token.py +0 -0
  98. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/utils.py +0 -0
  99. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cli/volume.py +0 -0
  100. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/client.py +0 -0
  101. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cloud_bucket_mount.py +0 -0
  102. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cloud_bucket_mount.pyi +0 -0
  103. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cls.py +0 -0
  104. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/cls.pyi +0 -0
  105. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/config.py +0 -0
  106. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/container_process.py +0 -0
  107. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/container_process.pyi +0 -0
  108. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/dict.py +0 -0
  109. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/dict.pyi +0 -0
  110. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/environments.py +0 -0
  111. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/environments.pyi +0 -0
  112. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/exception.py +0 -0
  113. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/experimental/__init__.py +0 -0
  114. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/experimental/flash.py +0 -0
  115. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/experimental/flash.pyi +0 -0
  116. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/experimental/ipython.py +0 -0
  117. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/file_io.py +0 -0
  118. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/file_io.pyi +0 -0
  119. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/functions.py +0 -0
  120. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/gpu.py +0 -0
  121. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/image.py +0 -0
  122. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/io_streams.py +0 -0
  123. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/io_streams.pyi +0 -0
  124. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/mount.py +0 -0
  125. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/mount.pyi +0 -0
  126. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/network_file_system.py +0 -0
  127. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/network_file_system.pyi +0 -0
  128. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/object.py +0 -0
  129. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/object.pyi +0 -0
  130. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/output.py +0 -0
  131. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/parallel_map.py +0 -0
  132. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/parallel_map.pyi +0 -0
  133. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/partial_function.py +0 -0
  134. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/partial_function.pyi +0 -0
  135. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/proxy.py +0 -0
  136. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/proxy.pyi +0 -0
  137. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/py.typed +0 -0
  138. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/queue.py +0 -0
  139. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/queue.pyi +0 -0
  140. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/retries.py +0 -0
  141. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/runner.py +0 -0
  142. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/runner.pyi +0 -0
  143. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/running_app.py +0 -0
  144. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/sandbox.py +0 -0
  145. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/sandbox.pyi +0 -0
  146. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/schedule.py +0 -0
  147. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/scheduler_placement.py +0 -0
  148. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/secret.py +0 -0
  149. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/secret.pyi +0 -0
  150. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/serving.py +0 -0
  151. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/serving.pyi +0 -0
  152. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/snapshot.py +0 -0
  153. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/snapshot.pyi +0 -0
  154. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/stream_type.py +0 -0
  155. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/token_flow.py +0 -0
  156. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/token_flow.pyi +0 -0
  157. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/volume.py +0 -0
  158. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal/volume.pyi +0 -0
  159. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/SOURCES.txt +0 -0
  160. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/dependency_links.txt +0 -0
  161. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/entry_points.txt +0 -0
  162. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/requires.txt +0 -0
  163. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal.egg-info/top_level.txt +0 -0
  164. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/__init__.py +0 -0
  165. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/gen_cli_docs.py +0 -0
  166. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/gen_reference_docs.py +0 -0
  167. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/mdmd/__init__.py +0 -0
  168. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/mdmd/mdmd.py +0 -0
  169. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_docs/mdmd/signatures.py +0 -0
  170. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/__init__.py +0 -0
  171. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api.proto +0 -0
  172. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api_grpc.py +0 -0
  173. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api_pb2.py +0 -0
  174. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api_pb2.pyi +0 -0
  175. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api_pb2_grpc.py +0 -0
  176. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
  177. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/modal_api_grpc.py +0 -0
  178. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/modal_options_grpc.py +0 -0
  179. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options.proto +0 -0
  180. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options_grpc.py +0 -0
  181. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options_pb2.py +0 -0
  182. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options_pb2.pyi +0 -0
  183. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options_pb2_grpc.py +0 -0
  184. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/options_pb2_grpc.pyi +0 -0
  185. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_proto/py.typed +0 -0
  186. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/modal_version/__main__.py +0 -0
  187. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/pyproject.toml +0 -0
  188. {modal-1.1.2.dev2 → modal-1.1.2.dev3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.2.dev2
3
+ Version: 1.1.2.dev3
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.2.dev2",
36
+ version: str = "1.1.2.dev3",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.2.dev2",
167
+ version: str = "1.1.2.dev3",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -11,6 +11,7 @@ then asking it whether file paths match any of its patterns.
11
11
 
12
12
  import os
13
13
  from abc import abstractmethod
14
+ from functools import cached_property
14
15
  from pathlib import Path
15
16
  from typing import Callable, Optional, Sequence, Union
16
17
 
@@ -99,11 +100,11 @@ class FilePatternMatcher(_AbstractPatternMatcher):
99
100
  ```
100
101
  """
101
102
 
102
- patterns: list[Pattern]
103
- _delayed_init: Callable[[], None] = None
103
+ _file_path: Optional[Union[str, Path]]
104
+ _pattern_strings: Optional[Sequence[str]]
104
105
 
105
- def _set_patterns(self, patterns: Sequence[str]) -> None:
106
- self.patterns = []
106
+ def _parse_patterns(self, patterns: Sequence[str]) -> list[Pattern]:
107
+ parsed_patterns = []
107
108
  for pattern in list(patterns):
108
109
  pattern = pattern.strip().strip(os.path.sep)
109
110
  if not pattern:
@@ -118,7 +119,8 @@ class FilePatternMatcher(_AbstractPatternMatcher):
118
119
  # In Python, we can proceed without explicit syntax checking
119
120
  new_pattern.cleaned_pattern = pattern
120
121
  new_pattern.dirs = pattern.split(os.path.sep)
121
- self.patterns.append(new_pattern)
122
+ parsed_patterns.append(new_pattern)
123
+ return parsed_patterns
122
124
 
123
125
  def __init__(self, *pattern: str) -> None:
124
126
  """Initialize a new FilePatternMatcher instance.
@@ -129,7 +131,8 @@ class FilePatternMatcher(_AbstractPatternMatcher):
129
131
  Raises:
130
132
  ValueError: If an illegal exclusion pattern is provided.
131
133
  """
132
- self._set_patterns(pattern)
134
+ self._pattern_strings = pattern
135
+ self._file_path = None
133
136
 
134
137
  @classmethod
135
138
  def from_file(cls, file_path: Union[str, Path]) -> "FilePatternMatcher":
@@ -148,14 +151,10 @@ class FilePatternMatcher(_AbstractPatternMatcher):
148
151
  ```
149
152
 
150
153
  """
151
- uninitialized = cls.__new__(cls)
152
-
153
- def _delayed_init():
154
- uninitialized._set_patterns(Path(file_path).read_text("utf8").splitlines())
155
- uninitialized._delayed_init = None
156
-
157
- uninitialized._delayed_init = _delayed_init
158
- return uninitialized
154
+ instance = cls.__new__(cls)
155
+ instance._file_path = file_path
156
+ instance._pattern_strings = None
157
+ return instance
159
158
 
160
159
  def _matches(self, file_path: str) -> bool:
161
160
  """Check if the file path or any of its parent directories match the patterns.
@@ -194,6 +193,18 @@ class FilePatternMatcher(_AbstractPatternMatcher):
194
193
 
195
194
  return matched
196
195
 
196
+ @cached_property
197
+ def patterns(self) -> list[Pattern]:
198
+ """Get the patterns, loading from file if necessary."""
199
+ if self._file_path is not None:
200
+ # Lazy load from file
201
+ pattern_strings = Path(self._file_path).read_text("utf8").splitlines()
202
+ else:
203
+ # Use patterns provided in __init__
204
+ pattern_strings = list(self._pattern_strings)
205
+
206
+ return self._parse_patterns(pattern_strings)
207
+
197
208
  def can_prune_directories(self) -> bool:
198
209
  """
199
210
  Returns True if this pattern matcher allows safe early directory pruning.
@@ -205,8 +216,6 @@ class FilePatternMatcher(_AbstractPatternMatcher):
205
216
  return not any(pattern.exclusion for pattern in self.patterns)
206
217
 
207
218
  def __call__(self, file_path: Path) -> bool:
208
- if self._delayed_init:
209
- self._delayed_init()
210
219
  return self._matches(str(file_path))
211
220
 
212
221
 
@@ -427,7 +427,7 @@ class Function(
427
427
 
428
428
  _call_generator: ___call_generator_spec[typing_extensions.Self]
429
429
 
430
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
430
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
431
431
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
432
432
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
433
433
  ...
@@ -436,7 +436,7 @@ class Function(
436
436
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
437
437
  ...
438
438
 
439
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
439
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
440
440
 
441
441
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
442
442
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -463,7 +463,7 @@ class Function(
463
463
  """
464
464
  ...
465
465
 
466
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
466
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
467
467
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
468
468
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
469
469
 
@@ -487,7 +487,7 @@ class Function(
487
487
  ...
488
488
 
489
489
  _experimental_spawn: ___experimental_spawn_spec[
490
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
490
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
491
491
  ]
492
492
 
493
493
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -496,7 +496,7 @@ class Function(
496
496
 
497
497
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
498
498
 
499
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
499
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
500
500
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
501
501
  """Calls the function with the given arguments, without waiting for the results.
502
502
 
@@ -517,7 +517,7 @@ class Function(
517
517
  """
518
518
  ...
519
519
 
520
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
520
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
521
521
 
522
522
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
523
523
  """Return the inner Python object wrapped by this Modal Function."""
@@ -91,7 +91,7 @@ def _create_context_mount_function(
91
91
  dockerfile_cmds: list[str] = [],
92
92
  dockerfile_path: typing.Optional[pathlib.Path] = None,
93
93
  context_mount: typing.Optional[modal.mount._Mount] = None,
94
- context_dir: typing.Union[pathlib.Path, str, None] = None,
94
+ context_dir: typing.Union[str, pathlib.Path, None] = None,
95
95
  ): ...
96
96
 
97
97
  class _ImageRegistryConfig:
@@ -537,7 +537,7 @@ class _Image(modal._object._Object):
537
537
  secrets: collections.abc.Sequence[modal.secret._Secret] = [],
538
538
  gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
539
539
  context_mount: typing.Optional[modal.mount._Mount] = None,
540
- context_dir: typing.Union[pathlib.Path, str, None] = None,
540
+ context_dir: typing.Union[str, pathlib.Path, None] = None,
541
541
  force_build: bool = False,
542
542
  ignore: typing.Union[
543
543
  collections.abc.Sequence[str], collections.abc.Callable[[pathlib.Path], bool]
@@ -748,7 +748,7 @@ class _Image(modal._object._Object):
748
748
  *,
749
749
  context_mount: typing.Optional[modal.mount._Mount] = None,
750
750
  force_build: bool = False,
751
- context_dir: typing.Union[pathlib.Path, str, None] = None,
751
+ context_dir: typing.Union[str, pathlib.Path, None] = None,
752
752
  secrets: collections.abc.Sequence[modal.secret._Secret] = [],
753
753
  gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
754
754
  add_python: typing.Optional[str] = None,
@@ -1381,7 +1381,7 @@ class Image(modal.object.Object):
1381
1381
  secrets: collections.abc.Sequence[modal.secret.Secret] = [],
1382
1382
  gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
1383
1383
  context_mount: typing.Optional[modal.mount.Mount] = None,
1384
- context_dir: typing.Union[pathlib.Path, str, None] = None,
1384
+ context_dir: typing.Union[str, pathlib.Path, None] = None,
1385
1385
  force_build: bool = False,
1386
1386
  ignore: typing.Union[
1387
1387
  collections.abc.Sequence[str], collections.abc.Callable[[pathlib.Path], bool]
@@ -1592,7 +1592,7 @@ class Image(modal.object.Object):
1592
1592
  *,
1593
1593
  context_mount: typing.Optional[modal.mount.Mount] = None,
1594
1594
  force_build: bool = False,
1595
- context_dir: typing.Union[pathlib.Path, str, None] = None,
1595
+ context_dir: typing.Union[str, pathlib.Path, None] = None,
1596
1596
  secrets: collections.abc.Sequence[modal.secret.Secret] = [],
1597
1597
  gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
1598
1598
  add_python: typing.Optional[str] = None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.2.dev2
3
+ Version: 1.1.2.dev3
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.1.2.dev2"
4
+ __version__ = "1.1.2.dev3"
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
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