fal 1.34.0__py3-none-any.whl → 1.35.0__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
@@ -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.34.0'
32
- __version_tuple__ = version_tuple = (1, 34, 0)
31
+ __version__ = version = '1.35.0'
32
+ __version_tuple__ = version_tuple = (1, 35, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
fal/cli/apps.py CHANGED
@@ -8,7 +8,7 @@ import fal.cli.runners as runners
8
8
  from fal.sdk import RunnerState
9
9
 
10
10
  from ._utils import get_client
11
- from .parser import FalClientParser
11
+ from .parser import FalClientParser, get_output_parser
12
12
 
13
13
  if TYPE_CHECKING:
14
14
  from fal.sdk import AliasInfo, ApplicationInfo
@@ -72,6 +72,8 @@ def _list(args):
72
72
  apps_as_dicts = [asdict(a) for a in apps]
73
73
  res = json.dumps({"apps": apps_as_dicts})
74
74
  args.console.print(res)
75
+ else:
76
+ raise AssertionError(f"Invalid output format: {args.output}")
75
77
 
76
78
 
77
79
  def _add_list_parser(subparsers, parents):
@@ -80,7 +82,7 @@ def _add_list_parser(subparsers, parents):
80
82
  "list",
81
83
  description=list_help,
82
84
  help=list_help,
83
- parents=parents,
85
+ parents=[*parents, get_output_parser()],
84
86
  )
85
87
  parser.add_argument(
86
88
  "--sort-by-runners",
@@ -92,13 +94,6 @@ def _add_list_parser(subparsers, parents):
92
94
  type=str,
93
95
  help="Filter applications by alias contents",
94
96
  )
95
- parser.add_argument(
96
- "--output",
97
- type=str,
98
- default="pretty",
99
- choices=["pretty", "json"],
100
- help="Modify the command output",
101
- )
102
97
  parser.set_defaults(func=_list)
103
98
 
104
99
 
fal/cli/deploy.py CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
  from typing import Literal, Optional, Tuple, Union
6
6
 
7
7
  from ._utils import get_app_data_from_toml, is_app_name
8
- from .parser import FalClientParser, RefAction
8
+ from .parser import FalClientParser, RefAction, get_output_parser
9
9
 
10
10
  User = namedtuple("User", ["user_id", "username"])
11
11
 
@@ -152,6 +152,8 @@ def _deploy_from_reference(
152
152
  args.console.print(
153
153
  f"\thttps://queue.{endpoint_host}/{user.username}/{app_name}{endpoint}"
154
154
  )
155
+ else:
156
+ raise AssertionError(f"Invalid output format: {args.output}")
155
157
 
156
158
 
157
159
  def _deploy(args):
@@ -211,7 +213,11 @@ def add_parser(main_subparsers, parents):
211
213
 
212
214
  parser = main_subparsers.add_parser(
213
215
  "deploy",
214
- parents=[*parents, FalClientParser(add_help=False)],
216
+ parents=[
217
+ *parents,
218
+ get_output_parser(),
219
+ FalClientParser(add_help=False),
220
+ ],
215
221
  description=deploy_help,
216
222
  help=deploy_help,
217
223
  epilog=epilog,
@@ -261,12 +267,5 @@ def add_parser(main_subparsers, parents):
261
267
  dest="app_scale_settings",
262
268
  help="Use the application code for scale settings.",
263
269
  )
264
- parser.add_argument(
265
- "--output",
266
- type=str,
267
- default="pretty",
268
- choices=["pretty", "json"],
269
- help="Modify the command output",
270
- )
271
270
 
272
271
  parser.set_defaults(func=_deploy)
fal/cli/parser.py CHANGED
@@ -103,3 +103,16 @@ class FalClientParser(FalParser):
103
103
  "--team",
104
104
  help="The team to use.",
105
105
  )
106
+
107
+
108
+ def get_output_parser():
109
+ parser = FalParser(add_help=False)
110
+ group = parser.add_argument_group(title="Output")
111
+ group.add_argument(
112
+ "--output",
113
+ type=str,
114
+ default="pretty",
115
+ choices=["pretty", "json"],
116
+ help="Modify the command output",
117
+ )
118
+ return parser
fal/cli/runners.py CHANGED
@@ -1,11 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  from typing import List
4
5
 
5
6
  from fal.sdk import RunnerInfo, RunnerState
6
7
 
7
8
  from ._utils import get_client
8
- from .parser import FalClientParser
9
+ from .parser import FalClientParser, get_output_parser
9
10
 
10
11
 
11
12
  def runners_table(runners: List[RunnerInfo]):
@@ -80,6 +81,26 @@ def _kill(args):
80
81
  connection.kill_runner(args.id)
81
82
 
82
83
 
84
+ def _list_json(args, runners: list[RunnerInfo], pending_runners: list[RunnerInfo]):
85
+ json_runners = [
86
+ {
87
+ "alias": r.alias,
88
+ "runner_id": r.runner_id,
89
+ "in_flight_requests": r.in_flight_requests,
90
+ "expiration_countdown": r.expiration_countdown,
91
+ "uptime_seconds": int(r.uptime.total_seconds()),
92
+ "revision": r.revision,
93
+ "state": r.state.value,
94
+ }
95
+ for r in runners
96
+ ]
97
+
98
+ res = {
99
+ "runners": json_runners,
100
+ }
101
+ args.console.print(json.dumps(res))
102
+
103
+
83
104
  def _list(args):
84
105
  client = get_client(args.host, args.team)
85
106
  with client.connect() as connection:
@@ -87,13 +108,18 @@ def _list(args):
87
108
  pending_runners = [
88
109
  runner for runner in runners if runner.state == RunnerState.PENDING
89
110
  ]
90
- args.console.print(f"Runners: {len(runners) - len(pending_runners)}")
91
- args.console.print(f"Pending Runners: {len(pending_runners)}")
92
- args.console.print(runners_table(runners))
111
+ if args.output == "pretty":
112
+ args.console.print(f"Runners: {len(runners) - len(pending_runners)}")
113
+ args.console.print(f"Pending Runners: {len(pending_runners)}")
114
+ args.console.print(runners_table(runners))
93
115
 
94
- requests_table = runners_requests_table(runners)
95
- args.console.print(f"Requests: {len(requests_table.rows)}")
96
- args.console.print(requests_table)
116
+ requests_table = runners_requests_table(runners)
117
+ args.console.print(f"Requests: {len(requests_table.rows)}")
118
+ args.console.print(requests_table)
119
+ elif args.output == "json":
120
+ _list_json(args, runners, pending_runners)
121
+ else:
122
+ raise AssertionError(f"Invalid output format: {args.output}")
97
123
 
98
124
 
99
125
  def _add_kill_parser(subparsers, parents):
@@ -117,7 +143,7 @@ def _add_list_parser(subparsers, parents):
117
143
  "list",
118
144
  description=list_help,
119
145
  help=list_help,
120
- parents=parents,
146
+ parents=[*parents, get_output_parser()],
121
147
  )
122
148
  parser.set_defaults(func=_list)
123
149
 
fal/console/__init__.py CHANGED
@@ -3,4 +3,4 @@ from __future__ import annotations
3
3
  from rich.console import Console
4
4
  from rich.theme import Theme
5
5
 
6
- console = Console(theme=Theme())
6
+ console = Console(theme=Theme(), soft_wrap=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.34.0
3
+ Version: 1.35.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
  fal/__init__.py,sha256=wXs1G0gSc7ZK60-bHe-B2m0l_sA6TrFk4BxY0tMoLe8,784
2
2
  fal/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83
3
- fal/_fal_version.py,sha256=yXxWIBVorAnMk5u-Uybx5dc-ngRbzkI76WdbILHvKUI,706
3
+ fal/_fal_version.py,sha256=fEVxpsnggVq-NSPWN73JVJO3FDQoAjIv54D7dJagIpE,706
4
4
  fal/_serialization.py,sha256=npXNsFJ5G7jzBeBIyVMH01Ww34mGY4XWhHpRbSrTtnQ,7598
5
5
  fal/_version.py,sha256=1BbTFnucNC_6ldKJ_ZoC722_UkW4S9aDBSW9L0fkKAw,2315
6
6
  fal/api.py,sha256=oWSPxefwyYF93s54mtyYGKWYMax9ll9B-wxijOyARb4,49244
@@ -23,23 +23,23 @@ fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
23
23
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
24
24
  fal/cli/_utils.py,sha256=ulYezhr3G29nTIF8MDQ6tsW01Oj1zPo-YSqMoBi05Ic,1871
25
25
  fal/cli/api.py,sha256=ZuDE_PIC-czzneTAWMwvC7P7WnwIyluNZSuJqzCFhqI,2640
26
- fal/cli/apps.py,sha256=pty0v0RIihCeKl1xG9NWIUMTWGhGUJf452x58EfBL-M,11242
26
+ fal/cli/apps.py,sha256=9eflKmU0J3FTF87jSambA4xuNa6-M2nS4S3ZjOvXpvg,11200
27
27
  fal/cli/auth.py,sha256=Qe-Z3ycXJnOzHimz5PjCQYoni8MF4csmdL19yGN7a1o,5171
28
28
  fal/cli/cli_nested_json.py,sha256=veSZU8_bYV3Iu1PAoxt-4BMBraNIqgH5nughbs2UKvE,13539
29
29
  fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
30
30
  fal/cli/debug.py,sha256=mTCjSpEZaNKcX225VZtry-BspFKSHURUuxUFuX6x5Cc,1488
31
- fal/cli/deploy.py,sha256=JAUi9FtN58pGk3_2JPd84h-RKurLatRjAUxL_Oe0vWo,8701
31
+ fal/cli/deploy.py,sha256=aezafp-g8vvLoARl1i84uGd-zIR1TtlSKi9E0dm-Z7E,8703
32
32
  fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
33
33
  fal/cli/files.py,sha256=-j0q4g53A7CWSczGLdfeUCTSd4zXoV3pfZFdman7JOw,3450
34
34
  fal/cli/keys.py,sha256=7Sf4DT4le89G42eAOt0ltRjbZAtE70AVQ62hmjZhUy0,3059
35
35
  fal/cli/main.py,sha256=s_LxEyz9z64dewk3oiGEI33_h3vJ3IVdu8aY3qydkMo,3345
36
- fal/cli/parser.py,sha256=jYsGQ0BLQuKI7KtN1jnLVYKMbLtez7hPjwTNfG3UPSk,2964
36
+ fal/cli/parser.py,sha256=PyD6Fv8xx0x4iD9OEtls9jSQImdYhgxMPW3UMGdsun8,3274
37
37
  fal/cli/profile.py,sha256=agyGFQRLHOtzJEdN3Pn9317rg044XaszNCZrf0ELK-8,6016
38
38
  fal/cli/run.py,sha256=nAC12Qss4Fg1XmV0qOS9RdGNLYcdoHeRgQMvbTN4P9I,1202
39
- fal/cli/runners.py,sha256=4knYZLG5WagdHoBUpjVsh_8BXHebU_rAtlRyRmJDZWI,3976
39
+ fal/cli/runners.py,sha256=IssWo5lhySLl9yRbpYdmWn3llkChdqTDhwWfqHxco-Y,4837
40
40
  fal/cli/secrets.py,sha256=QKSmazu-wiNF6fOpGL9v2TDYxAjX9KTi7ot7vnv6f5E,2474
41
41
  fal/cli/teams.py,sha256=6fR2rKJtiUJPThP7QsO4NLo9UdhUxraGvQZk3_Di6Ow,1218
42
- fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
42
+ fal/console/__init__.py,sha256=lGPUuTqIM9IKTa1cyyA-MA2iZJKVHp2YydsITZVlb6g,148
43
43
  fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
44
44
  fal/console/ux.py,sha256=KMQs3UHQvVHDxDQQqlot-WskVKoMQXOE3jiVkkfmIMY,356
45
45
  fal/exceptions/__init__.py,sha256=m2okJEpax11mnwmoqO_pCGtbt-FvzKiiuMhKo2ok-_8,270
@@ -143,8 +143,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
143
143
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
144
144
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
145
145
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
146
- fal-1.34.0.dist-info/METADATA,sha256=kW8btT1bvl7HuLMEnnzrd1HcmF6ZkEV21je4jmc_SLU,4054
147
- fal-1.34.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
148
- fal-1.34.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
149
- fal-1.34.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
150
- fal-1.34.0.dist-info/RECORD,,
146
+ fal-1.35.0.dist-info/METADATA,sha256=xW5NzNmxI3-XwxpsLMII25JT-mpw_pbHfvumwU2D6Y8,4054
147
+ fal-1.35.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
148
+ fal-1.35.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
149
+ fal-1.35.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
150
+ fal-1.35.0.dist-info/RECORD,,
File without changes