tensorlake 0.4.31__py3-none-win_amd64.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.
- tensorlake/__init__.py +1 -0
- tensorlake/_cloud_sdk.pyd +0 -0
- tensorlake/applications/__init__.py +1 -0
- tensorlake/applications/algorithms/__init__.py +6 -0
- tensorlake/applications/algorithms/dfs_bottom_up.py +94 -0
- tensorlake/applications/applications.py +49 -0
- tensorlake/applications/blob_store/__init__.py +4 -0
- tensorlake/applications/blob_store/blob.py +22 -0
- tensorlake/applications/blob_store/blob_store.py +276 -0
- tensorlake/applications/blob_store/local_fs_blob_store.py +77 -0
- tensorlake/applications/blob_store/s3_blob_store.py +240 -0
- tensorlake/applications/cloud_events.py +72 -0
- tensorlake/applications/function/application_call.py +159 -0
- tensorlake/applications/function/function_call.py +33 -0
- tensorlake/applications/function/introspect.py +166 -0
- tensorlake/applications/function/type_hints.py +74 -0
- tensorlake/applications/function/user_data_serializer.py +126 -0
- tensorlake/applications/image.py +73 -0
- tensorlake/applications/interface/README.md +8 -0
- tensorlake/applications/interface/__init__.py +66 -0
- tensorlake/applications/interface/_pretty_print.py +235 -0
- tensorlake/applications/interface/decorators.py +270 -0
- tensorlake/applications/interface/exceptions.py +104 -0
- tensorlake/applications/interface/file.py +17 -0
- tensorlake/applications/interface/function.py +310 -0
- tensorlake/applications/interface/futures.py +461 -0
- tensorlake/applications/interface/logger.py +67 -0
- tensorlake/applications/interface/request.py +30 -0
- tensorlake/applications/interface/request_context.py +109 -0
- tensorlake/applications/interface/retries.py +25 -0
- tensorlake/applications/interface/run.py +76 -0
- tensorlake/applications/internal_logger.py +181 -0
- tensorlake/applications/local/class_instance_store.py +50 -0
- tensorlake/applications/local/future.py +45 -0
- tensorlake/applications/local/future_run/function_call_future_run.py +216 -0
- tensorlake/applications/local/future_run/future_run.py +133 -0
- tensorlake/applications/local/request.py +26 -0
- tensorlake/applications/local/request_context/handlers/add_metrics.py +33 -0
- tensorlake/applications/local/request_context/handlers/progress_update.py +29 -0
- tensorlake/applications/local/request_context/handlers/request_state/commit_write.py +14 -0
- tensorlake/applications/local/request_context/handlers/request_state/file_path.py +17 -0
- tensorlake/applications/local/request_context/handlers/request_state/prepare_read.py +39 -0
- tensorlake/applications/local/request_context/handlers/request_state/prepare_write.py +35 -0
- tensorlake/applications/local/request_context/http_handler_factory.py +76 -0
- tensorlake/applications/local/runner.py +1289 -0
- tensorlake/applications/local/utils.py +12 -0
- tensorlake/applications/local/value_store.py +92 -0
- tensorlake/applications/metadata/__init__.py +16 -0
- tensorlake/applications/metadata/function_call.py +42 -0
- tensorlake/applications/metadata/serialization.py +27 -0
- tensorlake/applications/metadata/value.py +20 -0
- tensorlake/applications/multiprocessing.py +14 -0
- tensorlake/applications/registry.py +126 -0
- tensorlake/applications/remote/api_client.py +177 -0
- tensorlake/applications/remote/api_client_context_manager.py +24 -0
- tensorlake/applications/remote/app_manifest_cache.py +20 -0
- tensorlake/applications/remote/code/ignored_code_paths.py +143 -0
- tensorlake/applications/remote/code/loader.py +72 -0
- tensorlake/applications/remote/code/zip.py +187 -0
- tensorlake/applications/remote/curl_command.py +157 -0
- tensorlake/applications/remote/deploy.py +73 -0
- tensorlake/applications/remote/fake_json.py +37 -0
- tensorlake/applications/remote/manifests/application.py +126 -0
- tensorlake/applications/remote/manifests/docstring.py +474 -0
- tensorlake/applications/remote/manifests/function.py +308 -0
- tensorlake/applications/remote/manifests/function_manifests.py +110 -0
- tensorlake/applications/remote/manifests/function_resources.py +49 -0
- tensorlake/applications/remote/request.py +60 -0
- tensorlake/applications/remote/runner.py +128 -0
- tensorlake/applications/request_context/contextvar.py +22 -0
- tensorlake/applications/request_context/http_client/context.py +123 -0
- tensorlake/applications/request_context/http_client/metrics.py +83 -0
- tensorlake/applications/request_context/http_client/progress.py +93 -0
- tensorlake/applications/request_context/http_client/state.py +170 -0
- tensorlake/applications/request_context/http_client/transport.py +13 -0
- tensorlake/applications/request_context/http_server/handlers/add_metrics.py +46 -0
- tensorlake/applications/request_context/http_server/handlers/handler.py +26 -0
- tensorlake/applications/request_context/http_server/handlers/progress_update.py +45 -0
- tensorlake/applications/request_context/http_server/handlers/request_state/commit_write.py +37 -0
- tensorlake/applications/request_context/http_server/handlers/request_state/prepare_read.py +37 -0
- tensorlake/applications/request_context/http_server/handlers/request_state/prepare_write.py +37 -0
- tensorlake/applications/request_context/http_server/route.py +7 -0
- tensorlake/applications/request_context/http_server/router.py +101 -0
- tensorlake/applications/request_context/http_server/server.py +52 -0
- tensorlake/applications/request_context/metrics.py +77 -0
- tensorlake/applications/request_context/progress.py +63 -0
- tensorlake/applications/request_context/request_state.py +5 -0
- tensorlake/applications/runtime_hooks.py +191 -0
- tensorlake/applications/secrets.py +13 -0
- tensorlake/applications/user_data_serializer.py +198 -0
- tensorlake/applications/validation/__init__.py +11 -0
- tensorlake/applications/validation/message.py +30 -0
- tensorlake/applications/validation/print.py +54 -0
- tensorlake/applications/validation/validate.py +679 -0
- tensorlake/builder/__init__.py +74 -0
- tensorlake/builder/client_v2.py +212 -0
- tensorlake/builder/client_v3.py +451 -0
- tensorlake/builder/log_events.py +38 -0
- tensorlake/cli/__init__.py +3 -0
- tensorlake/cli/_common.py +135 -0
- tensorlake/cli/build_images.py +230 -0
- tensorlake/cli/create_sandbox_image.py +412 -0
- tensorlake/cli/deploy.py +362 -0
- tensorlake/cli/parse.py +111 -0
- tensorlake/cloud_client.py +350 -0
- tensorlake/documentai/__init__.py +81 -0
- tensorlake/documentai/_base.py +330 -0
- tensorlake/documentai/_classify.py +205 -0
- tensorlake/documentai/_datasets.py +516 -0
- tensorlake/documentai/_edit.py +147 -0
- tensorlake/documentai/_extract.py +233 -0
- tensorlake/documentai/_files.py +147 -0
- tensorlake/documentai/_parse.py +1128 -0
- tensorlake/documentai/_read.py +236 -0
- tensorlake/documentai/_utils.py +6 -0
- tensorlake/documentai/client.py +40 -0
- tensorlake/documentai/common.py +62 -0
- tensorlake/documentai/files.py +129 -0
- tensorlake/documentai/models/__init__.py +102 -0
- tensorlake/documentai/models/_datasets.py +38 -0
- tensorlake/documentai/models/_enums.py +218 -0
- tensorlake/documentai/models/_errors.py +59 -0
- tensorlake/documentai/models/_filters.py +63 -0
- tensorlake/documentai/models/_options.py +287 -0
- tensorlake/documentai/models/_pagination.py +20 -0
- tensorlake/documentai/models/_results.py +218 -0
- tensorlake/function_executor/README.md +19 -0
- tensorlake/function_executor/allocation_info.py +12 -0
- tensorlake/function_executor/allocation_runner/allocation_runner.py +976 -0
- tensorlake/function_executor/allocation_runner/allocation_state_wrapper.py +175 -0
- tensorlake/function_executor/allocation_runner/blob_utils.py +34 -0
- tensorlake/function_executor/allocation_runner/contextvars.py +17 -0
- tensorlake/function_executor/allocation_runner/download.py +155 -0
- tensorlake/function_executor/allocation_runner/event_loop/__init__.py +35 -0
- tensorlake/function_executor/allocation_runner/event_loop/durable_id.py +172 -0
- tensorlake/function_executor/allocation_runner/event_loop/event_loop.py +919 -0
- tensorlake/function_executor/allocation_runner/event_loop/input_events.py +53 -0
- tensorlake/function_executor/allocation_runner/event_loop/output_events.py +93 -0
- tensorlake/function_executor/allocation_runner/event_loop/special_function_calls.py +111 -0
- tensorlake/function_executor/allocation_runner/http_request_parse.py +255 -0
- tensorlake/function_executor/allocation_runner/request_context/progress.py +48 -0
- tensorlake/function_executor/allocation_runner/request_context/request_state.py +181 -0
- tensorlake/function_executor/allocation_runner/result_helper.py +91 -0
- tensorlake/function_executor/allocation_runner/sdk_algorithms.py +365 -0
- tensorlake/function_executor/allocation_runner/upload.py +163 -0
- tensorlake/function_executor/allocation_runner/value.py +20 -0
- tensorlake/function_executor/health_check.py +74 -0
- tensorlake/function_executor/info.py +16 -0
- tensorlake/function_executor/main.py +64 -0
- tensorlake/function_executor/message_validators.py +76 -0
- tensorlake/function_executor/proto/function_executor.proto +435 -0
- tensorlake/function_executor/proto/function_executor_pb2.py +154 -0
- tensorlake/function_executor/proto/function_executor_pb2.pyi +787 -0
- tensorlake/function_executor/proto/function_executor_pb2_grpc.py +448 -0
- tensorlake/function_executor/proto/message_validator.py +139 -0
- tensorlake/function_executor/proto/server_configuration.py +19 -0
- tensorlake/function_executor/proto/status.proto +42 -0
- tensorlake/function_executor/proto/status_pb2.py +45 -0
- tensorlake/function_executor/proto/status_pb2.pyi +27 -0
- tensorlake/function_executor/proto/status_pb2_grpc.py +28 -0
- tensorlake/function_executor/request_context/handlers/add_metrics.py +33 -0
- tensorlake/function_executor/request_context/handlers/progress_update.py +29 -0
- tensorlake/function_executor/request_context/handlers/request_state/commit_write.py +27 -0
- tensorlake/function_executor/request_context/handlers/request_state/prepare_read.py +27 -0
- tensorlake/function_executor/request_context/handlers/request_state/prepare_write.py +27 -0
- tensorlake/function_executor/request_context/http_handler_factory.py +76 -0
- tensorlake/function_executor/server.py +29 -0
- tensorlake/function_executor/service.py +404 -0
- tensorlake/function_executor/user_events.py +146 -0
- tensorlake/image/__init__.py +1 -0
- tensorlake/image/image.py +92 -0
- tensorlake/image/utils.py +40 -0
- tensorlake/sandbox/__init__.py +82 -0
- tensorlake/sandbox/_defaults.py +22 -0
- tensorlake/sandbox/client.py +783 -0
- tensorlake/sandbox/exceptions.py +76 -0
- tensorlake/sandbox/models.py +346 -0
- tensorlake/sandbox/sandbox.py +490 -0
- tensorlake/utils/README.md +3 -0
- tensorlake/utils/cache.py +85 -0
- tensorlake/utils/retries.py +100 -0
- tensorlake/vendor/__init__.py +0 -0
- tensorlake/vendor/faker/__init__.py +7 -0
- tensorlake/vendor/faker/__main__.py +4 -0
- tensorlake/vendor/faker/cli.py +296 -0
- tensorlake/vendor/faker/config.py +13 -0
- tensorlake/vendor/faker/contrib/__init__.py +0 -0
- tensorlake/vendor/faker/contrib/pytest/__init__.py +0 -0
- tensorlake/vendor/faker/contrib/pytest/plugin.py +38 -0
- tensorlake/vendor/faker/decode/__init__.py +13 -0
- tensorlake/vendor/faker/decode/codes.py +65538 -0
- tensorlake/vendor/faker/documentor.py +127 -0
- tensorlake/vendor/faker/exceptions.py +16 -0
- tensorlake/vendor/faker/factory.py +116 -0
- tensorlake/vendor/faker/generator.py +191 -0
- tensorlake/vendor/faker/providers/__init__.py +742 -0
- tensorlake/vendor/faker/providers/address/__init__.py +116 -0
- tensorlake/vendor/faker/providers/address/az_AZ/__init__.py +691 -0
- tensorlake/vendor/faker/providers/address/bn_BD/__init__.py +547 -0
- tensorlake/vendor/faker/providers/address/cs_CZ/__init__.py +1202 -0
- tensorlake/vendor/faker/providers/address/da_DK/__init__.py +2522 -0
- tensorlake/vendor/faker/providers/address/de/__init__.py +253 -0
- tensorlake/vendor/faker/providers/address/de_AT/__init__.py +280 -0
- tensorlake/vendor/faker/providers/address/de_CH/__init__.py +247 -0
- tensorlake/vendor/faker/providers/address/de_DE/__init__.py +470 -0
- tensorlake/vendor/faker/providers/address/el_GR/__init__.py +4952 -0
- tensorlake/vendor/faker/providers/address/en/__init__.py +251 -0
- tensorlake/vendor/faker/providers/address/en_AU/__init__.py +342 -0
- tensorlake/vendor/faker/providers/address/en_BD/__init__.py +547 -0
- tensorlake/vendor/faker/providers/address/en_CA/__init__.py +417 -0
- tensorlake/vendor/faker/providers/address/en_GB/__init__.py +550 -0
- tensorlake/vendor/faker/providers/address/en_IE/__init__.py +61 -0
- tensorlake/vendor/faker/providers/address/en_IN/__init__.py +572 -0
- tensorlake/vendor/faker/providers/address/en_MS/__init__.py +486 -0
- tensorlake/vendor/faker/providers/address/en_NZ/__init__.py +340 -0
- tensorlake/vendor/faker/providers/address/en_PH/__init__.py +1799 -0
- tensorlake/vendor/faker/providers/address/en_US/__init__.py +599 -0
- tensorlake/vendor/faker/providers/address/es/__init__.py +200 -0
- tensorlake/vendor/faker/providers/address/es_AR/__init__.py +231 -0
- tensorlake/vendor/faker/providers/address/es_CL/__init__.py +648 -0
- tensorlake/vendor/faker/providers/address/es_CO/__init__.py +1334 -0
- tensorlake/vendor/faker/providers/address/es_ES/__init__.py +140 -0
- tensorlake/vendor/faker/providers/address/es_MX/__init__.py +163 -0
- tensorlake/vendor/faker/providers/address/fa_IR/__init__.py +296 -0
- tensorlake/vendor/faker/providers/address/fi_FI/__init__.py +800 -0
- tensorlake/vendor/faker/providers/address/fil_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/address/fr_CA/__init__.py +81 -0
- tensorlake/vendor/faker/providers/address/fr_CH/__init__.py +367 -0
- tensorlake/vendor/faker/providers/address/fr_FR/__init__.py +478 -0
- tensorlake/vendor/faker/providers/address/he_IL/__init__.py +623 -0
- tensorlake/vendor/faker/providers/address/hi_IN/__init__.py +244 -0
- tensorlake/vendor/faker/providers/address/hr_HR/__init__.py +588 -0
- tensorlake/vendor/faker/providers/address/hu_HU/__init__.py +479 -0
- tensorlake/vendor/faker/providers/address/hy_AM/__init__.py +686 -0
- tensorlake/vendor/faker/providers/address/id_ID/__init__.py +526 -0
- tensorlake/vendor/faker/providers/address/it_IT/__init__.py +17659 -0
- tensorlake/vendor/faker/providers/address/ja_JP/__init__.py +649 -0
- tensorlake/vendor/faker/providers/address/ka_GE/__init__.py +1297 -0
- tensorlake/vendor/faker/providers/address/ko_KR/__init__.py +643 -0
- tensorlake/vendor/faker/providers/address/ne_NP/__init__.py +621 -0
- tensorlake/vendor/faker/providers/address/nl_BE/__init__.py +3047 -0
- tensorlake/vendor/faker/providers/address/nl_NL/__init__.py +2737 -0
- tensorlake/vendor/faker/providers/address/no_NO/__init__.py +114 -0
- tensorlake/vendor/faker/providers/address/pl_PL/__init__.py +696 -0
- tensorlake/vendor/faker/providers/address/pt_BR/__init__.py +935 -0
- tensorlake/vendor/faker/providers/address/pt_PT/__init__.py +1592 -0
- tensorlake/vendor/faker/providers/address/ro_RO/__init__.py +438 -0
- tensorlake/vendor/faker/providers/address/ru_RU/__init__.py +1597 -0
- tensorlake/vendor/faker/providers/address/sk_SK/__init__.py +5266 -0
- tensorlake/vendor/faker/providers/address/sl_SI/__init__.py +1601 -0
- tensorlake/vendor/faker/providers/address/sv_SE/__init__.py +375 -0
- tensorlake/vendor/faker/providers/address/ta_IN/__init__.py +429 -0
- tensorlake/vendor/faker/providers/address/th/__init__.py +251 -0
- tensorlake/vendor/faker/providers/address/th_TH/__init__.py +390 -0
- tensorlake/vendor/faker/providers/address/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/address/uk_UA/__init__.py +2200 -0
- tensorlake/vendor/faker/providers/address/vi_VN/__init__.py +307 -0
- tensorlake/vendor/faker/providers/address/zh_CN/__init__.py +449 -0
- tensorlake/vendor/faker/providers/address/zh_TW/__init__.py +388 -0
- tensorlake/vendor/faker/providers/address/zu_ZA/__init__.py +230 -0
- tensorlake/vendor/faker/providers/automotive/__init__.py +63 -0
- tensorlake/vendor/faker/providers/automotive/ar_BH/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/ar_JO/__init__.py +53 -0
- tensorlake/vendor/faker/providers/automotive/ar_PS/__init__.py +64 -0
- tensorlake/vendor/faker/providers/automotive/ar_SA/__init__.py +89 -0
- tensorlake/vendor/faker/providers/automotive/az_AZ/__init__.py +97 -0
- tensorlake/vendor/faker/providers/automotive/bn_BD/__init__.py +253 -0
- tensorlake/vendor/faker/providers/automotive/da_DK/__init__.py +9 -0
- tensorlake/vendor/faker/providers/automotive/de_AT/__init__.py +177 -0
- tensorlake/vendor/faker/providers/automotive/de_CH/__init__.py +44 -0
- tensorlake/vendor/faker/providers/automotive/de_DE/__init__.py +430 -0
- tensorlake/vendor/faker/providers/automotive/el_GR/__init__.py +23 -0
- tensorlake/vendor/faker/providers/automotive/en_CA/__init__.py +45 -0
- tensorlake/vendor/faker/providers/automotive/en_GB/__init__.py +15 -0
- tensorlake/vendor/faker/providers/automotive/en_NZ/__init__.py +32 -0
- tensorlake/vendor/faker/providers/automotive/en_PH/__init__.py +70 -0
- tensorlake/vendor/faker/providers/automotive/en_US/__init__.py +170 -0
- tensorlake/vendor/faker/providers/automotive/es_AR/__init__.py +87 -0
- tensorlake/vendor/faker/providers/automotive/es_CL/__init__.py +64 -0
- tensorlake/vendor/faker/providers/automotive/es_CO/__init__.py +16 -0
- tensorlake/vendor/faker/providers/automotive/es_ES/__init__.py +124 -0
- tensorlake/vendor/faker/providers/automotive/et_EE/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/fi_FI/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/fil_PH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/automotive/fr_FR/__init__.py +17 -0
- tensorlake/vendor/faker/providers/automotive/he_IL/__init__.py +11 -0
- tensorlake/vendor/faker/providers/automotive/hu_HU/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/id_ID/__init__.py +16 -0
- tensorlake/vendor/faker/providers/automotive/it_IT/__init__.py +15 -0
- tensorlake/vendor/faker/providers/automotive/ja_JP/__init__.py +116 -0
- tensorlake/vendor/faker/providers/automotive/ko_KR/__init__.py +52 -0
- tensorlake/vendor/faker/providers/automotive/lt_LT/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/nl_BE/__init__.py +16 -0
- tensorlake/vendor/faker/providers/automotive/nl_NL/__init__.py +77 -0
- tensorlake/vendor/faker/providers/automotive/no_NO/__init__.py +15 -0
- tensorlake/vendor/faker/providers/automotive/pl_PL/__init__.py +39 -0
- tensorlake/vendor/faker/providers/automotive/pt_BR/__init__.py +7 -0
- tensorlake/vendor/faker/providers/automotive/pt_PT/__init__.py +18 -0
- tensorlake/vendor/faker/providers/automotive/ro_RO/__init__.py +66 -0
- tensorlake/vendor/faker/providers/automotive/ru_RU/__init__.py +321 -0
- tensorlake/vendor/faker/providers/automotive/sk_SK/__init__.py +100 -0
- tensorlake/vendor/faker/providers/automotive/sq_AL/__init__.py +12 -0
- tensorlake/vendor/faker/providers/automotive/sv_SE/__init__.py +18 -0
- tensorlake/vendor/faker/providers/automotive/th_TH/__init__.py +39 -0
- tensorlake/vendor/faker/providers/automotive/tl_PH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/automotive/tr_TR/__init__.py +33 -0
- tensorlake/vendor/faker/providers/automotive/uk_UA/__init__.py +291 -0
- tensorlake/vendor/faker/providers/automotive/vi_VN/__init__.py +24 -0
- tensorlake/vendor/faker/providers/automotive/zh_CN/__init__.py +47 -0
- tensorlake/vendor/faker/providers/automotive/zh_TW/__init__.py +19 -0
- tensorlake/vendor/faker/providers/bank/__init__.py +165 -0
- tensorlake/vendor/faker/providers/bank/az_AZ/__init__.py +36 -0
- tensorlake/vendor/faker/providers/bank/bn_BD/__init__.py +83 -0
- tensorlake/vendor/faker/providers/bank/cs_CZ/__init__.py +11 -0
- tensorlake/vendor/faker/providers/bank/da_DK/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/de_AT/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/de_CH/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/de_DE/__init__.py +21 -0
- tensorlake/vendor/faker/providers/bank/el_GR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/en_GB/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/en_IE/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/en_IN/__init__.py +47 -0
- tensorlake/vendor/faker/providers/bank/en_PH/__init__.py +109 -0
- tensorlake/vendor/faker/providers/bank/es_AR/__init__.py +32 -0
- tensorlake/vendor/faker/providers/bank/es_ES/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/es_MX/__init__.py +274 -0
- tensorlake/vendor/faker/providers/bank/fa_IR/__init__.py +56 -0
- tensorlake/vendor/faker/providers/bank/fi_FI/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/fil_PH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/bank/fr_CH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/bank/fr_FR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/it_CH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/bank/it_IT/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/nl_BE/__init__.py +92 -0
- tensorlake/vendor/faker/providers/bank/nl_NL/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/no_NO/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/pl_PL/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/pt_PT/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/ro_RO/__init__.py +50 -0
- tensorlake/vendor/faker/providers/bank/ru_RU/__init__.py +755 -0
- tensorlake/vendor/faker/providers/bank/sk_SK/__init__.py +11 -0
- tensorlake/vendor/faker/providers/bank/th_TH/__init__.py +64 -0
- tensorlake/vendor/faker/providers/bank/tl_PH/__init__.py +10 -0
- tensorlake/vendor/faker/providers/bank/tr_TR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/bank/uk_UA/__init__.py +83 -0
- tensorlake/vendor/faker/providers/bank/zh_CN/__init__.py +33 -0
- tensorlake/vendor/faker/providers/barcode/__init__.py +122 -0
- tensorlake/vendor/faker/providers/barcode/en_CA/__init__.py +24 -0
- tensorlake/vendor/faker/providers/barcode/en_US/__init__.py +249 -0
- tensorlake/vendor/faker/providers/barcode/es_ES/__init__.py +12 -0
- tensorlake/vendor/faker/providers/barcode/fr_CA/__init__.py +10 -0
- tensorlake/vendor/faker/providers/barcode/ja_JP/__init__.py +49 -0
- tensorlake/vendor/faker/providers/color/__init__.py +330 -0
- tensorlake/vendor/faker/providers/color/ar_PS/__init__.py +170 -0
- tensorlake/vendor/faker/providers/color/az_AZ/__init__.py +70 -0
- tensorlake/vendor/faker/providers/color/bg_BG/__init__.py +86 -0
- tensorlake/vendor/faker/providers/color/bn_BD/__init__.py +172 -0
- tensorlake/vendor/faker/providers/color/color.py +386 -0
- tensorlake/vendor/faker/providers/color/cs_CZ/__init__.py +23 -0
- tensorlake/vendor/faker/providers/color/da_DK/__init__.py +334 -0
- tensorlake/vendor/faker/providers/color/de/__init__.py +158 -0
- tensorlake/vendor/faker/providers/color/de_AT/__init__.py +5 -0
- tensorlake/vendor/faker/providers/color/de_CH/__init__.py +11 -0
- tensorlake/vendor/faker/providers/color/de_DE/__init__.py +5 -0
- tensorlake/vendor/faker/providers/color/el_GR/__init__.py +113 -0
- tensorlake/vendor/faker/providers/color/en_US/__init__.py +7 -0
- tensorlake/vendor/faker/providers/color/es/__init__.py +169 -0
- tensorlake/vendor/faker/providers/color/es_CL/__init__.py +7 -0
- tensorlake/vendor/faker/providers/color/es_ES/__init__.py +7 -0
- tensorlake/vendor/faker/providers/color/fa_IR/__init__.py +175 -0
- tensorlake/vendor/faker/providers/color/fr_FR/__init__.py +167 -0
- tensorlake/vendor/faker/providers/color/he_IL/__init__.py +49 -0
- tensorlake/vendor/faker/providers/color/hr_HR/__init__.py +172 -0
- tensorlake/vendor/faker/providers/color/hu_HU/__init__.py +23 -0
- tensorlake/vendor/faker/providers/color/hy_AM/__init__.py +168 -0
- tensorlake/vendor/faker/providers/color/id_ID/__init__.py +60 -0
- tensorlake/vendor/faker/providers/color/ka_GE/__init__.py +92 -0
- tensorlake/vendor/faker/providers/color/pt_BR/__init__.py +261 -0
- tensorlake/vendor/faker/providers/color/ru_RU/__init__.py +86 -0
- tensorlake/vendor/faker/providers/color/sk_SK/__init__.py +23 -0
- tensorlake/vendor/faker/providers/color/th_TH/__init__.py +52 -0
- tensorlake/vendor/faker/providers/color/uk_UA/__init__.py +222 -0
- tensorlake/vendor/faker/providers/color/uz_UZ/__init__.py +69 -0
- tensorlake/vendor/faker/providers/color/vi_VN/__init__.py +90 -0
- tensorlake/vendor/faker/providers/company/__init__.py +531 -0
- tensorlake/vendor/faker/providers/company/az_AZ/__init__.py +52 -0
- tensorlake/vendor/faker/providers/company/bg_BG/__init__.py +30 -0
- tensorlake/vendor/faker/providers/company/bn_BD/__init__.py +640 -0
- tensorlake/vendor/faker/providers/company/cs_CZ/__init__.py +19 -0
- tensorlake/vendor/faker/providers/company/da_DK/__init__.py +14 -0
- tensorlake/vendor/faker/providers/company/de_AT/__init__.py +26 -0
- tensorlake/vendor/faker/providers/company/de_CH/__init__.py +23 -0
- tensorlake/vendor/faker/providers/company/de_DE/__init__.py +38 -0
- tensorlake/vendor/faker/providers/company/el_GR/__init__.py +11 -0
- tensorlake/vendor/faker/providers/company/en_PH/__init__.py +147 -0
- tensorlake/vendor/faker/providers/company/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/company/es_CL/__init__.py +442 -0
- tensorlake/vendor/faker/providers/company/es_ES/__init__.py +127 -0
- tensorlake/vendor/faker/providers/company/es_MX/__init__.py +439 -0
- tensorlake/vendor/faker/providers/company/fa_IR/__init__.py +1113 -0
- tensorlake/vendor/faker/providers/company/fi_FI/__init__.py +66 -0
- tensorlake/vendor/faker/providers/company/fil_PH/__init__.py +94 -0
- tensorlake/vendor/faker/providers/company/fr_CH/__init__.py +40 -0
- tensorlake/vendor/faker/providers/company/fr_FR/__init__.py +439 -0
- tensorlake/vendor/faker/providers/company/hr_HR/__init__.py +15 -0
- tensorlake/vendor/faker/providers/company/hu_HU/__init__.py +15 -0
- tensorlake/vendor/faker/providers/company/hy_AM/__init__.py +283 -0
- tensorlake/vendor/faker/providers/company/id_ID/__init__.py +32 -0
- tensorlake/vendor/faker/providers/company/it_IT/__init__.py +375 -0
- tensorlake/vendor/faker/providers/company/ja_JP/__init__.py +31 -0
- tensorlake/vendor/faker/providers/company/ko_KR/__init__.py +470 -0
- tensorlake/vendor/faker/providers/company/nl_BE/__init__.py +10 -0
- tensorlake/vendor/faker/providers/company/nl_NL/__init__.py +521 -0
- tensorlake/vendor/faker/providers/company/no_NO/__init__.py +22 -0
- tensorlake/vendor/faker/providers/company/pl_PL/__init__.py +149 -0
- tensorlake/vendor/faker/providers/company/pt_BR/__init__.py +111 -0
- tensorlake/vendor/faker/providers/company/pt_PT/__init__.py +53 -0
- tensorlake/vendor/faker/providers/company/ro_RO/__init__.py +34 -0
- tensorlake/vendor/faker/providers/company/ru_RU/__init__.py +1182 -0
- tensorlake/vendor/faker/providers/company/sk_SK/__init__.py +16 -0
- tensorlake/vendor/faker/providers/company/sl_SI/__init__.py +13 -0
- tensorlake/vendor/faker/providers/company/sv_SE/__init__.py +14 -0
- tensorlake/vendor/faker/providers/company/th_TH/__init__.py +126 -0
- tensorlake/vendor/faker/providers/company/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/company/tr_TR/__init__.py +123 -0
- tensorlake/vendor/faker/providers/company/vi_VN/__init__.py +24 -0
- tensorlake/vendor/faker/providers/company/zh_CN/__init__.py +95 -0
- tensorlake/vendor/faker/providers/company/zh_TW/__init__.py +113 -0
- tensorlake/vendor/faker/providers/credit_card/__init__.py +195 -0
- tensorlake/vendor/faker/providers/credit_card/en_US/__init__.py +7 -0
- tensorlake/vendor/faker/providers/credit_card/fa_IR/__init__.py +124 -0
- tensorlake/vendor/faker/providers/credit_card/pt_PT/__init__.py +299 -0
- tensorlake/vendor/faker/providers/credit_card/ru_RU/__init__.py +115 -0
- tensorlake/vendor/faker/providers/credit_card/uk_UA/__init__.py +58 -0
- tensorlake/vendor/faker/providers/credit_card/zh_CN/__init__.py +36 -0
- tensorlake/vendor/faker/providers/currency/__init__.py +425 -0
- tensorlake/vendor/faker/providers/currency/az_AZ/__init__.py +178 -0
- tensorlake/vendor/faker/providers/currency/bn_BD/__init__.py +231 -0
- tensorlake/vendor/faker/providers/currency/cs_CZ/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/da_DK/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/de/__init__.py +174 -0
- tensorlake/vendor/faker/providers/currency/de_AT/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/de_CH/__init__.py +9 -0
- tensorlake/vendor/faker/providers/currency/de_DE/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/el_GR/__init__.py +158 -0
- tensorlake/vendor/faker/providers/currency/en_AU/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/en_CA/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/en_US/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/es/__init__.py +171 -0
- tensorlake/vendor/faker/providers/currency/es_AR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/es_CL/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/es_ES/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/fa_IR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/fr_CA/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/fr_FR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/it_IT/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/ng_NG/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/nl_NL/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/pl_PL/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/pt_BR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/ro_RO/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/ru_RU/__init__.py +179 -0
- tensorlake/vendor/faker/providers/currency/sk_SK/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/sv_SE/__init__.py +178 -0
- tensorlake/vendor/faker/providers/currency/th_TH/__init__.py +186 -0
- tensorlake/vendor/faker/providers/currency/tr_TR/__init__.py +8 -0
- tensorlake/vendor/faker/providers/currency/uk_UA/__init__.py +173 -0
- tensorlake/vendor/faker/providers/currency/uz_UZ/__init__.py +178 -0
- tensorlake/vendor/faker/providers/currency/vi_VN/__init__.py +9 -0
- tensorlake/vendor/faker/providers/date_time/__init__.py +2616 -0
- tensorlake/vendor/faker/providers/date_time/ar_AA/__init__.py +1765 -0
- tensorlake/vendor/faker/providers/date_time/ar_EG/__init__.py +18 -0
- tensorlake/vendor/faker/providers/date_time/az_AZ/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/bn_BD/__init__.py +1740 -0
- tensorlake/vendor/faker/providers/date_time/cs_CZ/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/da_DK/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/de_AT/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/de_DE/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/el_GR/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/en_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/date_time/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/date_time/es/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/es_AR/__init__.py +5 -0
- tensorlake/vendor/faker/providers/date_time/es_CL/__init__.py +5 -0
- tensorlake/vendor/faker/providers/date_time/es_ES/__init__.py +5 -0
- tensorlake/vendor/faker/providers/date_time/fil_PH/__init__.py +37 -0
- tensorlake/vendor/faker/providers/date_time/fr_CA/__init__.py +8 -0
- tensorlake/vendor/faker/providers/date_time/fr_DZ/__init__.py +5 -0
- tensorlake/vendor/faker/providers/date_time/fr_FR/__init__.py +35 -0
- tensorlake/vendor/faker/providers/date_time/gu_IN/__init__.py +76 -0
- tensorlake/vendor/faker/providers/date_time/hi_IN/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/hr_HR/__init__.py +34 -0
- tensorlake/vendor/faker/providers/date_time/hu_HU/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/hy_AM/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/id_ID/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/it_IT/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/ja_JP/__init__.py +54 -0
- tensorlake/vendor/faker/providers/date_time/ka_GE/__init__.py +37 -0
- tensorlake/vendor/faker/providers/date_time/ko_KR/__init__.py +34 -0
- tensorlake/vendor/faker/providers/date_time/nl_NL/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/no_NO/__init__.py +35 -0
- tensorlake/vendor/faker/providers/date_time/pl_PL/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/pt_BR/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/pt_PT/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/ro_RO/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/ru_RU/__init__.py +1640 -0
- tensorlake/vendor/faker/providers/date_time/sk_SK/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/sl_SI/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/ta_IN/__init__.py +37 -0
- tensorlake/vendor/faker/providers/date_time/th_TH/__init__.py +340 -0
- tensorlake/vendor/faker/providers/date_time/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/date_time/tr_TR/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/uz_UZ/__init__.py +36 -0
- tensorlake/vendor/faker/providers/date_time/vi_VN/__init__.py +37 -0
- tensorlake/vendor/faker/providers/date_time/zh_CN/__init__.py +35 -0
- tensorlake/vendor/faker/providers/date_time/zh_TW/__init__.py +39 -0
- tensorlake/vendor/faker/providers/doi/__init__.py +22 -0
- tensorlake/vendor/faker/providers/emoji/__init__.py +3528 -0
- tensorlake/vendor/faker/providers/emoji/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/file/__init__.py +354 -0
- tensorlake/vendor/faker/providers/file/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/geo/__init__.py +1049 -0
- tensorlake/vendor/faker/providers/geo/bn_BD/__init__.py +989 -0
- tensorlake/vendor/faker/providers/geo/cs_CZ/__init__.py +156 -0
- tensorlake/vendor/faker/providers/geo/de_AT/__init__.py +11 -0
- tensorlake/vendor/faker/providers/geo/el_GR/__init__.py +28 -0
- tensorlake/vendor/faker/providers/geo/en_IE/__init__.py +52 -0
- tensorlake/vendor/faker/providers/geo/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/geo/pl_PL/__init__.py +48 -0
- tensorlake/vendor/faker/providers/geo/pt_PT/__init__.py +127 -0
- tensorlake/vendor/faker/providers/geo/sk_SK/__init__.py +104 -0
- tensorlake/vendor/faker/providers/geo/tr_TR/__init__.py +106 -0
- tensorlake/vendor/faker/providers/internet/__init__.py +802 -0
- tensorlake/vendor/faker/providers/internet/ar_AA/__init__.py +53 -0
- tensorlake/vendor/faker/providers/internet/az_AZ/__init__.py +38 -0
- tensorlake/vendor/faker/providers/internet/bg_BG/__init__.py +112 -0
- tensorlake/vendor/faker/providers/internet/bn_BD/__init__.py +30 -0
- tensorlake/vendor/faker/providers/internet/bs_BA/__init__.py +27 -0
- tensorlake/vendor/faker/providers/internet/cs_CZ/__init__.py +30 -0
- tensorlake/vendor/faker/providers/internet/de_AT/__init__.py +21 -0
- tensorlake/vendor/faker/providers/internet/de_DE/__init__.py +28 -0
- tensorlake/vendor/faker/providers/internet/el_GR/__init__.py +81 -0
- tensorlake/vendor/faker/providers/internet/en_AU/__init__.py +24 -0
- tensorlake/vendor/faker/providers/internet/en_GB/__init__.py +29 -0
- tensorlake/vendor/faker/providers/internet/en_NZ/__init__.py +24 -0
- tensorlake/vendor/faker/providers/internet/en_PH/__init__.py +65 -0
- tensorlake/vendor/faker/providers/internet/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/internet/es_AR/__init__.py +21 -0
- tensorlake/vendor/faker/providers/internet/es_CL/__init__.py +34 -0
- tensorlake/vendor/faker/providers/internet/es_ES/__init__.py +21 -0
- tensorlake/vendor/faker/providers/internet/fa_IR/__init__.py +13 -0
- tensorlake/vendor/faker/providers/internet/fi_FI/__init__.py +15 -0
- tensorlake/vendor/faker/providers/internet/fil_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/internet/fr_CH/__init__.py +35 -0
- tensorlake/vendor/faker/providers/internet/fr_FR/__init__.py +42 -0
- tensorlake/vendor/faker/providers/internet/hr_HR/__init__.py +33 -0
- tensorlake/vendor/faker/providers/internet/hu_HU/__init__.py +31 -0
- tensorlake/vendor/faker/providers/internet/id_ID/__init__.py +28 -0
- tensorlake/vendor/faker/providers/internet/it_IT/__init__.py +36 -0
- tensorlake/vendor/faker/providers/internet/ja_JP/__init__.py +17 -0
- tensorlake/vendor/faker/providers/internet/ko_KR/__init__.py +15 -0
- tensorlake/vendor/faker/providers/internet/no_NO/__init__.py +20 -0
- tensorlake/vendor/faker/providers/internet/pl_PL/__init__.py +26 -0
- tensorlake/vendor/faker/providers/internet/pt_BR/__init__.py +27 -0
- tensorlake/vendor/faker/providers/internet/pt_PT/__init__.py +7 -0
- tensorlake/vendor/faker/providers/internet/ro_RO/__init__.py +30 -0
- tensorlake/vendor/faker/providers/internet/ru_RU/__init__.py +100 -0
- tensorlake/vendor/faker/providers/internet/sk_SK/__init__.py +33 -0
- tensorlake/vendor/faker/providers/internet/sl_SI/__init__.py +63 -0
- tensorlake/vendor/faker/providers/internet/sv_SE/__init__.py +23 -0
- tensorlake/vendor/faker/providers/internet/th_TH/__init__.py +32 -0
- tensorlake/vendor/faker/providers/internet/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/internet/tr_TR/__init__.py +28 -0
- tensorlake/vendor/faker/providers/internet/uk_UA/__init__.py +82 -0
- tensorlake/vendor/faker/providers/internet/zh_CN/__init__.py +103 -0
- tensorlake/vendor/faker/providers/internet/zh_TW/__init__.py +17 -0
- tensorlake/vendor/faker/providers/isbn/__init__.py +75 -0
- tensorlake/vendor/faker/providers/isbn/en_US/__init__.py +35 -0
- tensorlake/vendor/faker/providers/isbn/es_ES/__init__.py +37 -0
- tensorlake/vendor/faker/providers/isbn/isbn.py +86 -0
- tensorlake/vendor/faker/providers/job/__init__.py +660 -0
- tensorlake/vendor/faker/providers/job/ar_AA/__init__.py +140 -0
- tensorlake/vendor/faker/providers/job/az_AZ/__init__.py +112 -0
- tensorlake/vendor/faker/providers/job/bn_BD/__init__.py +649 -0
- tensorlake/vendor/faker/providers/job/bs_BA/__init__.py +4319 -0
- tensorlake/vendor/faker/providers/job/cs_CZ/__init__.py +487 -0
- tensorlake/vendor/faker/providers/job/da_DK/__init__.py +962 -0
- tensorlake/vendor/faker/providers/job/de_AT/__init__.py +4997 -0
- tensorlake/vendor/faker/providers/job/de_DE/__init__.py +44 -0
- tensorlake/vendor/faker/providers/job/el_GR/__init__.py +451 -0
- tensorlake/vendor/faker/providers/job/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/es/__init__.py +483 -0
- tensorlake/vendor/faker/providers/job/es_AR/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/es_CL/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/es_CO/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/es_ES/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/es_MX/__init__.py +5 -0
- tensorlake/vendor/faker/providers/job/fa_IR/__init__.py +101 -0
- tensorlake/vendor/faker/providers/job/fi_FI/__init__.py +202 -0
- tensorlake/vendor/faker/providers/job/fr_CH/__init__.py +849 -0
- tensorlake/vendor/faker/providers/job/fr_FR/__init__.py +1587 -0
- tensorlake/vendor/faker/providers/job/hr_HR/__init__.py +290 -0
- tensorlake/vendor/faker/providers/job/hu_HU/__init__.py +418 -0
- tensorlake/vendor/faker/providers/job/hy_AM/__init__.py +250 -0
- tensorlake/vendor/faker/providers/job/ja_JP/__init__.py +66 -0
- tensorlake/vendor/faker/providers/job/ka_GE/__init__.py +392 -0
- tensorlake/vendor/faker/providers/job/ko_KR/__init__.py +434 -0
- tensorlake/vendor/faker/providers/job/pl_PL/__init__.py +224 -0
- tensorlake/vendor/faker/providers/job/pt_BR/__init__.py +758 -0
- tensorlake/vendor/faker/providers/job/pt_PT/__init__.py +391 -0
- tensorlake/vendor/faker/providers/job/ro_RO/__init__.py +4045 -0
- tensorlake/vendor/faker/providers/job/ru_RU/__init__.py +526 -0
- tensorlake/vendor/faker/providers/job/sk_SK/__init__.py +511 -0
- tensorlake/vendor/faker/providers/job/th_TH/__init__.py +93 -0
- tensorlake/vendor/faker/providers/job/tr_TR/__init__.py +738 -0
- tensorlake/vendor/faker/providers/job/uk_UA/__init__.py +185 -0
- tensorlake/vendor/faker/providers/job/vi_VN/__init__.py +75 -0
- tensorlake/vendor/faker/providers/job/zh_CN/__init__.py +1025 -0
- tensorlake/vendor/faker/providers/job/zh_TW/__init__.py +481 -0
- tensorlake/vendor/faker/providers/lorem/__init__.py +275 -0
- tensorlake/vendor/faker/providers/lorem/ar_AA/__init__.py +705 -0
- tensorlake/vendor/faker/providers/lorem/az_AZ/__init__.py +106 -0
- tensorlake/vendor/faker/providers/lorem/bn_BD/__init__.py +237 -0
- tensorlake/vendor/faker/providers/lorem/cs_CZ/__init__.py +5039 -0
- tensorlake/vendor/faker/providers/lorem/da_DK/__init__.py +1012 -0
- tensorlake/vendor/faker/providers/lorem/de_AT/__init__.py +9 -0
- tensorlake/vendor/faker/providers/lorem/de_DE/__init__.py +527 -0
- tensorlake/vendor/faker/providers/lorem/el_GR/__init__.py +395 -0
- tensorlake/vendor/faker/providers/lorem/en_PH/__init__.py +85 -0
- tensorlake/vendor/faker/providers/lorem/en_US/__init__.py +3180 -0
- tensorlake/vendor/faker/providers/lorem/es_AR/__init__.py +7 -0
- tensorlake/vendor/faker/providers/lorem/es_ES/__init__.py +1016 -0
- tensorlake/vendor/faker/providers/lorem/es_MX/__init__.py +7 -0
- tensorlake/vendor/faker/providers/lorem/fa_IR/__init__.py +929 -0
- tensorlake/vendor/faker/providers/lorem/fil_PH/__init__.py +639 -0
- tensorlake/vendor/faker/providers/lorem/fr_FR/__init__.py +1482 -0
- tensorlake/vendor/faker/providers/lorem/he_IL/__init__.py +156 -0
- tensorlake/vendor/faker/providers/lorem/hy_AM/__init__.py +230 -0
- tensorlake/vendor/faker/providers/lorem/it_IT/__init__.py +3094 -0
- tensorlake/vendor/faker/providers/lorem/ja_JP/__init__.py +232 -0
- tensorlake/vendor/faker/providers/lorem/la/__init__.py +194 -0
- tensorlake/vendor/faker/providers/lorem/nl_BE/__init__.py +1015 -0
- tensorlake/vendor/faker/providers/lorem/nl_NL/__init__.py +14 -0
- tensorlake/vendor/faker/providers/lorem/pl_PL/__init__.py +2014 -0
- tensorlake/vendor/faker/providers/lorem/ru_RU/__init__.py +512 -0
- tensorlake/vendor/faker/providers/lorem/th_TH/__init__.py +426 -0
- tensorlake/vendor/faker/providers/lorem/tl_PH/__init__.py +13 -0
- tensorlake/vendor/faker/providers/lorem/uk_UA/__init__.py +506 -0
- tensorlake/vendor/faker/providers/lorem/vi_VN/__init__.py +193 -0
- tensorlake/vendor/faker/providers/lorem/zh_CN/__init__.py +359 -0
- tensorlake/vendor/faker/providers/lorem/zh_TW/__init__.py +359 -0
- tensorlake/vendor/faker/providers/misc/__init__.py +781 -0
- tensorlake/vendor/faker/providers/misc/en_PH/__init__.py +218 -0
- tensorlake/vendor/faker/providers/misc/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/misc/fil_PH/__init__.py +5 -0
- tensorlake/vendor/faker/providers/misc/tl_PH/__init__.py +5 -0
- tensorlake/vendor/faker/providers/passport/__init__.py +47 -0
- tensorlake/vendor/faker/providers/passport/de_AT/__init__.py +16 -0
- tensorlake/vendor/faker/providers/passport/en_US/__init__.py +101 -0
- tensorlake/vendor/faker/providers/passport/ru_RU/__init__.py +26 -0
- tensorlake/vendor/faker/providers/person/__init__.py +330 -0
- tensorlake/vendor/faker/providers/person/ar_AA/__init__.py +1096 -0
- tensorlake/vendor/faker/providers/person/ar_DZ/__init__.py +379 -0
- tensorlake/vendor/faker/providers/person/ar_PS/__init__.py +48 -0
- tensorlake/vendor/faker/providers/person/ar_SA/__init__.py +50 -0
- tensorlake/vendor/faker/providers/person/az_AZ/__init__.py +913 -0
- tensorlake/vendor/faker/providers/person/bg_BG/__init__.py +1767 -0
- tensorlake/vendor/faker/providers/person/bn_BD/__init__.py +608 -0
- tensorlake/vendor/faker/providers/person/cs_CZ/__init__.py +546 -0
- tensorlake/vendor/faker/providers/person/da_DK/__init__.py +633 -0
- tensorlake/vendor/faker/providers/person/de_AT/__init__.py +1614 -0
- tensorlake/vendor/faker/providers/person/de_CH/__init__.py +2239 -0
- tensorlake/vendor/faker/providers/person/de_DE/__init__.py +2497 -0
- tensorlake/vendor/faker/providers/person/de_LI/__init__.py +553 -0
- tensorlake/vendor/faker/providers/person/de_LU/__init__.py +940 -0
- tensorlake/vendor/faker/providers/person/el_GR/__init__.py +2310 -0
- tensorlake/vendor/faker/providers/person/en/__init__.py +7732 -0
- tensorlake/vendor/faker/providers/person/en_GB/__init__.py +910 -0
- tensorlake/vendor/faker/providers/person/en_IE/__init__.py +3141 -0
- tensorlake/vendor/faker/providers/person/en_IN/__init__.py +1108 -0
- tensorlake/vendor/faker/providers/person/en_KE/__init__.py +1976 -0
- tensorlake/vendor/faker/providers/person/en_NG/__init__.py +93 -0
- tensorlake/vendor/faker/providers/person/en_NZ/__init__.py +1420 -0
- tensorlake/vendor/faker/providers/person/en_PK/__init__.py +995 -0
- tensorlake/vendor/faker/providers/person/en_TH/__init__.py +308 -0
- tensorlake/vendor/faker/providers/person/en_US/__init__.py +1830 -0
- tensorlake/vendor/faker/providers/person/es/__init__.py +186 -0
- tensorlake/vendor/faker/providers/person/es_AR/__init__.py +615 -0
- tensorlake/vendor/faker/providers/person/es_CA/__init__.py +93 -0
- tensorlake/vendor/faker/providers/person/es_CL/__init__.py +1602 -0
- tensorlake/vendor/faker/providers/person/es_CO/__init__.py +970 -0
- tensorlake/vendor/faker/providers/person/es_ES/__init__.py +2087 -0
- tensorlake/vendor/faker/providers/person/es_MX/__init__.py +989 -0
- tensorlake/vendor/faker/providers/person/et_EE/__init__.py +708 -0
- tensorlake/vendor/faker/providers/person/fa_IR/__init__.py +346 -0
- tensorlake/vendor/faker/providers/person/fi_FI/__init__.py +855 -0
- tensorlake/vendor/faker/providers/person/fr_BE/__init__.py +1564 -0
- tensorlake/vendor/faker/providers/person/fr_CA/__init__.py +481 -0
- tensorlake/vendor/faker/providers/person/fr_CH/__init__.py +349 -0
- tensorlake/vendor/faker/providers/person/fr_DZ/__init__.py +489 -0
- tensorlake/vendor/faker/providers/person/fr_FR/__init__.py +663 -0
- tensorlake/vendor/faker/providers/person/fr_QC/__init__.py +11 -0
- tensorlake/vendor/faker/providers/person/ga_IE/__init__.py +3273 -0
- tensorlake/vendor/faker/providers/person/gu_IN/__init__.py +157 -0
- tensorlake/vendor/faker/providers/person/ha_NG/__init__.py +89 -0
- tensorlake/vendor/faker/providers/person/he_IL/__init__.py +1500 -0
- tensorlake/vendor/faker/providers/person/hi_IN/__init__.py +525 -0
- tensorlake/vendor/faker/providers/person/hr_HR/__init__.py +1031 -0
- tensorlake/vendor/faker/providers/person/hu_HU/__init__.py +440 -0
- tensorlake/vendor/faker/providers/person/hy_AM/__init__.py +981 -0
- tensorlake/vendor/faker/providers/person/id_ID/__init__.py +1004 -0
- tensorlake/vendor/faker/providers/person/ig_NG/__init__.py +89 -0
- tensorlake/vendor/faker/providers/person/is_IS/__init__.py +3941 -0
- tensorlake/vendor/faker/providers/person/it_IT/__init__.py +1667 -0
- tensorlake/vendor/faker/providers/person/ja_JP/__init__.py +299 -0
- tensorlake/vendor/faker/providers/person/ka_GE/__init__.py +773 -0
- tensorlake/vendor/faker/providers/person/ko_KR/__init__.py +202 -0
- tensorlake/vendor/faker/providers/person/lt_LT/__init__.py +250 -0
- tensorlake/vendor/faker/providers/person/lv_LV/__init__.py +441 -0
- tensorlake/vendor/faker/providers/person/ne_NP/__init__.py +1543 -0
- tensorlake/vendor/faker/providers/person/nl_BE/__init__.py +1564 -0
- tensorlake/vendor/faker/providers/person/nl_NL/__init__.py +1660 -0
- tensorlake/vendor/faker/providers/person/no_NO/__init__.py +352 -0
- tensorlake/vendor/faker/providers/person/or_IN/__init__.py +1172 -0
- tensorlake/vendor/faker/providers/person/pl_PL/__init__.py +5001 -0
- tensorlake/vendor/faker/providers/person/pt_BR/__init__.py +444 -0
- tensorlake/vendor/faker/providers/person/pt_PT/__init__.py +343 -0
- tensorlake/vendor/faker/providers/person/ro_RO/__init__.py +753 -0
- tensorlake/vendor/faker/providers/person/ru_RU/__init__.py +1391 -0
- tensorlake/vendor/faker/providers/person/sk_SK/__init__.py +2290 -0
- tensorlake/vendor/faker/providers/person/sl_SI/__init__.py +529 -0
- tensorlake/vendor/faker/providers/person/sv_SE/__init__.py +1562 -0
- tensorlake/vendor/faker/providers/person/sw/__init__.py +409 -0
- tensorlake/vendor/faker/providers/person/ta_IN/__init__.py +1030 -0
- tensorlake/vendor/faker/providers/person/th_TH/__init__.py +1020 -0
- tensorlake/vendor/faker/providers/person/tr_TR/__init__.py +1643 -0
- tensorlake/vendor/faker/providers/person/tw_GH/__init__.py +601 -0
- tensorlake/vendor/faker/providers/person/uk_UA/__init__.py +1347 -0
- tensorlake/vendor/faker/providers/person/uz_UZ/__init__.py +433 -0
- tensorlake/vendor/faker/providers/person/vi_VN/__init__.py +110 -0
- tensorlake/vendor/faker/providers/person/yo_NG/__init__.py +340 -0
- tensorlake/vendor/faker/providers/person/zh_CN/__init__.py +697 -0
- tensorlake/vendor/faker/providers/person/zh_TW/__init__.py +951 -0
- tensorlake/vendor/faker/providers/person/zu_ZA/__init__.py +934 -0
- tensorlake/vendor/faker/providers/phone_number/__init__.py +331 -0
- tensorlake/vendor/faker/providers/phone_number/ar_AE/__init__.py +94 -0
- tensorlake/vendor/faker/providers/phone_number/ar_JO/__init__.py +65 -0
- tensorlake/vendor/faker/providers/phone_number/ar_PS/__init__.py +129 -0
- tensorlake/vendor/faker/providers/phone_number/az_AZ/__init__.py +57 -0
- tensorlake/vendor/faker/providers/phone_number/bg_BG/__init__.py +17 -0
- tensorlake/vendor/faker/providers/phone_number/bn_BD/__init__.py +334 -0
- tensorlake/vendor/faker/providers/phone_number/bs_BA/__init__.py +39 -0
- tensorlake/vendor/faker/providers/phone_number/cs_CZ/__init__.py +54 -0
- tensorlake/vendor/faker/providers/phone_number/da_DK/__init__.py +12 -0
- tensorlake/vendor/faker/providers/phone_number/de_AT/__init__.py +120 -0
- tensorlake/vendor/faker/providers/phone_number/de_CH/__init__.py +81 -0
- tensorlake/vendor/faker/providers/phone_number/de_DE/__init__.py +18 -0
- tensorlake/vendor/faker/providers/phone_number/de_LI/__init__.py +6 -0
- tensorlake/vendor/faker/providers/phone_number/de_LU/__init__.py +37 -0
- tensorlake/vendor/faker/providers/phone_number/el_GR/__init__.py +23 -0
- tensorlake/vendor/faker/providers/phone_number/en_AU/__init__.py +41 -0
- tensorlake/vendor/faker/providers/phone_number/en_CA/__init__.py +15 -0
- tensorlake/vendor/faker/providers/phone_number/en_GB/__init__.py +267 -0
- tensorlake/vendor/faker/providers/phone_number/en_IN/__init__.py +9 -0
- tensorlake/vendor/faker/providers/phone_number/en_NZ/__init__.py +46 -0
- tensorlake/vendor/faker/providers/phone_number/en_PH/__init__.py +252 -0
- tensorlake/vendor/faker/providers/phone_number/en_US/__init__.py +50 -0
- tensorlake/vendor/faker/providers/phone_number/es_AR/__init__.py +46 -0
- tensorlake/vendor/faker/providers/phone_number/es_CL/__init__.py +65 -0
- tensorlake/vendor/faker/providers/phone_number/es_CO/__init__.py +42 -0
- tensorlake/vendor/faker/providers/phone_number/es_ES/__init__.py +128 -0
- tensorlake/vendor/faker/providers/phone_number/es_MX/__init__.py +30 -0
- tensorlake/vendor/faker/providers/phone_number/fa_IR/__init__.py +101 -0
- tensorlake/vendor/faker/providers/phone_number/fi_FI/__init__.py +12 -0
- tensorlake/vendor/faker/providers/phone_number/fil_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/phone_number/fr_CH/__init__.py +37 -0
- tensorlake/vendor/faker/providers/phone_number/fr_DZ/__init__.py +9 -0
- tensorlake/vendor/faker/providers/phone_number/fr_FR/__init__.py +284 -0
- tensorlake/vendor/faker/providers/phone_number/he_IL/__init__.py +22 -0
- tensorlake/vendor/faker/providers/phone_number/hi_IN/__init__.py +11 -0
- tensorlake/vendor/faker/providers/phone_number/hr_HR/__init__.py +36 -0
- tensorlake/vendor/faker/providers/phone_number/hu_HU/__init__.py +13 -0
- tensorlake/vendor/faker/providers/phone_number/hy_AM/__init__.py +19 -0
- tensorlake/vendor/faker/providers/phone_number/id_ID/__init__.py +25 -0
- tensorlake/vendor/faker/providers/phone_number/it_CH/__init__.py +37 -0
- tensorlake/vendor/faker/providers/phone_number/it_IT/__init__.py +270 -0
- tensorlake/vendor/faker/providers/phone_number/ja_JP/__init__.py +10 -0
- tensorlake/vendor/faker/providers/phone_number/ka_GE/__init__.py +16 -0
- tensorlake/vendor/faker/providers/phone_number/ko_KR/__init__.py +30 -0
- tensorlake/vendor/faker/providers/phone_number/lt_LT/__init__.py +9 -0
- tensorlake/vendor/faker/providers/phone_number/lv_LV/__init__.py +9 -0
- tensorlake/vendor/faker/providers/phone_number/ne_NP/__init__.py +11 -0
- tensorlake/vendor/faker/providers/phone_number/nl_BE/__init__.py +24 -0
- tensorlake/vendor/faker/providers/phone_number/nl_NL/__init__.py +22 -0
- tensorlake/vendor/faker/providers/phone_number/no_NO/__init__.py +16 -0
- tensorlake/vendor/faker/providers/phone_number/pl_PL/__init__.py +36 -0
- tensorlake/vendor/faker/providers/phone_number/pt_BR/__init__.py +140 -0
- tensorlake/vendor/faker/providers/phone_number/pt_PT/__init__.py +41 -0
- tensorlake/vendor/faker/providers/phone_number/ro_RO/__init__.py +105 -0
- tensorlake/vendor/faker/providers/phone_number/ru_RU/__init__.py +16 -0
- tensorlake/vendor/faker/providers/phone_number/sk_SK/__init__.py +29 -0
- tensorlake/vendor/faker/providers/phone_number/sl_SI/__init__.py +17 -0
- tensorlake/vendor/faker/providers/phone_number/sv_SE/__init__.py +16 -0
- tensorlake/vendor/faker/providers/phone_number/ta_IN/__init__.py +11 -0
- tensorlake/vendor/faker/providers/phone_number/th_TH/__init__.py +72 -0
- tensorlake/vendor/faker/providers/phone_number/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/phone_number/tr_TR/__init__.py +15 -0
- tensorlake/vendor/faker/providers/phone_number/tw_GH/__init__.py +26 -0
- tensorlake/vendor/faker/providers/phone_number/uk_UA/__init__.py +69 -0
- tensorlake/vendor/faker/providers/phone_number/uz_UZ/__init__.py +15 -0
- tensorlake/vendor/faker/providers/phone_number/vi_VN/__init__.py +17 -0
- tensorlake/vendor/faker/providers/phone_number/zh_CN/__init__.py +40 -0
- tensorlake/vendor/faker/providers/phone_number/zh_TW/__init__.py +15 -0
- tensorlake/vendor/faker/providers/profile/__init__.py +60 -0
- tensorlake/vendor/faker/providers/profile/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/python/__init__.py +574 -0
- tensorlake/vendor/faker/providers/python/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/sbn/__init__.py +53 -0
- tensorlake/vendor/faker/providers/sbn/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/providers/sbn/rules.py +24 -0
- tensorlake/vendor/faker/providers/sbn/sbn.py +50 -0
- tensorlake/vendor/faker/providers/ssn/__init__.py +10 -0
- tensorlake/vendor/faker/providers/ssn/az_AZ/__init__.py +39 -0
- tensorlake/vendor/faker/providers/ssn/bg_BG/__init__.py +20 -0
- tensorlake/vendor/faker/providers/ssn/bn_BD/__init__.py +15 -0
- tensorlake/vendor/faker/providers/ssn/cs_CZ/__init__.py +42 -0
- tensorlake/vendor/faker/providers/ssn/de_AT/__init__.py +48 -0
- tensorlake/vendor/faker/providers/ssn/de_CH/__init__.py +5 -0
- tensorlake/vendor/faker/providers/ssn/de_DE/__init__.py +100 -0
- tensorlake/vendor/faker/providers/ssn/dk_DK/__init__.py +16 -0
- tensorlake/vendor/faker/providers/ssn/el_CY/__init__.py +16 -0
- tensorlake/vendor/faker/providers/ssn/el_GR/__init__.py +84 -0
- tensorlake/vendor/faker/providers/ssn/en_CA/__init__.py +80 -0
- tensorlake/vendor/faker/providers/ssn/en_GB/__init__.py +39 -0
- tensorlake/vendor/faker/providers/ssn/en_IE/__init__.py +21 -0
- tensorlake/vendor/faker/providers/ssn/en_IN/__init__.py +26 -0
- tensorlake/vendor/faker/providers/ssn/en_PH/__init__.py +53 -0
- tensorlake/vendor/faker/providers/ssn/en_US/__init__.py +235 -0
- tensorlake/vendor/faker/providers/ssn/es_CA/__init__.py +9 -0
- tensorlake/vendor/faker/providers/ssn/es_CL/__init__.py +67 -0
- tensorlake/vendor/faker/providers/ssn/es_CO/__init__.py +72 -0
- tensorlake/vendor/faker/providers/ssn/es_ES/__init__.py +123 -0
- tensorlake/vendor/faker/providers/ssn/es_MX/__init__.py +255 -0
- tensorlake/vendor/faker/providers/ssn/et_EE/__init__.py +69 -0
- tensorlake/vendor/faker/providers/ssn/fi_FI/__init__.py +67 -0
- tensorlake/vendor/faker/providers/ssn/fil_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/ssn/fr_CH/__init__.py +46 -0
- tensorlake/vendor/faker/providers/ssn/fr_FR/__init__.py +159 -0
- tensorlake/vendor/faker/providers/ssn/he_IL/__init__.py +28 -0
- tensorlake/vendor/faker/providers/ssn/hr_HR/__init__.py +49 -0
- tensorlake/vendor/faker/providers/ssn/hu_HU/__init__.py +135 -0
- tensorlake/vendor/faker/providers/ssn/it_IT/__init__.py +8146 -0
- tensorlake/vendor/faker/providers/ssn/ko_KR/__init__.py +12 -0
- tensorlake/vendor/faker/providers/ssn/lb_LU/__init__.py +17 -0
- tensorlake/vendor/faker/providers/ssn/lt_LT/__init__.py +20 -0
- tensorlake/vendor/faker/providers/ssn/lv_LV/__init__.py +62 -0
- tensorlake/vendor/faker/providers/ssn/mt_MT/__init__.py +17 -0
- tensorlake/vendor/faker/providers/ssn/nl_BE/__init__.py +74 -0
- tensorlake/vendor/faker/providers/ssn/nl_NL/__init__.py +45 -0
- tensorlake/vendor/faker/providers/ssn/no_NO/__init__.py +83 -0
- tensorlake/vendor/faker/providers/ssn/pl_PL/__init__.py +65 -0
- tensorlake/vendor/faker/providers/ssn/pt_BR/__init__.py +64 -0
- tensorlake/vendor/faker/providers/ssn/pt_PT/__init__.py +17 -0
- tensorlake/vendor/faker/providers/ssn/ro_RO/__init__.py +135 -0
- tensorlake/vendor/faker/providers/ssn/ru_RU/__init__.py +5 -0
- tensorlake/vendor/faker/providers/ssn/sk_SK/__init__.py +42 -0
- tensorlake/vendor/faker/providers/ssn/sl_SI/__init__.py +17 -0
- tensorlake/vendor/faker/providers/ssn/sv_SE/__init__.py +86 -0
- tensorlake/vendor/faker/providers/ssn/th_TH/__init__.py +59 -0
- tensorlake/vendor/faker/providers/ssn/tl_PH/__init__.py +7 -0
- tensorlake/vendor/faker/providers/ssn/tr_TR/__init__.py +34 -0
- tensorlake/vendor/faker/providers/ssn/uk_UA/__init__.py +59 -0
- tensorlake/vendor/faker/providers/ssn/zh_CN/__init__.py +3562 -0
- tensorlake/vendor/faker/providers/ssn/zh_TW/__init__.py +45 -0
- tensorlake/vendor/faker/providers/user_agent/__init__.py +360 -0
- tensorlake/vendor/faker/providers/user_agent/en_US/__init__.py +5 -0
- tensorlake/vendor/faker/proxy.py +439 -0
- tensorlake/vendor/faker/proxy.pyi +4652 -0
- tensorlake/vendor/faker/py.typed +0 -0
- tensorlake/vendor/faker/sphinx/__init__.py +0 -0
- tensorlake/vendor/faker/sphinx/autodoc.py +18 -0
- tensorlake/vendor/faker/sphinx/docstring.py +223 -0
- tensorlake/vendor/faker/sphinx/documentor.py +169 -0
- tensorlake/vendor/faker/sphinx/validator.py +174 -0
- tensorlake/vendor/faker/typing.py +43 -0
- tensorlake/vendor/faker/utils/__init__.py +0 -0
- tensorlake/vendor/faker/utils/checksums.py +23 -0
- tensorlake/vendor/faker/utils/datasets.py +8 -0
- tensorlake/vendor/faker/utils/decorators.py +38 -0
- tensorlake/vendor/faker/utils/distribution.py +88 -0
- tensorlake/vendor/faker/utils/loading.py +60 -0
- tensorlake/vendor/faker/utils/text.py +28 -0
- tensorlake/vendor/faker-40.1.2.dist-info/INSTALLER +1 -0
- tensorlake/vendor/faker-40.1.2.dist-info/METADATA +551 -0
- tensorlake/vendor/faker-40.1.2.dist-info/RECORD +1428 -0
- tensorlake/vendor/faker-40.1.2.dist-info/REQUESTED +0 -0
- tensorlake/vendor/faker-40.1.2.dist-info/WHEEL +5 -0
- tensorlake/vendor/faker-40.1.2.dist-info/entry_points.txt +5 -0
- tensorlake/vendor/faker-40.1.2.dist-info/licenses/LICENSE.txt +19 -0
- tensorlake/vendor/faker-40.1.2.dist-info/top_level.txt +1 -0
- tensorlake/vendor/faker-40.1.2.dist-info/zip-safe +1 -0
- tensorlake/vendor/nanoid/__init__.py +3 -0
- tensorlake/vendor/nanoid/nanoid/__init__.py +6 -0
- tensorlake/vendor/nanoid/nanoid/algorithm.py +7 -0
- tensorlake/vendor/nanoid/nanoid/generate.py +10 -0
- tensorlake/vendor/nanoid/nanoid/method.py +25 -0
- tensorlake/vendor/nanoid/nanoid/non_secure_generate.py +19 -0
- tensorlake/vendor/nanoid/nanoid/resources.py +2 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/INSTALLER +1 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/LICENSE +24 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/METADATA +114 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/RECORD +21 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/REQUESTED +0 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/WHEEL +4 -0
- tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/top_level.txt +1 -0
- tensorlake/vendor/polyfactory/__init__.py +15 -0
- tensorlake/vendor/polyfactory/__metadata__.py +12 -0
- tensorlake/vendor/polyfactory/constants.py +39 -0
- tensorlake/vendor/polyfactory/decorators.py +31 -0
- tensorlake/vendor/polyfactory/exceptions.py +18 -0
- tensorlake/vendor/polyfactory/factories/__init__.py +5 -0
- tensorlake/vendor/polyfactory/factories/attrs_factory.py +81 -0
- tensorlake/vendor/polyfactory/factories/base.py +1264 -0
- tensorlake/vendor/polyfactory/factories/beanie_odm_factory.py +88 -0
- tensorlake/vendor/polyfactory/factories/dataclass_factory.py +57 -0
- tensorlake/vendor/polyfactory/factories/msgspec_factory.py +69 -0
- tensorlake/vendor/polyfactory/factories/odmantic_odm_factory.py +60 -0
- tensorlake/vendor/polyfactory/factories/pydantic_factory.py +730 -0
- tensorlake/vendor/polyfactory/factories/sqlalchemy_factory.py +353 -0
- tensorlake/vendor/polyfactory/factories/typed_dict_factory.py +59 -0
- tensorlake/vendor/polyfactory/field_meta.py +224 -0
- tensorlake/vendor/polyfactory/fields.py +80 -0
- tensorlake/vendor/polyfactory/persistence.py +53 -0
- tensorlake/vendor/polyfactory/py.typed +0 -0
- tensorlake/vendor/polyfactory/pytest_plugin.py +124 -0
- tensorlake/vendor/polyfactory/utils/__init__.py +0 -0
- tensorlake/vendor/polyfactory/utils/_internal.py +8 -0
- tensorlake/vendor/polyfactory/utils/deprecation.py +151 -0
- tensorlake/vendor/polyfactory/utils/helpers.py +188 -0
- tensorlake/vendor/polyfactory/utils/model_coverage.py +149 -0
- tensorlake/vendor/polyfactory/utils/normalize_type.py +103 -0
- tensorlake/vendor/polyfactory/utils/predicates.py +192 -0
- tensorlake/vendor/polyfactory/utils/types.py +31 -0
- tensorlake/vendor/polyfactory/value_generators/__init__.py +0 -0
- tensorlake/vendor/polyfactory/value_generators/complex_types.py +156 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_collections.py +137 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_dates.py +41 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_numbers.py +445 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_path.py +13 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_strings.py +139 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_url.py +10 -0
- tensorlake/vendor/polyfactory/value_generators/constrained_uuid.py +31 -0
- tensorlake/vendor/polyfactory/value_generators/primitives.py +132 -0
- tensorlake/vendor/polyfactory/value_generators/regex.py +147 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/INSTALLER +1 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/METADATA +211 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/RECORD +83 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/REQUESTED +0 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/WHEEL +4 -0
- tensorlake/vendor/polyfactory-3.2.0.dist-info/licenses/LICENSE +21 -0
- tensorlake-0.4.31.data/scripts/function-executor +5 -0
- tensorlake-0.4.31.data/scripts/tensorlake-build-images +4 -0
- tensorlake-0.4.31.data/scripts/tensorlake-create-sandbox-image +4 -0
- tensorlake-0.4.31.data/scripts/tensorlake-deploy +4 -0
- tensorlake-0.4.31.data/scripts/tensorlake.exe +0 -0
- tensorlake-0.4.31.data/scripts/tl.exe +0 -0
- tensorlake-0.4.31.dist-info/METADATA +243 -0
- tensorlake-0.4.31.dist-info/RECORD +971 -0
- tensorlake-0.4.31.dist-info/WHEEL +4 -0
- tensorlake-0.4.31.dist-info/licenses/LICENSE +202 -0
- tensorlake-0.4.31.dist-info/sboms/tensorlake-cli.cyclonedx.json +9180 -0
tensorlake/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from tensorlake.image import Image
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .interface import *
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Any, Generator
|
|
2
|
+
|
|
3
|
+
from ..interface.exceptions import InternalError
|
|
4
|
+
from ..interface.futures import (
|
|
5
|
+
FunctionCallFuture,
|
|
6
|
+
Future,
|
|
7
|
+
MapFuture,
|
|
8
|
+
ReduceOperationFuture,
|
|
9
|
+
_InitialMissingType,
|
|
10
|
+
_TensorlakeFutureWrapper,
|
|
11
|
+
_unwrap_future,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def dfs_bottom_up_unique_only(root: Future) -> Generator[Future, None, None]:
|
|
16
|
+
"""Yields all unique Futures starting from leafs up to the root aka Post-Order DFS.
|
|
17
|
+
|
|
18
|
+
This traversal order is useful when at the moment of processing a node, all its children have
|
|
19
|
+
to be already processed.
|
|
20
|
+
|
|
21
|
+
The traversal order is deterministic (always the same for the same tree).
|
|
22
|
+
Doesn't yield the same Future referenced in the tree multiple times.
|
|
23
|
+
Doesn't yield user supplied values.
|
|
24
|
+
|
|
25
|
+
Raises InternalError if encounters an unexpected Future type.
|
|
26
|
+
"""
|
|
27
|
+
seen_future_ids: set[str] = set()
|
|
28
|
+
for future in dfs_bottom_up(root):
|
|
29
|
+
if future._id not in seen_future_ids:
|
|
30
|
+
seen_future_ids.add(future._id)
|
|
31
|
+
yield future
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def dfs_bottom_up(root: Future) -> Generator[Future, None, None]:
|
|
35
|
+
"""Yields all Futures starting from leafs up to the root aka Post-Order DFS.
|
|
36
|
+
|
|
37
|
+
This traversal order is useful when at the moment of processing a node, all its children have
|
|
38
|
+
to be already processed.
|
|
39
|
+
|
|
40
|
+
The traversal order is deterministic (always the same for the same tree).
|
|
41
|
+
Doesn't yield user supplied values.
|
|
42
|
+
|
|
43
|
+
Raises InternalError if encounters an unexpected Future type.
|
|
44
|
+
"""
|
|
45
|
+
dfs_stack: list[Future] = [root]
|
|
46
|
+
yield_stack: list[Future] = []
|
|
47
|
+
|
|
48
|
+
while len(dfs_stack) > 0:
|
|
49
|
+
node: Future = dfs_stack.pop()
|
|
50
|
+
yield_stack.append(node)
|
|
51
|
+
|
|
52
|
+
if isinstance(node, MapFuture):
|
|
53
|
+
node: MapFuture
|
|
54
|
+
items: list[_TensorlakeFutureWrapper[Future] | Any] | Future = (
|
|
55
|
+
_unwrap_future(node._items)
|
|
56
|
+
)
|
|
57
|
+
if isinstance(items, Future):
|
|
58
|
+
dfs_stack.append(items)
|
|
59
|
+
else:
|
|
60
|
+
for item in node._items:
|
|
61
|
+
item: Future | Any = _unwrap_future(item)
|
|
62
|
+
if isinstance(item, Future):
|
|
63
|
+
dfs_stack.append(item)
|
|
64
|
+
elif isinstance(node, ReduceOperationFuture):
|
|
65
|
+
node: ReduceOperationFuture
|
|
66
|
+
initial: Future | Any | _InitialMissingType = _unwrap_future(node._initial)
|
|
67
|
+
if isinstance(initial, Future):
|
|
68
|
+
dfs_stack.append(initial)
|
|
69
|
+
|
|
70
|
+
items: list[_TensorlakeFutureWrapper[Future] | Any] | Future = (
|
|
71
|
+
_unwrap_future(node._items)
|
|
72
|
+
)
|
|
73
|
+
if isinstance(items, Future):
|
|
74
|
+
dfs_stack.append(items)
|
|
75
|
+
else:
|
|
76
|
+
for item in node._items:
|
|
77
|
+
item: Future | Any = _unwrap_future(item)
|
|
78
|
+
if isinstance(item, Future):
|
|
79
|
+
dfs_stack.append(item)
|
|
80
|
+
elif isinstance(node, FunctionCallFuture):
|
|
81
|
+
node: FunctionCallFuture
|
|
82
|
+
for arg in node._args:
|
|
83
|
+
arg: Future | Any = _unwrap_future(arg)
|
|
84
|
+
if isinstance(arg, Future):
|
|
85
|
+
dfs_stack.append(arg)
|
|
86
|
+
# Sort dict keys to ensure deterministic traversal order.
|
|
87
|
+
for key in sorted(node._kwargs.keys()):
|
|
88
|
+
arg: Future | Any = _unwrap_future(node._kwargs[key])
|
|
89
|
+
if isinstance(arg, Future):
|
|
90
|
+
dfs_stack.append(arg)
|
|
91
|
+
else:
|
|
92
|
+
raise InternalError(f"Unexpected type of Future tree node: {type(node)}")
|
|
93
|
+
|
|
94
|
+
yield from reversed(yield_stack)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from collections.abc import Generator, Iterator
|
|
2
|
+
|
|
3
|
+
from .interface.function import Function, _is_application_function
|
|
4
|
+
from .interface.request import Request
|
|
5
|
+
from .interface.run import (
|
|
6
|
+
run_local_application,
|
|
7
|
+
run_remote_application,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
# Internal utilities for working with applications.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def filter_applications(
|
|
14
|
+
functions: Iterator[Function],
|
|
15
|
+
) -> Generator[Function, None, None]:
|
|
16
|
+
"""Yields all applications out of the supplied functions."""
|
|
17
|
+
for function in functions:
|
|
18
|
+
function: Function
|
|
19
|
+
if not _is_application_function(function):
|
|
20
|
+
continue
|
|
21
|
+
yield function
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def functions_for_application(
|
|
25
|
+
_application: Function,
|
|
26
|
+
functions: Iterator[Function],
|
|
27
|
+
) -> list[Function]:
|
|
28
|
+
"""Returns all loaded functions for the application build request.
|
|
29
|
+
|
|
30
|
+
We cannot reliably determine application membership statically, and one
|
|
31
|
+
application can call another application's function at runtime. For
|
|
32
|
+
compatibility with deploy/runtime packaging, each application build includes
|
|
33
|
+
all loaded Tensorlake functions.
|
|
34
|
+
"""
|
|
35
|
+
return list(functions)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def run_application(
|
|
39
|
+
application: Function | str, remote: bool, *args, **kwargs
|
|
40
|
+
) -> Request:
|
|
41
|
+
"""Runs the application remotely or locally depending on the `remote` parameter value.
|
|
42
|
+
|
|
43
|
+
This is a convenience wrapper around the `run_remote_application` and `run_local_application`.
|
|
44
|
+
It's not part of SDK interface, it's a helper function for writing tests.
|
|
45
|
+
"""
|
|
46
|
+
if remote:
|
|
47
|
+
return run_remote_application(application, *args, **kwargs)
|
|
48
|
+
else:
|
|
49
|
+
return run_local_application(application, *args, **kwargs)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class BLOBChunk(BaseModel):
|
|
5
|
+
# URI of the chunk.
|
|
6
|
+
# S3 URI if the data is stored in S3.
|
|
7
|
+
# Starts with "file://"" prefix if the data is stored on a local file system.
|
|
8
|
+
uri: str
|
|
9
|
+
# Actual size of chunk data if the BLOB has data.
|
|
10
|
+
# Requested chunk size if the BLOB has no data yet (can be used for data upload).
|
|
11
|
+
size: int
|
|
12
|
+
# None if the BLOB has data.
|
|
13
|
+
# ETag of the chunk data (generated by BLOB store) if the BLOB chunk was used to upload data.
|
|
14
|
+
etag: str | None
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BLOB(BaseModel):
|
|
18
|
+
# ID of the BLOB
|
|
19
|
+
id: str
|
|
20
|
+
# Ordered chunks of the BLOB if the BLOB has data.
|
|
21
|
+
# Ordered chunks of the BLOB that can be used to upload data if the BLOB has no data yet.
|
|
22
|
+
chunks: list[BLOBChunk]
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
from concurrent.futures import FIRST_EXCEPTION, Future, ThreadPoolExecutor, wait
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from tensorlake.applications.interface.exceptions import InternalError
|
|
6
|
+
from tensorlake.applications.internal_logger import InternalLogger
|
|
7
|
+
|
|
8
|
+
from .blob import BLOB, BLOBChunk
|
|
9
|
+
from .local_fs_blob_store import LocalFSBLOBStore
|
|
10
|
+
from .s3_blob_store import S3BLOBStore
|
|
11
|
+
|
|
12
|
+
# S3 multipart uploads from EC2 instances gradually speed up until we reach 10 parallel chunk uploads.
|
|
13
|
+
# S3 downloads from EC2 instances gradually speed up until we reach 5 parallel chunk downloads.
|
|
14
|
+
# Then they slow down gradually. Using a common middleground value of 7 to be able to use a single
|
|
15
|
+
# thread pool with a static max workers value.
|
|
16
|
+
_MAX_WORKER_THREADS: int = 7
|
|
17
|
+
# Upper limit in case a function has low CPU limit.
|
|
18
|
+
_IO_WORKER_THREADS_PER_AVAILABLE_CPU: int = 3
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class _ChunkInfo:
|
|
23
|
+
index: int
|
|
24
|
+
offset: int
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class BLOBStore:
|
|
28
|
+
"""Dispatches generic BLOB store calls to their real backends.
|
|
29
|
+
|
|
30
|
+
Implements chunking. Thread-safe. Picklable.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, available_cpu_count: int):
|
|
34
|
+
"""Creates a BLOB store that uses the supplied BLOB stores."""
|
|
35
|
+
self._available_cpu_count: int = available_cpu_count
|
|
36
|
+
|
|
37
|
+
max_io_workers: int = min(
|
|
38
|
+
available_cpu_count * _IO_WORKER_THREADS_PER_AVAILABLE_CPU,
|
|
39
|
+
_MAX_WORKER_THREADS,
|
|
40
|
+
)
|
|
41
|
+
self._io_workers_pool = ThreadPoolExecutor(
|
|
42
|
+
max_workers=max_io_workers, thread_name_prefix="BLOBStoreWorker"
|
|
43
|
+
)
|
|
44
|
+
self._local: LocalFSBLOBStore = LocalFSBLOBStore()
|
|
45
|
+
self._s3: S3BLOBStore = S3BLOBStore(io_workers_count=max_io_workers)
|
|
46
|
+
|
|
47
|
+
def close(self):
|
|
48
|
+
"""Closes the BLOB store and its resources."""
|
|
49
|
+
self._io_workers_pool.shutdown(wait=True, cancel_futures=True)
|
|
50
|
+
|
|
51
|
+
def __getstate__(self):
|
|
52
|
+
"""Get the state for pickling."""
|
|
53
|
+
return {
|
|
54
|
+
"available_cpu_count": self._available_cpu_count,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
def __setstate__(self, state: dict[str, Any]):
|
|
58
|
+
"""Set the state for unpickling."""
|
|
59
|
+
self.__init__(
|
|
60
|
+
available_cpu_count=state["available_cpu_count"],
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def get(
|
|
64
|
+
self, blob: BLOB, offset: int, size: int, logger: InternalLogger
|
|
65
|
+
) -> bytearray:
|
|
66
|
+
"""Returns binary data stored in BLOB with the supplied URI at the supplied offset.
|
|
67
|
+
|
|
68
|
+
Raises InternalError on error.
|
|
69
|
+
"""
|
|
70
|
+
if offset + size > _blob_size(blob):
|
|
71
|
+
raise InternalError(
|
|
72
|
+
f"Offset {offset} + size {size} is out of bounds for BLOB chunks of size {_blob_size(blob)}."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Read data from BLOB chunks in parallel until all data is read.
|
|
76
|
+
# Minimize data copying by not creating any intermediate bytes/bytearray objects.
|
|
77
|
+
read_chunk_futures: list[Future] = []
|
|
78
|
+
destination: bytearray = bytearray(size)
|
|
79
|
+
destination_view: memoryview = memoryview(destination)
|
|
80
|
+
read_offset: int = offset
|
|
81
|
+
|
|
82
|
+
# Allow reads of size 0. This happens when an application function call with no arguments is made.
|
|
83
|
+
if size == 0:
|
|
84
|
+
return destination
|
|
85
|
+
|
|
86
|
+
first_chunk_info: _ChunkInfo = _find_chunk(blob, offset)
|
|
87
|
+
chunk_ix: int = first_chunk_info.index
|
|
88
|
+
offset_inside_chunk: int = offset - first_chunk_info.offset
|
|
89
|
+
while read_offset != (offset + size):
|
|
90
|
+
chunk: BLOBChunk = blob.chunks[chunk_ix]
|
|
91
|
+
chunk_read_size: int = min(
|
|
92
|
+
(offset + size) - read_offset, chunk.size - offset_inside_chunk
|
|
93
|
+
)
|
|
94
|
+
destination_offset: int = read_offset - offset
|
|
95
|
+
chunk_in_destination: memoryview = destination_view[
|
|
96
|
+
destination_offset : destination_offset + chunk_read_size
|
|
97
|
+
]
|
|
98
|
+
read_chunk_futures.append(
|
|
99
|
+
self._io_workers_pool.submit(
|
|
100
|
+
self._read_into,
|
|
101
|
+
# Local file chunk URI points at the beginning of the file (not the chunk).
|
|
102
|
+
# S3 chunk URI points at the beginning of the S3 object (not the chunk). This is performance optimization so we don't
|
|
103
|
+
# need to presign a ranged S3 URI per chunk. We use a single presigned S3 URI for all BLOB chunks instead.
|
|
104
|
+
blob_uri=chunk.uri,
|
|
105
|
+
blob_read_offset=read_offset,
|
|
106
|
+
destination=chunk_in_destination,
|
|
107
|
+
logger=logger,
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
read_offset += chunk_read_size
|
|
112
|
+
offset_inside_chunk = (
|
|
113
|
+
0 # only read of first chunk can be not aligned at chunk boundary
|
|
114
|
+
)
|
|
115
|
+
chunk_ix += 1
|
|
116
|
+
|
|
117
|
+
wait(read_chunk_futures, return_when=FIRST_EXCEPTION)
|
|
118
|
+
for future in read_chunk_futures:
|
|
119
|
+
if future.exception() is not None:
|
|
120
|
+
raise InternalError(
|
|
121
|
+
"Failed reading BLOB store chunk"
|
|
122
|
+
) from future.exception()
|
|
123
|
+
|
|
124
|
+
return destination
|
|
125
|
+
|
|
126
|
+
def _read_into(
|
|
127
|
+
self,
|
|
128
|
+
blob_uri: str,
|
|
129
|
+
blob_read_offset: int,
|
|
130
|
+
destination: memoryview,
|
|
131
|
+
logger: InternalLogger,
|
|
132
|
+
) -> bytes:
|
|
133
|
+
if _is_file_uri(blob_uri):
|
|
134
|
+
self._local.get(
|
|
135
|
+
uri=blob_uri,
|
|
136
|
+
offset=blob_read_offset,
|
|
137
|
+
destination=destination,
|
|
138
|
+
logger=logger,
|
|
139
|
+
)
|
|
140
|
+
else:
|
|
141
|
+
self._s3.get(
|
|
142
|
+
uri=blob_uri,
|
|
143
|
+
offset=blob_read_offset,
|
|
144
|
+
destination=destination,
|
|
145
|
+
logger=logger,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
def put(self, blob: BLOB, data: list[bytes], logger: InternalLogger) -> BLOB:
|
|
149
|
+
"""Stores the supplied binary data into the supplied BLOB starting from its very beginning.
|
|
150
|
+
|
|
151
|
+
Overwrites BLOB. Raises Exception on error.
|
|
152
|
+
Data can be smaller than the BLOB size, but not larger.
|
|
153
|
+
Returns the updated BLOB with chunks that were used for storing the data starting from the first chunk
|
|
154
|
+
in the original BLOB. The original order of the chunks is preserved. Chunks that were not used for
|
|
155
|
+
storing the data are not added to the returned BLOB. Each chunk in the returned BLOB has its size set to
|
|
156
|
+
the actual size of the data that was written to it and its etag returned by the storage backend.
|
|
157
|
+
|
|
158
|
+
Raises InternalError on error.
|
|
159
|
+
"""
|
|
160
|
+
blob_size: int = _blob_size(blob)
|
|
161
|
+
data_size: int = sum(len(chunk) for chunk in data)
|
|
162
|
+
|
|
163
|
+
if data_size > blob_size:
|
|
164
|
+
raise InternalError(f"Data size {data_size} exceeds BLOB size {blob_size}.")
|
|
165
|
+
|
|
166
|
+
# Write data to BLOB chunks in parallel until all data is written.
|
|
167
|
+
# Minimize data copying by not creating any intermediate bytes/bytearray objects.
|
|
168
|
+
data_read_offset: int = 0
|
|
169
|
+
write_chunk_futures: list[Future] = []
|
|
170
|
+
uploaded_chunk_sizes: list[int] = []
|
|
171
|
+
|
|
172
|
+
data_ix: int = 0
|
|
173
|
+
read_offset_inside_data: int = 0
|
|
174
|
+
for chunk in blob.chunks:
|
|
175
|
+
chunk: BLOBChunk
|
|
176
|
+
chunk_data: list[memoryview] = []
|
|
177
|
+
chunk_data_size: int = 0
|
|
178
|
+
chunk_offset: int = data_read_offset
|
|
179
|
+
if data_ix == len(data):
|
|
180
|
+
break
|
|
181
|
+
|
|
182
|
+
# Fill the chunk with data until it is full.
|
|
183
|
+
while chunk_data_size != chunk.size and data_ix != len(data):
|
|
184
|
+
read_size: int = min(
|
|
185
|
+
chunk.size - chunk_data_size,
|
|
186
|
+
len(data[data_ix]) - read_offset_inside_data,
|
|
187
|
+
)
|
|
188
|
+
chunk_data.append(
|
|
189
|
+
memoryview(data[data_ix])[
|
|
190
|
+
read_offset_inside_data : read_offset_inside_data + read_size
|
|
191
|
+
]
|
|
192
|
+
)
|
|
193
|
+
chunk_data_size += read_size
|
|
194
|
+
read_offset_inside_data += read_size
|
|
195
|
+
data_read_offset += read_size
|
|
196
|
+
if read_offset_inside_data == len(data[data_ix]):
|
|
197
|
+
data_ix += 1
|
|
198
|
+
read_offset_inside_data = 0
|
|
199
|
+
|
|
200
|
+
# Write the chunk (should be full except the last one).
|
|
201
|
+
# Local file chunk URI points at the beginning of the file (not the chunk).
|
|
202
|
+
# S3 chunk URI contains chunk's index (part number).
|
|
203
|
+
write_chunk_futures.append(
|
|
204
|
+
self._io_workers_pool.submit(
|
|
205
|
+
self._write_chunk,
|
|
206
|
+
chunk_uri=chunk.uri,
|
|
207
|
+
chunk_offset=chunk_offset,
|
|
208
|
+
source=chunk_data,
|
|
209
|
+
logger=logger,
|
|
210
|
+
)
|
|
211
|
+
)
|
|
212
|
+
uploaded_chunk_sizes.append(chunk_data_size)
|
|
213
|
+
|
|
214
|
+
wait(write_chunk_futures, return_when=FIRST_EXCEPTION)
|
|
215
|
+
uploaded_blob: BLOB = BLOB(
|
|
216
|
+
id=blob.id,
|
|
217
|
+
chunks=[],
|
|
218
|
+
)
|
|
219
|
+
for ix, future in enumerate(write_chunk_futures):
|
|
220
|
+
if future.exception() is not None:
|
|
221
|
+
raise InternalError(
|
|
222
|
+
"Failed writing BLOB store chunk"
|
|
223
|
+
) from future.exception()
|
|
224
|
+
# The futures list is ordered by the chunk index, so appending here preserves
|
|
225
|
+
# the original chunks order.
|
|
226
|
+
uploaded_chunk: BLOBChunk = blob.chunks[ix].model_copy()
|
|
227
|
+
uploaded_chunk.size = uploaded_chunk_sizes[ix]
|
|
228
|
+
uploaded_chunk.etag = future.result()
|
|
229
|
+
uploaded_blob.chunks.append(uploaded_chunk)
|
|
230
|
+
|
|
231
|
+
return uploaded_blob
|
|
232
|
+
|
|
233
|
+
def _write_chunk(
|
|
234
|
+
self,
|
|
235
|
+
chunk_uri: str,
|
|
236
|
+
chunk_offset: int,
|
|
237
|
+
source: list[memoryview],
|
|
238
|
+
logger: InternalLogger,
|
|
239
|
+
) -> str:
|
|
240
|
+
if _is_file_uri(chunk_uri):
|
|
241
|
+
return self._local.put(
|
|
242
|
+
uri=chunk_uri,
|
|
243
|
+
offset=chunk_offset,
|
|
244
|
+
source=source,
|
|
245
|
+
logger=logger,
|
|
246
|
+
)
|
|
247
|
+
else:
|
|
248
|
+
return self._s3.put(
|
|
249
|
+
uri=chunk_uri,
|
|
250
|
+
source=source,
|
|
251
|
+
logger=logger,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def _find_chunk(blob: BLOB, offset: int) -> _ChunkInfo:
|
|
256
|
+
"""Returns info of the chunk where the supplied offset starts.
|
|
257
|
+
|
|
258
|
+
Raises IndexError if the offset is outside of the BLOB."""
|
|
259
|
+
current_offset: int = 0
|
|
260
|
+
for ix, chunk in enumerate(blob.chunks):
|
|
261
|
+
if current_offset + chunk.size > offset:
|
|
262
|
+
return _ChunkInfo(index=ix, offset=current_offset)
|
|
263
|
+
current_offset += chunk.size
|
|
264
|
+
|
|
265
|
+
raise InternalError(
|
|
266
|
+
f"Offset {offset} is out of bounds for BLOB chunks of size {current_offset}."
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _blob_size(blob: BLOB) -> int:
|
|
271
|
+
"""Returns the total size of the BLOB."""
|
|
272
|
+
return sum(chunk.size for chunk in blob.chunks)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def _is_file_uri(uri: str) -> bool:
|
|
276
|
+
return uri.startswith("file://")
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import os
|
|
3
|
+
import os.path
|
|
4
|
+
from typing import List
|
|
5
|
+
|
|
6
|
+
from tensorlake.applications.interface.exceptions import InternalError
|
|
7
|
+
from tensorlake.applications.internal_logger import InternalLogger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LocalFSBLOBStore:
|
|
11
|
+
"""BLOB store that stores BLOBs in local file system."""
|
|
12
|
+
|
|
13
|
+
def get(
|
|
14
|
+
self,
|
|
15
|
+
uri: str,
|
|
16
|
+
offset: int,
|
|
17
|
+
destination: memoryview,
|
|
18
|
+
logger: InternalLogger,
|
|
19
|
+
) -> None:
|
|
20
|
+
"""Reads binary data stored in file at the supplied URI and offset into the destination memoryview.
|
|
21
|
+
|
|
22
|
+
The URI must be a file URI (starts with "file://"). The path must be absolute.
|
|
23
|
+
Raises InternalError on error.
|
|
24
|
+
"""
|
|
25
|
+
blob_path: str = _blob_path_from_uri(uri)
|
|
26
|
+
if not os.path.isabs(blob_path):
|
|
27
|
+
raise InternalError(f"BLOB file path {blob_path} must be absolute")
|
|
28
|
+
|
|
29
|
+
if os.path.exists(blob_path):
|
|
30
|
+
with open(blob_path, mode="rb") as blob_file:
|
|
31
|
+
blob_file.seek(offset)
|
|
32
|
+
# memoryview ensures that the slice we pass points at destination.
|
|
33
|
+
blob_file.readinto(destination)
|
|
34
|
+
else:
|
|
35
|
+
raise InternalError(f"BLOB file at {blob_path} does not exist")
|
|
36
|
+
|
|
37
|
+
def put(
|
|
38
|
+
self,
|
|
39
|
+
uri: str,
|
|
40
|
+
offset: int,
|
|
41
|
+
source: List[memoryview],
|
|
42
|
+
logger: InternalLogger,
|
|
43
|
+
) -> str:
|
|
44
|
+
"""Stores the supplied memoryviews of binary data in a file at the supplied URI and offset.
|
|
45
|
+
|
|
46
|
+
The URI must be a file URI (starts with "file://"). The path must be absolute.
|
|
47
|
+
Overwrites existing file. Raises Exception on error.
|
|
48
|
+
Returns the ETag of the stored data.
|
|
49
|
+
"""
|
|
50
|
+
blob_path: str = _blob_path_from_uri(uri)
|
|
51
|
+
if not os.path.isabs(blob_path):
|
|
52
|
+
raise InternalError(f"BLOB file path {blob_path} must be absolute")
|
|
53
|
+
|
|
54
|
+
os.makedirs(os.path.dirname(blob_path), exist_ok=True)
|
|
55
|
+
_create_file_if_doesnt_exist(blob_path)
|
|
56
|
+
|
|
57
|
+
hasher: hashlib.md5 = hashlib.md5()
|
|
58
|
+
with open(blob_path, mode="rb+") as blob_file:
|
|
59
|
+
blob_file.seek(offset) # Adds zeroes if the file is smaller than offset.
|
|
60
|
+
for source_data in source:
|
|
61
|
+
blob_file.write(source_data)
|
|
62
|
+
hasher.update(source_data)
|
|
63
|
+
|
|
64
|
+
return hasher.hexdigest()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _blob_path_from_uri(uri: str) -> str:
|
|
68
|
+
return uri[7:] # strip "file://" prefix
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _create_file_if_doesnt_exist(path: str) -> None:
|
|
72
|
+
"""Creates an empty file at the specified path if it doesn't exist."""
|
|
73
|
+
try:
|
|
74
|
+
with open(path, "x"):
|
|
75
|
+
pass # File was created
|
|
76
|
+
except FileExistsError:
|
|
77
|
+
pass # File already exists, no action needed
|