fal 1.28.3__tar.gz → 1.29.0__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 (186) hide show
  1. {fal-1.28.3/fal.egg-info → fal-1.29.0}/PKG-INFO +1 -1
  2. {fal-1.28.3 → fal-1.29.0/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.28.3 → fal-1.29.0}/src/fal/_fal_version.py +16 -3
  4. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/apps.py +2 -2
  5. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/deploy.py +7 -4
  6. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/providers/fal.py +6 -1
  7. {fal-1.28.3 → fal-1.29.0}/.gitignore +0 -0
  8. {fal-1.28.3 → fal-1.29.0}/Makefile +0 -0
  9. {fal-1.28.3 → fal-1.29.0}/README.md +0 -0
  10. {fal-1.28.3 → fal-1.29.0}/docs/conf.py +0 -0
  11. {fal-1.28.3 → fal-1.29.0}/docs/index.rst +0 -0
  12. {fal-1.28.3 → fal-1.29.0}/fal.egg-info/SOURCES.txt +0 -0
  13. {fal-1.28.3 → fal-1.29.0}/fal.egg-info/dependency_links.txt +0 -0
  14. {fal-1.28.3 → fal-1.29.0}/fal.egg-info/entry_points.txt +0 -0
  15. {fal-1.28.3 → fal-1.29.0}/fal.egg-info/requires.txt +0 -0
  16. {fal-1.28.3 → fal-1.29.0}/fal.egg-info/top_level.txt +0 -0
  17. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/README.md +0 -0
  18. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  19. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  20. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  21. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  22. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  23. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  24. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  25. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  26. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  27. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  28. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  29. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  30. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  31. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  32. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  33. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  34. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  35. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  36. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  37. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  38. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  39. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  40. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  41. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  42. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  43. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  44. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  45. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  46. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  47. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  48. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  49. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  50. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  51. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  52. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  53. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  54. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  55. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  56. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  57. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  58. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  59. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  60. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  61. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  62. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  63. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  64. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  65. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  66. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  67. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  68. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  69. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  70. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  71. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  72. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  73. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  74. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  75. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  76. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  77. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  78. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  79. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  80. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  81. {fal-1.28.3 → fal-1.29.0}/openapi-fal-rest/pyproject.toml +0 -0
  82. {fal-1.28.3 → fal-1.29.0}/openapi_rest.config.yaml +0 -0
  83. {fal-1.28.3 → fal-1.29.0}/pyproject.toml +0 -0
  84. {fal-1.28.3 → fal-1.29.0}/setup.cfg +0 -0
  85. {fal-1.28.3 → fal-1.29.0}/src/fal/__init__.py +0 -0
  86. {fal-1.28.3 → fal-1.29.0}/src/fal/__main__.py +0 -0
  87. {fal-1.28.3 → fal-1.29.0}/src/fal/_serialization.py +0 -0
  88. {fal-1.28.3 → fal-1.29.0}/src/fal/_version.py +0 -0
  89. {fal-1.28.3 → fal-1.29.0}/src/fal/api.py +0 -0
  90. {fal-1.28.3 → fal-1.29.0}/src/fal/app.py +0 -0
  91. {fal-1.28.3 → fal-1.29.0}/src/fal/apps.py +0 -0
  92. {fal-1.28.3 → fal-1.29.0}/src/fal/auth/__init__.py +0 -0
  93. {fal-1.28.3 → fal-1.29.0}/src/fal/auth/auth0.py +0 -0
  94. {fal-1.28.3 → fal-1.29.0}/src/fal/auth/local.py +0 -0
  95. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/__init__.py +0 -0
  96. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/_utils.py +0 -0
  97. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/api.py +0 -0
  98. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/auth.py +0 -0
  99. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/cli_nested_json.py +0 -0
  100. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/create.py +0 -0
  101. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/debug.py +0 -0
  102. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/doctor.py +0 -0
  103. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/files.py +0 -0
  104. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/keys.py +0 -0
  105. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/main.py +0 -0
  106. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/parser.py +0 -0
  107. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/profile.py +0 -0
  108. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/run.py +0 -0
  109. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/runners.py +0 -0
  110. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/secrets.py +0 -0
  111. {fal-1.28.3 → fal-1.29.0}/src/fal/cli/teams.py +0 -0
  112. {fal-1.28.3 → fal-1.29.0}/src/fal/config.py +0 -0
  113. {fal-1.28.3 → fal-1.29.0}/src/fal/console/__init__.py +0 -0
  114. {fal-1.28.3 → fal-1.29.0}/src/fal/console/icons.py +0 -0
  115. {fal-1.28.3 → fal-1.29.0}/src/fal/console/ux.py +0 -0
  116. {fal-1.28.3 → fal-1.29.0}/src/fal/container.py +0 -0
  117. {fal-1.28.3 → fal-1.29.0}/src/fal/exceptions/__init__.py +0 -0
  118. {fal-1.28.3 → fal-1.29.0}/src/fal/exceptions/_base.py +0 -0
  119. {fal-1.28.3 → fal-1.29.0}/src/fal/exceptions/_cuda.py +0 -0
  120. {fal-1.28.3 → fal-1.29.0}/src/fal/exceptions/auth.py +0 -0
  121. {fal-1.28.3 → fal-1.29.0}/src/fal/files.py +0 -0
  122. {fal-1.28.3 → fal-1.29.0}/src/fal/flags.py +0 -0
  123. {fal-1.28.3 → fal-1.29.0}/src/fal/logging/__init__.py +0 -0
  124. {fal-1.28.3 → fal-1.29.0}/src/fal/logging/isolate.py +0 -0
  125. {fal-1.28.3 → fal-1.29.0}/src/fal/logging/style.py +0 -0
  126. {fal-1.28.3 → fal-1.29.0}/src/fal/logging/trace.py +0 -0
  127. {fal-1.28.3 → fal-1.29.0}/src/fal/logging/user.py +0 -0
  128. {fal-1.28.3 → fal-1.29.0}/src/fal/project.py +0 -0
  129. {fal-1.28.3 → fal-1.29.0}/src/fal/py.typed +0 -0
  130. {fal-1.28.3 → fal-1.29.0}/src/fal/rest_client.py +0 -0
  131. {fal-1.28.3 → fal-1.29.0}/src/fal/sdk.py +0 -0
  132. {fal-1.28.3 → fal-1.29.0}/src/fal/sync.py +0 -0
  133. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/__init__.py +0 -0
  134. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/audio/__init__.py +0 -0
  135. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/audio/audio.py +0 -0
  136. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/exceptions.py +0 -0
  137. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/__init__.py +0 -0
  138. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/file.py +0 -0
  139. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/providers/gcp.py +0 -0
  140. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/providers/r2.py +0 -0
  141. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/providers/s3.py +0 -0
  142. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/file/types.py +0 -0
  143. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/__init__.py +0 -0
  144. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/image.py +0 -0
  145. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  146. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  147. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  148. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  149. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  150. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/image/safety_checker.py +0 -0
  151. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/kv.py +0 -0
  152. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/optimize.py +0 -0
  153. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/types.py +0 -0
  154. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/utils/__init__.py +0 -0
  155. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/utils/download_utils.py +0 -0
  156. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/utils/endpoint.py +0 -0
  157. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/utils/retry.py +0 -0
  158. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/video/__init__.py +0 -0
  159. {fal-1.28.3 → fal-1.29.0}/src/fal/toolkit/video/video.py +0 -0
  160. {fal-1.28.3 → fal-1.29.0}/src/fal/utils.py +0 -0
  161. {fal-1.28.3 → fal-1.29.0}/src/fal/workflows.py +0 -0
  162. {fal-1.28.3 → fal-1.29.0}/tests/__init__.py +0 -0
  163. {fal-1.28.3 → fal-1.29.0}/tests/assets/cat.png +0 -0
  164. {fal-1.28.3 → fal-1.29.0}/tests/cli/__init__.py +0 -0
  165. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_apps.py +0 -0
  166. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_auth.py +0 -0
  167. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_deploy.py +0 -0
  168. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_keys.py +0 -0
  169. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_run.py +0 -0
  170. {fal-1.28.3 → fal-1.29.0}/tests/cli/test_secrets.py +0 -0
  171. {fal-1.28.3 → fal-1.29.0}/tests/conftest.py +0 -0
  172. {fal-1.28.3 → fal-1.29.0}/tests/integration_test.py +0 -0
  173. {fal-1.28.3 → fal-1.29.0}/tests/mainify_package/__init__.py +0 -0
  174. {fal-1.28.3 → fal-1.29.0}/tests/mainify_package/impl.py +0 -0
  175. {fal-1.28.3 → fal-1.29.0}/tests/mainify_package/utils.py +0 -0
  176. {fal-1.28.3 → fal-1.29.0}/tests/mainify_target.py +0 -0
  177. {fal-1.28.3 → fal-1.29.0}/tests/test_apps.py +0 -0
  178. {fal-1.28.3 → fal-1.29.0}/tests/test_files.py +0 -0
  179. {fal-1.28.3 → fal-1.29.0}/tests/test_kv.py +0 -0
  180. {fal-1.28.3 → fal-1.29.0}/tests/test_stability.py +0 -0
  181. {fal-1.28.3 → fal-1.29.0}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  182. {fal-1.28.3 → fal-1.29.0}/tests/toolkit/file_test.py +0 -0
  183. {fal-1.28.3 → fal-1.29.0}/tests/toolkit/image_test.py +0 -0
  184. {fal-1.28.3 → fal-1.29.0}/tests/toolkit/test_types.py +0 -0
  185. {fal-1.28.3 → fal-1.29.0}/tests/toolkit/utils/retry.py +0 -0
  186. {fal-1.28.3 → fal-1.29.0}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.28.3
3
+ Version: 1.29.0
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.28.3
3
+ Version: 1.29.0
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,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '1.28.3'
21
- __version_tuple__ = version_tuple = (1, 28, 3)
31
+ __version__ = version = '1.29.0'
32
+ __version_tuple__ = version_tuple = (1, 29, 0)
33
+
34
+ __commit_id__ = commit_id = None
@@ -69,8 +69,8 @@ def _list(args):
69
69
  args.console.print(table)
70
70
  elif args.output == "json":
71
71
  apps_as_dicts = [asdict(a) for a in apps]
72
- res = json.dumps(apps_as_dicts)
73
- args.console.print({"apps": res})
72
+ res = json.dumps({"apps": apps_as_dicts})
73
+ args.console.print(res)
74
74
 
75
75
 
76
76
  def _add_list_parser(subparsers, parents):
@@ -1,4 +1,5 @@
1
1
  import argparse
2
+ import json
2
3
  from collections import namedtuple
3
4
  from pathlib import Path
4
5
  from typing import Literal, Optional, Tuple, Union
@@ -124,10 +125,12 @@ def _deploy_from_reference(
124
125
 
125
126
  if args.output == "json":
126
127
  args.console.print(
127
- {
128
- "revision": app_id,
129
- "app_name": app_name,
130
- }
128
+ json.dumps(
129
+ {
130
+ "revision": app_id,
131
+ "app_name": app_name,
132
+ }
133
+ )
131
134
  )
132
135
  elif args.output == "pretty":
133
136
  args.console.print(
@@ -10,7 +10,7 @@ from dataclasses import dataclass
10
10
  from datetime import datetime, timezone
11
11
  from pathlib import Path
12
12
  from typing import Any, Dict, Generator, Generic, TypeVar
13
- from urllib.error import HTTPError
13
+ from urllib.error import HTTPError, URLError
14
14
  from urllib.parse import urlparse, urlunparse
15
15
  from urllib.request import Request, urlopen
16
16
  from urllib.response import addinfourl
@@ -44,6 +44,11 @@ def _urlopen(
44
44
  def _should_retry(exc: Exception) -> bool:
45
45
  if isinstance(exc, HTTPError) and exc.code in RETRY_CODES:
46
46
  return True
47
+ elif type(exc) is URLError:
48
+ # URLError is a base class for other errors,
49
+ # but it can be raised directly, e.g.
50
+ # URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
51
+ return True
47
52
 
48
53
  if isinstance(exc, TimeoutError):
49
54
  return True
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