fal 1.50.0__tar.gz → 1.50.2__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 (201) hide show
  1. {fal-1.50.0/fal.egg-info → fal-1.50.2}/PKG-INFO +1 -1
  2. {fal-1.50.0 → fal-1.50.2/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.50.0 → fal-1.50.2}/src/fal/_fal_version.py +2 -2
  4. {fal-1.50.0 → fal-1.50.2}/src/fal/files.py +1 -0
  5. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/providers/fal.py +10 -33
  6. {fal-1.50.0 → fal-1.50.2}/tests/toolkit/file/providers/test_fal_retry.py +1 -40
  7. {fal-1.50.0 → fal-1.50.2}/.gitignore +0 -0
  8. {fal-1.50.0 → fal-1.50.2}/Makefile +0 -0
  9. {fal-1.50.0 → fal-1.50.2}/README.md +0 -0
  10. {fal-1.50.0 → fal-1.50.2}/docs/conf.py +0 -0
  11. {fal-1.50.0 → fal-1.50.2}/docs/index.rst +0 -0
  12. {fal-1.50.0 → fal-1.50.2}/fal.egg-info/SOURCES.txt +0 -0
  13. {fal-1.50.0 → fal-1.50.2}/fal.egg-info/dependency_links.txt +0 -0
  14. {fal-1.50.0 → fal-1.50.2}/fal.egg-info/entry_points.txt +0 -0
  15. {fal-1.50.0 → fal-1.50.2}/fal.egg-info/requires.txt +0 -0
  16. {fal-1.50.0 → fal-1.50.2}/fal.egg-info/top_level.txt +0 -0
  17. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/README.md +0 -0
  18. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  19. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  20. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  21. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  22. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  23. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  24. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  25. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  26. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  27. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  28. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  29. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  30. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  31. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  32. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  33. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  34. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  35. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  36. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  37. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  38. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  39. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  40. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  41. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  42. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  43. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  44. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  45. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  46. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  47. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  48. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  49. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  50. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  51. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  52. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  53. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  54. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  55. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  56. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  57. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  58. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  59. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  60. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  61. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  62. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  63. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  64. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  65. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  66. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  67. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  68. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  69. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  70. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  71. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  72. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  73. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  74. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  75. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  76. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  77. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  78. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  79. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  80. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  81. {fal-1.50.0 → fal-1.50.2}/openapi-fal-rest/pyproject.toml +0 -0
  82. {fal-1.50.0 → fal-1.50.2}/openapi_rest.config.yaml +0 -0
  83. {fal-1.50.0 → fal-1.50.2}/pyproject.toml +0 -0
  84. {fal-1.50.0 → fal-1.50.2}/setup.cfg +0 -0
  85. {fal-1.50.0 → fal-1.50.2}/src/fal/__init__.py +0 -0
  86. {fal-1.50.0 → fal-1.50.2}/src/fal/__main__.py +0 -0
  87. {fal-1.50.0 → fal-1.50.2}/src/fal/_serialization.py +0 -0
  88. {fal-1.50.0 → fal-1.50.2}/src/fal/_version.py +0 -0
  89. {fal-1.50.0 → fal-1.50.2}/src/fal/api/__init__.py +0 -0
  90. {fal-1.50.0 → fal-1.50.2}/src/fal/api/api.py +0 -0
  91. {fal-1.50.0 → fal-1.50.2}/src/fal/api/apps.py +0 -0
  92. {fal-1.50.0 → fal-1.50.2}/src/fal/api/client.py +0 -0
  93. {fal-1.50.0 → fal-1.50.2}/src/fal/api/deploy.py +0 -0
  94. {fal-1.50.0 → fal-1.50.2}/src/fal/api/runners.py +0 -0
  95. {fal-1.50.0 → fal-1.50.2}/src/fal/app.py +0 -0
  96. {fal-1.50.0 → fal-1.50.2}/src/fal/apps.py +0 -0
  97. {fal-1.50.0 → fal-1.50.2}/src/fal/auth/__init__.py +0 -0
  98. {fal-1.50.0 → fal-1.50.2}/src/fal/auth/auth0.py +0 -0
  99. {fal-1.50.0 → fal-1.50.2}/src/fal/auth/local.py +0 -0
  100. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/__init__.py +0 -0
  101. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/_utils.py +0 -0
  102. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/api.py +0 -0
  103. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/apps.py +0 -0
  104. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/auth.py +0 -0
  105. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/cli_nested_json.py +0 -0
  106. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/create.py +0 -0
  107. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/debug.py +0 -0
  108. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/deploy.py +0 -0
  109. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/doctor.py +0 -0
  110. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/files.py +0 -0
  111. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/keys.py +0 -0
  112. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/main.py +0 -0
  113. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/parser.py +0 -0
  114. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/profile.py +0 -0
  115. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/queue.py +0 -0
  116. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/run.py +0 -0
  117. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/runners.py +0 -0
  118. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/secrets.py +0 -0
  119. {fal-1.50.0 → fal-1.50.2}/src/fal/cli/teams.py +0 -0
  120. {fal-1.50.0 → fal-1.50.2}/src/fal/config.py +0 -0
  121. {fal-1.50.0 → fal-1.50.2}/src/fal/console/__init__.py +0 -0
  122. {fal-1.50.0 → fal-1.50.2}/src/fal/console/icons.py +0 -0
  123. {fal-1.50.0 → fal-1.50.2}/src/fal/console/ux.py +0 -0
  124. {fal-1.50.0 → fal-1.50.2}/src/fal/container.py +0 -0
  125. {fal-1.50.0 → fal-1.50.2}/src/fal/distributed/__init__.py +0 -0
  126. {fal-1.50.0 → fal-1.50.2}/src/fal/distributed/utils.py +0 -0
  127. {fal-1.50.0 → fal-1.50.2}/src/fal/distributed/worker.py +0 -0
  128. {fal-1.50.0 → fal-1.50.2}/src/fal/exceptions/__init__.py +0 -0
  129. {fal-1.50.0 → fal-1.50.2}/src/fal/exceptions/_base.py +0 -0
  130. {fal-1.50.0 → fal-1.50.2}/src/fal/exceptions/_cuda.py +0 -0
  131. {fal-1.50.0 → fal-1.50.2}/src/fal/exceptions/auth.py +0 -0
  132. {fal-1.50.0 → fal-1.50.2}/src/fal/file_sync.py +0 -0
  133. {fal-1.50.0 → fal-1.50.2}/src/fal/flags.py +0 -0
  134. {fal-1.50.0 → fal-1.50.2}/src/fal/logging/__init__.py +0 -0
  135. {fal-1.50.0 → fal-1.50.2}/src/fal/logging/isolate.py +0 -0
  136. {fal-1.50.0 → fal-1.50.2}/src/fal/logging/style.py +0 -0
  137. {fal-1.50.0 → fal-1.50.2}/src/fal/logging/trace.py +0 -0
  138. {fal-1.50.0 → fal-1.50.2}/src/fal/project.py +0 -0
  139. {fal-1.50.0 → fal-1.50.2}/src/fal/py.typed +0 -0
  140. {fal-1.50.0 → fal-1.50.2}/src/fal/rest_client.py +0 -0
  141. {fal-1.50.0 → fal-1.50.2}/src/fal/sdk.py +0 -0
  142. {fal-1.50.0 → fal-1.50.2}/src/fal/sync.py +0 -0
  143. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/__init__.py +0 -0
  144. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/audio/__init__.py +0 -0
  145. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/audio/audio.py +0 -0
  146. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/exceptions.py +0 -0
  147. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/__init__.py +0 -0
  148. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/file.py +0 -0
  149. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/providers/gcp.py +0 -0
  150. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/providers/r2.py +0 -0
  151. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/providers/s3.py +0 -0
  152. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/file/types.py +0 -0
  153. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/__init__.py +0 -0
  154. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/image.py +0 -0
  155. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  156. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  157. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  158. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  159. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  160. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/image/safety_checker.py +0 -0
  161. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/kv.py +0 -0
  162. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/optimize.py +0 -0
  163. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/types.py +0 -0
  164. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/utils/__init__.py +0 -0
  165. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/utils/download_utils.py +0 -0
  166. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/utils/endpoint.py +0 -0
  167. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/utils/retry.py +0 -0
  168. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/utils/setup_utils.py +0 -0
  169. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/video/__init__.py +0 -0
  170. {fal-1.50.0 → fal-1.50.2}/src/fal/toolkit/video/video.py +0 -0
  171. {fal-1.50.0 → fal-1.50.2}/src/fal/utils.py +0 -0
  172. {fal-1.50.0 → fal-1.50.2}/src/fal/workflows.py +0 -0
  173. {fal-1.50.0 → fal-1.50.2}/tests/__init__.py +0 -0
  174. {fal-1.50.0 → fal-1.50.2}/tests/assets/cat.png +0 -0
  175. {fal-1.50.0 → fal-1.50.2}/tests/cli/__init__.py +0 -0
  176. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_apps.py +0 -0
  177. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_auth.py +0 -0
  178. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_deploy.py +0 -0
  179. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_keys.py +0 -0
  180. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_run.py +0 -0
  181. {fal-1.50.0 → fal-1.50.2}/tests/cli/test_secrets.py +0 -0
  182. {fal-1.50.0 → fal-1.50.2}/tests/conftest.py +0 -0
  183. {fal-1.50.0 → fal-1.50.2}/tests/integration_test.py +0 -0
  184. {fal-1.50.0 → fal-1.50.2}/tests/mainify_package/__init__.py +0 -0
  185. {fal-1.50.0 → fal-1.50.2}/tests/mainify_package/impl.py +0 -0
  186. {fal-1.50.0 → fal-1.50.2}/tests/mainify_package/utils.py +0 -0
  187. {fal-1.50.0 → fal-1.50.2}/tests/mainify_target.py +0 -0
  188. {fal-1.50.0 → fal-1.50.2}/tests/test_apps.py +0 -0
  189. {fal-1.50.0 → fal-1.50.2}/tests/test_file_sync.py +0 -0
  190. {fal-1.50.0 → fal-1.50.2}/tests/test_files.py +0 -0
  191. {fal-1.50.0 → fal-1.50.2}/tests/test_kv.py +0 -0
  192. {fal-1.50.0 → fal-1.50.2}/tests/test_stability.py +0 -0
  193. {fal-1.50.0 → fal-1.50.2}/tests/toolkit/file_test.py +0 -0
  194. {fal-1.50.0 → fal-1.50.2}/tests/toolkit/image_test.py +0 -0
  195. {fal-1.50.0 → fal-1.50.2}/tests/toolkit/test_types.py +0 -0
  196. {fal-1.50.0 → fal-1.50.2}/tests/toolkit/utils/retry.py +0 -0
  197. {fal-1.50.0 → fal-1.50.2}/tests/unit/distributed/test_integration.py +0 -0
  198. {fal-1.50.0 → fal-1.50.2}/tests/unit/distributed/test_utils.py +0 -0
  199. {fal-1.50.0 → fal-1.50.2}/tests/unit/distributed/test_worker.py +0 -0
  200. {fal-1.50.0 → fal-1.50.2}/tests/unit/test_app.py +0 -0
  201. {fal-1.50.0 → fal-1.50.2}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.50.0
3
+ Version: 1.50.2
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.50.0
3
+ Version: 1.50.2
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.50.0'
32
- __version_tuple__ = version_tuple = (1, 50, 0)
31
+ __version__ = version = '1.50.2'
32
+ __version_tuple__ = version_tuple = (1, 50, 2)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -224,6 +224,7 @@ class FalFileSystem(AbstractFileSystem):
224
224
  "POST",
225
225
  f"/files/file/url/{abs_rpath}",
226
226
  json={"url": url},
227
+ timeout=10 * 60, # 10 minutes in seconds
227
228
  )
228
229
  self.dircache.clear()
229
230
 
@@ -56,44 +56,21 @@ def _should_retry(exc: Exception) -> bool:
56
56
  return False
57
57
 
58
58
 
59
- class _RetryingRequestContext:
60
- def __init__(self, request: Request, kwargs: dict[str, Any]):
61
- self.request = request
62
- self.kwargs = kwargs
63
- self._cm: Any | None = None
64
- self._response: addinfourl | None = None
65
-
66
- def __enter__(self) -> addinfourl:
67
- def _enter_once() -> addinfourl:
68
- # Obtain the original context manager and explicitly enter it
69
- self._cm = _urlopen(self.request, **self.kwargs)
70
- return self._cm.__enter__()
71
-
72
- _enter_with_retry = retry(
73
- max_retries=MAX_ATTEMPTS,
74
- base_delay=BASE_DELAY,
75
- max_delay=MAX_DELAY,
76
- backoff_type="exponential",
77
- jitter=True,
78
- should_retry=_should_retry,
79
- )(_enter_once)
80
-
81
- self._response = _enter_with_retry()
82
- assert self._response is not None
83
- return self._response
84
-
85
- def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
86
- if self._cm is not None:
87
- return self._cm.__exit__(exc_type, exc_val, exc_tb)
88
- return False
89
-
90
-
91
59
  @contextmanager
92
60
  def _maybe_retry_request(
93
61
  request: Request,
94
62
  **kwargs: Any,
95
63
  ) -> Generator[addinfourl, None, None]:
96
- with _RetryingRequestContext(request, kwargs) as response:
64
+ _urlopen_with_retry = retry(
65
+ max_retries=MAX_ATTEMPTS,
66
+ base_delay=BASE_DELAY,
67
+ max_delay=MAX_DELAY,
68
+ backoff_type="exponential",
69
+ jitter=True,
70
+ should_retry=_should_retry,
71
+ )(_urlopen)
72
+
73
+ with _urlopen_with_retry(request, **kwargs) as response:
97
74
  yield response
98
75
 
99
76
 
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from unittest import mock
4
- from urllib.error import HTTPError, URLError
4
+ from urllib.error import HTTPError
5
5
  from urllib.request import Request
6
6
 
7
7
  import pytest
@@ -163,42 +163,3 @@ def test_max_retries_exhausted_for_retryable_errors():
163
163
 
164
164
  assert exc_info.value.code == 500
165
165
  assert call_count == 5
166
-
167
-
168
- def test_retry_on_urlerror_during_context_enter():
169
- request = Request("https://example.com/test")
170
-
171
- calls = {"open": 0, "enter": 0}
172
-
173
- class EnterRaisesOnce:
174
- def __init__(self):
175
- self.data = b'{"result": "success"}'
176
- self.headers = {"Content-Type": "application/json"}
177
-
178
- def read(self):
179
- return self.data
180
-
181
- def __enter__(self):
182
- calls["enter"] += 1
183
- if calls["enter"] == 1:
184
- raise URLError("Temporary failure in name resolution")
185
- return self
186
-
187
- def __exit__(self, exc_type, exc_val, exc_tb):
188
- return False
189
-
190
- def mock_urlopen_side_effect(*args, **kwargs):
191
- calls["open"] += 1
192
- return EnterRaisesOnce()
193
-
194
- with mock.patch(
195
- "fal.toolkit.file.providers.fal._urlopen", side_effect=mock_urlopen_side_effect
196
- ):
197
- with mock.patch("fal.toolkit.utils.retry.time.sleep"):
198
- # Expect success after a retry (second __enter__ returns normally)
199
- with _maybe_retry_request(request) as response:
200
- assert response is not None
201
-
202
- # Should have attempted to open at least twice due to retry
203
- assert calls["open"] >= 2
204
- assert calls["enter"] >= 2
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
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