fal 0.12.6__tar.gz → 0.12.7__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 (89) hide show
  1. {fal-0.12.6 → fal-0.12.7}/PKG-INFO +2 -1
  2. {fal-0.12.6 → fal-0.12.7}/pyproject.toml +1 -1
  3. {fal-0.12.6 → fal-0.12.7}/src/fal/_serialization.py +28 -0
  4. {fal-0.12.6 → fal-0.12.7}/src/fal/api.py +35 -3
  5. {fal-0.12.6 → fal-0.12.7}/src/fal/cli.py +2 -0
  6. {fal-0.12.6 → fal-0.12.7}/src/fal/exceptions/__init__.py +2 -0
  7. {fal-0.12.6 → fal-0.12.7}/src/fal/exceptions/handlers.py +24 -1
  8. fal-0.12.6/setup.py +0 -90
  9. {fal-0.12.6 → fal-0.12.7}/README.md +0 -0
  10. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  11. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  12. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  13. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  14. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  15. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  16. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  17. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  18. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  19. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  20. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_or_update_workflow_workflows_post.py +0 -0
  21. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow_workflows_user_id_workflow_name_delete.py +0 -0
  22. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/execute_workflow_workflows_user_id_workflow_name_post.py +0 -0
  23. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow_workflows_user_id_workflow_name_get.py +0 -0
  24. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflows_workflows_get.py +0 -0
  25. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  26. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  27. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  28. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  29. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  30. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  31. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_json_body_type_0.py +0 -0
  32. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_response_200_type_0.py +0 -0
  33. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  34. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  35. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  36. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  37. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  38. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  39. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  40. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  41. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  42. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  43. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents_type_0.py +0 -0
  44. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  45. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  46. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  47. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  48. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  49. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  50. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  51. {fal-0.12.6 → fal-0.12.7}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  52. {fal-0.12.6 → fal-0.12.7}/src/fal/__init__.py +0 -0
  53. {fal-0.12.6 → fal-0.12.7}/src/fal/__main__.py +0 -0
  54. {fal-0.12.6 → fal-0.12.7}/src/fal/app.py +0 -0
  55. {fal-0.12.6 → fal-0.12.7}/src/fal/apps.py +0 -0
  56. {fal-0.12.6 → fal-0.12.7}/src/fal/auth/__init__.py +0 -0
  57. {fal-0.12.6 → fal-0.12.7}/src/fal/auth/auth0.py +0 -0
  58. {fal-0.12.6 → fal-0.12.7}/src/fal/auth/local.py +0 -0
  59. {fal-0.12.6 → fal-0.12.7}/src/fal/console/__init__.py +0 -0
  60. {fal-0.12.6 → fal-0.12.7}/src/fal/console/icons.py +0 -0
  61. {fal-0.12.6 → fal-0.12.7}/src/fal/console/ux.py +0 -0
  62. {fal-0.12.6 → fal-0.12.7}/src/fal/env.py +0 -0
  63. {fal-0.12.6 → fal-0.12.7}/src/fal/exceptions/_base.py +0 -0
  64. {fal-0.12.6 → fal-0.12.7}/src/fal/exceptions/auth.py +0 -0
  65. {fal-0.12.6 → fal-0.12.7}/src/fal/flags.py +0 -0
  66. {fal-0.12.6 → fal-0.12.7}/src/fal/logging/__init__.py +0 -0
  67. {fal-0.12.6 → fal-0.12.7}/src/fal/logging/isolate.py +0 -0
  68. {fal-0.12.6 → fal-0.12.7}/src/fal/logging/style.py +0 -0
  69. {fal-0.12.6 → fal-0.12.7}/src/fal/logging/trace.py +0 -0
  70. {fal-0.12.6 → fal-0.12.7}/src/fal/logging/user.py +0 -0
  71. {fal-0.12.6 → fal-0.12.7}/src/fal/py.typed +0 -0
  72. {fal-0.12.6 → fal-0.12.7}/src/fal/rest_client.py +0 -0
  73. {fal-0.12.6 → fal-0.12.7}/src/fal/sdk.py +0 -0
  74. {fal-0.12.6 → fal-0.12.7}/src/fal/sync.py +0 -0
  75. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/__init__.py +0 -0
  76. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/exceptions.py +0 -0
  77. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/__init__.py +0 -0
  78. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/file.py +0 -0
  79. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/providers/fal.py +0 -0
  80. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/providers/gcp.py +0 -0
  81. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/providers/r2.py +0 -0
  82. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/file/types.py +0 -0
  83. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/image/__init__.py +0 -0
  84. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/image/image.py +0 -0
  85. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/mainify.py +0 -0
  86. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/optimize.py +0 -0
  87. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/utils/__init__.py +0 -0
  88. {fal-0.12.6 → fal-0.12.7}/src/fal/toolkit/utils/download_utils.py +0 -0
  89. {fal-0.12.6 → fal-0.12.7}/src/fal/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 0.12.6
3
+ Version: 0.12.7
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels
6
6
  Author-email: hello@fal.ai
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.8
10
10
  Classifier: Programming Language :: Python :: 3.9
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
13
14
  Requires-Dist: attrs (>=21.3.0)
14
15
  Requires-Dist: click (>=8.1.3,<9.0.0)
15
16
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fal"
3
- version = "0.12.6"
3
+ version = "0.12.7"
4
4
  description = "fal is an easy-to-use Serverless Python Framework"
5
5
  authors = ["Features & Labels <hello@fal.ai>"]
6
6
  readme = "README.md"
@@ -137,10 +137,38 @@ def patch_pydantic_class_attributes():
137
137
  pydantic.utils.DUNDER_ATTRIBUTES.add("__class__")
138
138
 
139
139
 
140
+ @mainify
141
+ def patch_exceptions():
142
+ # Adapting tblib.pickling_support.install for dill.
143
+ from types import TracebackType
144
+
145
+ import dill
146
+ from tblib.pickling_support import (
147
+ _get_subclasses,
148
+ pickle_exception,
149
+ pickle_traceback,
150
+ )
151
+
152
+ @dill.register(TracebackType)
153
+ def save_traceback(pickler, obj):
154
+ unpickle, args = pickle_traceback(obj)
155
+ pickler.save_reduce(unpickle, args, obj=obj)
156
+
157
+ @dill.register(BaseException)
158
+ def save_exception(pickler, obj):
159
+ unpickle, args = pickle_exception(obj)
160
+ pickler.save_reduce(unpickle, args, obj=obj)
161
+
162
+ for exception_cls in _get_subclasses(BaseException):
163
+ dill.pickle(exception_cls, save_exception)
164
+
165
+
140
166
  @mainify
141
167
  def patch_dill():
142
168
  import dill
143
169
 
144
170
  dill.settings["recurse"] = True
171
+
172
+ patch_exceptions()
145
173
  patch_pydantic_class_attributes()
146
174
  patch_pydantic_field_serialization()
@@ -175,6 +175,21 @@ def cached(func: Callable[ArgsT, ReturnT]) -> Callable[ArgsT, ReturnT]:
175
175
  return wrapper
176
176
 
177
177
 
178
+ @mainify
179
+ class UserFunctionException(Exception):
180
+ pass
181
+
182
+
183
+ def match_class(obj, cls):
184
+ # NOTE: Can't use isinstance because we are not using dill's byref setting when
185
+ # loading/dumping objects in RPC, which means that our exceptions from remote
186
+ # server are created by value and are actually a separate class that only looks
187
+ # like original one.
188
+ #
189
+ # See https://github.com/fal-ai/fal/issues/142
190
+ return type(obj).__name__ == cls.__name__
191
+
192
+
178
193
  def _prepare_partial_func(
179
194
  func: Callable[ArgsT, ReturnT],
180
195
  *args: ArgsT.args,
@@ -184,9 +199,19 @@ def _prepare_partial_func(
184
199
 
185
200
  @wraps(func)
186
201
  def wrapper(*remote_args: ArgsT.args, **remote_kwargs: ArgsT.kwargs) -> ReturnT:
187
- result = func(*remote_args, *args, **remote_kwargs, **kwargs)
188
- with suppress(Exception):
189
- patch_dill()
202
+ try:
203
+ result = func(*remote_args, *args, **remote_kwargs, **kwargs)
204
+ except Exception as exc:
205
+ tb = exc.__traceback__
206
+ if tb is not None and tb.tb_next is not None:
207
+ # remove our wrapper from user's traceback
208
+ tb = tb.tb_next
209
+ raise UserFunctionException(
210
+ f"Uncaught user function exception: {str(exc)}"
211
+ ) from exc.with_traceback(tb)
212
+ finally:
213
+ with suppress(Exception):
214
+ patch_dill()
190
215
  return result
191
216
 
192
217
  return wrapper
@@ -895,6 +920,7 @@ class IsolatedFunction(Generic[ArgsT, ReturnT]):
895
920
  raw_func: Callable[ArgsT, ReturnT]
896
921
  options: Options
897
922
  executor: ThreadPoolExecutor = field(default_factory=ThreadPoolExecutor)
923
+ reraise: bool = True
898
924
 
899
925
  def __getstate__(self) -> dict[str, Any]:
900
926
  # Ensure that the executor is not pickled.
@@ -946,6 +972,12 @@ class IsolatedFunction(Generic[ArgsT, ReturnT]):
946
972
  f"function uses the following modules which weren't present in the environment definition:\n"
947
973
  + "\n".join(lines)
948
974
  ) from None
975
+ except Exception as exc:
976
+ cause = exc.__cause__
977
+ if self.reraise and match_class(exc, UserFunctionException) and cause:
978
+ # re-raise original exception without our wrappers
979
+ raise cause
980
+ raise
949
981
 
950
982
  @overload
951
983
  def on(
@@ -348,6 +348,8 @@ def register_application(
348
348
  @click.pass_obj
349
349
  def run(host: api.FalServerlessHost, file_path: str, function_name: str):
350
350
  isolated_function = load_function_from(host, file_path, function_name)
351
+ # let our exc handlers handle UserFunctionException
352
+ isolated_function.reraise = False
351
353
  isolated_function()
352
354
 
353
355
 
@@ -4,6 +4,7 @@ from .handlers import (
4
4
  BaseExceptionHandler,
5
5
  FalServerlessExceptionHandler,
6
6
  GrpcExceptionHandler,
7
+ UserFunctionExceptionHandler,
7
8
  )
8
9
 
9
10
 
@@ -20,6 +21,7 @@ class ApplicationExceptionHandler:
20
21
  _handlers: list[BaseExceptionHandler] = [
21
22
  GrpcExceptionHandler(),
22
23
  FalServerlessExceptionHandler(),
24
+ UserFunctionExceptionHandler(),
23
25
  ]
24
26
 
25
27
  def handle(self, exception):
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Generic, TypeVar
3
+ from typing import TYPE_CHECKING, Generic, TypeVar
4
4
 
5
5
  from grpc import Call as RpcCall
6
6
  from rich.markdown import Markdown
@@ -8,6 +8,9 @@ from rich.markdown import Markdown
8
8
  from fal.console import console
9
9
  from fal.console.icons import CROSS_ICON
10
10
 
11
+ if TYPE_CHECKING:
12
+ from fal.api import UserFunctionException
13
+
11
14
  from ._base import FalServerlessException
12
15
 
13
16
  ExceptionType = TypeVar("ExceptionType")
@@ -44,3 +47,23 @@ class GrpcExceptionHandler(BaseExceptionHandler[RpcCall]):
44
47
 
45
48
  def handle(self, exception: RpcCall):
46
49
  console.print(exception.details())
50
+
51
+
52
+ class UserFunctionExceptionHandler(BaseExceptionHandler["UserFunctionException"]):
53
+ def should_handle(self, exception: Exception) -> bool:
54
+ from fal.api import UserFunctionException, match_class
55
+
56
+ return match_class(exception, UserFunctionException)
57
+
58
+ def handle(self, exception: UserFunctionException):
59
+ import rich
60
+
61
+ cause = exception.__cause__
62
+ exc = cause or exception
63
+ tb = rich.traceback.Traceback.from_exception(
64
+ type(exc),
65
+ exc,
66
+ exc.__traceback__,
67
+ )
68
+ console.print(tb)
69
+ super().handle(exception)
fal-0.12.6/setup.py DELETED
@@ -1,90 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from setuptools import setup
3
-
4
- package_dir = \
5
- {'': 'src',
6
- 'openapi_fal_rest': 'openapi-fal-rest/openapi_fal_rest',
7
- 'openapi_fal_rest.api': 'openapi-fal-rest/openapi_fal_rest/api',
8
- 'openapi_fal_rest.api.applications': 'openapi-fal-rest/openapi_fal_rest/api/applications',
9
- 'openapi_fal_rest.api.billing': 'openapi-fal-rest/openapi_fal_rest/api/billing',
10
- 'openapi_fal_rest.api.files': 'openapi-fal-rest/openapi_fal_rest/api/files',
11
- 'openapi_fal_rest.api.workflows': 'openapi-fal-rest/openapi_fal_rest/api/workflows',
12
- 'openapi_fal_rest.models': 'openapi-fal-rest/openapi_fal_rest/models'}
13
-
14
- packages = \
15
- ['fal',
16
- 'fal.auth',
17
- 'fal.console',
18
- 'fal.exceptions',
19
- 'fal.logging',
20
- 'fal.toolkit',
21
- 'fal.toolkit.file',
22
- 'fal.toolkit.file.providers',
23
- 'fal.toolkit.image',
24
- 'fal.toolkit.utils',
25
- 'openapi_fal_rest',
26
- 'openapi_fal_rest.api',
27
- 'openapi_fal_rest.api.applications',
28
- 'openapi_fal_rest.api.billing',
29
- 'openapi_fal_rest.api.files',
30
- 'openapi_fal_rest.api.workflows',
31
- 'openapi_fal_rest.models']
32
-
33
- package_data = \
34
- {'': ['*']}
35
-
36
- install_requires = \
37
- ['attrs>=21.3.0',
38
- 'click>=8.1.3,<9.0.0',
39
- 'colorama>=0.4.6,<0.5.0',
40
- 'dill==0.3.7',
41
- 'fastapi==0.99.1',
42
- 'grpc-interceptor>=0.15.0,<0.16.0',
43
- 'grpcio>=1.50.0,<2.0.0',
44
- 'httpx>=0.15.4',
45
- 'isolate-proto>=0.3.4,<0.4.0',
46
- 'isolate[build]>=0.12.3,<1.0',
47
- 'msgpack>=1.0.7,<2.0.0',
48
- 'opentelemetry-api>=1.15.0,<2.0.0',
49
- 'opentelemetry-sdk>=1.15.0,<2.0.0',
50
- 'packaging>=21.3',
51
- 'pathspec>=0.11.1,<0.12.0',
52
- 'pillow>=10.2.0,<11.0.0',
53
- 'portalocker>=2.7.0,<3.0.0',
54
- 'pydantic<2.0',
55
- 'pyjwt[crypto]>=2.8.0,<3.0.0',
56
- 'python-dateutil>=2.8.0,<3.0.0',
57
- 'rich>=13.3.2,<14.0.0',
58
- 'rich_click',
59
- 'structlog>=22.3.0,<23.0.0',
60
- 'types-python-dateutil>=2.8.0,<3.0.0',
61
- 'typing-extensions>=4.7.1,<5.0.0',
62
- 'websockets>=12.0,<13.0']
63
-
64
- extras_require = \
65
- {':python_version < "3.10"': ['importlib-metadata>=4.4']}
66
-
67
- entry_points = \
68
- {'console_scripts': ['fal = fal.cli:cli', 'fal-serverless = fal.cli:cli']}
69
-
70
- setup_kwargs = {
71
- 'name': 'fal',
72
- 'version': '0.12.6',
73
- 'description': 'fal is an easy-to-use Serverless Python Framework',
74
- 'long_description': '[![PyPI](https://img.shields.io/pypi/v/fal.svg?logo=PyPI)](https://pypi.org/project/fal)\n[![Tests](https://img.shields.io/github/actions/workflow/status/fal-ai/fal/integration_tests.yaml?label=Tests)](https://github.com/fal-ai/fal/actions)\n\n# fal\n\nfal is a serverless Python runtime that lets you run and scale code in the cloud with no infra management.\n\nWith fal, you can build pipelines, serve ML models and scale them up to many users. You scale down to 0 when you don\'t use any resources.\n\n## Quickstart\n\nFirst, you need to install the `fal` package. You can do so using pip:\n```shell\npip install fal\n```\n\nThen you need to authenticate:\n```shell\nfal auth login\n```\n\nYou can also use fal keys that you can get from [our dashboard](https://fal.ai/dashboard/keys).\n\nNow can use the fal package in your Python scripts as follows:\n\n```py\nimport fal\n\n@fal.function(\n "virtualenv",\n requirements=["pyjokes"],\n)\ndef tell_joke() -> str:\n import pyjokes\n\n joke = pyjokes.get_joke()\n return joke\n\nprint("Joke from the clouds: ", tell_joke())\n```\n\nA new virtual environment will be created by fal in the cloud and the set of requirements that we passed will be installed as soon as this function is called. From that point on, our code will be executed as if it were running locally, and the joke prepared by the pyjokes library will be returned.\n\n## Next steps\n\nIf you would like to find out more about the capabilities of fal, check out to the [docs](https://fal.ai/docs). You can learn more about persistent storage, function caches and deploying your functions as API endpoints.\n',
75
- 'author': 'Features & Labels',
76
- 'author_email': 'hello@fal.ai',
77
- 'maintainer': 'None',
78
- 'maintainer_email': 'None',
79
- 'url': 'None',
80
- 'package_dir': package_dir,
81
- 'packages': packages,
82
- 'package_data': package_data,
83
- 'install_requires': install_requires,
84
- 'extras_require': extras_require,
85
- 'entry_points': entry_points,
86
- 'python_requires': '>=3.8,<4.0',
87
- }
88
-
89
-
90
- setup(**setup_kwargs)
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