fal 1.11.5__tar.gz → 1.12.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 (176) hide show
  1. {fal-1.11.5/fal.egg-info → fal-1.12.1}/PKG-INFO +1 -1
  2. {fal-1.11.5 → fal-1.12.1/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.11.5 → fal-1.12.1}/src/fal/_fal_version.py +2 -2
  4. {fal-1.11.5 → fal-1.12.1}/src/fal/auth/__init__.py +13 -11
  5. fal-1.12.1/src/fal/cli/auth.py +151 -0
  6. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/teams.py +4 -39
  7. {fal-1.11.5 → fal-1.12.1}/src/fal/sdk.py +1 -1
  8. fal-1.11.5/src/fal/cli/auth.py +0 -101
  9. {fal-1.11.5 → fal-1.12.1}/.gitignore +0 -0
  10. {fal-1.11.5 → fal-1.12.1}/Makefile +0 -0
  11. {fal-1.11.5 → fal-1.12.1}/README.md +0 -0
  12. {fal-1.11.5 → fal-1.12.1}/docs/conf.py +0 -0
  13. {fal-1.11.5 → fal-1.12.1}/docs/index.rst +0 -0
  14. {fal-1.11.5 → fal-1.12.1}/fal.egg-info/SOURCES.txt +0 -0
  15. {fal-1.11.5 → fal-1.12.1}/fal.egg-info/dependency_links.txt +0 -0
  16. {fal-1.11.5 → fal-1.12.1}/fal.egg-info/entry_points.txt +0 -0
  17. {fal-1.11.5 → fal-1.12.1}/fal.egg-info/requires.txt +0 -0
  18. {fal-1.11.5 → fal-1.12.1}/fal.egg-info/top_level.txt +0 -0
  19. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/README.md +0 -0
  20. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  21. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  22. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  23. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  24. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  25. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  26. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  27. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  28. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  29. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  30. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  31. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  32. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  33. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  34. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  35. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  36. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  37. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  38. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  39. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  40. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  41. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  42. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  43. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  44. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  45. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  46. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  47. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  48. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  49. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  50. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  51. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  52. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  53. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  54. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  55. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  56. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  57. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  58. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  59. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  60. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  61. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  62. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  63. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  64. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  65. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  66. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  67. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  68. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  69. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  70. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  71. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  72. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  73. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  74. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  75. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  76. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  77. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  78. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  79. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  80. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  81. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  82. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  83. {fal-1.11.5 → fal-1.12.1}/openapi-fal-rest/pyproject.toml +0 -0
  84. {fal-1.11.5 → fal-1.12.1}/openapi_rest.config.yaml +0 -0
  85. {fal-1.11.5 → fal-1.12.1}/pyproject.toml +0 -0
  86. {fal-1.11.5 → fal-1.12.1}/setup.cfg +0 -0
  87. {fal-1.11.5 → fal-1.12.1}/src/fal/__init__.py +0 -0
  88. {fal-1.11.5 → fal-1.12.1}/src/fal/__main__.py +0 -0
  89. {fal-1.11.5 → fal-1.12.1}/src/fal/_serialization.py +0 -0
  90. {fal-1.11.5 → fal-1.12.1}/src/fal/_version.py +0 -0
  91. {fal-1.11.5 → fal-1.12.1}/src/fal/api.py +0 -0
  92. {fal-1.11.5 → fal-1.12.1}/src/fal/app.py +0 -0
  93. {fal-1.11.5 → fal-1.12.1}/src/fal/apps.py +0 -0
  94. {fal-1.11.5 → fal-1.12.1}/src/fal/auth/auth0.py +0 -0
  95. {fal-1.11.5 → fal-1.12.1}/src/fal/auth/local.py +0 -0
  96. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/__init__.py +0 -0
  97. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/_utils.py +0 -0
  98. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/api.py +0 -0
  99. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/apps.py +0 -0
  100. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/cli_nested_json.py +0 -0
  101. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/create.py +0 -0
  102. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/debug.py +0 -0
  103. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/deploy.py +0 -0
  104. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/doctor.py +0 -0
  105. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/keys.py +0 -0
  106. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/main.py +0 -0
  107. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/parser.py +0 -0
  108. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/profile.py +0 -0
  109. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/run.py +0 -0
  110. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/runners.py +0 -0
  111. {fal-1.11.5 → fal-1.12.1}/src/fal/cli/secrets.py +0 -0
  112. {fal-1.11.5 → fal-1.12.1}/src/fal/config.py +0 -0
  113. {fal-1.11.5 → fal-1.12.1}/src/fal/console/__init__.py +0 -0
  114. {fal-1.11.5 → fal-1.12.1}/src/fal/console/icons.py +0 -0
  115. {fal-1.11.5 → fal-1.12.1}/src/fal/console/ux.py +0 -0
  116. {fal-1.11.5 → fal-1.12.1}/src/fal/container.py +0 -0
  117. {fal-1.11.5 → fal-1.12.1}/src/fal/exceptions/__init__.py +0 -0
  118. {fal-1.11.5 → fal-1.12.1}/src/fal/exceptions/_base.py +0 -0
  119. {fal-1.11.5 → fal-1.12.1}/src/fal/exceptions/_cuda.py +0 -0
  120. {fal-1.11.5 → fal-1.12.1}/src/fal/exceptions/auth.py +0 -0
  121. {fal-1.11.5 → fal-1.12.1}/src/fal/files.py +0 -0
  122. {fal-1.11.5 → fal-1.12.1}/src/fal/flags.py +0 -0
  123. {fal-1.11.5 → fal-1.12.1}/src/fal/logging/__init__.py +0 -0
  124. {fal-1.11.5 → fal-1.12.1}/src/fal/logging/isolate.py +0 -0
  125. {fal-1.11.5 → fal-1.12.1}/src/fal/logging/style.py +0 -0
  126. {fal-1.11.5 → fal-1.12.1}/src/fal/logging/trace.py +0 -0
  127. {fal-1.11.5 → fal-1.12.1}/src/fal/logging/user.py +0 -0
  128. {fal-1.11.5 → fal-1.12.1}/src/fal/py.typed +0 -0
  129. {fal-1.11.5 → fal-1.12.1}/src/fal/rest_client.py +0 -0
  130. {fal-1.11.5 → fal-1.12.1}/src/fal/sync.py +0 -0
  131. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/__init__.py +0 -0
  132. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/exceptions.py +0 -0
  133. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/__init__.py +0 -0
  134. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/file.py +0 -0
  135. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/providers/fal.py +0 -0
  136. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  137. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  138. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/providers/s3.py +0 -0
  139. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/file/types.py +0 -0
  140. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/__init__.py +0 -0
  141. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/image.py +0 -0
  142. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  143. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  144. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  145. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  146. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  147. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  148. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/optimize.py +0 -0
  149. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/types.py +0 -0
  150. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/utils/__init__.py +0 -0
  151. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/utils/download_utils.py +0 -0
  152. {fal-1.11.5 → fal-1.12.1}/src/fal/toolkit/utils/retry.py +0 -0
  153. {fal-1.11.5 → fal-1.12.1}/src/fal/utils.py +0 -0
  154. {fal-1.11.5 → fal-1.12.1}/src/fal/workflows.py +0 -0
  155. {fal-1.11.5 → fal-1.12.1}/tests/__init__.py +0 -0
  156. {fal-1.11.5 → fal-1.12.1}/tests/assets/cat.png +0 -0
  157. {fal-1.11.5 → fal-1.12.1}/tests/cli/__init__.py +0 -0
  158. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_apps.py +0 -0
  159. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_auth.py +0 -0
  160. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_deploy.py +0 -0
  161. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_keys.py +0 -0
  162. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_run.py +0 -0
  163. {fal-1.11.5 → fal-1.12.1}/tests/cli/test_secrets.py +0 -0
  164. {fal-1.11.5 → fal-1.12.1}/tests/conftest.py +0 -0
  165. {fal-1.11.5 → fal-1.12.1}/tests/integration_test.py +0 -0
  166. {fal-1.11.5 → fal-1.12.1}/tests/mainify_package/__init__.py +0 -0
  167. {fal-1.11.5 → fal-1.12.1}/tests/mainify_package/impl.py +0 -0
  168. {fal-1.11.5 → fal-1.12.1}/tests/mainify_package/utils.py +0 -0
  169. {fal-1.11.5 → fal-1.12.1}/tests/mainify_target.py +0 -0
  170. {fal-1.11.5 → fal-1.12.1}/tests/test_apps.py +0 -0
  171. {fal-1.11.5 → fal-1.12.1}/tests/test_stability.py +0 -0
  172. {fal-1.11.5 → fal-1.12.1}/tests/toolkit/file_test.py +0 -0
  173. {fal-1.11.5 → fal-1.12.1}/tests/toolkit/image_test.py +0 -0
  174. {fal-1.11.5 → fal-1.12.1}/tests/toolkit/test_types.py +0 -0
  175. {fal-1.11.5 → fal-1.12.1}/tests/toolkit/utils/retry.py +0 -0
  176. {fal-1.11.5 → fal-1.12.1}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.11.5
3
+ Version: 1.12.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.4
2
2
  Name: fal
3
- Version: 1.11.5
3
+ Version: 1.12.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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.11.5'
21
- __version_tuple__ = version_tuple = (1, 11, 5)
20
+ __version__ = version = '1.12.1'
21
+ __version_tuple__ = version_tuple = (1, 12, 1)
@@ -142,25 +142,23 @@ def _fetch_teams(bearer_token: str) -> list[dict]:
142
142
  )
143
143
  try:
144
144
  with urlopen(request) as response:
145
- teams = json.load(response)
145
+ return json.load(response)
146
146
  except HTTPError as exc:
147
147
  raise FalServerlessException("Failed to fetch teams") from exc
148
148
 
149
- return [team for team in teams if not team["is_personal"]]
150
-
151
149
 
152
150
  @dataclass
153
151
  class UserAccess:
154
152
  _access_token: str | None = field(repr=False, default=None)
155
153
  _user_info: dict | None = field(repr=False, default=None)
156
154
  _exc: Exception | None = field(repr=False, default=None)
157
- _teams: list[dict] | None = field(repr=False, default=None)
155
+ _accounts: list[dict] | None = field(repr=False, default=None)
158
156
 
159
157
  def invalidate(self) -> None:
160
158
  self._access_token = None
161
159
  self._user_info = None
162
160
  self._exc = None
163
- self._teams = None
161
+ self._accounts = None
164
162
 
165
163
  @property
166
164
  def info(self) -> dict:
@@ -191,13 +189,17 @@ class UserAccess:
191
189
  return "Bearer " + self.access_token
192
190
 
193
191
  @property
194
- def teams(self) -> list[dict]:
195
- if self._teams is None:
196
- self._teams = _fetch_teams(self.bearer_token)
197
- return self._teams
192
+ def accounts(self) -> list[dict]:
193
+ if self._accounts is None:
194
+ self._accounts = _fetch_teams(self.bearer_token)
195
+ self._accounts = sorted(
196
+ self._accounts, key=lambda x: (not x["is_personal"], x["nickname"])
197
+ )
198
+
199
+ return self._accounts
198
200
 
199
- def get_team(self, team: str) -> dict:
200
- for t in self.teams:
201
+ def get_account(self, team: str) -> dict:
202
+ for t in self.accounts:
201
203
  if t["nickname"].lower() == team.lower():
202
204
  return t
203
205
  raise ValueError(f"Team {team} not found")
@@ -0,0 +1,151 @@
1
+ from fal.auth import USER, login, logout
2
+
3
+
4
+ def _login(args):
5
+ from fal.config import Config
6
+
7
+ login()
8
+
9
+ with Config().edit() as config:
10
+ config.unset("team")
11
+
12
+ _set_account(args)
13
+
14
+
15
+ def _logout(args):
16
+ from fal.config import Config
17
+
18
+ logout()
19
+ with Config().edit() as config:
20
+ config.unset("team")
21
+
22
+
23
+ def _list_accounts(args):
24
+ from rich.style import Style
25
+ from rich.table import Table
26
+
27
+ from fal.config import Config
28
+
29
+ config = Config()
30
+ current_account = config.get("team") or USER.info["nickname"]
31
+
32
+ table = Table(border_style=Style(frame=False), show_header=False)
33
+ table.add_column("#")
34
+ table.add_column("Nickname")
35
+ table.add_column("Type")
36
+
37
+ for idx, account in enumerate(USER.accounts):
38
+ selected = account["nickname"] == current_account
39
+ color = "bold yellow" if selected else None
40
+
41
+ table.add_row(
42
+ f"* {idx + 1}" if selected else f" {idx + 1}",
43
+ account["nickname"],
44
+ "Personal" if account["is_personal"] else "Team",
45
+ style=color,
46
+ )
47
+
48
+ args.console.print(table)
49
+
50
+
51
+ def _set_account(args):
52
+ from rich.prompt import Prompt
53
+
54
+ from fal.config import Config
55
+
56
+ if hasattr(args, "account") and args.account:
57
+ if args.account.isdigit():
58
+ acc_index = int(args.account) - 1
59
+ account = USER.accounts[acc_index]
60
+ else:
61
+ account = USER.get_account(args.account)
62
+ else:
63
+ _list_accounts(args)
64
+ indices = list(map(str, range(1, len(USER.accounts) + 1)))
65
+ team_names = [account["nickname"] for account in USER.accounts]
66
+ acc_choice = Prompt.ask(
67
+ "Select an account by number",
68
+ choices=indices + team_names,
69
+ show_choices=False,
70
+ )
71
+ if acc_choice in indices:
72
+ acc_index = int(acc_choice) - 1
73
+ account = USER.accounts[acc_index]
74
+ else:
75
+ account = USER.get_account(acc_choice)
76
+
77
+ if account["is_personal"]:
78
+ args.console.print(
79
+ f"Using personal account [cyan]{account['nickname']}[/]. "
80
+ "You can change this later with [bold]fal team set[/]"
81
+ )
82
+ else:
83
+ args.console.print(
84
+ f"Using team account [cyan]{account['nickname']}[/]. "
85
+ "You can change this later with [bold]fal team set[/]"
86
+ )
87
+
88
+ with Config().edit() as config:
89
+ config.set("team", account["nickname"])
90
+
91
+
92
+ def _whoami(args):
93
+ from fal.config import Config
94
+
95
+ config = Config()
96
+
97
+ team = config.get("team")
98
+ if team:
99
+ account = USER.get_account(team)
100
+ else:
101
+ account = USER.get_account(USER.info["nickname"])
102
+
103
+ nickname = account["nickname"]
104
+ full_name = account["full_name"]
105
+ user_id = account["user_id"]
106
+
107
+ args.console.print(f"Hello, {full_name}: {nickname!r} - {user_id!r}")
108
+
109
+
110
+ def add_parser(main_subparsers, parents):
111
+ auth_help = "Authenticate with fal."
112
+ parser = main_subparsers.add_parser(
113
+ "auth",
114
+ description=auth_help,
115
+ help=auth_help,
116
+ parents=parents,
117
+ )
118
+
119
+ subparsers = parser.add_subparsers(
120
+ title="Commands",
121
+ metavar="command",
122
+ dest="cmd",
123
+ required=True,
124
+ )
125
+
126
+ login_help = "Log in a user."
127
+ login_parser = subparsers.add_parser(
128
+ "login",
129
+ description=login_help,
130
+ help=login_help,
131
+ parents=parents,
132
+ )
133
+ login_parser.set_defaults(func=_login)
134
+
135
+ logout_help = "Log out the currently logged-in user."
136
+ logout_parser = subparsers.add_parser(
137
+ "logout",
138
+ description=logout_help,
139
+ help=logout_help,
140
+ parents=parents,
141
+ )
142
+ logout_parser.set_defaults(func=_logout)
143
+
144
+ whoami_help = "Show the currently authenticated user."
145
+ whoami_parser = subparsers.add_parser(
146
+ "whoami",
147
+ description=whoami_help,
148
+ help=whoami_help,
149
+ parents=parents,
150
+ )
151
+ whoami_parser.set_defaults(func=_whoami)
@@ -1,39 +1,4 @@
1
- def _list(args):
2
- from rich.table import Table
3
-
4
- from fal.auth import USER
5
- from fal.config import Config
6
-
7
- table = Table()
8
- table.add_column("Default")
9
- table.add_column("Team")
10
- table.add_column("Full Name")
11
- table.add_column("ID")
12
-
13
- default_team = Config().get("team")
14
-
15
- for team in USER.teams:
16
- default = default_team and default_team.lower() == team["nickname"].lower()
17
- table.add_row(
18
- "*" if default else "", team["nickname"], team["full_name"], team["user_id"]
19
- )
20
-
21
- args.console.print(table)
22
-
23
-
24
- def _set(args):
25
- from fal.config import Config
26
- from fal.sdk import USER
27
-
28
- team = args.team.lower()
29
- for team_info in USER.teams:
30
- if team_info["nickname"].lower() == team:
31
- break
32
- else:
33
- raise ValueError(f"Team {args.team} not found")
34
-
35
- with Config().edit() as config:
36
- config.set("team", team)
1
+ from fal.cli.auth import _list_accounts, _set_account
37
2
 
38
3
 
39
4
  def _unset(args):
@@ -67,7 +32,7 @@ def add_parser(main_subparsers, parents):
67
32
  help=list_help,
68
33
  parents=parents,
69
34
  )
70
- list_parser.set_defaults(func=_list)
35
+ list_parser.set_defaults(func=_list_accounts)
71
36
 
72
37
  set_help = "Set the current team."
73
38
  set_parser = subparsers.add_parser(
@@ -76,8 +41,8 @@ def add_parser(main_subparsers, parents):
76
41
  help=set_help,
77
42
  parents=parents,
78
43
  )
79
- set_parser.add_argument("team", help="The team to set.")
80
- set_parser.set_defaults(func=_set)
44
+ set_parser.add_argument("account", help="The team to set.")
45
+ set_parser.set_defaults(func=_set_account)
81
46
 
82
47
  unset_help = "Unset the current team."
83
48
  unset_parser = subparsers.add_parser(
@@ -183,7 +183,7 @@ def get_default_credentials(team: str | None = None) -> Credentials:
183
183
  else:
184
184
  config = Config()
185
185
  team = team or config.get("team")
186
- team_id = USER.get_team(team)["user_id"] if team else None
186
+ team_id = USER.get_account(team)["user_id"] if team else None
187
187
  return AuthenticatedCredentials(team_id=team_id)
188
188
 
189
189
 
@@ -1,101 +0,0 @@
1
- from fal.auth import USER, login, logout
2
-
3
-
4
- def _login(args):
5
- from fal.config import Config
6
- from fal.console.prompt import prompt
7
-
8
- login()
9
-
10
- teams = [team["nickname"].lower() for team in USER.teams]
11
- if not teams:
12
- return
13
-
14
- args.console.print("")
15
- args.console.print(
16
- f"You ({USER.info['name']}) are a member of the following teams:\n",
17
- )
18
- for idx, team in enumerate(USER.teams):
19
- args.console.print(f" {idx + 1}. {team['nickname']}")
20
- args.console.print("")
21
-
22
- team_choice = prompt(
23
- args.console,
24
- "Pick a team account to use (leave blank for personal account)",
25
- choices=teams,
26
- show_choices=False,
27
- default=None,
28
- )
29
- args.console.print("")
30
-
31
- with Config().edit() as config:
32
- if team_choice:
33
- args.console.print(
34
- f"Setting team to [cyan]{team}[/]. "
35
- "You can change this later with [bold]fal team set[/]."
36
- )
37
- config.set("team", team)
38
- else:
39
- args.console.print(
40
- "Using your personal account. "
41
- "You can change this later with [bold]fal team set[/]."
42
- )
43
- config.unset("team")
44
-
45
-
46
- def _logout(args):
47
- from fal.config import Config
48
-
49
- logout()
50
- with Config().edit() as config:
51
- config.unset("team")
52
-
53
-
54
- def _whoami(args):
55
- user_name = USER.info["name"]
56
- sub = USER.info["sub"]
57
- args.console.print(f"Hello, {user_name} - '{sub}'")
58
-
59
-
60
- def add_parser(main_subparsers, parents):
61
- auth_help = "Authenticate with fal."
62
- parser = main_subparsers.add_parser(
63
- "auth",
64
- description=auth_help,
65
- help=auth_help,
66
- parents=parents,
67
- )
68
-
69
- subparsers = parser.add_subparsers(
70
- title="Commands",
71
- metavar="command",
72
- dest="cmd",
73
- required=True,
74
- )
75
-
76
- login_help = "Log in a user."
77
- login_parser = subparsers.add_parser(
78
- "login",
79
- description=login_help,
80
- help=login_help,
81
- parents=parents,
82
- )
83
- login_parser.set_defaults(func=_login)
84
-
85
- logout_help = "Log out the currently logged-in user."
86
- logout_parser = subparsers.add_parser(
87
- "logout",
88
- description=logout_help,
89
- help=logout_help,
90
- parents=parents,
91
- )
92
- logout_parser.set_defaults(func=_logout)
93
-
94
- whoami_help = "Show the currently authenticated user."
95
- whoami_parser = subparsers.add_parser(
96
- "whoami",
97
- description=whoami_help,
98
- help=whoami_help,
99
- parents=parents,
100
- )
101
- whoami_parser.set_defaults(func=_whoami)
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
File without changes
File without changes
File without changes
File without changes
File without changes