fal 1.13.3__tar.gz → 1.13.4__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 (175) hide show
  1. {fal-1.13.3/fal.egg-info → fal-1.13.4}/PKG-INFO +1 -1
  2. {fal-1.13.3 → fal-1.13.4/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.13.3 → fal-1.13.4}/src/fal/_fal_version.py +2 -2
  4. {fal-1.13.3 → fal-1.13.4}/src/fal/app.py +19 -1
  5. {fal-1.13.3 → fal-1.13.4}/tests/test_apps.py +28 -0
  6. {fal-1.13.3 → fal-1.13.4}/.gitignore +0 -0
  7. {fal-1.13.3 → fal-1.13.4}/Makefile +0 -0
  8. {fal-1.13.3 → fal-1.13.4}/README.md +0 -0
  9. {fal-1.13.3 → fal-1.13.4}/docs/conf.py +0 -0
  10. {fal-1.13.3 → fal-1.13.4}/docs/index.rst +0 -0
  11. {fal-1.13.3 → fal-1.13.4}/fal.egg-info/SOURCES.txt +0 -0
  12. {fal-1.13.3 → fal-1.13.4}/fal.egg-info/dependency_links.txt +0 -0
  13. {fal-1.13.3 → fal-1.13.4}/fal.egg-info/entry_points.txt +0 -0
  14. {fal-1.13.3 → fal-1.13.4}/fal.egg-info/requires.txt +0 -0
  15. {fal-1.13.3 → fal-1.13.4}/fal.egg-info/top_level.txt +0 -0
  16. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/README.md +0 -0
  17. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  18. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  19. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  20. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  21. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  22. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  23. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  24. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  25. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  26. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  27. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  28. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  29. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  30. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  31. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  32. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  33. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  34. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  35. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  36. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  37. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  38. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  39. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  40. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  41. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  42. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  43. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  44. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  45. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  46. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  47. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  48. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  49. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  50. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  51. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  52. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  53. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  54. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  55. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  56. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  57. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  58. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  59. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  60. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  61. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  62. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  63. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  64. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  65. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  66. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  67. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  68. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  69. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  70. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  71. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  72. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  73. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  74. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  75. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  76. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  77. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  78. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  79. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  80. {fal-1.13.3 → fal-1.13.4}/openapi-fal-rest/pyproject.toml +0 -0
  81. {fal-1.13.3 → fal-1.13.4}/openapi_rest.config.yaml +0 -0
  82. {fal-1.13.3 → fal-1.13.4}/pyproject.toml +0 -0
  83. {fal-1.13.3 → fal-1.13.4}/setup.cfg +0 -0
  84. {fal-1.13.3 → fal-1.13.4}/src/fal/__init__.py +0 -0
  85. {fal-1.13.3 → fal-1.13.4}/src/fal/__main__.py +0 -0
  86. {fal-1.13.3 → fal-1.13.4}/src/fal/_serialization.py +0 -0
  87. {fal-1.13.3 → fal-1.13.4}/src/fal/_version.py +0 -0
  88. {fal-1.13.3 → fal-1.13.4}/src/fal/api.py +0 -0
  89. {fal-1.13.3 → fal-1.13.4}/src/fal/apps.py +0 -0
  90. {fal-1.13.3 → fal-1.13.4}/src/fal/auth/__init__.py +0 -0
  91. {fal-1.13.3 → fal-1.13.4}/src/fal/auth/auth0.py +0 -0
  92. {fal-1.13.3 → fal-1.13.4}/src/fal/auth/local.py +0 -0
  93. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/__init__.py +0 -0
  94. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/_utils.py +0 -0
  95. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/api.py +0 -0
  96. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/apps.py +0 -0
  97. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/auth.py +0 -0
  98. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/cli_nested_json.py +0 -0
  99. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/create.py +0 -0
  100. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/debug.py +0 -0
  101. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/deploy.py +0 -0
  102. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/doctor.py +0 -0
  103. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/keys.py +0 -0
  104. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/main.py +0 -0
  105. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/parser.py +0 -0
  106. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/profile.py +0 -0
  107. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/run.py +0 -0
  108. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/runners.py +0 -0
  109. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/secrets.py +0 -0
  110. {fal-1.13.3 → fal-1.13.4}/src/fal/cli/teams.py +0 -0
  111. {fal-1.13.3 → fal-1.13.4}/src/fal/config.py +0 -0
  112. {fal-1.13.3 → fal-1.13.4}/src/fal/console/__init__.py +0 -0
  113. {fal-1.13.3 → fal-1.13.4}/src/fal/console/icons.py +0 -0
  114. {fal-1.13.3 → fal-1.13.4}/src/fal/console/ux.py +0 -0
  115. {fal-1.13.3 → fal-1.13.4}/src/fal/container.py +0 -0
  116. {fal-1.13.3 → fal-1.13.4}/src/fal/exceptions/__init__.py +0 -0
  117. {fal-1.13.3 → fal-1.13.4}/src/fal/exceptions/_base.py +0 -0
  118. {fal-1.13.3 → fal-1.13.4}/src/fal/exceptions/_cuda.py +0 -0
  119. {fal-1.13.3 → fal-1.13.4}/src/fal/exceptions/auth.py +0 -0
  120. {fal-1.13.3 → fal-1.13.4}/src/fal/files.py +0 -0
  121. {fal-1.13.3 → fal-1.13.4}/src/fal/flags.py +0 -0
  122. {fal-1.13.3 → fal-1.13.4}/src/fal/logging/__init__.py +0 -0
  123. {fal-1.13.3 → fal-1.13.4}/src/fal/logging/isolate.py +0 -0
  124. {fal-1.13.3 → fal-1.13.4}/src/fal/logging/style.py +0 -0
  125. {fal-1.13.3 → fal-1.13.4}/src/fal/logging/trace.py +0 -0
  126. {fal-1.13.3 → fal-1.13.4}/src/fal/logging/user.py +0 -0
  127. {fal-1.13.3 → fal-1.13.4}/src/fal/py.typed +0 -0
  128. {fal-1.13.3 → fal-1.13.4}/src/fal/rest_client.py +0 -0
  129. {fal-1.13.3 → fal-1.13.4}/src/fal/sdk.py +0 -0
  130. {fal-1.13.3 → fal-1.13.4}/src/fal/sync.py +0 -0
  131. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/__init__.py +0 -0
  132. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/exceptions.py +0 -0
  133. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/__init__.py +0 -0
  134. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/file.py +0 -0
  135. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/providers/fal.py +0 -0
  136. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/providers/gcp.py +0 -0
  137. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/providers/r2.py +0 -0
  138. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/providers/s3.py +0 -0
  139. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/file/types.py +0 -0
  140. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/__init__.py +0 -0
  141. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/image.py +0 -0
  142. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  143. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  144. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  145. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  146. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  147. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/image/safety_checker.py +0 -0
  148. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/optimize.py +0 -0
  149. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/types.py +0 -0
  150. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/utils/__init__.py +0 -0
  151. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/utils/download_utils.py +0 -0
  152. {fal-1.13.3 → fal-1.13.4}/src/fal/toolkit/utils/retry.py +0 -0
  153. {fal-1.13.3 → fal-1.13.4}/src/fal/utils.py +0 -0
  154. {fal-1.13.3 → fal-1.13.4}/src/fal/workflows.py +0 -0
  155. {fal-1.13.3 → fal-1.13.4}/tests/__init__.py +0 -0
  156. {fal-1.13.3 → fal-1.13.4}/tests/assets/cat.png +0 -0
  157. {fal-1.13.3 → fal-1.13.4}/tests/cli/__init__.py +0 -0
  158. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_apps.py +0 -0
  159. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_auth.py +0 -0
  160. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_deploy.py +0 -0
  161. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_keys.py +0 -0
  162. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_run.py +0 -0
  163. {fal-1.13.3 → fal-1.13.4}/tests/cli/test_secrets.py +0 -0
  164. {fal-1.13.3 → fal-1.13.4}/tests/conftest.py +0 -0
  165. {fal-1.13.3 → fal-1.13.4}/tests/integration_test.py +0 -0
  166. {fal-1.13.3 → fal-1.13.4}/tests/mainify_package/__init__.py +0 -0
  167. {fal-1.13.3 → fal-1.13.4}/tests/mainify_package/impl.py +0 -0
  168. {fal-1.13.3 → fal-1.13.4}/tests/mainify_package/utils.py +0 -0
  169. {fal-1.13.3 → fal-1.13.4}/tests/mainify_target.py +0 -0
  170. {fal-1.13.3 → fal-1.13.4}/tests/test_stability.py +0 -0
  171. {fal-1.13.3 → fal-1.13.4}/tests/toolkit/file_test.py +0 -0
  172. {fal-1.13.3 → fal-1.13.4}/tests/toolkit/image_test.py +0 -0
  173. {fal-1.13.3 → fal-1.13.4}/tests/toolkit/test_types.py +0 -0
  174. {fal-1.13.3 → fal-1.13.4}/tests/toolkit/utils/retry.py +0 -0
  175. {fal-1.13.3 → fal-1.13.4}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.13.3
3
+ Version: 1.13.4
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.13.3
3
+ Version: 1.13.4
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.13.3'
21
- __version_tuple__ = version_tuple = (1, 13, 3)
20
+ __version__ = version = '1.13.4'
21
+ __version_tuple__ = version_tuple = (1, 13, 4)
@@ -345,7 +345,25 @@ class App(BaseServable):
345
345
  async def provide_hints_headers(request, call_next):
346
346
  response = await call_next(request)
347
347
  try:
348
- response.headers["X-Fal-Runner-Hints"] = ",".join(self.provide_hints())
348
+ # make sure the hints can be encoded in latin-1, so we don't crash
349
+ # when serving.
350
+ # https://github.com/encode/starlette/blob/a766a58d14007f07c0b5782fa78cdc370b892796/starlette/datastructures.py#L568
351
+ hints = []
352
+ for hint in self.provide_hints():
353
+ try:
354
+ _ = hint.encode("latin-1")
355
+ hints.append(hint)
356
+ except UnicodeEncodeError:
357
+ from fastapi.logger import logger
358
+
359
+ logger.warning(
360
+ "Ignoring hint %s for %s because it can't be encoded in "
361
+ "latin-1",
362
+ hint,
363
+ self.__class__.__name__,
364
+ )
365
+
366
+ response.headers["X-Fal-Runner-Hints"] = ",".join(hints)
349
367
  except NotImplementedError:
350
368
  # This lets us differentiate between apps that don't provide hints
351
369
  # and apps that provide empty hints.
@@ -966,3 +966,31 @@ def test_container_app_client(test_container_app: str):
966
966
  def test_container_build_args_app_client(test_container_build_args_app: str):
967
967
  response = apps.run(test_container_build_args_app, {})
968
968
  assert response == "built with build args"
969
+
970
+
971
+ class HintsApp(fal.App, keep_alive=300, max_concurrency=1):
972
+ machine_type = "S"
973
+
974
+ def provide_hints(self) -> List[str]:
975
+ return ["é", "😀"]
976
+
977
+ @fal.endpoint("/add")
978
+ def add(self, input: Input) -> Output:
979
+ return Output(result=input.lhs + input.rhs)
980
+
981
+
982
+ def test_hints_encoding():
983
+ """
984
+ Make sure that hints that can't be encoded in latin-1 don't crash the app
985
+ https://github.com/encode/starlette/blob/a766a58d14007f07c0b5782fa78cdc370b892796/starlette/datastructures.py#L568
986
+ """
987
+ with AppClient.connect(HintsApp) as client:
988
+ with httpx.Client() as httpx_client:
989
+ url = client.url + "/add"
990
+ resp = httpx_client.post(
991
+ url,
992
+ json={"lhs": 1, "rhs": 2},
993
+ timeout=30,
994
+ )
995
+ assert resp.is_success
996
+ assert resp.json()["result"] == 3
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
File without changes
File without changes