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 +2 -2
- fal/cli/_utils.py +5 -1
- fal/toolkit/file/providers/fal.py +14 -11
- {fal-1.4.0.dist-info → fal-1.4.1.dist-info}/METADATA +1 -1
- {fal-1.4.0.dist-info → fal-1.4.1.dist-info}/RECORD +8 -8
- {fal-1.4.0.dist-info → fal-1.4.1.dist-info}/WHEEL +1 -1
- {fal-1.4.0.dist-info → fal-1.4.1.dist-info}/entry_points.txt +0 -0
- {fal-1.4.0.dist-info → fal-1.4.1.dist-info}/top_level.txt +0 -0
fal/_fal_version.py
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
287
|
+
storage_url = f"{token.base_upload_url}/upload"
|
|
285
288
|
|
|
286
289
|
try:
|
|
287
290
|
req = Request(
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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.
|
|
130
|
-
fal-1.4.
|
|
131
|
-
fal-1.4.
|
|
132
|
-
fal-1.4.
|
|
133
|
-
fal-1.4.
|
|
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,,
|
|
File without changes
|
|
File without changes
|