flyte 0.0.1b0__py3-none-any.whl → 2.0.0b46__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.
- flyte/__init__.py +83 -30
- flyte/_bin/connect.py +61 -0
- flyte/_bin/debug.py +38 -0
- flyte/_bin/runtime.py +87 -19
- flyte/_bin/serve.py +351 -0
- flyte/_build.py +3 -2
- flyte/_cache/cache.py +6 -5
- flyte/_cache/local_cache.py +216 -0
- flyte/_code_bundle/_ignore.py +31 -5
- flyte/_code_bundle/_packaging.py +42 -11
- flyte/_code_bundle/_utils.py +57 -34
- flyte/_code_bundle/bundle.py +130 -27
- flyte/_constants.py +1 -0
- flyte/_context.py +21 -5
- flyte/_custom_context.py +73 -0
- flyte/_debug/constants.py +37 -0
- flyte/_debug/utils.py +17 -0
- flyte/_debug/vscode.py +315 -0
- flyte/_deploy.py +396 -75
- flyte/_deployer.py +109 -0
- flyte/_environment.py +94 -11
- flyte/_excepthook.py +37 -0
- flyte/_group.py +2 -1
- flyte/_hash.py +1 -16
- flyte/_image.py +544 -234
- flyte/_initialize.py +443 -294
- flyte/_interface.py +40 -5
- flyte/_internal/controllers/__init__.py +22 -8
- flyte/_internal/controllers/_local_controller.py +159 -35
- flyte/_internal/controllers/_trace.py +18 -10
- flyte/_internal/controllers/remote/__init__.py +38 -9
- flyte/_internal/controllers/remote/_action.py +82 -12
- flyte/_internal/controllers/remote/_client.py +6 -2
- flyte/_internal/controllers/remote/_controller.py +290 -64
- flyte/_internal/controllers/remote/_core.py +155 -95
- flyte/_internal/controllers/remote/_informer.py +40 -20
- flyte/_internal/controllers/remote/_service_protocol.py +2 -2
- flyte/_internal/imagebuild/__init__.py +2 -10
- flyte/_internal/imagebuild/docker_builder.py +391 -84
- flyte/_internal/imagebuild/image_builder.py +111 -55
- flyte/_internal/imagebuild/remote_builder.py +409 -0
- flyte/_internal/imagebuild/utils.py +79 -0
- flyte/_internal/resolvers/_app_env_module.py +92 -0
- flyte/_internal/resolvers/_task_module.py +5 -38
- flyte/_internal/resolvers/app_env.py +26 -0
- flyte/_internal/resolvers/common.py +8 -1
- flyte/_internal/resolvers/default.py +2 -2
- flyte/_internal/runtime/convert.py +322 -33
- flyte/_internal/runtime/entrypoints.py +106 -18
- flyte/_internal/runtime/io.py +71 -23
- flyte/_internal/runtime/resources_serde.py +21 -7
- flyte/_internal/runtime/reuse.py +125 -0
- flyte/_internal/runtime/rusty.py +196 -0
- flyte/_internal/runtime/task_serde.py +239 -66
- flyte/_internal/runtime/taskrunner.py +48 -8
- flyte/_internal/runtime/trigger_serde.py +162 -0
- flyte/_internal/runtime/types_serde.py +7 -16
- flyte/_keyring/file.py +115 -0
- flyte/_link.py +30 -0
- flyte/_logging.py +241 -42
- flyte/_map.py +312 -0
- flyte/_metrics.py +59 -0
- flyte/_module.py +74 -0
- flyte/_pod.py +30 -0
- flyte/_resources.py +296 -33
- flyte/_retry.py +1 -7
- flyte/_reusable_environment.py +72 -7
- flyte/_run.py +461 -132
- flyte/_secret.py +47 -11
- flyte/_serve.py +333 -0
- flyte/_task.py +245 -56
- flyte/_task_environment.py +219 -97
- flyte/_task_plugins.py +47 -0
- flyte/_tools.py +8 -8
- flyte/_trace.py +15 -24
- flyte/_trigger.py +1027 -0
- flyte/_utils/__init__.py +12 -1
- flyte/_utils/asyn.py +3 -1
- flyte/_utils/async_cache.py +139 -0
- flyte/_utils/coro_management.py +5 -4
- flyte/_utils/description_parser.py +19 -0
- flyte/_utils/docker_credentials.py +173 -0
- flyte/_utils/helpers.py +45 -19
- flyte/_utils/module_loader.py +123 -0
- flyte/_utils/org_discovery.py +57 -0
- flyte/_utils/uv_script_parser.py +8 -1
- flyte/_version.py +16 -3
- flyte/app/__init__.py +27 -0
- flyte/app/_app_environment.py +362 -0
- flyte/app/_connector_environment.py +40 -0
- flyte/app/_deploy.py +130 -0
- flyte/app/_parameter.py +343 -0
- flyte/app/_runtime/__init__.py +3 -0
- flyte/app/_runtime/app_serde.py +383 -0
- flyte/app/_types.py +113 -0
- flyte/app/extras/__init__.py +9 -0
- flyte/app/extras/_auth_middleware.py +217 -0
- flyte/app/extras/_fastapi.py +93 -0
- flyte/app/extras/_model_loader/__init__.py +3 -0
- flyte/app/extras/_model_loader/config.py +7 -0
- flyte/app/extras/_model_loader/loader.py +288 -0
- flyte/cli/__init__.py +12 -0
- flyte/cli/_abort.py +28 -0
- flyte/cli/_build.py +114 -0
- flyte/cli/_common.py +493 -0
- flyte/cli/_create.py +371 -0
- flyte/cli/_delete.py +45 -0
- flyte/cli/_deploy.py +401 -0
- flyte/cli/_gen.py +316 -0
- flyte/cli/_get.py +446 -0
- flyte/cli/_option.py +33 -0
- {union/_cli → flyte/cli}/_params.py +152 -153
- flyte/cli/_plugins.py +209 -0
- flyte/cli/_prefetch.py +292 -0
- flyte/cli/_run.py +690 -0
- flyte/cli/_serve.py +338 -0
- flyte/cli/_update.py +86 -0
- flyte/cli/_user.py +20 -0
- flyte/cli/main.py +246 -0
- flyte/config/__init__.py +3 -0
- flyte/config/_config.py +248 -0
- flyte/config/_internal.py +73 -0
- flyte/config/_reader.py +225 -0
- flyte/connectors/__init__.py +11 -0
- flyte/connectors/_connector.py +330 -0
- flyte/connectors/_server.py +194 -0
- flyte/connectors/utils.py +159 -0
- flyte/errors.py +134 -2
- flyte/extend.py +24 -0
- flyte/extras/_container.py +69 -56
- flyte/git/__init__.py +3 -0
- flyte/git/_config.py +279 -0
- flyte/io/__init__.py +8 -1
- flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
- flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
- flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
- flyte/io/_dir.py +575 -113
- flyte/io/_file.py +587 -141
- flyte/io/_hashing_io.py +342 -0
- flyte/io/extend.py +7 -0
- flyte/models.py +635 -0
- flyte/prefetch/__init__.py +22 -0
- flyte/prefetch/_hf_model.py +563 -0
- flyte/remote/__init__.py +14 -3
- flyte/remote/_action.py +879 -0
- flyte/remote/_app.py +346 -0
- flyte/remote/_auth_metadata.py +42 -0
- flyte/remote/_client/_protocols.py +62 -4
- flyte/remote/_client/auth/_auth_utils.py +19 -0
- flyte/remote/_client/auth/_authenticators/base.py +8 -2
- flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
- flyte/remote/_client/auth/_authenticators/factory.py +4 -0
- flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
- flyte/remote/_client/auth/_channel.py +47 -18
- flyte/remote/_client/auth/_client_config.py +5 -3
- flyte/remote/_client/auth/_keyring.py +15 -2
- flyte/remote/_client/auth/_token_client.py +3 -3
- flyte/remote/_client/controlplane.py +206 -18
- flyte/remote/_common.py +66 -0
- flyte/remote/_data.py +107 -22
- flyte/remote/_logs.py +116 -33
- flyte/remote/_project.py +21 -19
- flyte/remote/_run.py +164 -631
- flyte/remote/_secret.py +72 -29
- flyte/remote/_task.py +387 -46
- flyte/remote/_trigger.py +368 -0
- flyte/remote/_user.py +43 -0
- flyte/report/_report.py +10 -6
- flyte/storage/__init__.py +13 -1
- flyte/storage/_config.py +237 -0
- flyte/storage/_parallel_reader.py +289 -0
- flyte/storage/_storage.py +268 -59
- flyte/syncify/__init__.py +56 -0
- flyte/syncify/_api.py +414 -0
- flyte/types/__init__.py +39 -0
- flyte/types/_interface.py +22 -7
- flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
- flyte/types/_string_literals.py +8 -9
- flyte/types/_type_engine.py +230 -129
- flyte/types/_utils.py +1 -1
- flyte-2.0.0b46.data/scripts/debug.py +38 -0
- flyte-2.0.0b46.data/scripts/runtime.py +194 -0
- flyte-2.0.0b46.dist-info/METADATA +352 -0
- flyte-2.0.0b46.dist-info/RECORD +221 -0
- flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
- flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
- flyte/_api_commons.py +0 -3
- flyte/_cli/_common.py +0 -287
- flyte/_cli/_create.py +0 -42
- flyte/_cli/_delete.py +0 -23
- flyte/_cli/_deploy.py +0 -140
- flyte/_cli/_get.py +0 -235
- flyte/_cli/_run.py +0 -152
- flyte/_cli/main.py +0 -72
- flyte/_datastructures.py +0 -342
- flyte/_internal/controllers/pbhash.py +0 -39
- flyte/_protos/common/authorization_pb2.py +0 -66
- flyte/_protos/common/authorization_pb2.pyi +0 -108
- flyte/_protos/common/authorization_pb2_grpc.py +0 -4
- flyte/_protos/common/identifier_pb2.py +0 -71
- flyte/_protos/common/identifier_pb2.pyi +0 -82
- flyte/_protos/common/identifier_pb2_grpc.py +0 -4
- flyte/_protos/common/identity_pb2.py +0 -48
- flyte/_protos/common/identity_pb2.pyi +0 -72
- flyte/_protos/common/identity_pb2_grpc.py +0 -4
- flyte/_protos/common/list_pb2.py +0 -36
- flyte/_protos/common/list_pb2.pyi +0 -69
- flyte/_protos/common/list_pb2_grpc.py +0 -4
- flyte/_protos/common/policy_pb2.py +0 -37
- flyte/_protos/common/policy_pb2.pyi +0 -27
- flyte/_protos/common/policy_pb2_grpc.py +0 -4
- flyte/_protos/common/role_pb2.py +0 -37
- flyte/_protos/common/role_pb2.pyi +0 -53
- flyte/_protos/common/role_pb2_grpc.py +0 -4
- flyte/_protos/common/runtime_version_pb2.py +0 -28
- flyte/_protos/common/runtime_version_pb2.pyi +0 -24
- flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
- flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
- flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/definition_pb2.py +0 -49
- flyte/_protos/secret/definition_pb2.pyi +0 -93
- flyte/_protos/secret/definition_pb2_grpc.py +0 -4
- flyte/_protos/secret/payload_pb2.py +0 -62
- flyte/_protos/secret/payload_pb2.pyi +0 -94
- flyte/_protos/secret/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/secret_pb2.py +0 -38
- flyte/_protos/secret/secret_pb2.pyi +0 -6
- flyte/_protos/secret/secret_pb2_grpc.py +0 -198
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
- flyte/_protos/validate/validate/validate_pb2.py +0 -76
- flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
- flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- flyte/_protos/workflow/queue_service_pb2.py +0 -106
- flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
- flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- flyte/_protos/workflow/run_definition_pb2.py +0 -128
- flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
- flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
- flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- flyte/_protos/workflow/run_service_pb2.py +0 -133
- flyte/_protos/workflow/run_service_pb2.pyi +0 -175
- flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
- flyte/_protos/workflow/state_service_pb2.py +0 -58
- flyte/_protos/workflow/state_service_pb2.pyi +0 -71
- flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
- flyte/_protos/workflow/task_definition_pb2.py +0 -72
- flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
- flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/task_service_pb2.py +0 -44
- flyte/_protos/workflow/task_service_pb2.pyi +0 -31
- flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
- flyte/io/_dataframe.py +0 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/remote/_console.py +0 -18
- flyte-0.0.1b0.dist-info/METADATA +0 -179
- flyte-0.0.1b0.dist-info/RECORD +0 -390
- flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
- union/__init__.py +0 -54
- union/_api_commons.py +0 -3
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +0 -113
- union/_build.py +0 -25
- union/_cache/__init__.py +0 -12
- union/_cache/cache.py +0 -141
- union/_cache/defaults.py +0 -9
- union/_cache/policy_function_body.py +0 -42
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +0 -263
- union/_cli/_create.py +0 -40
- union/_cli/_delete.py +0 -23
- union/_cli/_deploy.py +0 -120
- union/_cli/_get.py +0 -162
- union/_cli/_run.py +0 -150
- union/_cli/main.py +0 -72
- union/_code_bundle/__init__.py +0 -8
- union/_code_bundle/_ignore.py +0 -113
- union/_code_bundle/_packaging.py +0 -187
- union/_code_bundle/_utils.py +0 -342
- union/_code_bundle/bundle.py +0 -176
- union/_context.py +0 -146
- union/_datastructures.py +0 -295
- union/_deploy.py +0 -185
- union/_doc.py +0 -29
- union/_docstring.py +0 -26
- union/_environment.py +0 -43
- union/_group.py +0 -31
- union/_hash.py +0 -23
- union/_image.py +0 -760
- union/_initialize.py +0 -585
- union/_interface.py +0 -84
- union/_internal/__init__.py +0 -3
- union/_internal/controllers/__init__.py +0 -77
- union/_internal/controllers/_local_controller.py +0 -77
- union/_internal/controllers/pbhash.py +0 -39
- union/_internal/controllers/remote/__init__.py +0 -40
- union/_internal/controllers/remote/_action.py +0 -131
- union/_internal/controllers/remote/_client.py +0 -43
- union/_internal/controllers/remote/_controller.py +0 -169
- union/_internal/controllers/remote/_core.py +0 -341
- union/_internal/controllers/remote/_informer.py +0 -260
- union/_internal/controllers/remote/_service_protocol.py +0 -44
- union/_internal/imagebuild/__init__.py +0 -11
- union/_internal/imagebuild/docker_builder.py +0 -416
- union/_internal/imagebuild/image_builder.py +0 -243
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +0 -31
- union/_internal/resolvers/common.py +0 -24
- union/_internal/resolvers/default.py +0 -27
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +0 -163
- union/_internal/runtime/entrypoints.py +0 -121
- union/_internal/runtime/io.py +0 -136
- union/_internal/runtime/resources_serde.py +0 -134
- union/_internal/runtime/task_serde.py +0 -202
- union/_internal/runtime/taskrunner.py +0 -179
- union/_internal/runtime/types_serde.py +0 -53
- union/_logging.py +0 -124
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +0 -66
- union/_protos/common/authorization_pb2.pyi +0 -106
- union/_protos/common/authorization_pb2_grpc.py +0 -4
- union/_protos/common/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- union/_protos/common/identifier_pb2_grpc.py +0 -4
- union/_protos/common/identity_pb2.py +0 -48
- union/_protos/common/identity_pb2.pyi +0 -72
- union/_protos/common/identity_pb2_grpc.py +0 -4
- union/_protos/common/list_pb2.py +0 -36
- union/_protos/common/list_pb2.pyi +0 -69
- union/_protos/common/list_pb2_grpc.py +0 -4
- union/_protos/common/policy_pb2.py +0 -37
- union/_protos/common/policy_pb2.pyi +0 -27
- union/_protos/common/policy_pb2_grpc.py +0 -4
- union/_protos/common/role_pb2.py +0 -37
- union/_protos/common/role_pb2.pyi +0 -51
- union/_protos/common/role_pb2_grpc.py +0 -4
- union/_protos/common/runtime_version_pb2.py +0 -28
- union/_protos/common/runtime_version_pb2.pyi +0 -24
- union/_protos/common/runtime_version_pb2_grpc.py +0 -4
- union/_protos/logs/dataplane/payload_pb2.py +0 -96
- union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- union/_protos/secret/definition_pb2.py +0 -49
- union/_protos/secret/definition_pb2.pyi +0 -93
- union/_protos/secret/definition_pb2_grpc.py +0 -4
- union/_protos/secret/payload_pb2.py +0 -62
- union/_protos/secret/payload_pb2.pyi +0 -94
- union/_protos/secret/payload_pb2_grpc.py +0 -4
- union/_protos/secret/secret_pb2.py +0 -38
- union/_protos/secret/secret_pb2.pyi +0 -6
- union/_protos/secret/secret_pb2_grpc.py +0 -198
- union/_protos/validate/validate/validate_pb2.py +0 -76
- union/_protos/workflow/node_execution_service_pb2.py +0 -26
- union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- union/_protos/workflow/queue_service_pb2.py +0 -75
- union/_protos/workflow/queue_service_pb2.pyi +0 -103
- union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- union/_protos/workflow/run_definition_pb2.py +0 -100
- union/_protos/workflow/run_definition_pb2.pyi +0 -256
- union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/run_logs_service_pb2.py +0 -41
- union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- union/_protos/workflow/run_service_pb2.py +0 -133
- union/_protos/workflow/run_service_pb2.pyi +0 -173
- union/_protos/workflow/run_service_pb2_grpc.py +0 -412
- union/_protos/workflow/state_service_pb2.py +0 -58
- union/_protos/workflow/state_service_pb2.pyi +0 -69
- union/_protos/workflow/state_service_pb2_grpc.py +0 -138
- union/_protos/workflow/task_definition_pb2.py +0 -72
- union/_protos/workflow/task_definition_pb2.pyi +0 -65
- union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/task_service_pb2.py +0 -44
- union/_protos/workflow/task_service_pb2.pyi +0 -31
- union/_protos/workflow/task_service_pb2_grpc.py +0 -104
- union/_resources.py +0 -226
- union/_retry.py +0 -32
- union/_reusable_environment.py +0 -25
- union/_run.py +0 -374
- union/_secret.py +0 -61
- union/_task.py +0 -354
- union/_task_environment.py +0 -186
- union/_timeout.py +0 -47
- union/_tools.py +0 -27
- union/_utils/__init__.py +0 -11
- union/_utils/asyn.py +0 -119
- union/_utils/file_handling.py +0 -71
- union/_utils/helpers.py +0 -46
- union/_utils/lazy_module.py +0 -54
- union/_utils/uv_script_parser.py +0 -49
- union/_version.py +0 -21
- union/connectors/__init__.py +0 -0
- union/errors.py +0 -128
- union/extras/__init__.py +0 -5
- union/extras/_container.py +0 -263
- union/io/__init__.py +0 -11
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +0 -425
- union/io/_file.py +0 -418
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +0 -117
- union/io/structured_dataset/__init__.py +0 -122
- union/io/structured_dataset/basic_dfs.py +0 -219
- union/io/structured_dataset/structured_dataset.py +0 -1057
- union/py.typed +0 -0
- union/remote/__init__.py +0 -23
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +0 -129
- union/remote/_client/auth/__init__.py +0 -12
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +0 -391
- union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
- union/remote/_client/auth/_authenticators/device_code.py +0 -120
- union/remote/_client/auth/_authenticators/external_command.py +0 -77
- union/remote/_client/auth/_authenticators/factory.py +0 -200
- union/remote/_client/auth/_authenticators/pkce.py +0 -515
- union/remote/_client/auth/_channel.py +0 -184
- union/remote/_client/auth/_client_config.py +0 -83
- union/remote/_client/auth/_default_html.py +0 -32
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
- union/remote/_client/auth/_keyring.py +0 -154
- union/remote/_client/auth/_token_client.py +0 -258
- union/remote/_client/auth/errors.py +0 -16
- union/remote/_client/controlplane.py +0 -86
- union/remote/_data.py +0 -149
- union/remote/_logs.py +0 -74
- union/remote/_project.py +0 -86
- union/remote/_run.py +0 -820
- union/remote/_secret.py +0 -132
- union/remote/_task.py +0 -193
- union/report/__init__.py +0 -3
- union/report/_report.py +0 -178
- union/report/_template.html +0 -124
- union/storage/__init__.py +0 -24
- union/storage/_remote_fs.py +0 -34
- union/storage/_storage.py +0 -247
- union/storage/_utils.py +0 -5
- union/types/__init__.py +0 -11
- union/types/_renderer.py +0 -162
- union/types/_string_literals.py +0 -120
- union/types/_type_engine.py +0 -2131
- union/types/_utils.py +0 -80
- /flyte/{_cli → _debug}/__init__.py +0 -0
- /flyte/{_protos → _keyring}/__init__.py +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
flyte/_bin/serve.py
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Flyte runtime serve module. This is used to serve Apps/serving.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import os
|
|
9
|
+
import traceback
|
|
10
|
+
import typing
|
|
11
|
+
|
|
12
|
+
import click
|
|
13
|
+
|
|
14
|
+
import flyte.io
|
|
15
|
+
from flyte._logging import logger
|
|
16
|
+
from flyte.models import CodeBundle
|
|
17
|
+
|
|
18
|
+
if typing.TYPE_CHECKING:
|
|
19
|
+
from flyte.app import AppEnvironment
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
PROJECT_NAME = "FLYTE_INTERNAL_EXECUTION_PROJECT"
|
|
23
|
+
DOMAIN_NAME = "FLYTE_INTERNAL_EXECUTION_DOMAIN"
|
|
24
|
+
ORG_NAME = "_U_ORG_NAME"
|
|
25
|
+
_F_PATH_REWRITE = "_F_PATH_REWRITE"
|
|
26
|
+
ENDPOINT_OVERRIDE = "_U_EP_OVERRIDE"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def sync_parameters(serialized_parameters: str, dest: str) -> tuple[dict, dict, dict]:
|
|
30
|
+
"""
|
|
31
|
+
Converts parameters into simple dict of name to value, downloading any files/directories as needed.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
serialized_parameters (str): The serialized parameters string.
|
|
35
|
+
dest: Destination to download parameters to
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Tuple[dict, dict]: A tuple containing the output dictionary and the environment variables dictionary.
|
|
39
|
+
The output dictionary maps parameter names to their values.
|
|
40
|
+
The environment variables dictionary maps environment variable names to their values.
|
|
41
|
+
"""
|
|
42
|
+
import flyte.storage as storage
|
|
43
|
+
from flyte.app._parameter import SerializableParameterCollection
|
|
44
|
+
|
|
45
|
+
print(f"Log level: {logger.getEffectiveLevel()} is set from env {os.environ.get('LOG_LEVEL')}", flush=True)
|
|
46
|
+
logger.info("Reading parameters...")
|
|
47
|
+
|
|
48
|
+
user_parameters = SerializableParameterCollection.from_transport(serialized_parameters)
|
|
49
|
+
|
|
50
|
+
# these will be serialized to json, the app can fetch these values via
|
|
51
|
+
# env var or with flyte.app.get_input()
|
|
52
|
+
serializable_parameters = {}
|
|
53
|
+
|
|
54
|
+
# these will be passed into the AppEnvironment._server function.
|
|
55
|
+
materialized_parameters = {}
|
|
56
|
+
|
|
57
|
+
env_vars = {}
|
|
58
|
+
|
|
59
|
+
for parameter in user_parameters.parameters:
|
|
60
|
+
parameter_type = parameter.type
|
|
61
|
+
ser_value = parameter.value
|
|
62
|
+
|
|
63
|
+
materialized_value: str | flyte.io.File | flyte.io.Dir = ser_value
|
|
64
|
+
# for files and directories, default to remote paths for the materialized value
|
|
65
|
+
if parameter_type == "file":
|
|
66
|
+
materialized_value = flyte.io.File(path=ser_value)
|
|
67
|
+
elif parameter_type == "directory":
|
|
68
|
+
materialized_value = flyte.io.Dir(path=ser_value)
|
|
69
|
+
|
|
70
|
+
# download files or directories
|
|
71
|
+
if parameter.download:
|
|
72
|
+
user_dest = parameter.dest or dest
|
|
73
|
+
|
|
74
|
+
# replace file and directory inputs with the local paths if download is True
|
|
75
|
+
if parameter_type == "file":
|
|
76
|
+
logger.info(f"Downloading {parameter.name} of type File to {user_dest}...")
|
|
77
|
+
ser_value = await storage.get(ser_value, user_dest)
|
|
78
|
+
materialized_value = flyte.io.File(path=ser_value)
|
|
79
|
+
|
|
80
|
+
elif parameter_type == "directory":
|
|
81
|
+
logger.info(f"Downloading {parameter.name} of type Directory to {user_dest}...")
|
|
82
|
+
ser_value = await storage.get(ser_value, user_dest, recursive=True)
|
|
83
|
+
materialized_value = flyte.io.Dir(path=ser_value)
|
|
84
|
+
else:
|
|
85
|
+
raise ValueError("Can only download files or directories")
|
|
86
|
+
|
|
87
|
+
serializable_parameters[parameter.name] = ser_value
|
|
88
|
+
materialized_parameters[parameter.name] = materialized_value
|
|
89
|
+
|
|
90
|
+
if parameter.env_var:
|
|
91
|
+
env_vars[parameter.env_var] = ser_value
|
|
92
|
+
|
|
93
|
+
return serializable_parameters, materialized_parameters, env_vars
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
async def download_code_parameters(
|
|
97
|
+
serialized_parameters: str, tgz: str, pkl: str, dest: str, version: str
|
|
98
|
+
) -> tuple[dict, dict, dict, CodeBundle | None]:
|
|
99
|
+
from flyte._internal.runtime.entrypoints import download_code_bundle
|
|
100
|
+
|
|
101
|
+
serializable_parameters: dict[str, str] = {}
|
|
102
|
+
materialized_parameters: dict[str, str | flyte.io.File | flyte.io.Dir] = {}
|
|
103
|
+
env_vars: dict[str, str] = {}
|
|
104
|
+
if serialized_parameters and len(serialized_parameters) > 0:
|
|
105
|
+
serializable_parameters, materialized_parameters, env_vars = await sync_parameters(serialized_parameters, dest)
|
|
106
|
+
code_bundle: CodeBundle | None = None
|
|
107
|
+
if tgz or pkl:
|
|
108
|
+
logger.debug(f"Downloading Code bundle: {tgz or pkl} ...")
|
|
109
|
+
bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
|
|
110
|
+
code_bundle = await download_code_bundle(bundle)
|
|
111
|
+
|
|
112
|
+
return serializable_parameters, materialized_parameters, env_vars, code_bundle
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def load_app_env(
|
|
116
|
+
resolver: str,
|
|
117
|
+
resolver_args: str,
|
|
118
|
+
) -> AppEnvironment:
|
|
119
|
+
"""
|
|
120
|
+
Load a app environment from a resolver.
|
|
121
|
+
|
|
122
|
+
:param resolver: The resolver to use to load the task.
|
|
123
|
+
:param resolver_args: Arguments to pass to the resolver.
|
|
124
|
+
:return: The loaded task.
|
|
125
|
+
"""
|
|
126
|
+
from flyte._internal.resolvers.app_env import AppEnvResolver
|
|
127
|
+
from flyte._internal.runtime.entrypoints import load_class
|
|
128
|
+
|
|
129
|
+
resolver_class = load_class(resolver)
|
|
130
|
+
resolver_instance: AppEnvResolver = resolver_class()
|
|
131
|
+
try:
|
|
132
|
+
return resolver_instance.load_app_env(resolver_args)
|
|
133
|
+
except ModuleNotFoundError as e:
|
|
134
|
+
cwd = os.getcwd()
|
|
135
|
+
files = []
|
|
136
|
+
try:
|
|
137
|
+
for root, dirs, filenames in os.walk(cwd):
|
|
138
|
+
for name in dirs + filenames:
|
|
139
|
+
rel_path = os.path.relpath(os.path.join(root, name), cwd)
|
|
140
|
+
files.append(rel_path)
|
|
141
|
+
except Exception as list_err:
|
|
142
|
+
files = [f"(Failed to list directory: {list_err})"]
|
|
143
|
+
|
|
144
|
+
msg = (
|
|
145
|
+
"\n\nFull traceback:\n" + "".join(traceback.format_exc()) + f"\n[ImportError Diagnostics]\n"
|
|
146
|
+
f"Module '{e.name}' not found in either the Python virtual environment or the current working directory.\n"
|
|
147
|
+
f"Current working directory: {cwd}\n"
|
|
148
|
+
f"Files found under current directory:\n" + "\n".join(f" - {f}" for f in files)
|
|
149
|
+
)
|
|
150
|
+
raise ModuleNotFoundError(msg) from e
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def load_pkl_app_env(code_bundle: CodeBundle) -> AppEnvironment:
|
|
154
|
+
import gzip
|
|
155
|
+
|
|
156
|
+
import cloudpickle
|
|
157
|
+
|
|
158
|
+
if code_bundle.downloaded_path is None:
|
|
159
|
+
raise ValueError("Code bundle downloaded_path is None. Code bundle must be downloaded first.")
|
|
160
|
+
logger.debug(f"Loading app env from pkl: {code_bundle.downloaded_path}")
|
|
161
|
+
try:
|
|
162
|
+
with gzip.open(str(code_bundle.downloaded_path), "rb") as f:
|
|
163
|
+
return cloudpickle.load(f)
|
|
164
|
+
except Exception as e:
|
|
165
|
+
logger.exception(f"Failed to load pickled app env from {code_bundle.downloaded_path}. Reason: {e!s}")
|
|
166
|
+
raise
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _bind_parameters(
|
|
170
|
+
func: typing.Callable,
|
|
171
|
+
materialized_parameters: dict[str, str | flyte.io.File | flyte.io.Dir],
|
|
172
|
+
) -> dict[str, str | flyte.io.File | flyte.io.Dir]:
|
|
173
|
+
"""Bind materialized_parameters to func based on the argument names of the function.
|
|
174
|
+
|
|
175
|
+
If the function has **kwargs, all materialized parameters are passed through.
|
|
176
|
+
Otherwise, only parameters matching the function signature are bound.
|
|
177
|
+
"""
|
|
178
|
+
import inspect
|
|
179
|
+
|
|
180
|
+
sig = inspect.signature(func)
|
|
181
|
+
|
|
182
|
+
# Check if function accepts **kwargs
|
|
183
|
+
has_var_keyword = any(param.kind == inspect.Parameter.VAR_KEYWORD for param in sig.parameters.values())
|
|
184
|
+
|
|
185
|
+
if has_var_keyword:
|
|
186
|
+
# If function has **kwargs, pass all parameters
|
|
187
|
+
return materialized_parameters
|
|
188
|
+
|
|
189
|
+
# Otherwise, only bind parameters that match the function signature
|
|
190
|
+
bound_params = {}
|
|
191
|
+
for param_name in sig.parameters:
|
|
192
|
+
if param_name in materialized_parameters:
|
|
193
|
+
bound_params[param_name] = materialized_parameters[param_name]
|
|
194
|
+
return bound_params
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
async def _serve(
|
|
198
|
+
app_env: AppEnvironment,
|
|
199
|
+
materialized_parameters: dict[str, str | flyte.io.File | flyte.io.Dir],
|
|
200
|
+
):
|
|
201
|
+
import signal
|
|
202
|
+
|
|
203
|
+
logger.info("Running app via server function")
|
|
204
|
+
assert app_env._server is not None
|
|
205
|
+
|
|
206
|
+
# Use the asyncio event loop's add_signal_handler, and ensure all cleanup happens
|
|
207
|
+
# within the running event loop, not from a synchronous signal handler.
|
|
208
|
+
loop = asyncio.get_running_loop()
|
|
209
|
+
|
|
210
|
+
async def shutdown():
|
|
211
|
+
logger.info("Received SIGTERM, shutting down server...")
|
|
212
|
+
if app_env._on_shutdown is not None:
|
|
213
|
+
bound_params = _bind_parameters(app_env._on_shutdown, materialized_parameters)
|
|
214
|
+
if asyncio.iscoroutinefunction(app_env._on_shutdown):
|
|
215
|
+
await app_env._on_shutdown(**bound_params)
|
|
216
|
+
else:
|
|
217
|
+
app_env._on_shutdown(**bound_params)
|
|
218
|
+
logger.info("Server shut down")
|
|
219
|
+
# Use loop.stop() to gracefully stop the loop after shutdown
|
|
220
|
+
loop.stop()
|
|
221
|
+
|
|
222
|
+
logger.info("Adding signal handler for SIGTERM using signal.signal")
|
|
223
|
+
signal.signal(signal.SIGTERM, lambda signum, frame: asyncio.create_task(shutdown()))
|
|
224
|
+
|
|
225
|
+
if app_env._on_startup is not None:
|
|
226
|
+
logger.info("Running on_startup function")
|
|
227
|
+
bound_params = _bind_parameters(app_env._on_startup, materialized_parameters)
|
|
228
|
+
if asyncio.iscoroutinefunction(app_env._on_startup):
|
|
229
|
+
await app_env._on_startup(**bound_params)
|
|
230
|
+
else:
|
|
231
|
+
app_env._on_startup(**bound_params)
|
|
232
|
+
|
|
233
|
+
try:
|
|
234
|
+
logger.info("Running server function")
|
|
235
|
+
bound_params = _bind_parameters(app_env._server, materialized_parameters)
|
|
236
|
+
if asyncio.iscoroutinefunction(app_env._server):
|
|
237
|
+
await app_env._server(**bound_params)
|
|
238
|
+
else:
|
|
239
|
+
app_env._server(**bound_params)
|
|
240
|
+
finally:
|
|
241
|
+
await shutdown()
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@click.command()
|
|
245
|
+
@click.option("--parameters", "-p", required=False)
|
|
246
|
+
@click.option("--version", required=True)
|
|
247
|
+
@click.option("--image-cache", required=False)
|
|
248
|
+
@click.option("--tgz", required=False)
|
|
249
|
+
@click.option("--pkl", required=False)
|
|
250
|
+
@click.option("--dest", required=False)
|
|
251
|
+
@click.option("--project", envvar=PROJECT_NAME, required=False)
|
|
252
|
+
@click.option("--domain", envvar=DOMAIN_NAME, required=False)
|
|
253
|
+
@click.option("--org", envvar=ORG_NAME, required=False)
|
|
254
|
+
@click.option("--resolver", required=False)
|
|
255
|
+
@click.option("--resolver-args", type=str, required=False)
|
|
256
|
+
@click.argument("command", nargs=-1, type=click.UNPROCESSED)
|
|
257
|
+
def main(
|
|
258
|
+
parameters: str | None,
|
|
259
|
+
version: str,
|
|
260
|
+
resolver: str,
|
|
261
|
+
resolver_args: str,
|
|
262
|
+
image_cache: str,
|
|
263
|
+
tgz: str,
|
|
264
|
+
pkl: str,
|
|
265
|
+
dest: str,
|
|
266
|
+
command: tuple[str, ...] | None = None,
|
|
267
|
+
project: str | None = None,
|
|
268
|
+
domain: str | None = None,
|
|
269
|
+
org: str | None = None,
|
|
270
|
+
):
|
|
271
|
+
import json
|
|
272
|
+
import os
|
|
273
|
+
import signal
|
|
274
|
+
from subprocess import Popen
|
|
275
|
+
|
|
276
|
+
from flyte._initialize import init_in_cluster
|
|
277
|
+
from flyte.app._parameter import RUNTIME_PARAMETERS_FILE
|
|
278
|
+
|
|
279
|
+
init_in_cluster(org=org, project=project, domain=domain)
|
|
280
|
+
|
|
281
|
+
logger.info(f"Starting flyte-serve, org: {org}, project: {project}, domain: {domain}")
|
|
282
|
+
|
|
283
|
+
serializable_parameters, materialized_parameters, env_vars, code_bundle = asyncio.run(
|
|
284
|
+
download_code_parameters(
|
|
285
|
+
serialized_parameters=parameters or "",
|
|
286
|
+
tgz=tgz or "",
|
|
287
|
+
pkl=pkl or "",
|
|
288
|
+
dest=dest or os.getcwd(),
|
|
289
|
+
version=version,
|
|
290
|
+
),
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
app_env: AppEnvironment | None = None
|
|
294
|
+
if code_bundle is not None:
|
|
295
|
+
if code_bundle.pkl:
|
|
296
|
+
app_env = load_pkl_app_env(code_bundle)
|
|
297
|
+
elif code_bundle.tgz:
|
|
298
|
+
if resolver is not None and resolver_args is not None:
|
|
299
|
+
logger.info(f"Loading app env from resolver: {resolver}, args: {resolver_args}")
|
|
300
|
+
app_env = load_app_env(resolver, resolver_args)
|
|
301
|
+
else:
|
|
302
|
+
logger.info("Resolver arguments not provided, started server from command.")
|
|
303
|
+
else:
|
|
304
|
+
raise ValueError("Code bundle did not contain a tgz or pkl file")
|
|
305
|
+
|
|
306
|
+
for key, value in env_vars.items():
|
|
307
|
+
# set environment variables defined in the AppEnvironment Parameters
|
|
308
|
+
logger.info(f"Setting environment variable {key}='{value}'")
|
|
309
|
+
os.environ[key] = value
|
|
310
|
+
|
|
311
|
+
parameters_file = os.path.join(os.getcwd(), RUNTIME_PARAMETERS_FILE)
|
|
312
|
+
with open(parameters_file, "w") as f:
|
|
313
|
+
json.dump(serializable_parameters, f)
|
|
314
|
+
|
|
315
|
+
os.environ[RUNTIME_PARAMETERS_FILE] = parameters_file
|
|
316
|
+
|
|
317
|
+
if app_env and app_env._server is not None:
|
|
318
|
+
asyncio.run(_serve(app_env, materialized_parameters))
|
|
319
|
+
exit(0)
|
|
320
|
+
|
|
321
|
+
if command is None or len(command) == 0:
|
|
322
|
+
raise ValueError("No command provided to execute")
|
|
323
|
+
|
|
324
|
+
logger.info(f"Serving app with command: {command}")
|
|
325
|
+
command_list = []
|
|
326
|
+
for arg in command:
|
|
327
|
+
logger.info(f"Processing arg: {arg}")
|
|
328
|
+
if arg.startswith("$"):
|
|
329
|
+
# expand environment variables in the user-defined command
|
|
330
|
+
val = os.getenv(arg[1:])
|
|
331
|
+
if val is None:
|
|
332
|
+
raise ValueError(f"Environment variable {arg[1:]} not found")
|
|
333
|
+
logger.info(f"Found env var {arg}.")
|
|
334
|
+
command_list.append(val)
|
|
335
|
+
else:
|
|
336
|
+
command_list.append(arg)
|
|
337
|
+
|
|
338
|
+
command_joined = " ".join(command_list)
|
|
339
|
+
logger.info(f"Serving command: {command_joined}")
|
|
340
|
+
p = Popen(command_joined, env=os.environ, shell=True)
|
|
341
|
+
|
|
342
|
+
def handle_sigterm(signum, frame):
|
|
343
|
+
p.send_signal(signum)
|
|
344
|
+
|
|
345
|
+
signal.signal(signal.SIGTERM, handle_sigterm)
|
|
346
|
+
returncode = p.wait()
|
|
347
|
+
exit(returncode)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
if __name__ == "__main__":
|
|
351
|
+
main()
|
flyte/_build.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from .
|
|
3
|
+
from flyte.syncify import syncify
|
|
4
|
+
|
|
4
5
|
from ._image import Image
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
@
|
|
8
|
+
@syncify
|
|
8
9
|
async def build(image: Image) -> str:
|
|
9
10
|
"""
|
|
10
11
|
Build an image. The existing async context will be used.
|
flyte/_cache/cache.py
CHANGED
|
@@ -14,15 +14,14 @@ from typing import (
|
|
|
14
14
|
import rich.repr
|
|
15
15
|
from typing_extensions import Literal, ParamSpec, TypeVar, get_args
|
|
16
16
|
|
|
17
|
-
from flyte._datastructures import CodeBundle
|
|
18
|
-
|
|
19
17
|
# if TYPE_CHECKING:
|
|
20
18
|
from flyte._image import Image
|
|
19
|
+
from flyte.models import CodeBundle
|
|
21
20
|
|
|
22
21
|
P = ParamSpec("P")
|
|
23
22
|
FuncOut = TypeVar("FuncOut")
|
|
24
23
|
|
|
25
|
-
CacheBehavior = Literal["auto", "override", "disable"
|
|
24
|
+
CacheBehavior = Literal["auto", "override", "disable"]
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
@dataclass
|
|
@@ -78,14 +77,16 @@ class Cache:
|
|
|
78
77
|
def __post_init__(self):
|
|
79
78
|
if self.behavior not in get_args(CacheBehavior):
|
|
80
79
|
raise ValueError(f"Invalid cache behavior: {self.behavior}. Must be one of ['auto', 'override', 'disable']")
|
|
81
|
-
if self.behavior == "disable":
|
|
82
|
-
return
|
|
83
80
|
|
|
81
|
+
# Still setup _ignore_inputs when cache is disabled to prevent _ignored_inputs attribute not found error
|
|
84
82
|
if isinstance(self.ignored_inputs, str):
|
|
85
83
|
self._ignored_inputs = (self.ignored_inputs,)
|
|
86
84
|
else:
|
|
87
85
|
self._ignored_inputs = self.ignored_inputs
|
|
88
86
|
|
|
87
|
+
if self.behavior == "disable":
|
|
88
|
+
return
|
|
89
|
+
|
|
89
90
|
# Normalize policies so that self._policies is always a list
|
|
90
91
|
if self.policies is None:
|
|
91
92
|
from flyte._cache.defaults import get_default_policies
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import sqlite3
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
try:
|
|
5
|
+
import aiosqlite
|
|
6
|
+
|
|
7
|
+
HAS_AIOSQLITE = True
|
|
8
|
+
except ImportError:
|
|
9
|
+
HAS_AIOSQLITE = False
|
|
10
|
+
|
|
11
|
+
from flyteidl2.task import common_pb2
|
|
12
|
+
|
|
13
|
+
from flyte._internal.runtime import convert
|
|
14
|
+
from flyte._logging import logger
|
|
15
|
+
from flyte.config import auto
|
|
16
|
+
|
|
17
|
+
DEFAULT_CACHE_DIR = "~/.flyte"
|
|
18
|
+
CACHE_LOCATION = "local-cache/cache.db"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LocalTaskCache(object):
|
|
22
|
+
"""
|
|
23
|
+
This class implements a persistent store able to cache the result of local task executions.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
_conn: "aiosqlite.Connection | None" = None
|
|
27
|
+
_conn_sync: sqlite3.Connection | None = None
|
|
28
|
+
_initialized: bool = False
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def _get_cache_path() -> str:
|
|
32
|
+
"""Get the cache database path, creating directory if needed."""
|
|
33
|
+
config = auto()
|
|
34
|
+
if config.source:
|
|
35
|
+
cache_dir = config.source.parent
|
|
36
|
+
else:
|
|
37
|
+
cache_dir = Path(DEFAULT_CACHE_DIR).expanduser()
|
|
38
|
+
|
|
39
|
+
cache_path = cache_dir / CACHE_LOCATION
|
|
40
|
+
# Ensure the directory exists
|
|
41
|
+
cache_path.parent.mkdir(parents=True, exist_ok=True)
|
|
42
|
+
logger.info(f"Use local cache path: {cache_path}")
|
|
43
|
+
return str(cache_path)
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
async def initialize():
|
|
47
|
+
"""Initialize the cache with database connection."""
|
|
48
|
+
if not LocalTaskCache._initialized:
|
|
49
|
+
if HAS_AIOSQLITE:
|
|
50
|
+
await LocalTaskCache._initialize_async()
|
|
51
|
+
else:
|
|
52
|
+
LocalTaskCache._initialize_sync()
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
async def _initialize_async():
|
|
56
|
+
"""Initialize async cache connection."""
|
|
57
|
+
db_path = LocalTaskCache._get_cache_path()
|
|
58
|
+
conn = await aiosqlite.connect(db_path)
|
|
59
|
+
await conn.execute("""
|
|
60
|
+
CREATE TABLE IF NOT EXISTS task_cache (
|
|
61
|
+
key TEXT PRIMARY KEY,
|
|
62
|
+
value BLOB
|
|
63
|
+
)
|
|
64
|
+
""")
|
|
65
|
+
await conn.commit()
|
|
66
|
+
LocalTaskCache._conn = conn
|
|
67
|
+
LocalTaskCache._initialized = True
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def _initialize_sync():
|
|
71
|
+
"""Initialize sync cache connection."""
|
|
72
|
+
db_path = LocalTaskCache._get_cache_path()
|
|
73
|
+
conn = sqlite3.connect(db_path)
|
|
74
|
+
conn.execute("""
|
|
75
|
+
CREATE TABLE IF NOT EXISTS task_cache (
|
|
76
|
+
key TEXT PRIMARY KEY,
|
|
77
|
+
value BLOB
|
|
78
|
+
)
|
|
79
|
+
""")
|
|
80
|
+
conn.commit()
|
|
81
|
+
LocalTaskCache._conn_sync = conn
|
|
82
|
+
LocalTaskCache._initialized = True
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
async def clear():
|
|
86
|
+
"""Clear all cache entries."""
|
|
87
|
+
if not LocalTaskCache._initialized:
|
|
88
|
+
await LocalTaskCache.initialize()
|
|
89
|
+
|
|
90
|
+
if HAS_AIOSQLITE:
|
|
91
|
+
await LocalTaskCache._clear_async()
|
|
92
|
+
else:
|
|
93
|
+
LocalTaskCache._clear_sync()
|
|
94
|
+
|
|
95
|
+
@staticmethod
|
|
96
|
+
async def _clear_async():
|
|
97
|
+
"""Clear all cache entries (async)."""
|
|
98
|
+
if LocalTaskCache._conn is None:
|
|
99
|
+
raise RuntimeError("Cache not properly initialized")
|
|
100
|
+
await LocalTaskCache._conn.execute("DELETE FROM task_cache")
|
|
101
|
+
await LocalTaskCache._conn.commit()
|
|
102
|
+
|
|
103
|
+
@staticmethod
|
|
104
|
+
def _clear_sync():
|
|
105
|
+
"""Clear all cache entries (sync)."""
|
|
106
|
+
if LocalTaskCache._conn_sync is None:
|
|
107
|
+
raise RuntimeError("Cache not properly initialized")
|
|
108
|
+
LocalTaskCache._conn_sync.execute("DELETE FROM task_cache")
|
|
109
|
+
LocalTaskCache._conn_sync.commit()
|
|
110
|
+
|
|
111
|
+
@staticmethod
|
|
112
|
+
async def get(cache_key: str) -> convert.Outputs | None:
|
|
113
|
+
if not LocalTaskCache._initialized:
|
|
114
|
+
await LocalTaskCache.initialize()
|
|
115
|
+
|
|
116
|
+
if HAS_AIOSQLITE:
|
|
117
|
+
return await LocalTaskCache._get_async(cache_key)
|
|
118
|
+
else:
|
|
119
|
+
return LocalTaskCache._get_sync(cache_key)
|
|
120
|
+
|
|
121
|
+
@staticmethod
|
|
122
|
+
async def _get_async(cache_key: str) -> convert.Outputs | None:
|
|
123
|
+
"""Get cache entry (async)."""
|
|
124
|
+
if LocalTaskCache._conn is None:
|
|
125
|
+
raise RuntimeError("Cache not properly initialized")
|
|
126
|
+
|
|
127
|
+
async with LocalTaskCache._conn.execute("SELECT value FROM task_cache WHERE key = ?", (cache_key,)) as cursor:
|
|
128
|
+
row = await cursor.fetchone()
|
|
129
|
+
if row:
|
|
130
|
+
outputs_bytes = row[0]
|
|
131
|
+
outputs = common_pb2.Outputs()
|
|
132
|
+
outputs.ParseFromString(outputs_bytes)
|
|
133
|
+
return convert.Outputs(proto_outputs=outputs)
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def _get_sync(cache_key: str) -> convert.Outputs | None:
|
|
138
|
+
"""Get cache entry (sync)."""
|
|
139
|
+
if LocalTaskCache._conn_sync is None:
|
|
140
|
+
raise RuntimeError("Cache not properly initialized")
|
|
141
|
+
|
|
142
|
+
cursor = LocalTaskCache._conn_sync.execute("SELECT value FROM task_cache WHERE key = ?", (cache_key,))
|
|
143
|
+
row = cursor.fetchone()
|
|
144
|
+
if row:
|
|
145
|
+
outputs_bytes = row[0]
|
|
146
|
+
outputs = common_pb2.Outputs()
|
|
147
|
+
outputs.ParseFromString(outputs_bytes)
|
|
148
|
+
return convert.Outputs(proto_outputs=outputs)
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
async def set(
|
|
153
|
+
cache_key: str,
|
|
154
|
+
value: convert.Outputs,
|
|
155
|
+
) -> None:
|
|
156
|
+
if not LocalTaskCache._initialized:
|
|
157
|
+
await LocalTaskCache.initialize()
|
|
158
|
+
|
|
159
|
+
if HAS_AIOSQLITE:
|
|
160
|
+
await LocalTaskCache._set_async(cache_key, value)
|
|
161
|
+
else:
|
|
162
|
+
LocalTaskCache._set_sync(cache_key, value)
|
|
163
|
+
|
|
164
|
+
@staticmethod
|
|
165
|
+
async def _set_async(
|
|
166
|
+
cache_key: str,
|
|
167
|
+
value: convert.Outputs,
|
|
168
|
+
) -> None:
|
|
169
|
+
"""Set cache entry (async)."""
|
|
170
|
+
if LocalTaskCache._conn is None:
|
|
171
|
+
raise RuntimeError("Cache not properly initialized")
|
|
172
|
+
|
|
173
|
+
output_bytes = value.proto_outputs.SerializeToString()
|
|
174
|
+
await LocalTaskCache._conn.execute(
|
|
175
|
+
"INSERT OR REPLACE INTO task_cache (key, value) VALUES (?, ?)", (cache_key, output_bytes)
|
|
176
|
+
)
|
|
177
|
+
await LocalTaskCache._conn.commit()
|
|
178
|
+
|
|
179
|
+
@staticmethod
|
|
180
|
+
def _set_sync(
|
|
181
|
+
cache_key: str,
|
|
182
|
+
value: convert.Outputs,
|
|
183
|
+
) -> None:
|
|
184
|
+
"""Set cache entry (sync)."""
|
|
185
|
+
if LocalTaskCache._conn_sync is None:
|
|
186
|
+
raise RuntimeError("Cache not properly initialized")
|
|
187
|
+
|
|
188
|
+
output_bytes = value.proto_outputs.SerializeToString()
|
|
189
|
+
LocalTaskCache._conn_sync.execute(
|
|
190
|
+
"INSERT OR REPLACE INTO task_cache (key, value) VALUES (?, ?)", (cache_key, output_bytes)
|
|
191
|
+
)
|
|
192
|
+
LocalTaskCache._conn_sync.commit()
|
|
193
|
+
|
|
194
|
+
@staticmethod
|
|
195
|
+
async def close():
|
|
196
|
+
"""Close the database connection."""
|
|
197
|
+
if HAS_AIOSQLITE:
|
|
198
|
+
await LocalTaskCache._close_async()
|
|
199
|
+
else:
|
|
200
|
+
LocalTaskCache._close_sync()
|
|
201
|
+
|
|
202
|
+
@staticmethod
|
|
203
|
+
async def _close_async():
|
|
204
|
+
"""Close async database connection."""
|
|
205
|
+
if LocalTaskCache._conn:
|
|
206
|
+
await LocalTaskCache._conn.close()
|
|
207
|
+
LocalTaskCache._conn = None
|
|
208
|
+
LocalTaskCache._initialized = False
|
|
209
|
+
|
|
210
|
+
@staticmethod
|
|
211
|
+
def _close_sync():
|
|
212
|
+
"""Close sync database connection."""
|
|
213
|
+
if LocalTaskCache._conn_sync:
|
|
214
|
+
LocalTaskCache._conn_sync.close()
|
|
215
|
+
LocalTaskCache._conn_sync = None
|
|
216
|
+
LocalTaskCache._initialized = False
|
flyte/_code_bundle/_ignore.py
CHANGED
|
@@ -71,7 +71,25 @@ class GitIgnore(Ignore):
|
|
|
71
71
|
return False
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
STANDARD_IGNORE_PATTERNS = [
|
|
74
|
+
STANDARD_IGNORE_PATTERNS = [
|
|
75
|
+
"*.pyc",
|
|
76
|
+
"__pycache__",
|
|
77
|
+
"**/__pycache__",
|
|
78
|
+
".cache",
|
|
79
|
+
".cache/*",
|
|
80
|
+
".pytest_cache",
|
|
81
|
+
"**/.pytest_cache",
|
|
82
|
+
".venv",
|
|
83
|
+
"venv",
|
|
84
|
+
"env",
|
|
85
|
+
"*.log",
|
|
86
|
+
".env",
|
|
87
|
+
"*.egg-info",
|
|
88
|
+
"*.egg",
|
|
89
|
+
"dist",
|
|
90
|
+
"build",
|
|
91
|
+
"*.whl",
|
|
92
|
+
]
|
|
75
93
|
|
|
76
94
|
|
|
77
95
|
class StandardIgnore(Ignore):
|
|
@@ -79,12 +97,19 @@ class StandardIgnore(Ignore):
|
|
|
79
97
|
by fed with custom ignore patterns from cli."""
|
|
80
98
|
|
|
81
99
|
def __init__(self, root: Path, patterns: Optional[List[str]] = None):
|
|
82
|
-
super().__init__(root)
|
|
100
|
+
super().__init__(root.resolve())
|
|
83
101
|
self.patterns = patterns if patterns else STANDARD_IGNORE_PATTERNS
|
|
84
102
|
|
|
85
103
|
def _is_ignored(self, path: pathlib.Path) -> bool:
|
|
104
|
+
# Convert to relative path for pattern matching
|
|
105
|
+
try:
|
|
106
|
+
rel_path = path.relative_to(self.root)
|
|
107
|
+
except ValueError:
|
|
108
|
+
# If path is not under root, don't ignore it
|
|
109
|
+
return False
|
|
110
|
+
|
|
86
111
|
for pattern in self.patterns:
|
|
87
|
-
if fnmatch(str(
|
|
112
|
+
if fnmatch(str(rel_path), pattern):
|
|
88
113
|
return True
|
|
89
114
|
return False
|
|
90
115
|
|
|
@@ -105,9 +130,10 @@ class IgnoreGroup(Ignore):
|
|
|
105
130
|
|
|
106
131
|
def list_ignored(self) -> List[str]:
|
|
107
132
|
ignored = []
|
|
108
|
-
for dir, _, files in self.root
|
|
133
|
+
for dir, _, files in os.walk(self.root):
|
|
134
|
+
dir_path = Path(dir)
|
|
109
135
|
for file in files:
|
|
110
|
-
abs_path =
|
|
136
|
+
abs_path = dir_path / file
|
|
111
137
|
if self.is_ignored(abs_path):
|
|
112
138
|
ignored.append(str(abs_path.relative_to(self.root)))
|
|
113
139
|
return ignored
|