fal 1.4.0__py3-none-any.whl → 1.4.1__py3-none-any.whl

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.

fal/_fal_version.py CHANGED
@@ -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)
fal/cli/_utils.py CHANGED
@@ -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(
@@ -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
  fal/__init__.py,sha256=wXs1G0gSc7ZK60-bHe-B2m0l_sA6TrFk4BxY0tMoLe8,784
2
2
  fal/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83
3
- fal/_fal_version.py,sha256=R8-T9fmURjcuoxYpHTAjyNAhgJPDtI2jogCjqYYkfCU,411
3
+ fal/_fal_version.py,sha256=oFZsPxoSsCY6D2DiWMSueNvMDRRQN5ssWrPdQtlLJ_o,411
4
4
  fal/_serialization.py,sha256=rD2YiSa8iuzCaZohZwN_MPEB-PpSKbWRDeaIDpTEjyY,7653
5
5
  fal/_version.py,sha256=EBGqrknaf1WygENX-H4fBefLvHryvJBBGtVJetaB0NY,266
6
6
  fal/api.py,sha256=EuHMoWJ-LUP46moTQCXoBlzXlXCfdb0YQR7zsM694jQ,42513
@@ -19,7 +19,7 @@ fal/auth/__init__.py,sha256=r8iA2-5ih7-Fik3gEC4HEWNFbGoxpYnXpZu1icPIoS0,3561
19
19
  fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
20
20
  fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
21
21
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
22
- fal/cli/_utils.py,sha256=DSfHZ6qna4jLffs-N4F3XbV-9ydF_OSlP2-GRounWsY,911
22
+ fal/cli/_utils.py,sha256=Fxq-tmYIgNDYwWtL7vMmJVDQn7Y2kA_ePmss48FPelo,1084
23
23
  fal/cli/apps.py,sha256=-DDp-Gvxz5kHho5YjAhbri8vOny_9cftAI_wP2KR5nU,8175
24
24
  fal/cli/auth.py,sha256=--MhfHGwxmtHbRkGioyn1prKn_U-pBzbz0G_QeZou-U,1352
25
25
  fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
@@ -49,7 +49,7 @@ fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
49
49
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
50
50
  fal/toolkit/file/file.py,sha256=jGdaIHMoYRCwsui3q3J6RTnngBG1-53UeJa0k_bBO2M,7756
51
51
  fal/toolkit/file/types.py,sha256=GymH0CJesJvsZ6wph7GqTGTuNjzvyMgLxQmBBxoKzS0,1627
52
- fal/toolkit/file/providers/fal.py,sha256=4uIc-SdOo43kanirNBReXls8mbifxIcXLaZJQJ5UMcQ,12534
52
+ fal/toolkit/file/providers/fal.py,sha256=f07ps_P8qyYCeLA9fDnG46c7uIfDZOgbL7MD5LxTUQs,12677
53
53
  fal/toolkit/file/providers/gcp.py,sha256=cxG1j3yuOpFl_Dl_nCEibFE4677qkdXZhuKgb65PnjQ,2126
54
54
  fal/toolkit/file/providers/r2.py,sha256=Y3DjhpmrbESUTDUtVcKtg0NMKamMTevf6cJA7OgvalI,2750
55
55
  fal/toolkit/image/__init__.py,sha256=aLcU8HzD7HyOxx-C-Bbx9kYCMHdBhy9tR98FSVJ6gSA,1830
@@ -126,8 +126,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
126
126
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
127
127
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
128
128
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
129
- fal-1.4.0.dist-info/METADATA,sha256=ojpG29xyDDwvd7GB440xIkUa8AkeDhfy-IGQgpNKp3I,3787
130
- fal-1.4.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
131
- fal-1.4.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
132
- fal-1.4.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
133
- fal-1.4.0.dist-info/RECORD,,
129
+ fal-1.4.1.dist-info/METADATA,sha256=2ZAk-oh2yPEg9Ib638qsxPKm8HXkDtWJNRSq_mSNTwI,3787
130
+ fal-1.4.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
131
+ fal-1.4.1.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
132
+ fal-1.4.1.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
133
+ fal-1.4.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5