fal 1.4.0__tar.gz → 1.4.1__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 fal might be problematic. Click here for more details.

Files changed (162) hide show
  1. {fal-1.4.0 → fal-1.4.1}/PKG-INFO +1 -1
  2. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/PKG-INFO +1 -1
  3. {fal-1.4.0 → fal-1.4.1}/src/fal/_fal_version.py +2 -2
  4. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/_utils.py +5 -1
  5. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/providers/fal.py +14 -11
  6. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_deploy.py +13 -2
  7. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_run.py +5 -2
  8. {fal-1.4.0 → fal-1.4.1}/.gitignore +0 -0
  9. {fal-1.4.0 → fal-1.4.1}/README.md +0 -0
  10. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/SOURCES.txt +0 -0
  11. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/dependency_links.txt +0 -0
  12. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/entry_points.txt +0 -0
  13. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/requires.txt +0 -0
  14. {fal-1.4.0 → fal-1.4.1}/fal.egg-info/top_level.txt +0 -0
  15. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/README.md +0 -0
  16. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  17. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  18. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  19. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  20. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  21. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  22. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  23. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  24. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  25. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  26. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  27. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  28. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  29. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  30. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  31. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  32. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  33. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  34. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  35. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  36. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  37. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  38. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  39. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  40. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  41. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  42. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  43. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  44. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  45. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  46. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  47. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  48. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  49. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  50. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  51. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  52. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  53. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  54. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  55. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  56. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  57. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  58. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  59. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  60. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  61. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  62. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  63. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  64. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  65. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  66. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  67. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  68. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  69. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  70. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  71. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  72. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  73. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  74. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  75. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  76. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  77. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  78. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  79. {fal-1.4.0 → fal-1.4.1}/openapi-fal-rest/pyproject.toml +0 -0
  80. {fal-1.4.0 → fal-1.4.1}/openapi_rest.config.yaml +0 -0
  81. {fal-1.4.0 → fal-1.4.1}/pyproject.toml +0 -0
  82. {fal-1.4.0 → fal-1.4.1}/setup.cfg +0 -0
  83. {fal-1.4.0 → fal-1.4.1}/src/fal/__init__.py +0 -0
  84. {fal-1.4.0 → fal-1.4.1}/src/fal/__main__.py +0 -0
  85. {fal-1.4.0 → fal-1.4.1}/src/fal/_serialization.py +0 -0
  86. {fal-1.4.0 → fal-1.4.1}/src/fal/_version.py +0 -0
  87. {fal-1.4.0 → fal-1.4.1}/src/fal/api.py +0 -0
  88. {fal-1.4.0 → fal-1.4.1}/src/fal/app.py +0 -0
  89. {fal-1.4.0 → fal-1.4.1}/src/fal/apps.py +0 -0
  90. {fal-1.4.0 → fal-1.4.1}/src/fal/auth/__init__.py +0 -0
  91. {fal-1.4.0 → fal-1.4.1}/src/fal/auth/auth0.py +0 -0
  92. {fal-1.4.0 → fal-1.4.1}/src/fal/auth/local.py +0 -0
  93. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/__init__.py +0 -0
  94. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/apps.py +0 -0
  95. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/auth.py +0 -0
  96. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/create.py +0 -0
  97. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/debug.py +0 -0
  98. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/deploy.py +0 -0
  99. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/doctor.py +0 -0
  100. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/keys.py +0 -0
  101. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/main.py +0 -0
  102. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/parser.py +0 -0
  103. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/run.py +0 -0
  104. {fal-1.4.0 → fal-1.4.1}/src/fal/cli/secrets.py +0 -0
  105. {fal-1.4.0 → fal-1.4.1}/src/fal/console/__init__.py +0 -0
  106. {fal-1.4.0 → fal-1.4.1}/src/fal/console/icons.py +0 -0
  107. {fal-1.4.0 → fal-1.4.1}/src/fal/console/ux.py +0 -0
  108. {fal-1.4.0 → fal-1.4.1}/src/fal/container.py +0 -0
  109. {fal-1.4.0 → fal-1.4.1}/src/fal/exceptions/__init__.py +0 -0
  110. {fal-1.4.0 → fal-1.4.1}/src/fal/exceptions/_base.py +0 -0
  111. {fal-1.4.0 → fal-1.4.1}/src/fal/exceptions/_cuda.py +0 -0
  112. {fal-1.4.0 → fal-1.4.1}/src/fal/exceptions/auth.py +0 -0
  113. {fal-1.4.0 → fal-1.4.1}/src/fal/files.py +0 -0
  114. {fal-1.4.0 → fal-1.4.1}/src/fal/flags.py +0 -0
  115. {fal-1.4.0 → fal-1.4.1}/src/fal/logging/__init__.py +0 -0
  116. {fal-1.4.0 → fal-1.4.1}/src/fal/logging/isolate.py +0 -0
  117. {fal-1.4.0 → fal-1.4.1}/src/fal/logging/style.py +0 -0
  118. {fal-1.4.0 → fal-1.4.1}/src/fal/logging/trace.py +0 -0
  119. {fal-1.4.0 → fal-1.4.1}/src/fal/logging/user.py +0 -0
  120. {fal-1.4.0 → fal-1.4.1}/src/fal/py.typed +0 -0
  121. {fal-1.4.0 → fal-1.4.1}/src/fal/rest_client.py +0 -0
  122. {fal-1.4.0 → fal-1.4.1}/src/fal/sdk.py +0 -0
  123. {fal-1.4.0 → fal-1.4.1}/src/fal/sync.py +0 -0
  124. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/__init__.py +0 -0
  125. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/exceptions.py +0 -0
  126. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/__init__.py +0 -0
  127. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/file.py +0 -0
  128. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  129. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  130. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/file/types.py +0 -0
  131. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/__init__.py +0 -0
  132. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/image.py +0 -0
  133. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  134. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  135. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  136. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  137. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  138. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  139. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/optimize.py +0 -0
  140. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/utils/__init__.py +0 -0
  141. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/utils/download_utils.py +0 -0
  142. {fal-1.4.0 → fal-1.4.1}/src/fal/toolkit/utils/retry.py +0 -0
  143. {fal-1.4.0 → fal-1.4.1}/src/fal/utils.py +0 -0
  144. {fal-1.4.0 → fal-1.4.1}/src/fal/workflows.py +0 -0
  145. {fal-1.4.0 → fal-1.4.1}/tests/__init__.py +0 -0
  146. {fal-1.4.0 → fal-1.4.1}/tests/cli/__init__.py +0 -0
  147. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_apps.py +0 -0
  148. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_auth.py +0 -0
  149. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_keys.py +0 -0
  150. {fal-1.4.0 → fal-1.4.1}/tests/cli/test_secrets.py +0 -0
  151. {fal-1.4.0 → fal-1.4.1}/tests/conftest.py +0 -0
  152. {fal-1.4.0 → fal-1.4.1}/tests/integration_test.py +0 -0
  153. {fal-1.4.0 → fal-1.4.1}/tests/mainify_package/__init__.py +0 -0
  154. {fal-1.4.0 → fal-1.4.1}/tests/mainify_package/impl.py +0 -0
  155. {fal-1.4.0 → fal-1.4.1}/tests/mainify_package/utils.py +0 -0
  156. {fal-1.4.0 → fal-1.4.1}/tests/mainify_target.py +0 -0
  157. {fal-1.4.0 → fal-1.4.1}/tests/test_apps.py +0 -0
  158. {fal-1.4.0 → fal-1.4.1}/tests/test_stability.py +0 -0
  159. {fal-1.4.0 → fal-1.4.1}/tests/toolkit/file_test.py +0 -0
  160. {fal-1.4.0 → fal-1.4.1}/tests/toolkit/image_test.py +0 -0
  161. {fal-1.4.0 → fal-1.4.1}/tests/toolkit/utils/retry.py +0 -0
  162. {fal-1.4.0 → fal-1.4.1}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.4.0
3
+ Version: 1.4.1
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.1
2
2
  Name: fal
3
- Version: 1.4.0
3
+ Version: 1.4.1
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
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.4.0'
16
- __version_tuple__ = version_tuple = (1, 4, 0)
15
+ __version__ = version = '1.4.1'
16
+ __version_tuple__ = version_tuple = (1, 4, 1)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from fal.files import find_pyproject_toml, parse_pyproject_toml
3
+ from fal.files import find_project_root, find_pyproject_toml, parse_pyproject_toml
4
4
 
5
5
 
6
6
  def is_app_name(app_ref: tuple[str, str | None]) -> bool:
@@ -29,6 +29,10 @@ def get_app_data_from_toml(app_name):
29
29
  except KeyError:
30
30
  raise ValueError(f"App {app_name} does not have a ref key in pyproject.toml")
31
31
 
32
+ # Convert the app_ref to a path relative to the project root
33
+ project_root, _ = find_project_root(None)
34
+ app_ref = str(project_root / app_ref)
35
+
32
36
  app_auth = app_data.get("auth", "private")
33
37
 
34
38
  return app_ref, app_auth
@@ -10,6 +10,7 @@ from dataclasses import dataclass
10
10
  from datetime import datetime, timezone
11
11
  from pathlib import Path
12
12
  from urllib.error import HTTPError
13
+ from urllib.parse import urlparse, urlunparse
13
14
  from urllib.request import Request, urlopen
14
15
 
15
16
  from fal.auth import key_credentials
@@ -24,7 +25,7 @@ _FAL_CDN = "https://fal.media"
24
25
  class FalV2Token:
25
26
  token: str
26
27
  token_type: str
27
- base_url: str
28
+ base_upload_url: str
28
29
  expires_at: datetime
29
30
 
30
31
  def is_expired(self) -> bool:
@@ -36,7 +37,7 @@ class FalV2TokenManager:
36
37
  self._token: FalV2Token = FalV2Token(
37
38
  token="",
38
39
  token_type="",
39
- base_url="",
40
+ base_upload_url="",
40
41
  expires_at=datetime.min.replace(tzinfo=timezone.utc),
41
42
  )
42
43
  self._lock: threading.Lock = threading.Lock()
@@ -72,10 +73,15 @@ class FalV2TokenManager:
72
73
  with urlopen(req) as response:
73
74
  result = json.load(response)
74
75
 
76
+ parsed_base_url = urlparse(result["base_url"])
77
+ base_upload_url = urlunparse(
78
+ parsed_base_url._replace(netloc="upload." + parsed_base_url.netloc)
79
+ )
80
+
75
81
  self._token = FalV2Token(
76
82
  token=result["token"],
77
83
  token_type=result["token_type"],
78
- base_url=result["base_url"],
84
+ base_upload_url=base_upload_url,
79
85
  expires_at=datetime.fromisoformat(result["expires_at"]),
80
86
  )
81
87
 
@@ -179,7 +185,7 @@ class MultipartUpload:
179
185
  token = fal_v2_token_manager.get_token()
180
186
  try:
181
187
  req = Request(
182
- f"{token.base_url}/upload/initiate-multipart",
188
+ f"{token.base_upload_url}/upload/initiate-multipart",
183
189
  method="POST",
184
190
  headers={
185
191
  "Authorization": f"{token.token_type} {token.token}",
@@ -195,7 +201,7 @@ class MultipartUpload:
195
201
  )
196
202
  with urlopen(req) as response:
197
203
  result = json.load(response)
198
- self._upload_id = result["upload_id"]
204
+ self._upload_url = result["upload_url"]
199
205
  self._file_url = result["file_url"]
200
206
  except HTTPError as exc:
201
207
  raise FileUploadException(
@@ -235,10 +241,7 @@ class MultipartUpload:
235
241
  ) as executor:
236
242
  futures = []
237
243
  for part_number in range(1, parts + 1):
238
- upload_url = (
239
- f"{self._file_url}?upload_id={self._upload_id}"
240
- f"&part_number={part_number}"
241
- )
244
+ upload_url = f"{self._upload_url}&part_number={part_number}"
242
245
  futures.append(
243
246
  executor.submit(self._upload_part, upload_url, part_number)
244
247
  )
@@ -248,7 +251,7 @@ class MultipartUpload:
248
251
  self._parts.append(entry)
249
252
 
250
253
  def complete(self):
251
- url = f"{self._file_url}?upload_id={self._upload_id}"
254
+ url = self._upload_url
252
255
  try:
253
256
  req = Request(
254
257
  url,
@@ -281,7 +284,7 @@ class FalFileRepositoryV2(FalFileRepositoryBase):
281
284
  "Content-Type": file.content_type,
282
285
  }
283
286
 
284
- storage_url = f"{token.base_url}/upload"
287
+ storage_url = f"{token.base_upload_url}/upload"
285
288
 
286
289
  try:
287
290
  req = Request(
@@ -4,6 +4,7 @@ from unittest.mock import MagicMock, patch
4
4
  import pytest
5
5
  from fal.cli.deploy import _deploy
6
6
  from fal.cli.main import parse_args
7
+ from fal.files import find_project_root
7
8
 
8
9
 
9
10
  def test_deploy():
@@ -53,9 +54,14 @@ def test_deploy_with_toml_success(
53
54
 
54
55
  _deploy(args)
55
56
 
57
+ project_root, _ = find_project_root(None)
58
+
56
59
  # Ensure the correct app is deployed
57
60
  mock_deploy_ref.assert_called_once_with(
58
- ("src/my_app/inference.py", "MyApp"), "my-app", "shared", args
61
+ (f"{project_root / 'src/my_app/inference.py'}", "MyApp"),
62
+ "my-app",
63
+ "shared",
64
+ args,
59
65
  )
60
66
 
61
67
 
@@ -72,9 +78,14 @@ def test_deploy_with_toml_no_auth(
72
78
 
73
79
  _deploy(args)
74
80
 
81
+ project_root, _ = find_project_root(None)
82
+
75
83
  # Since auth is not provided for "another-app", it should default to "private"
76
84
  mock_deploy_ref.assert_called_once_with(
77
- ("src/another_app/inference.py", "AnotherApp"), "another-app", "private", args
85
+ (f"{project_root / 'src/another_app/inference.py'}", "AnotherApp"),
86
+ "another-app",
87
+ "private",
88
+ args,
78
89
  )
79
90
 
80
91
 
@@ -3,6 +3,7 @@ from unittest.mock import MagicMock, patch
3
3
  import pytest
4
4
  from fal.cli.main import parse_args
5
5
  from fal.cli.run import _run
6
+ from fal.files import find_project_root
6
7
 
7
8
 
8
9
  def test_run():
@@ -60,9 +61,11 @@ def test_run_with_toml_success(
60
61
 
61
62
  _run(args)
62
63
 
63
- # Ensure the correct app is deployed
64
+ project_root, _ = find_project_root(None)
65
+
66
+ # Ensure the correct app is ran
64
67
  mock_load_function_from.assert_called_once_with(
65
- host, "src/my_app/inference.py", "MyApp"
68
+ host, f"{project_root / 'src/my_app/inference.py'}", "MyApp"
66
69
  )
67
70
 
68
71
 
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