fal 1.50.0__tar.gz → 1.50.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.
- {fal-1.50.0/fal.egg-info → fal-1.50.1}/PKG-INFO +1 -1
- {fal-1.50.0 → fal-1.50.1/fal.egg-info}/PKG-INFO +1 -1
- {fal-1.50.0 → fal-1.50.1}/src/fal/_fal_version.py +2 -2
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/providers/fal.py +10 -33
- {fal-1.50.0 → fal-1.50.1}/tests/toolkit/file/providers/test_fal_retry.py +1 -40
- {fal-1.50.0 → fal-1.50.1}/.gitignore +0 -0
- {fal-1.50.0 → fal-1.50.1}/Makefile +0 -0
- {fal-1.50.0 → fal-1.50.1}/README.md +0 -0
- {fal-1.50.0 → fal-1.50.1}/docs/conf.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/docs/index.rst +0 -0
- {fal-1.50.0 → fal-1.50.1}/fal.egg-info/SOURCES.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/fal.egg-info/dependency_links.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/fal.egg-info/entry_points.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/fal.egg-info/requires.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/fal.egg-info/top_level.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/README.md +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/pyproject.toml +0 -0
- {fal-1.50.0 → fal-1.50.1}/openapi_rest.config.yaml +0 -0
- {fal-1.50.0 → fal-1.50.1}/pyproject.toml +0 -0
- {fal-1.50.0 → fal-1.50.1}/setup.cfg +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/__main__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/_serialization.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/_version.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/api.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/apps.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/client.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/deploy.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/api/runners.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/app.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/apps.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/auth/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/auth/auth0.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/auth/local.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/_utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/api.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/apps.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/auth.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/cli_nested_json.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/create.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/debug.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/deploy.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/doctor.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/files.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/keys.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/main.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/parser.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/profile.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/queue.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/run.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/runners.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/secrets.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/cli/teams.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/config.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/console/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/console/icons.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/console/ux.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/container.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/distributed/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/distributed/utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/distributed/worker.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/exceptions/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/exceptions/_base.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/exceptions/_cuda.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/exceptions/auth.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/file_sync.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/files.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/flags.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/logging/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/logging/isolate.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/logging/style.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/logging/trace.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/project.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/py.typed +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/rest_client.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/sdk.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/sync.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/audio/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/audio/audio.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/exceptions.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/file.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/providers/r2.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/providers/s3.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/file/types.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/image.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/image/safety_checker.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/kv.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/optimize.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/types.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/utils/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/utils/download_utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/utils/endpoint.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/utils/retry.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/utils/setup_utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/video/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/toolkit/video/video.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/src/fal/workflows.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/assets/cat.png +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_apps.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_auth.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_deploy.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_keys.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_run.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/cli/test_secrets.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/conftest.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/integration_test.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/mainify_package/__init__.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/mainify_package/impl.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/mainify_package/utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/mainify_target.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/test_apps.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/test_file_sync.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/test_files.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/test_kv.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/test_stability.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/toolkit/file_test.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/toolkit/image_test.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/toolkit/test_types.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/toolkit/utils/retry.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/unit/distributed/test_integration.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/unit/distributed/test_utils.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/unit/distributed/test_worker.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tests/unit/test_app.py +0 -0
- {fal-1.50.0 → fal-1.50.1}/tools/demo_script.py +0 -0
|
@@ -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.50.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 50,
|
|
31
|
+
__version__ = version = '1.50.1'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 50, 1)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -56,44 +56,21 @@ def _should_retry(exc: Exception) -> bool:
|
|
|
56
56
|
return False
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
class _RetryingRequestContext:
|
|
60
|
-
def __init__(self, request: Request, kwargs: dict[str, Any]):
|
|
61
|
-
self.request = request
|
|
62
|
-
self.kwargs = kwargs
|
|
63
|
-
self._cm: Any | None = None
|
|
64
|
-
self._response: addinfourl | None = None
|
|
65
|
-
|
|
66
|
-
def __enter__(self) -> addinfourl:
|
|
67
|
-
def _enter_once() -> addinfourl:
|
|
68
|
-
# Obtain the original context manager and explicitly enter it
|
|
69
|
-
self._cm = _urlopen(self.request, **self.kwargs)
|
|
70
|
-
return self._cm.__enter__()
|
|
71
|
-
|
|
72
|
-
_enter_with_retry = retry(
|
|
73
|
-
max_retries=MAX_ATTEMPTS,
|
|
74
|
-
base_delay=BASE_DELAY,
|
|
75
|
-
max_delay=MAX_DELAY,
|
|
76
|
-
backoff_type="exponential",
|
|
77
|
-
jitter=True,
|
|
78
|
-
should_retry=_should_retry,
|
|
79
|
-
)(_enter_once)
|
|
80
|
-
|
|
81
|
-
self._response = _enter_with_retry()
|
|
82
|
-
assert self._response is not None
|
|
83
|
-
return self._response
|
|
84
|
-
|
|
85
|
-
def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
|
|
86
|
-
if self._cm is not None:
|
|
87
|
-
return self._cm.__exit__(exc_type, exc_val, exc_tb)
|
|
88
|
-
return False
|
|
89
|
-
|
|
90
|
-
|
|
91
59
|
@contextmanager
|
|
92
60
|
def _maybe_retry_request(
|
|
93
61
|
request: Request,
|
|
94
62
|
**kwargs: Any,
|
|
95
63
|
) -> Generator[addinfourl, None, None]:
|
|
96
|
-
|
|
64
|
+
_urlopen_with_retry = retry(
|
|
65
|
+
max_retries=MAX_ATTEMPTS,
|
|
66
|
+
base_delay=BASE_DELAY,
|
|
67
|
+
max_delay=MAX_DELAY,
|
|
68
|
+
backoff_type="exponential",
|
|
69
|
+
jitter=True,
|
|
70
|
+
should_retry=_should_retry,
|
|
71
|
+
)(_urlopen)
|
|
72
|
+
|
|
73
|
+
with _urlopen_with_retry(request, **kwargs) as response:
|
|
97
74
|
yield response
|
|
98
75
|
|
|
99
76
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from unittest import mock
|
|
4
|
-
from urllib.error import HTTPError
|
|
4
|
+
from urllib.error import HTTPError
|
|
5
5
|
from urllib.request import Request
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
@@ -163,42 +163,3 @@ def test_max_retries_exhausted_for_retryable_errors():
|
|
|
163
163
|
|
|
164
164
|
assert exc_info.value.code == 500
|
|
165
165
|
assert call_count == 5
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def test_retry_on_urlerror_during_context_enter():
|
|
169
|
-
request = Request("https://example.com/test")
|
|
170
|
-
|
|
171
|
-
calls = {"open": 0, "enter": 0}
|
|
172
|
-
|
|
173
|
-
class EnterRaisesOnce:
|
|
174
|
-
def __init__(self):
|
|
175
|
-
self.data = b'{"result": "success"}'
|
|
176
|
-
self.headers = {"Content-Type": "application/json"}
|
|
177
|
-
|
|
178
|
-
def read(self):
|
|
179
|
-
return self.data
|
|
180
|
-
|
|
181
|
-
def __enter__(self):
|
|
182
|
-
calls["enter"] += 1
|
|
183
|
-
if calls["enter"] == 1:
|
|
184
|
-
raise URLError("Temporary failure in name resolution")
|
|
185
|
-
return self
|
|
186
|
-
|
|
187
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
188
|
-
return False
|
|
189
|
-
|
|
190
|
-
def mock_urlopen_side_effect(*args, **kwargs):
|
|
191
|
-
calls["open"] += 1
|
|
192
|
-
return EnterRaisesOnce()
|
|
193
|
-
|
|
194
|
-
with mock.patch(
|
|
195
|
-
"fal.toolkit.file.providers.fal._urlopen", side_effect=mock_urlopen_side_effect
|
|
196
|
-
):
|
|
197
|
-
with mock.patch("fal.toolkit.utils.retry.time.sleep"):
|
|
198
|
-
# Expect success after a retry (second __enter__ returns normally)
|
|
199
|
-
with _maybe_retry_request(request) as response:
|
|
200
|
-
assert response is not None
|
|
201
|
-
|
|
202
|
-
# Should have attempted to open at least twice due to retry
|
|
203
|
-
assert calls["open"] >= 2
|
|
204
|
-
assert calls["enter"] >= 2
|
|
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
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py
RENAMED
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py
RENAMED
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py
RENAMED
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py
RENAMED
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.50.0 → fal-1.50.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py
RENAMED
|
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
|
|
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
|