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.
Files changed (971) hide show
  1. tensorlake/__init__.py +1 -0
  2. tensorlake/_cloud_sdk.pyd +0 -0
  3. tensorlake/applications/__init__.py +1 -0
  4. tensorlake/applications/algorithms/__init__.py +6 -0
  5. tensorlake/applications/algorithms/dfs_bottom_up.py +94 -0
  6. tensorlake/applications/applications.py +49 -0
  7. tensorlake/applications/blob_store/__init__.py +4 -0
  8. tensorlake/applications/blob_store/blob.py +22 -0
  9. tensorlake/applications/blob_store/blob_store.py +276 -0
  10. tensorlake/applications/blob_store/local_fs_blob_store.py +77 -0
  11. tensorlake/applications/blob_store/s3_blob_store.py +240 -0
  12. tensorlake/applications/cloud_events.py +72 -0
  13. tensorlake/applications/function/application_call.py +159 -0
  14. tensorlake/applications/function/function_call.py +33 -0
  15. tensorlake/applications/function/introspect.py +166 -0
  16. tensorlake/applications/function/type_hints.py +74 -0
  17. tensorlake/applications/function/user_data_serializer.py +126 -0
  18. tensorlake/applications/image.py +73 -0
  19. tensorlake/applications/interface/README.md +8 -0
  20. tensorlake/applications/interface/__init__.py +66 -0
  21. tensorlake/applications/interface/_pretty_print.py +235 -0
  22. tensorlake/applications/interface/decorators.py +270 -0
  23. tensorlake/applications/interface/exceptions.py +104 -0
  24. tensorlake/applications/interface/file.py +17 -0
  25. tensorlake/applications/interface/function.py +310 -0
  26. tensorlake/applications/interface/futures.py +461 -0
  27. tensorlake/applications/interface/logger.py +67 -0
  28. tensorlake/applications/interface/request.py +30 -0
  29. tensorlake/applications/interface/request_context.py +109 -0
  30. tensorlake/applications/interface/retries.py +25 -0
  31. tensorlake/applications/interface/run.py +76 -0
  32. tensorlake/applications/internal_logger.py +181 -0
  33. tensorlake/applications/local/class_instance_store.py +50 -0
  34. tensorlake/applications/local/future.py +45 -0
  35. tensorlake/applications/local/future_run/function_call_future_run.py +216 -0
  36. tensorlake/applications/local/future_run/future_run.py +133 -0
  37. tensorlake/applications/local/request.py +26 -0
  38. tensorlake/applications/local/request_context/handlers/add_metrics.py +33 -0
  39. tensorlake/applications/local/request_context/handlers/progress_update.py +29 -0
  40. tensorlake/applications/local/request_context/handlers/request_state/commit_write.py +14 -0
  41. tensorlake/applications/local/request_context/handlers/request_state/file_path.py +17 -0
  42. tensorlake/applications/local/request_context/handlers/request_state/prepare_read.py +39 -0
  43. tensorlake/applications/local/request_context/handlers/request_state/prepare_write.py +35 -0
  44. tensorlake/applications/local/request_context/http_handler_factory.py +76 -0
  45. tensorlake/applications/local/runner.py +1289 -0
  46. tensorlake/applications/local/utils.py +12 -0
  47. tensorlake/applications/local/value_store.py +92 -0
  48. tensorlake/applications/metadata/__init__.py +16 -0
  49. tensorlake/applications/metadata/function_call.py +42 -0
  50. tensorlake/applications/metadata/serialization.py +27 -0
  51. tensorlake/applications/metadata/value.py +20 -0
  52. tensorlake/applications/multiprocessing.py +14 -0
  53. tensorlake/applications/registry.py +126 -0
  54. tensorlake/applications/remote/api_client.py +177 -0
  55. tensorlake/applications/remote/api_client_context_manager.py +24 -0
  56. tensorlake/applications/remote/app_manifest_cache.py +20 -0
  57. tensorlake/applications/remote/code/ignored_code_paths.py +143 -0
  58. tensorlake/applications/remote/code/loader.py +72 -0
  59. tensorlake/applications/remote/code/zip.py +187 -0
  60. tensorlake/applications/remote/curl_command.py +157 -0
  61. tensorlake/applications/remote/deploy.py +73 -0
  62. tensorlake/applications/remote/fake_json.py +37 -0
  63. tensorlake/applications/remote/manifests/application.py +126 -0
  64. tensorlake/applications/remote/manifests/docstring.py +474 -0
  65. tensorlake/applications/remote/manifests/function.py +308 -0
  66. tensorlake/applications/remote/manifests/function_manifests.py +110 -0
  67. tensorlake/applications/remote/manifests/function_resources.py +49 -0
  68. tensorlake/applications/remote/request.py +60 -0
  69. tensorlake/applications/remote/runner.py +128 -0
  70. tensorlake/applications/request_context/contextvar.py +22 -0
  71. tensorlake/applications/request_context/http_client/context.py +123 -0
  72. tensorlake/applications/request_context/http_client/metrics.py +83 -0
  73. tensorlake/applications/request_context/http_client/progress.py +93 -0
  74. tensorlake/applications/request_context/http_client/state.py +170 -0
  75. tensorlake/applications/request_context/http_client/transport.py +13 -0
  76. tensorlake/applications/request_context/http_server/handlers/add_metrics.py +46 -0
  77. tensorlake/applications/request_context/http_server/handlers/handler.py +26 -0
  78. tensorlake/applications/request_context/http_server/handlers/progress_update.py +45 -0
  79. tensorlake/applications/request_context/http_server/handlers/request_state/commit_write.py +37 -0
  80. tensorlake/applications/request_context/http_server/handlers/request_state/prepare_read.py +37 -0
  81. tensorlake/applications/request_context/http_server/handlers/request_state/prepare_write.py +37 -0
  82. tensorlake/applications/request_context/http_server/route.py +7 -0
  83. tensorlake/applications/request_context/http_server/router.py +101 -0
  84. tensorlake/applications/request_context/http_server/server.py +52 -0
  85. tensorlake/applications/request_context/metrics.py +77 -0
  86. tensorlake/applications/request_context/progress.py +63 -0
  87. tensorlake/applications/request_context/request_state.py +5 -0
  88. tensorlake/applications/runtime_hooks.py +191 -0
  89. tensorlake/applications/secrets.py +13 -0
  90. tensorlake/applications/user_data_serializer.py +198 -0
  91. tensorlake/applications/validation/__init__.py +11 -0
  92. tensorlake/applications/validation/message.py +30 -0
  93. tensorlake/applications/validation/print.py +54 -0
  94. tensorlake/applications/validation/validate.py +679 -0
  95. tensorlake/builder/__init__.py +74 -0
  96. tensorlake/builder/client_v2.py +212 -0
  97. tensorlake/builder/client_v3.py +451 -0
  98. tensorlake/builder/log_events.py +38 -0
  99. tensorlake/cli/__init__.py +3 -0
  100. tensorlake/cli/_common.py +135 -0
  101. tensorlake/cli/build_images.py +230 -0
  102. tensorlake/cli/create_sandbox_image.py +412 -0
  103. tensorlake/cli/deploy.py +362 -0
  104. tensorlake/cli/parse.py +111 -0
  105. tensorlake/cloud_client.py +350 -0
  106. tensorlake/documentai/__init__.py +81 -0
  107. tensorlake/documentai/_base.py +330 -0
  108. tensorlake/documentai/_classify.py +205 -0
  109. tensorlake/documentai/_datasets.py +516 -0
  110. tensorlake/documentai/_edit.py +147 -0
  111. tensorlake/documentai/_extract.py +233 -0
  112. tensorlake/documentai/_files.py +147 -0
  113. tensorlake/documentai/_parse.py +1128 -0
  114. tensorlake/documentai/_read.py +236 -0
  115. tensorlake/documentai/_utils.py +6 -0
  116. tensorlake/documentai/client.py +40 -0
  117. tensorlake/documentai/common.py +62 -0
  118. tensorlake/documentai/files.py +129 -0
  119. tensorlake/documentai/models/__init__.py +102 -0
  120. tensorlake/documentai/models/_datasets.py +38 -0
  121. tensorlake/documentai/models/_enums.py +218 -0
  122. tensorlake/documentai/models/_errors.py +59 -0
  123. tensorlake/documentai/models/_filters.py +63 -0
  124. tensorlake/documentai/models/_options.py +287 -0
  125. tensorlake/documentai/models/_pagination.py +20 -0
  126. tensorlake/documentai/models/_results.py +218 -0
  127. tensorlake/function_executor/README.md +19 -0
  128. tensorlake/function_executor/allocation_info.py +12 -0
  129. tensorlake/function_executor/allocation_runner/allocation_runner.py +976 -0
  130. tensorlake/function_executor/allocation_runner/allocation_state_wrapper.py +175 -0
  131. tensorlake/function_executor/allocation_runner/blob_utils.py +34 -0
  132. tensorlake/function_executor/allocation_runner/contextvars.py +17 -0
  133. tensorlake/function_executor/allocation_runner/download.py +155 -0
  134. tensorlake/function_executor/allocation_runner/event_loop/__init__.py +35 -0
  135. tensorlake/function_executor/allocation_runner/event_loop/durable_id.py +172 -0
  136. tensorlake/function_executor/allocation_runner/event_loop/event_loop.py +919 -0
  137. tensorlake/function_executor/allocation_runner/event_loop/input_events.py +53 -0
  138. tensorlake/function_executor/allocation_runner/event_loop/output_events.py +93 -0
  139. tensorlake/function_executor/allocation_runner/event_loop/special_function_calls.py +111 -0
  140. tensorlake/function_executor/allocation_runner/http_request_parse.py +255 -0
  141. tensorlake/function_executor/allocation_runner/request_context/progress.py +48 -0
  142. tensorlake/function_executor/allocation_runner/request_context/request_state.py +181 -0
  143. tensorlake/function_executor/allocation_runner/result_helper.py +91 -0
  144. tensorlake/function_executor/allocation_runner/sdk_algorithms.py +365 -0
  145. tensorlake/function_executor/allocation_runner/upload.py +163 -0
  146. tensorlake/function_executor/allocation_runner/value.py +20 -0
  147. tensorlake/function_executor/health_check.py +74 -0
  148. tensorlake/function_executor/info.py +16 -0
  149. tensorlake/function_executor/main.py +64 -0
  150. tensorlake/function_executor/message_validators.py +76 -0
  151. tensorlake/function_executor/proto/function_executor.proto +435 -0
  152. tensorlake/function_executor/proto/function_executor_pb2.py +154 -0
  153. tensorlake/function_executor/proto/function_executor_pb2.pyi +787 -0
  154. tensorlake/function_executor/proto/function_executor_pb2_grpc.py +448 -0
  155. tensorlake/function_executor/proto/message_validator.py +139 -0
  156. tensorlake/function_executor/proto/server_configuration.py +19 -0
  157. tensorlake/function_executor/proto/status.proto +42 -0
  158. tensorlake/function_executor/proto/status_pb2.py +45 -0
  159. tensorlake/function_executor/proto/status_pb2.pyi +27 -0
  160. tensorlake/function_executor/proto/status_pb2_grpc.py +28 -0
  161. tensorlake/function_executor/request_context/handlers/add_metrics.py +33 -0
  162. tensorlake/function_executor/request_context/handlers/progress_update.py +29 -0
  163. tensorlake/function_executor/request_context/handlers/request_state/commit_write.py +27 -0
  164. tensorlake/function_executor/request_context/handlers/request_state/prepare_read.py +27 -0
  165. tensorlake/function_executor/request_context/handlers/request_state/prepare_write.py +27 -0
  166. tensorlake/function_executor/request_context/http_handler_factory.py +76 -0
  167. tensorlake/function_executor/server.py +29 -0
  168. tensorlake/function_executor/service.py +404 -0
  169. tensorlake/function_executor/user_events.py +146 -0
  170. tensorlake/image/__init__.py +1 -0
  171. tensorlake/image/image.py +92 -0
  172. tensorlake/image/utils.py +40 -0
  173. tensorlake/sandbox/__init__.py +82 -0
  174. tensorlake/sandbox/_defaults.py +22 -0
  175. tensorlake/sandbox/client.py +783 -0
  176. tensorlake/sandbox/exceptions.py +76 -0
  177. tensorlake/sandbox/models.py +346 -0
  178. tensorlake/sandbox/sandbox.py +490 -0
  179. tensorlake/utils/README.md +3 -0
  180. tensorlake/utils/cache.py +85 -0
  181. tensorlake/utils/retries.py +100 -0
  182. tensorlake/vendor/__init__.py +0 -0
  183. tensorlake/vendor/faker/__init__.py +7 -0
  184. tensorlake/vendor/faker/__main__.py +4 -0
  185. tensorlake/vendor/faker/cli.py +296 -0
  186. tensorlake/vendor/faker/config.py +13 -0
  187. tensorlake/vendor/faker/contrib/__init__.py +0 -0
  188. tensorlake/vendor/faker/contrib/pytest/__init__.py +0 -0
  189. tensorlake/vendor/faker/contrib/pytest/plugin.py +38 -0
  190. tensorlake/vendor/faker/decode/__init__.py +13 -0
  191. tensorlake/vendor/faker/decode/codes.py +65538 -0
  192. tensorlake/vendor/faker/documentor.py +127 -0
  193. tensorlake/vendor/faker/exceptions.py +16 -0
  194. tensorlake/vendor/faker/factory.py +116 -0
  195. tensorlake/vendor/faker/generator.py +191 -0
  196. tensorlake/vendor/faker/providers/__init__.py +742 -0
  197. tensorlake/vendor/faker/providers/address/__init__.py +116 -0
  198. tensorlake/vendor/faker/providers/address/az_AZ/__init__.py +691 -0
  199. tensorlake/vendor/faker/providers/address/bn_BD/__init__.py +547 -0
  200. tensorlake/vendor/faker/providers/address/cs_CZ/__init__.py +1202 -0
  201. tensorlake/vendor/faker/providers/address/da_DK/__init__.py +2522 -0
  202. tensorlake/vendor/faker/providers/address/de/__init__.py +253 -0
  203. tensorlake/vendor/faker/providers/address/de_AT/__init__.py +280 -0
  204. tensorlake/vendor/faker/providers/address/de_CH/__init__.py +247 -0
  205. tensorlake/vendor/faker/providers/address/de_DE/__init__.py +470 -0
  206. tensorlake/vendor/faker/providers/address/el_GR/__init__.py +4952 -0
  207. tensorlake/vendor/faker/providers/address/en/__init__.py +251 -0
  208. tensorlake/vendor/faker/providers/address/en_AU/__init__.py +342 -0
  209. tensorlake/vendor/faker/providers/address/en_BD/__init__.py +547 -0
  210. tensorlake/vendor/faker/providers/address/en_CA/__init__.py +417 -0
  211. tensorlake/vendor/faker/providers/address/en_GB/__init__.py +550 -0
  212. tensorlake/vendor/faker/providers/address/en_IE/__init__.py +61 -0
  213. tensorlake/vendor/faker/providers/address/en_IN/__init__.py +572 -0
  214. tensorlake/vendor/faker/providers/address/en_MS/__init__.py +486 -0
  215. tensorlake/vendor/faker/providers/address/en_NZ/__init__.py +340 -0
  216. tensorlake/vendor/faker/providers/address/en_PH/__init__.py +1799 -0
  217. tensorlake/vendor/faker/providers/address/en_US/__init__.py +599 -0
  218. tensorlake/vendor/faker/providers/address/es/__init__.py +200 -0
  219. tensorlake/vendor/faker/providers/address/es_AR/__init__.py +231 -0
  220. tensorlake/vendor/faker/providers/address/es_CL/__init__.py +648 -0
  221. tensorlake/vendor/faker/providers/address/es_CO/__init__.py +1334 -0
  222. tensorlake/vendor/faker/providers/address/es_ES/__init__.py +140 -0
  223. tensorlake/vendor/faker/providers/address/es_MX/__init__.py +163 -0
  224. tensorlake/vendor/faker/providers/address/fa_IR/__init__.py +296 -0
  225. tensorlake/vendor/faker/providers/address/fi_FI/__init__.py +800 -0
  226. tensorlake/vendor/faker/providers/address/fil_PH/__init__.py +7 -0
  227. tensorlake/vendor/faker/providers/address/fr_CA/__init__.py +81 -0
  228. tensorlake/vendor/faker/providers/address/fr_CH/__init__.py +367 -0
  229. tensorlake/vendor/faker/providers/address/fr_FR/__init__.py +478 -0
  230. tensorlake/vendor/faker/providers/address/he_IL/__init__.py +623 -0
  231. tensorlake/vendor/faker/providers/address/hi_IN/__init__.py +244 -0
  232. tensorlake/vendor/faker/providers/address/hr_HR/__init__.py +588 -0
  233. tensorlake/vendor/faker/providers/address/hu_HU/__init__.py +479 -0
  234. tensorlake/vendor/faker/providers/address/hy_AM/__init__.py +686 -0
  235. tensorlake/vendor/faker/providers/address/id_ID/__init__.py +526 -0
  236. tensorlake/vendor/faker/providers/address/it_IT/__init__.py +17659 -0
  237. tensorlake/vendor/faker/providers/address/ja_JP/__init__.py +649 -0
  238. tensorlake/vendor/faker/providers/address/ka_GE/__init__.py +1297 -0
  239. tensorlake/vendor/faker/providers/address/ko_KR/__init__.py +643 -0
  240. tensorlake/vendor/faker/providers/address/ne_NP/__init__.py +621 -0
  241. tensorlake/vendor/faker/providers/address/nl_BE/__init__.py +3047 -0
  242. tensorlake/vendor/faker/providers/address/nl_NL/__init__.py +2737 -0
  243. tensorlake/vendor/faker/providers/address/no_NO/__init__.py +114 -0
  244. tensorlake/vendor/faker/providers/address/pl_PL/__init__.py +696 -0
  245. tensorlake/vendor/faker/providers/address/pt_BR/__init__.py +935 -0
  246. tensorlake/vendor/faker/providers/address/pt_PT/__init__.py +1592 -0
  247. tensorlake/vendor/faker/providers/address/ro_RO/__init__.py +438 -0
  248. tensorlake/vendor/faker/providers/address/ru_RU/__init__.py +1597 -0
  249. tensorlake/vendor/faker/providers/address/sk_SK/__init__.py +5266 -0
  250. tensorlake/vendor/faker/providers/address/sl_SI/__init__.py +1601 -0
  251. tensorlake/vendor/faker/providers/address/sv_SE/__init__.py +375 -0
  252. tensorlake/vendor/faker/providers/address/ta_IN/__init__.py +429 -0
  253. tensorlake/vendor/faker/providers/address/th/__init__.py +251 -0
  254. tensorlake/vendor/faker/providers/address/th_TH/__init__.py +390 -0
  255. tensorlake/vendor/faker/providers/address/tl_PH/__init__.py +7 -0
  256. tensorlake/vendor/faker/providers/address/uk_UA/__init__.py +2200 -0
  257. tensorlake/vendor/faker/providers/address/vi_VN/__init__.py +307 -0
  258. tensorlake/vendor/faker/providers/address/zh_CN/__init__.py +449 -0
  259. tensorlake/vendor/faker/providers/address/zh_TW/__init__.py +388 -0
  260. tensorlake/vendor/faker/providers/address/zu_ZA/__init__.py +230 -0
  261. tensorlake/vendor/faker/providers/automotive/__init__.py +63 -0
  262. tensorlake/vendor/faker/providers/automotive/ar_BH/__init__.py +12 -0
  263. tensorlake/vendor/faker/providers/automotive/ar_JO/__init__.py +53 -0
  264. tensorlake/vendor/faker/providers/automotive/ar_PS/__init__.py +64 -0
  265. tensorlake/vendor/faker/providers/automotive/ar_SA/__init__.py +89 -0
  266. tensorlake/vendor/faker/providers/automotive/az_AZ/__init__.py +97 -0
  267. tensorlake/vendor/faker/providers/automotive/bn_BD/__init__.py +253 -0
  268. tensorlake/vendor/faker/providers/automotive/da_DK/__init__.py +9 -0
  269. tensorlake/vendor/faker/providers/automotive/de_AT/__init__.py +177 -0
  270. tensorlake/vendor/faker/providers/automotive/de_CH/__init__.py +44 -0
  271. tensorlake/vendor/faker/providers/automotive/de_DE/__init__.py +430 -0
  272. tensorlake/vendor/faker/providers/automotive/el_GR/__init__.py +23 -0
  273. tensorlake/vendor/faker/providers/automotive/en_CA/__init__.py +45 -0
  274. tensorlake/vendor/faker/providers/automotive/en_GB/__init__.py +15 -0
  275. tensorlake/vendor/faker/providers/automotive/en_NZ/__init__.py +32 -0
  276. tensorlake/vendor/faker/providers/automotive/en_PH/__init__.py +70 -0
  277. tensorlake/vendor/faker/providers/automotive/en_US/__init__.py +170 -0
  278. tensorlake/vendor/faker/providers/automotive/es_AR/__init__.py +87 -0
  279. tensorlake/vendor/faker/providers/automotive/es_CL/__init__.py +64 -0
  280. tensorlake/vendor/faker/providers/automotive/es_CO/__init__.py +16 -0
  281. tensorlake/vendor/faker/providers/automotive/es_ES/__init__.py +124 -0
  282. tensorlake/vendor/faker/providers/automotive/et_EE/__init__.py +12 -0
  283. tensorlake/vendor/faker/providers/automotive/fi_FI/__init__.py +12 -0
  284. tensorlake/vendor/faker/providers/automotive/fil_PH/__init__.py +10 -0
  285. tensorlake/vendor/faker/providers/automotive/fr_FR/__init__.py +17 -0
  286. tensorlake/vendor/faker/providers/automotive/he_IL/__init__.py +11 -0
  287. tensorlake/vendor/faker/providers/automotive/hu_HU/__init__.py +12 -0
  288. tensorlake/vendor/faker/providers/automotive/id_ID/__init__.py +16 -0
  289. tensorlake/vendor/faker/providers/automotive/it_IT/__init__.py +15 -0
  290. tensorlake/vendor/faker/providers/automotive/ja_JP/__init__.py +116 -0
  291. tensorlake/vendor/faker/providers/automotive/ko_KR/__init__.py +52 -0
  292. tensorlake/vendor/faker/providers/automotive/lt_LT/__init__.py +12 -0
  293. tensorlake/vendor/faker/providers/automotive/nl_BE/__init__.py +16 -0
  294. tensorlake/vendor/faker/providers/automotive/nl_NL/__init__.py +77 -0
  295. tensorlake/vendor/faker/providers/automotive/no_NO/__init__.py +15 -0
  296. tensorlake/vendor/faker/providers/automotive/pl_PL/__init__.py +39 -0
  297. tensorlake/vendor/faker/providers/automotive/pt_BR/__init__.py +7 -0
  298. tensorlake/vendor/faker/providers/automotive/pt_PT/__init__.py +18 -0
  299. tensorlake/vendor/faker/providers/automotive/ro_RO/__init__.py +66 -0
  300. tensorlake/vendor/faker/providers/automotive/ru_RU/__init__.py +321 -0
  301. tensorlake/vendor/faker/providers/automotive/sk_SK/__init__.py +100 -0
  302. tensorlake/vendor/faker/providers/automotive/sq_AL/__init__.py +12 -0
  303. tensorlake/vendor/faker/providers/automotive/sv_SE/__init__.py +18 -0
  304. tensorlake/vendor/faker/providers/automotive/th_TH/__init__.py +39 -0
  305. tensorlake/vendor/faker/providers/automotive/tl_PH/__init__.py +10 -0
  306. tensorlake/vendor/faker/providers/automotive/tr_TR/__init__.py +33 -0
  307. tensorlake/vendor/faker/providers/automotive/uk_UA/__init__.py +291 -0
  308. tensorlake/vendor/faker/providers/automotive/vi_VN/__init__.py +24 -0
  309. tensorlake/vendor/faker/providers/automotive/zh_CN/__init__.py +47 -0
  310. tensorlake/vendor/faker/providers/automotive/zh_TW/__init__.py +19 -0
  311. tensorlake/vendor/faker/providers/bank/__init__.py +165 -0
  312. tensorlake/vendor/faker/providers/bank/az_AZ/__init__.py +36 -0
  313. tensorlake/vendor/faker/providers/bank/bn_BD/__init__.py +83 -0
  314. tensorlake/vendor/faker/providers/bank/cs_CZ/__init__.py +11 -0
  315. tensorlake/vendor/faker/providers/bank/da_DK/__init__.py +8 -0
  316. tensorlake/vendor/faker/providers/bank/de_AT/__init__.py +8 -0
  317. tensorlake/vendor/faker/providers/bank/de_CH/__init__.py +8 -0
  318. tensorlake/vendor/faker/providers/bank/de_DE/__init__.py +21 -0
  319. tensorlake/vendor/faker/providers/bank/el_GR/__init__.py +8 -0
  320. tensorlake/vendor/faker/providers/bank/en_GB/__init__.py +8 -0
  321. tensorlake/vendor/faker/providers/bank/en_IE/__init__.py +8 -0
  322. tensorlake/vendor/faker/providers/bank/en_IN/__init__.py +47 -0
  323. tensorlake/vendor/faker/providers/bank/en_PH/__init__.py +109 -0
  324. tensorlake/vendor/faker/providers/bank/es_AR/__init__.py +32 -0
  325. tensorlake/vendor/faker/providers/bank/es_ES/__init__.py +8 -0
  326. tensorlake/vendor/faker/providers/bank/es_MX/__init__.py +274 -0
  327. tensorlake/vendor/faker/providers/bank/fa_IR/__init__.py +56 -0
  328. tensorlake/vendor/faker/providers/bank/fi_FI/__init__.py +8 -0
  329. tensorlake/vendor/faker/providers/bank/fil_PH/__init__.py +10 -0
  330. tensorlake/vendor/faker/providers/bank/fr_CH/__init__.py +10 -0
  331. tensorlake/vendor/faker/providers/bank/fr_FR/__init__.py +8 -0
  332. tensorlake/vendor/faker/providers/bank/it_CH/__init__.py +10 -0
  333. tensorlake/vendor/faker/providers/bank/it_IT/__init__.py +8 -0
  334. tensorlake/vendor/faker/providers/bank/nl_BE/__init__.py +92 -0
  335. tensorlake/vendor/faker/providers/bank/nl_NL/__init__.py +8 -0
  336. tensorlake/vendor/faker/providers/bank/no_NO/__init__.py +8 -0
  337. tensorlake/vendor/faker/providers/bank/pl_PL/__init__.py +8 -0
  338. tensorlake/vendor/faker/providers/bank/pt_PT/__init__.py +8 -0
  339. tensorlake/vendor/faker/providers/bank/ro_RO/__init__.py +50 -0
  340. tensorlake/vendor/faker/providers/bank/ru_RU/__init__.py +755 -0
  341. tensorlake/vendor/faker/providers/bank/sk_SK/__init__.py +11 -0
  342. tensorlake/vendor/faker/providers/bank/th_TH/__init__.py +64 -0
  343. tensorlake/vendor/faker/providers/bank/tl_PH/__init__.py +10 -0
  344. tensorlake/vendor/faker/providers/bank/tr_TR/__init__.py +8 -0
  345. tensorlake/vendor/faker/providers/bank/uk_UA/__init__.py +83 -0
  346. tensorlake/vendor/faker/providers/bank/zh_CN/__init__.py +33 -0
  347. tensorlake/vendor/faker/providers/barcode/__init__.py +122 -0
  348. tensorlake/vendor/faker/providers/barcode/en_CA/__init__.py +24 -0
  349. tensorlake/vendor/faker/providers/barcode/en_US/__init__.py +249 -0
  350. tensorlake/vendor/faker/providers/barcode/es_ES/__init__.py +12 -0
  351. tensorlake/vendor/faker/providers/barcode/fr_CA/__init__.py +10 -0
  352. tensorlake/vendor/faker/providers/barcode/ja_JP/__init__.py +49 -0
  353. tensorlake/vendor/faker/providers/color/__init__.py +330 -0
  354. tensorlake/vendor/faker/providers/color/ar_PS/__init__.py +170 -0
  355. tensorlake/vendor/faker/providers/color/az_AZ/__init__.py +70 -0
  356. tensorlake/vendor/faker/providers/color/bg_BG/__init__.py +86 -0
  357. tensorlake/vendor/faker/providers/color/bn_BD/__init__.py +172 -0
  358. tensorlake/vendor/faker/providers/color/color.py +386 -0
  359. tensorlake/vendor/faker/providers/color/cs_CZ/__init__.py +23 -0
  360. tensorlake/vendor/faker/providers/color/da_DK/__init__.py +334 -0
  361. tensorlake/vendor/faker/providers/color/de/__init__.py +158 -0
  362. tensorlake/vendor/faker/providers/color/de_AT/__init__.py +5 -0
  363. tensorlake/vendor/faker/providers/color/de_CH/__init__.py +11 -0
  364. tensorlake/vendor/faker/providers/color/de_DE/__init__.py +5 -0
  365. tensorlake/vendor/faker/providers/color/el_GR/__init__.py +113 -0
  366. tensorlake/vendor/faker/providers/color/en_US/__init__.py +7 -0
  367. tensorlake/vendor/faker/providers/color/es/__init__.py +169 -0
  368. tensorlake/vendor/faker/providers/color/es_CL/__init__.py +7 -0
  369. tensorlake/vendor/faker/providers/color/es_ES/__init__.py +7 -0
  370. tensorlake/vendor/faker/providers/color/fa_IR/__init__.py +175 -0
  371. tensorlake/vendor/faker/providers/color/fr_FR/__init__.py +167 -0
  372. tensorlake/vendor/faker/providers/color/he_IL/__init__.py +49 -0
  373. tensorlake/vendor/faker/providers/color/hr_HR/__init__.py +172 -0
  374. tensorlake/vendor/faker/providers/color/hu_HU/__init__.py +23 -0
  375. tensorlake/vendor/faker/providers/color/hy_AM/__init__.py +168 -0
  376. tensorlake/vendor/faker/providers/color/id_ID/__init__.py +60 -0
  377. tensorlake/vendor/faker/providers/color/ka_GE/__init__.py +92 -0
  378. tensorlake/vendor/faker/providers/color/pt_BR/__init__.py +261 -0
  379. tensorlake/vendor/faker/providers/color/ru_RU/__init__.py +86 -0
  380. tensorlake/vendor/faker/providers/color/sk_SK/__init__.py +23 -0
  381. tensorlake/vendor/faker/providers/color/th_TH/__init__.py +52 -0
  382. tensorlake/vendor/faker/providers/color/uk_UA/__init__.py +222 -0
  383. tensorlake/vendor/faker/providers/color/uz_UZ/__init__.py +69 -0
  384. tensorlake/vendor/faker/providers/color/vi_VN/__init__.py +90 -0
  385. tensorlake/vendor/faker/providers/company/__init__.py +531 -0
  386. tensorlake/vendor/faker/providers/company/az_AZ/__init__.py +52 -0
  387. tensorlake/vendor/faker/providers/company/bg_BG/__init__.py +30 -0
  388. tensorlake/vendor/faker/providers/company/bn_BD/__init__.py +640 -0
  389. tensorlake/vendor/faker/providers/company/cs_CZ/__init__.py +19 -0
  390. tensorlake/vendor/faker/providers/company/da_DK/__init__.py +14 -0
  391. tensorlake/vendor/faker/providers/company/de_AT/__init__.py +26 -0
  392. tensorlake/vendor/faker/providers/company/de_CH/__init__.py +23 -0
  393. tensorlake/vendor/faker/providers/company/de_DE/__init__.py +38 -0
  394. tensorlake/vendor/faker/providers/company/el_GR/__init__.py +11 -0
  395. tensorlake/vendor/faker/providers/company/en_PH/__init__.py +147 -0
  396. tensorlake/vendor/faker/providers/company/en_US/__init__.py +5 -0
  397. tensorlake/vendor/faker/providers/company/es_CL/__init__.py +442 -0
  398. tensorlake/vendor/faker/providers/company/es_ES/__init__.py +127 -0
  399. tensorlake/vendor/faker/providers/company/es_MX/__init__.py +439 -0
  400. tensorlake/vendor/faker/providers/company/fa_IR/__init__.py +1113 -0
  401. tensorlake/vendor/faker/providers/company/fi_FI/__init__.py +66 -0
  402. tensorlake/vendor/faker/providers/company/fil_PH/__init__.py +94 -0
  403. tensorlake/vendor/faker/providers/company/fr_CH/__init__.py +40 -0
  404. tensorlake/vendor/faker/providers/company/fr_FR/__init__.py +439 -0
  405. tensorlake/vendor/faker/providers/company/hr_HR/__init__.py +15 -0
  406. tensorlake/vendor/faker/providers/company/hu_HU/__init__.py +15 -0
  407. tensorlake/vendor/faker/providers/company/hy_AM/__init__.py +283 -0
  408. tensorlake/vendor/faker/providers/company/id_ID/__init__.py +32 -0
  409. tensorlake/vendor/faker/providers/company/it_IT/__init__.py +375 -0
  410. tensorlake/vendor/faker/providers/company/ja_JP/__init__.py +31 -0
  411. tensorlake/vendor/faker/providers/company/ko_KR/__init__.py +470 -0
  412. tensorlake/vendor/faker/providers/company/nl_BE/__init__.py +10 -0
  413. tensorlake/vendor/faker/providers/company/nl_NL/__init__.py +521 -0
  414. tensorlake/vendor/faker/providers/company/no_NO/__init__.py +22 -0
  415. tensorlake/vendor/faker/providers/company/pl_PL/__init__.py +149 -0
  416. tensorlake/vendor/faker/providers/company/pt_BR/__init__.py +111 -0
  417. tensorlake/vendor/faker/providers/company/pt_PT/__init__.py +53 -0
  418. tensorlake/vendor/faker/providers/company/ro_RO/__init__.py +34 -0
  419. tensorlake/vendor/faker/providers/company/ru_RU/__init__.py +1182 -0
  420. tensorlake/vendor/faker/providers/company/sk_SK/__init__.py +16 -0
  421. tensorlake/vendor/faker/providers/company/sl_SI/__init__.py +13 -0
  422. tensorlake/vendor/faker/providers/company/sv_SE/__init__.py +14 -0
  423. tensorlake/vendor/faker/providers/company/th_TH/__init__.py +126 -0
  424. tensorlake/vendor/faker/providers/company/tl_PH/__init__.py +7 -0
  425. tensorlake/vendor/faker/providers/company/tr_TR/__init__.py +123 -0
  426. tensorlake/vendor/faker/providers/company/vi_VN/__init__.py +24 -0
  427. tensorlake/vendor/faker/providers/company/zh_CN/__init__.py +95 -0
  428. tensorlake/vendor/faker/providers/company/zh_TW/__init__.py +113 -0
  429. tensorlake/vendor/faker/providers/credit_card/__init__.py +195 -0
  430. tensorlake/vendor/faker/providers/credit_card/en_US/__init__.py +7 -0
  431. tensorlake/vendor/faker/providers/credit_card/fa_IR/__init__.py +124 -0
  432. tensorlake/vendor/faker/providers/credit_card/pt_PT/__init__.py +299 -0
  433. tensorlake/vendor/faker/providers/credit_card/ru_RU/__init__.py +115 -0
  434. tensorlake/vendor/faker/providers/credit_card/uk_UA/__init__.py +58 -0
  435. tensorlake/vendor/faker/providers/credit_card/zh_CN/__init__.py +36 -0
  436. tensorlake/vendor/faker/providers/currency/__init__.py +425 -0
  437. tensorlake/vendor/faker/providers/currency/az_AZ/__init__.py +178 -0
  438. tensorlake/vendor/faker/providers/currency/bn_BD/__init__.py +231 -0
  439. tensorlake/vendor/faker/providers/currency/cs_CZ/__init__.py +8 -0
  440. tensorlake/vendor/faker/providers/currency/da_DK/__init__.py +8 -0
  441. tensorlake/vendor/faker/providers/currency/de/__init__.py +174 -0
  442. tensorlake/vendor/faker/providers/currency/de_AT/__init__.py +8 -0
  443. tensorlake/vendor/faker/providers/currency/de_CH/__init__.py +9 -0
  444. tensorlake/vendor/faker/providers/currency/de_DE/__init__.py +8 -0
  445. tensorlake/vendor/faker/providers/currency/el_GR/__init__.py +158 -0
  446. tensorlake/vendor/faker/providers/currency/en_AU/__init__.py +8 -0
  447. tensorlake/vendor/faker/providers/currency/en_CA/__init__.py +8 -0
  448. tensorlake/vendor/faker/providers/currency/en_US/__init__.py +8 -0
  449. tensorlake/vendor/faker/providers/currency/es/__init__.py +171 -0
  450. tensorlake/vendor/faker/providers/currency/es_AR/__init__.py +8 -0
  451. tensorlake/vendor/faker/providers/currency/es_CL/__init__.py +8 -0
  452. tensorlake/vendor/faker/providers/currency/es_ES/__init__.py +8 -0
  453. tensorlake/vendor/faker/providers/currency/fa_IR/__init__.py +8 -0
  454. tensorlake/vendor/faker/providers/currency/fr_CA/__init__.py +8 -0
  455. tensorlake/vendor/faker/providers/currency/fr_FR/__init__.py +8 -0
  456. tensorlake/vendor/faker/providers/currency/it_IT/__init__.py +8 -0
  457. tensorlake/vendor/faker/providers/currency/ng_NG/__init__.py +8 -0
  458. tensorlake/vendor/faker/providers/currency/nl_NL/__init__.py +8 -0
  459. tensorlake/vendor/faker/providers/currency/pl_PL/__init__.py +8 -0
  460. tensorlake/vendor/faker/providers/currency/pt_BR/__init__.py +8 -0
  461. tensorlake/vendor/faker/providers/currency/ro_RO/__init__.py +8 -0
  462. tensorlake/vendor/faker/providers/currency/ru_RU/__init__.py +179 -0
  463. tensorlake/vendor/faker/providers/currency/sk_SK/__init__.py +8 -0
  464. tensorlake/vendor/faker/providers/currency/sv_SE/__init__.py +178 -0
  465. tensorlake/vendor/faker/providers/currency/th_TH/__init__.py +186 -0
  466. tensorlake/vendor/faker/providers/currency/tr_TR/__init__.py +8 -0
  467. tensorlake/vendor/faker/providers/currency/uk_UA/__init__.py +173 -0
  468. tensorlake/vendor/faker/providers/currency/uz_UZ/__init__.py +178 -0
  469. tensorlake/vendor/faker/providers/currency/vi_VN/__init__.py +9 -0
  470. tensorlake/vendor/faker/providers/date_time/__init__.py +2616 -0
  471. tensorlake/vendor/faker/providers/date_time/ar_AA/__init__.py +1765 -0
  472. tensorlake/vendor/faker/providers/date_time/ar_EG/__init__.py +18 -0
  473. tensorlake/vendor/faker/providers/date_time/az_AZ/__init__.py +36 -0
  474. tensorlake/vendor/faker/providers/date_time/bn_BD/__init__.py +1740 -0
  475. tensorlake/vendor/faker/providers/date_time/cs_CZ/__init__.py +36 -0
  476. tensorlake/vendor/faker/providers/date_time/da_DK/__init__.py +36 -0
  477. tensorlake/vendor/faker/providers/date_time/de_AT/__init__.py +36 -0
  478. tensorlake/vendor/faker/providers/date_time/de_DE/__init__.py +36 -0
  479. tensorlake/vendor/faker/providers/date_time/el_GR/__init__.py +36 -0
  480. tensorlake/vendor/faker/providers/date_time/en_PH/__init__.py +7 -0
  481. tensorlake/vendor/faker/providers/date_time/en_US/__init__.py +5 -0
  482. tensorlake/vendor/faker/providers/date_time/es/__init__.py +36 -0
  483. tensorlake/vendor/faker/providers/date_time/es_AR/__init__.py +5 -0
  484. tensorlake/vendor/faker/providers/date_time/es_CL/__init__.py +5 -0
  485. tensorlake/vendor/faker/providers/date_time/es_ES/__init__.py +5 -0
  486. tensorlake/vendor/faker/providers/date_time/fil_PH/__init__.py +37 -0
  487. tensorlake/vendor/faker/providers/date_time/fr_CA/__init__.py +8 -0
  488. tensorlake/vendor/faker/providers/date_time/fr_DZ/__init__.py +5 -0
  489. tensorlake/vendor/faker/providers/date_time/fr_FR/__init__.py +35 -0
  490. tensorlake/vendor/faker/providers/date_time/gu_IN/__init__.py +76 -0
  491. tensorlake/vendor/faker/providers/date_time/hi_IN/__init__.py +36 -0
  492. tensorlake/vendor/faker/providers/date_time/hr_HR/__init__.py +34 -0
  493. tensorlake/vendor/faker/providers/date_time/hu_HU/__init__.py +36 -0
  494. tensorlake/vendor/faker/providers/date_time/hy_AM/__init__.py +36 -0
  495. tensorlake/vendor/faker/providers/date_time/id_ID/__init__.py +36 -0
  496. tensorlake/vendor/faker/providers/date_time/it_IT/__init__.py +36 -0
  497. tensorlake/vendor/faker/providers/date_time/ja_JP/__init__.py +54 -0
  498. tensorlake/vendor/faker/providers/date_time/ka_GE/__init__.py +37 -0
  499. tensorlake/vendor/faker/providers/date_time/ko_KR/__init__.py +34 -0
  500. tensorlake/vendor/faker/providers/date_time/nl_NL/__init__.py +36 -0
  501. tensorlake/vendor/faker/providers/date_time/no_NO/__init__.py +35 -0
  502. tensorlake/vendor/faker/providers/date_time/pl_PL/__init__.py +36 -0
  503. tensorlake/vendor/faker/providers/date_time/pt_BR/__init__.py +36 -0
  504. tensorlake/vendor/faker/providers/date_time/pt_PT/__init__.py +36 -0
  505. tensorlake/vendor/faker/providers/date_time/ro_RO/__init__.py +36 -0
  506. tensorlake/vendor/faker/providers/date_time/ru_RU/__init__.py +1640 -0
  507. tensorlake/vendor/faker/providers/date_time/sk_SK/__init__.py +36 -0
  508. tensorlake/vendor/faker/providers/date_time/sl_SI/__init__.py +36 -0
  509. tensorlake/vendor/faker/providers/date_time/ta_IN/__init__.py +37 -0
  510. tensorlake/vendor/faker/providers/date_time/th_TH/__init__.py +340 -0
  511. tensorlake/vendor/faker/providers/date_time/tl_PH/__init__.py +7 -0
  512. tensorlake/vendor/faker/providers/date_time/tr_TR/__init__.py +36 -0
  513. tensorlake/vendor/faker/providers/date_time/uz_UZ/__init__.py +36 -0
  514. tensorlake/vendor/faker/providers/date_time/vi_VN/__init__.py +37 -0
  515. tensorlake/vendor/faker/providers/date_time/zh_CN/__init__.py +35 -0
  516. tensorlake/vendor/faker/providers/date_time/zh_TW/__init__.py +39 -0
  517. tensorlake/vendor/faker/providers/doi/__init__.py +22 -0
  518. tensorlake/vendor/faker/providers/emoji/__init__.py +3528 -0
  519. tensorlake/vendor/faker/providers/emoji/en_US/__init__.py +5 -0
  520. tensorlake/vendor/faker/providers/file/__init__.py +354 -0
  521. tensorlake/vendor/faker/providers/file/en_US/__init__.py +5 -0
  522. tensorlake/vendor/faker/providers/geo/__init__.py +1049 -0
  523. tensorlake/vendor/faker/providers/geo/bn_BD/__init__.py +989 -0
  524. tensorlake/vendor/faker/providers/geo/cs_CZ/__init__.py +156 -0
  525. tensorlake/vendor/faker/providers/geo/de_AT/__init__.py +11 -0
  526. tensorlake/vendor/faker/providers/geo/el_GR/__init__.py +28 -0
  527. tensorlake/vendor/faker/providers/geo/en_IE/__init__.py +52 -0
  528. tensorlake/vendor/faker/providers/geo/en_US/__init__.py +5 -0
  529. tensorlake/vendor/faker/providers/geo/pl_PL/__init__.py +48 -0
  530. tensorlake/vendor/faker/providers/geo/pt_PT/__init__.py +127 -0
  531. tensorlake/vendor/faker/providers/geo/sk_SK/__init__.py +104 -0
  532. tensorlake/vendor/faker/providers/geo/tr_TR/__init__.py +106 -0
  533. tensorlake/vendor/faker/providers/internet/__init__.py +802 -0
  534. tensorlake/vendor/faker/providers/internet/ar_AA/__init__.py +53 -0
  535. tensorlake/vendor/faker/providers/internet/az_AZ/__init__.py +38 -0
  536. tensorlake/vendor/faker/providers/internet/bg_BG/__init__.py +112 -0
  537. tensorlake/vendor/faker/providers/internet/bn_BD/__init__.py +30 -0
  538. tensorlake/vendor/faker/providers/internet/bs_BA/__init__.py +27 -0
  539. tensorlake/vendor/faker/providers/internet/cs_CZ/__init__.py +30 -0
  540. tensorlake/vendor/faker/providers/internet/de_AT/__init__.py +21 -0
  541. tensorlake/vendor/faker/providers/internet/de_DE/__init__.py +28 -0
  542. tensorlake/vendor/faker/providers/internet/el_GR/__init__.py +81 -0
  543. tensorlake/vendor/faker/providers/internet/en_AU/__init__.py +24 -0
  544. tensorlake/vendor/faker/providers/internet/en_GB/__init__.py +29 -0
  545. tensorlake/vendor/faker/providers/internet/en_NZ/__init__.py +24 -0
  546. tensorlake/vendor/faker/providers/internet/en_PH/__init__.py +65 -0
  547. tensorlake/vendor/faker/providers/internet/en_US/__init__.py +5 -0
  548. tensorlake/vendor/faker/providers/internet/es_AR/__init__.py +21 -0
  549. tensorlake/vendor/faker/providers/internet/es_CL/__init__.py +34 -0
  550. tensorlake/vendor/faker/providers/internet/es_ES/__init__.py +21 -0
  551. tensorlake/vendor/faker/providers/internet/fa_IR/__init__.py +13 -0
  552. tensorlake/vendor/faker/providers/internet/fi_FI/__init__.py +15 -0
  553. tensorlake/vendor/faker/providers/internet/fil_PH/__init__.py +7 -0
  554. tensorlake/vendor/faker/providers/internet/fr_CH/__init__.py +35 -0
  555. tensorlake/vendor/faker/providers/internet/fr_FR/__init__.py +42 -0
  556. tensorlake/vendor/faker/providers/internet/hr_HR/__init__.py +33 -0
  557. tensorlake/vendor/faker/providers/internet/hu_HU/__init__.py +31 -0
  558. tensorlake/vendor/faker/providers/internet/id_ID/__init__.py +28 -0
  559. tensorlake/vendor/faker/providers/internet/it_IT/__init__.py +36 -0
  560. tensorlake/vendor/faker/providers/internet/ja_JP/__init__.py +17 -0
  561. tensorlake/vendor/faker/providers/internet/ko_KR/__init__.py +15 -0
  562. tensorlake/vendor/faker/providers/internet/no_NO/__init__.py +20 -0
  563. tensorlake/vendor/faker/providers/internet/pl_PL/__init__.py +26 -0
  564. tensorlake/vendor/faker/providers/internet/pt_BR/__init__.py +27 -0
  565. tensorlake/vendor/faker/providers/internet/pt_PT/__init__.py +7 -0
  566. tensorlake/vendor/faker/providers/internet/ro_RO/__init__.py +30 -0
  567. tensorlake/vendor/faker/providers/internet/ru_RU/__init__.py +100 -0
  568. tensorlake/vendor/faker/providers/internet/sk_SK/__init__.py +33 -0
  569. tensorlake/vendor/faker/providers/internet/sl_SI/__init__.py +63 -0
  570. tensorlake/vendor/faker/providers/internet/sv_SE/__init__.py +23 -0
  571. tensorlake/vendor/faker/providers/internet/th_TH/__init__.py +32 -0
  572. tensorlake/vendor/faker/providers/internet/tl_PH/__init__.py +7 -0
  573. tensorlake/vendor/faker/providers/internet/tr_TR/__init__.py +28 -0
  574. tensorlake/vendor/faker/providers/internet/uk_UA/__init__.py +82 -0
  575. tensorlake/vendor/faker/providers/internet/zh_CN/__init__.py +103 -0
  576. tensorlake/vendor/faker/providers/internet/zh_TW/__init__.py +17 -0
  577. tensorlake/vendor/faker/providers/isbn/__init__.py +75 -0
  578. tensorlake/vendor/faker/providers/isbn/en_US/__init__.py +35 -0
  579. tensorlake/vendor/faker/providers/isbn/es_ES/__init__.py +37 -0
  580. tensorlake/vendor/faker/providers/isbn/isbn.py +86 -0
  581. tensorlake/vendor/faker/providers/job/__init__.py +660 -0
  582. tensorlake/vendor/faker/providers/job/ar_AA/__init__.py +140 -0
  583. tensorlake/vendor/faker/providers/job/az_AZ/__init__.py +112 -0
  584. tensorlake/vendor/faker/providers/job/bn_BD/__init__.py +649 -0
  585. tensorlake/vendor/faker/providers/job/bs_BA/__init__.py +4319 -0
  586. tensorlake/vendor/faker/providers/job/cs_CZ/__init__.py +487 -0
  587. tensorlake/vendor/faker/providers/job/da_DK/__init__.py +962 -0
  588. tensorlake/vendor/faker/providers/job/de_AT/__init__.py +4997 -0
  589. tensorlake/vendor/faker/providers/job/de_DE/__init__.py +44 -0
  590. tensorlake/vendor/faker/providers/job/el_GR/__init__.py +451 -0
  591. tensorlake/vendor/faker/providers/job/en_US/__init__.py +5 -0
  592. tensorlake/vendor/faker/providers/job/es/__init__.py +483 -0
  593. tensorlake/vendor/faker/providers/job/es_AR/__init__.py +5 -0
  594. tensorlake/vendor/faker/providers/job/es_CL/__init__.py +5 -0
  595. tensorlake/vendor/faker/providers/job/es_CO/__init__.py +5 -0
  596. tensorlake/vendor/faker/providers/job/es_ES/__init__.py +5 -0
  597. tensorlake/vendor/faker/providers/job/es_MX/__init__.py +5 -0
  598. tensorlake/vendor/faker/providers/job/fa_IR/__init__.py +101 -0
  599. tensorlake/vendor/faker/providers/job/fi_FI/__init__.py +202 -0
  600. tensorlake/vendor/faker/providers/job/fr_CH/__init__.py +849 -0
  601. tensorlake/vendor/faker/providers/job/fr_FR/__init__.py +1587 -0
  602. tensorlake/vendor/faker/providers/job/hr_HR/__init__.py +290 -0
  603. tensorlake/vendor/faker/providers/job/hu_HU/__init__.py +418 -0
  604. tensorlake/vendor/faker/providers/job/hy_AM/__init__.py +250 -0
  605. tensorlake/vendor/faker/providers/job/ja_JP/__init__.py +66 -0
  606. tensorlake/vendor/faker/providers/job/ka_GE/__init__.py +392 -0
  607. tensorlake/vendor/faker/providers/job/ko_KR/__init__.py +434 -0
  608. tensorlake/vendor/faker/providers/job/pl_PL/__init__.py +224 -0
  609. tensorlake/vendor/faker/providers/job/pt_BR/__init__.py +758 -0
  610. tensorlake/vendor/faker/providers/job/pt_PT/__init__.py +391 -0
  611. tensorlake/vendor/faker/providers/job/ro_RO/__init__.py +4045 -0
  612. tensorlake/vendor/faker/providers/job/ru_RU/__init__.py +526 -0
  613. tensorlake/vendor/faker/providers/job/sk_SK/__init__.py +511 -0
  614. tensorlake/vendor/faker/providers/job/th_TH/__init__.py +93 -0
  615. tensorlake/vendor/faker/providers/job/tr_TR/__init__.py +738 -0
  616. tensorlake/vendor/faker/providers/job/uk_UA/__init__.py +185 -0
  617. tensorlake/vendor/faker/providers/job/vi_VN/__init__.py +75 -0
  618. tensorlake/vendor/faker/providers/job/zh_CN/__init__.py +1025 -0
  619. tensorlake/vendor/faker/providers/job/zh_TW/__init__.py +481 -0
  620. tensorlake/vendor/faker/providers/lorem/__init__.py +275 -0
  621. tensorlake/vendor/faker/providers/lorem/ar_AA/__init__.py +705 -0
  622. tensorlake/vendor/faker/providers/lorem/az_AZ/__init__.py +106 -0
  623. tensorlake/vendor/faker/providers/lorem/bn_BD/__init__.py +237 -0
  624. tensorlake/vendor/faker/providers/lorem/cs_CZ/__init__.py +5039 -0
  625. tensorlake/vendor/faker/providers/lorem/da_DK/__init__.py +1012 -0
  626. tensorlake/vendor/faker/providers/lorem/de_AT/__init__.py +9 -0
  627. tensorlake/vendor/faker/providers/lorem/de_DE/__init__.py +527 -0
  628. tensorlake/vendor/faker/providers/lorem/el_GR/__init__.py +395 -0
  629. tensorlake/vendor/faker/providers/lorem/en_PH/__init__.py +85 -0
  630. tensorlake/vendor/faker/providers/lorem/en_US/__init__.py +3180 -0
  631. tensorlake/vendor/faker/providers/lorem/es_AR/__init__.py +7 -0
  632. tensorlake/vendor/faker/providers/lorem/es_ES/__init__.py +1016 -0
  633. tensorlake/vendor/faker/providers/lorem/es_MX/__init__.py +7 -0
  634. tensorlake/vendor/faker/providers/lorem/fa_IR/__init__.py +929 -0
  635. tensorlake/vendor/faker/providers/lorem/fil_PH/__init__.py +639 -0
  636. tensorlake/vendor/faker/providers/lorem/fr_FR/__init__.py +1482 -0
  637. tensorlake/vendor/faker/providers/lorem/he_IL/__init__.py +156 -0
  638. tensorlake/vendor/faker/providers/lorem/hy_AM/__init__.py +230 -0
  639. tensorlake/vendor/faker/providers/lorem/it_IT/__init__.py +3094 -0
  640. tensorlake/vendor/faker/providers/lorem/ja_JP/__init__.py +232 -0
  641. tensorlake/vendor/faker/providers/lorem/la/__init__.py +194 -0
  642. tensorlake/vendor/faker/providers/lorem/nl_BE/__init__.py +1015 -0
  643. tensorlake/vendor/faker/providers/lorem/nl_NL/__init__.py +14 -0
  644. tensorlake/vendor/faker/providers/lorem/pl_PL/__init__.py +2014 -0
  645. tensorlake/vendor/faker/providers/lorem/ru_RU/__init__.py +512 -0
  646. tensorlake/vendor/faker/providers/lorem/th_TH/__init__.py +426 -0
  647. tensorlake/vendor/faker/providers/lorem/tl_PH/__init__.py +13 -0
  648. tensorlake/vendor/faker/providers/lorem/uk_UA/__init__.py +506 -0
  649. tensorlake/vendor/faker/providers/lorem/vi_VN/__init__.py +193 -0
  650. tensorlake/vendor/faker/providers/lorem/zh_CN/__init__.py +359 -0
  651. tensorlake/vendor/faker/providers/lorem/zh_TW/__init__.py +359 -0
  652. tensorlake/vendor/faker/providers/misc/__init__.py +781 -0
  653. tensorlake/vendor/faker/providers/misc/en_PH/__init__.py +218 -0
  654. tensorlake/vendor/faker/providers/misc/en_US/__init__.py +5 -0
  655. tensorlake/vendor/faker/providers/misc/fil_PH/__init__.py +5 -0
  656. tensorlake/vendor/faker/providers/misc/tl_PH/__init__.py +5 -0
  657. tensorlake/vendor/faker/providers/passport/__init__.py +47 -0
  658. tensorlake/vendor/faker/providers/passport/de_AT/__init__.py +16 -0
  659. tensorlake/vendor/faker/providers/passport/en_US/__init__.py +101 -0
  660. tensorlake/vendor/faker/providers/passport/ru_RU/__init__.py +26 -0
  661. tensorlake/vendor/faker/providers/person/__init__.py +330 -0
  662. tensorlake/vendor/faker/providers/person/ar_AA/__init__.py +1096 -0
  663. tensorlake/vendor/faker/providers/person/ar_DZ/__init__.py +379 -0
  664. tensorlake/vendor/faker/providers/person/ar_PS/__init__.py +48 -0
  665. tensorlake/vendor/faker/providers/person/ar_SA/__init__.py +50 -0
  666. tensorlake/vendor/faker/providers/person/az_AZ/__init__.py +913 -0
  667. tensorlake/vendor/faker/providers/person/bg_BG/__init__.py +1767 -0
  668. tensorlake/vendor/faker/providers/person/bn_BD/__init__.py +608 -0
  669. tensorlake/vendor/faker/providers/person/cs_CZ/__init__.py +546 -0
  670. tensorlake/vendor/faker/providers/person/da_DK/__init__.py +633 -0
  671. tensorlake/vendor/faker/providers/person/de_AT/__init__.py +1614 -0
  672. tensorlake/vendor/faker/providers/person/de_CH/__init__.py +2239 -0
  673. tensorlake/vendor/faker/providers/person/de_DE/__init__.py +2497 -0
  674. tensorlake/vendor/faker/providers/person/de_LI/__init__.py +553 -0
  675. tensorlake/vendor/faker/providers/person/de_LU/__init__.py +940 -0
  676. tensorlake/vendor/faker/providers/person/el_GR/__init__.py +2310 -0
  677. tensorlake/vendor/faker/providers/person/en/__init__.py +7732 -0
  678. tensorlake/vendor/faker/providers/person/en_GB/__init__.py +910 -0
  679. tensorlake/vendor/faker/providers/person/en_IE/__init__.py +3141 -0
  680. tensorlake/vendor/faker/providers/person/en_IN/__init__.py +1108 -0
  681. tensorlake/vendor/faker/providers/person/en_KE/__init__.py +1976 -0
  682. tensorlake/vendor/faker/providers/person/en_NG/__init__.py +93 -0
  683. tensorlake/vendor/faker/providers/person/en_NZ/__init__.py +1420 -0
  684. tensorlake/vendor/faker/providers/person/en_PK/__init__.py +995 -0
  685. tensorlake/vendor/faker/providers/person/en_TH/__init__.py +308 -0
  686. tensorlake/vendor/faker/providers/person/en_US/__init__.py +1830 -0
  687. tensorlake/vendor/faker/providers/person/es/__init__.py +186 -0
  688. tensorlake/vendor/faker/providers/person/es_AR/__init__.py +615 -0
  689. tensorlake/vendor/faker/providers/person/es_CA/__init__.py +93 -0
  690. tensorlake/vendor/faker/providers/person/es_CL/__init__.py +1602 -0
  691. tensorlake/vendor/faker/providers/person/es_CO/__init__.py +970 -0
  692. tensorlake/vendor/faker/providers/person/es_ES/__init__.py +2087 -0
  693. tensorlake/vendor/faker/providers/person/es_MX/__init__.py +989 -0
  694. tensorlake/vendor/faker/providers/person/et_EE/__init__.py +708 -0
  695. tensorlake/vendor/faker/providers/person/fa_IR/__init__.py +346 -0
  696. tensorlake/vendor/faker/providers/person/fi_FI/__init__.py +855 -0
  697. tensorlake/vendor/faker/providers/person/fr_BE/__init__.py +1564 -0
  698. tensorlake/vendor/faker/providers/person/fr_CA/__init__.py +481 -0
  699. tensorlake/vendor/faker/providers/person/fr_CH/__init__.py +349 -0
  700. tensorlake/vendor/faker/providers/person/fr_DZ/__init__.py +489 -0
  701. tensorlake/vendor/faker/providers/person/fr_FR/__init__.py +663 -0
  702. tensorlake/vendor/faker/providers/person/fr_QC/__init__.py +11 -0
  703. tensorlake/vendor/faker/providers/person/ga_IE/__init__.py +3273 -0
  704. tensorlake/vendor/faker/providers/person/gu_IN/__init__.py +157 -0
  705. tensorlake/vendor/faker/providers/person/ha_NG/__init__.py +89 -0
  706. tensorlake/vendor/faker/providers/person/he_IL/__init__.py +1500 -0
  707. tensorlake/vendor/faker/providers/person/hi_IN/__init__.py +525 -0
  708. tensorlake/vendor/faker/providers/person/hr_HR/__init__.py +1031 -0
  709. tensorlake/vendor/faker/providers/person/hu_HU/__init__.py +440 -0
  710. tensorlake/vendor/faker/providers/person/hy_AM/__init__.py +981 -0
  711. tensorlake/vendor/faker/providers/person/id_ID/__init__.py +1004 -0
  712. tensorlake/vendor/faker/providers/person/ig_NG/__init__.py +89 -0
  713. tensorlake/vendor/faker/providers/person/is_IS/__init__.py +3941 -0
  714. tensorlake/vendor/faker/providers/person/it_IT/__init__.py +1667 -0
  715. tensorlake/vendor/faker/providers/person/ja_JP/__init__.py +299 -0
  716. tensorlake/vendor/faker/providers/person/ka_GE/__init__.py +773 -0
  717. tensorlake/vendor/faker/providers/person/ko_KR/__init__.py +202 -0
  718. tensorlake/vendor/faker/providers/person/lt_LT/__init__.py +250 -0
  719. tensorlake/vendor/faker/providers/person/lv_LV/__init__.py +441 -0
  720. tensorlake/vendor/faker/providers/person/ne_NP/__init__.py +1543 -0
  721. tensorlake/vendor/faker/providers/person/nl_BE/__init__.py +1564 -0
  722. tensorlake/vendor/faker/providers/person/nl_NL/__init__.py +1660 -0
  723. tensorlake/vendor/faker/providers/person/no_NO/__init__.py +352 -0
  724. tensorlake/vendor/faker/providers/person/or_IN/__init__.py +1172 -0
  725. tensorlake/vendor/faker/providers/person/pl_PL/__init__.py +5001 -0
  726. tensorlake/vendor/faker/providers/person/pt_BR/__init__.py +444 -0
  727. tensorlake/vendor/faker/providers/person/pt_PT/__init__.py +343 -0
  728. tensorlake/vendor/faker/providers/person/ro_RO/__init__.py +753 -0
  729. tensorlake/vendor/faker/providers/person/ru_RU/__init__.py +1391 -0
  730. tensorlake/vendor/faker/providers/person/sk_SK/__init__.py +2290 -0
  731. tensorlake/vendor/faker/providers/person/sl_SI/__init__.py +529 -0
  732. tensorlake/vendor/faker/providers/person/sv_SE/__init__.py +1562 -0
  733. tensorlake/vendor/faker/providers/person/sw/__init__.py +409 -0
  734. tensorlake/vendor/faker/providers/person/ta_IN/__init__.py +1030 -0
  735. tensorlake/vendor/faker/providers/person/th_TH/__init__.py +1020 -0
  736. tensorlake/vendor/faker/providers/person/tr_TR/__init__.py +1643 -0
  737. tensorlake/vendor/faker/providers/person/tw_GH/__init__.py +601 -0
  738. tensorlake/vendor/faker/providers/person/uk_UA/__init__.py +1347 -0
  739. tensorlake/vendor/faker/providers/person/uz_UZ/__init__.py +433 -0
  740. tensorlake/vendor/faker/providers/person/vi_VN/__init__.py +110 -0
  741. tensorlake/vendor/faker/providers/person/yo_NG/__init__.py +340 -0
  742. tensorlake/vendor/faker/providers/person/zh_CN/__init__.py +697 -0
  743. tensorlake/vendor/faker/providers/person/zh_TW/__init__.py +951 -0
  744. tensorlake/vendor/faker/providers/person/zu_ZA/__init__.py +934 -0
  745. tensorlake/vendor/faker/providers/phone_number/__init__.py +331 -0
  746. tensorlake/vendor/faker/providers/phone_number/ar_AE/__init__.py +94 -0
  747. tensorlake/vendor/faker/providers/phone_number/ar_JO/__init__.py +65 -0
  748. tensorlake/vendor/faker/providers/phone_number/ar_PS/__init__.py +129 -0
  749. tensorlake/vendor/faker/providers/phone_number/az_AZ/__init__.py +57 -0
  750. tensorlake/vendor/faker/providers/phone_number/bg_BG/__init__.py +17 -0
  751. tensorlake/vendor/faker/providers/phone_number/bn_BD/__init__.py +334 -0
  752. tensorlake/vendor/faker/providers/phone_number/bs_BA/__init__.py +39 -0
  753. tensorlake/vendor/faker/providers/phone_number/cs_CZ/__init__.py +54 -0
  754. tensorlake/vendor/faker/providers/phone_number/da_DK/__init__.py +12 -0
  755. tensorlake/vendor/faker/providers/phone_number/de_AT/__init__.py +120 -0
  756. tensorlake/vendor/faker/providers/phone_number/de_CH/__init__.py +81 -0
  757. tensorlake/vendor/faker/providers/phone_number/de_DE/__init__.py +18 -0
  758. tensorlake/vendor/faker/providers/phone_number/de_LI/__init__.py +6 -0
  759. tensorlake/vendor/faker/providers/phone_number/de_LU/__init__.py +37 -0
  760. tensorlake/vendor/faker/providers/phone_number/el_GR/__init__.py +23 -0
  761. tensorlake/vendor/faker/providers/phone_number/en_AU/__init__.py +41 -0
  762. tensorlake/vendor/faker/providers/phone_number/en_CA/__init__.py +15 -0
  763. tensorlake/vendor/faker/providers/phone_number/en_GB/__init__.py +267 -0
  764. tensorlake/vendor/faker/providers/phone_number/en_IN/__init__.py +9 -0
  765. tensorlake/vendor/faker/providers/phone_number/en_NZ/__init__.py +46 -0
  766. tensorlake/vendor/faker/providers/phone_number/en_PH/__init__.py +252 -0
  767. tensorlake/vendor/faker/providers/phone_number/en_US/__init__.py +50 -0
  768. tensorlake/vendor/faker/providers/phone_number/es_AR/__init__.py +46 -0
  769. tensorlake/vendor/faker/providers/phone_number/es_CL/__init__.py +65 -0
  770. tensorlake/vendor/faker/providers/phone_number/es_CO/__init__.py +42 -0
  771. tensorlake/vendor/faker/providers/phone_number/es_ES/__init__.py +128 -0
  772. tensorlake/vendor/faker/providers/phone_number/es_MX/__init__.py +30 -0
  773. tensorlake/vendor/faker/providers/phone_number/fa_IR/__init__.py +101 -0
  774. tensorlake/vendor/faker/providers/phone_number/fi_FI/__init__.py +12 -0
  775. tensorlake/vendor/faker/providers/phone_number/fil_PH/__init__.py +7 -0
  776. tensorlake/vendor/faker/providers/phone_number/fr_CH/__init__.py +37 -0
  777. tensorlake/vendor/faker/providers/phone_number/fr_DZ/__init__.py +9 -0
  778. tensorlake/vendor/faker/providers/phone_number/fr_FR/__init__.py +284 -0
  779. tensorlake/vendor/faker/providers/phone_number/he_IL/__init__.py +22 -0
  780. tensorlake/vendor/faker/providers/phone_number/hi_IN/__init__.py +11 -0
  781. tensorlake/vendor/faker/providers/phone_number/hr_HR/__init__.py +36 -0
  782. tensorlake/vendor/faker/providers/phone_number/hu_HU/__init__.py +13 -0
  783. tensorlake/vendor/faker/providers/phone_number/hy_AM/__init__.py +19 -0
  784. tensorlake/vendor/faker/providers/phone_number/id_ID/__init__.py +25 -0
  785. tensorlake/vendor/faker/providers/phone_number/it_CH/__init__.py +37 -0
  786. tensorlake/vendor/faker/providers/phone_number/it_IT/__init__.py +270 -0
  787. tensorlake/vendor/faker/providers/phone_number/ja_JP/__init__.py +10 -0
  788. tensorlake/vendor/faker/providers/phone_number/ka_GE/__init__.py +16 -0
  789. tensorlake/vendor/faker/providers/phone_number/ko_KR/__init__.py +30 -0
  790. tensorlake/vendor/faker/providers/phone_number/lt_LT/__init__.py +9 -0
  791. tensorlake/vendor/faker/providers/phone_number/lv_LV/__init__.py +9 -0
  792. tensorlake/vendor/faker/providers/phone_number/ne_NP/__init__.py +11 -0
  793. tensorlake/vendor/faker/providers/phone_number/nl_BE/__init__.py +24 -0
  794. tensorlake/vendor/faker/providers/phone_number/nl_NL/__init__.py +22 -0
  795. tensorlake/vendor/faker/providers/phone_number/no_NO/__init__.py +16 -0
  796. tensorlake/vendor/faker/providers/phone_number/pl_PL/__init__.py +36 -0
  797. tensorlake/vendor/faker/providers/phone_number/pt_BR/__init__.py +140 -0
  798. tensorlake/vendor/faker/providers/phone_number/pt_PT/__init__.py +41 -0
  799. tensorlake/vendor/faker/providers/phone_number/ro_RO/__init__.py +105 -0
  800. tensorlake/vendor/faker/providers/phone_number/ru_RU/__init__.py +16 -0
  801. tensorlake/vendor/faker/providers/phone_number/sk_SK/__init__.py +29 -0
  802. tensorlake/vendor/faker/providers/phone_number/sl_SI/__init__.py +17 -0
  803. tensorlake/vendor/faker/providers/phone_number/sv_SE/__init__.py +16 -0
  804. tensorlake/vendor/faker/providers/phone_number/ta_IN/__init__.py +11 -0
  805. tensorlake/vendor/faker/providers/phone_number/th_TH/__init__.py +72 -0
  806. tensorlake/vendor/faker/providers/phone_number/tl_PH/__init__.py +7 -0
  807. tensorlake/vendor/faker/providers/phone_number/tr_TR/__init__.py +15 -0
  808. tensorlake/vendor/faker/providers/phone_number/tw_GH/__init__.py +26 -0
  809. tensorlake/vendor/faker/providers/phone_number/uk_UA/__init__.py +69 -0
  810. tensorlake/vendor/faker/providers/phone_number/uz_UZ/__init__.py +15 -0
  811. tensorlake/vendor/faker/providers/phone_number/vi_VN/__init__.py +17 -0
  812. tensorlake/vendor/faker/providers/phone_number/zh_CN/__init__.py +40 -0
  813. tensorlake/vendor/faker/providers/phone_number/zh_TW/__init__.py +15 -0
  814. tensorlake/vendor/faker/providers/profile/__init__.py +60 -0
  815. tensorlake/vendor/faker/providers/profile/en_US/__init__.py +5 -0
  816. tensorlake/vendor/faker/providers/python/__init__.py +574 -0
  817. tensorlake/vendor/faker/providers/python/en_US/__init__.py +5 -0
  818. tensorlake/vendor/faker/providers/sbn/__init__.py +53 -0
  819. tensorlake/vendor/faker/providers/sbn/en_US/__init__.py +5 -0
  820. tensorlake/vendor/faker/providers/sbn/rules.py +24 -0
  821. tensorlake/vendor/faker/providers/sbn/sbn.py +50 -0
  822. tensorlake/vendor/faker/providers/ssn/__init__.py +10 -0
  823. tensorlake/vendor/faker/providers/ssn/az_AZ/__init__.py +39 -0
  824. tensorlake/vendor/faker/providers/ssn/bg_BG/__init__.py +20 -0
  825. tensorlake/vendor/faker/providers/ssn/bn_BD/__init__.py +15 -0
  826. tensorlake/vendor/faker/providers/ssn/cs_CZ/__init__.py +42 -0
  827. tensorlake/vendor/faker/providers/ssn/de_AT/__init__.py +48 -0
  828. tensorlake/vendor/faker/providers/ssn/de_CH/__init__.py +5 -0
  829. tensorlake/vendor/faker/providers/ssn/de_DE/__init__.py +100 -0
  830. tensorlake/vendor/faker/providers/ssn/dk_DK/__init__.py +16 -0
  831. tensorlake/vendor/faker/providers/ssn/el_CY/__init__.py +16 -0
  832. tensorlake/vendor/faker/providers/ssn/el_GR/__init__.py +84 -0
  833. tensorlake/vendor/faker/providers/ssn/en_CA/__init__.py +80 -0
  834. tensorlake/vendor/faker/providers/ssn/en_GB/__init__.py +39 -0
  835. tensorlake/vendor/faker/providers/ssn/en_IE/__init__.py +21 -0
  836. tensorlake/vendor/faker/providers/ssn/en_IN/__init__.py +26 -0
  837. tensorlake/vendor/faker/providers/ssn/en_PH/__init__.py +53 -0
  838. tensorlake/vendor/faker/providers/ssn/en_US/__init__.py +235 -0
  839. tensorlake/vendor/faker/providers/ssn/es_CA/__init__.py +9 -0
  840. tensorlake/vendor/faker/providers/ssn/es_CL/__init__.py +67 -0
  841. tensorlake/vendor/faker/providers/ssn/es_CO/__init__.py +72 -0
  842. tensorlake/vendor/faker/providers/ssn/es_ES/__init__.py +123 -0
  843. tensorlake/vendor/faker/providers/ssn/es_MX/__init__.py +255 -0
  844. tensorlake/vendor/faker/providers/ssn/et_EE/__init__.py +69 -0
  845. tensorlake/vendor/faker/providers/ssn/fi_FI/__init__.py +67 -0
  846. tensorlake/vendor/faker/providers/ssn/fil_PH/__init__.py +7 -0
  847. tensorlake/vendor/faker/providers/ssn/fr_CH/__init__.py +46 -0
  848. tensorlake/vendor/faker/providers/ssn/fr_FR/__init__.py +159 -0
  849. tensorlake/vendor/faker/providers/ssn/he_IL/__init__.py +28 -0
  850. tensorlake/vendor/faker/providers/ssn/hr_HR/__init__.py +49 -0
  851. tensorlake/vendor/faker/providers/ssn/hu_HU/__init__.py +135 -0
  852. tensorlake/vendor/faker/providers/ssn/it_IT/__init__.py +8146 -0
  853. tensorlake/vendor/faker/providers/ssn/ko_KR/__init__.py +12 -0
  854. tensorlake/vendor/faker/providers/ssn/lb_LU/__init__.py +17 -0
  855. tensorlake/vendor/faker/providers/ssn/lt_LT/__init__.py +20 -0
  856. tensorlake/vendor/faker/providers/ssn/lv_LV/__init__.py +62 -0
  857. tensorlake/vendor/faker/providers/ssn/mt_MT/__init__.py +17 -0
  858. tensorlake/vendor/faker/providers/ssn/nl_BE/__init__.py +74 -0
  859. tensorlake/vendor/faker/providers/ssn/nl_NL/__init__.py +45 -0
  860. tensorlake/vendor/faker/providers/ssn/no_NO/__init__.py +83 -0
  861. tensorlake/vendor/faker/providers/ssn/pl_PL/__init__.py +65 -0
  862. tensorlake/vendor/faker/providers/ssn/pt_BR/__init__.py +64 -0
  863. tensorlake/vendor/faker/providers/ssn/pt_PT/__init__.py +17 -0
  864. tensorlake/vendor/faker/providers/ssn/ro_RO/__init__.py +135 -0
  865. tensorlake/vendor/faker/providers/ssn/ru_RU/__init__.py +5 -0
  866. tensorlake/vendor/faker/providers/ssn/sk_SK/__init__.py +42 -0
  867. tensorlake/vendor/faker/providers/ssn/sl_SI/__init__.py +17 -0
  868. tensorlake/vendor/faker/providers/ssn/sv_SE/__init__.py +86 -0
  869. tensorlake/vendor/faker/providers/ssn/th_TH/__init__.py +59 -0
  870. tensorlake/vendor/faker/providers/ssn/tl_PH/__init__.py +7 -0
  871. tensorlake/vendor/faker/providers/ssn/tr_TR/__init__.py +34 -0
  872. tensorlake/vendor/faker/providers/ssn/uk_UA/__init__.py +59 -0
  873. tensorlake/vendor/faker/providers/ssn/zh_CN/__init__.py +3562 -0
  874. tensorlake/vendor/faker/providers/ssn/zh_TW/__init__.py +45 -0
  875. tensorlake/vendor/faker/providers/user_agent/__init__.py +360 -0
  876. tensorlake/vendor/faker/providers/user_agent/en_US/__init__.py +5 -0
  877. tensorlake/vendor/faker/proxy.py +439 -0
  878. tensorlake/vendor/faker/proxy.pyi +4652 -0
  879. tensorlake/vendor/faker/py.typed +0 -0
  880. tensorlake/vendor/faker/sphinx/__init__.py +0 -0
  881. tensorlake/vendor/faker/sphinx/autodoc.py +18 -0
  882. tensorlake/vendor/faker/sphinx/docstring.py +223 -0
  883. tensorlake/vendor/faker/sphinx/documentor.py +169 -0
  884. tensorlake/vendor/faker/sphinx/validator.py +174 -0
  885. tensorlake/vendor/faker/typing.py +43 -0
  886. tensorlake/vendor/faker/utils/__init__.py +0 -0
  887. tensorlake/vendor/faker/utils/checksums.py +23 -0
  888. tensorlake/vendor/faker/utils/datasets.py +8 -0
  889. tensorlake/vendor/faker/utils/decorators.py +38 -0
  890. tensorlake/vendor/faker/utils/distribution.py +88 -0
  891. tensorlake/vendor/faker/utils/loading.py +60 -0
  892. tensorlake/vendor/faker/utils/text.py +28 -0
  893. tensorlake/vendor/faker-40.1.2.dist-info/INSTALLER +1 -0
  894. tensorlake/vendor/faker-40.1.2.dist-info/METADATA +551 -0
  895. tensorlake/vendor/faker-40.1.2.dist-info/RECORD +1428 -0
  896. tensorlake/vendor/faker-40.1.2.dist-info/REQUESTED +0 -0
  897. tensorlake/vendor/faker-40.1.2.dist-info/WHEEL +5 -0
  898. tensorlake/vendor/faker-40.1.2.dist-info/entry_points.txt +5 -0
  899. tensorlake/vendor/faker-40.1.2.dist-info/licenses/LICENSE.txt +19 -0
  900. tensorlake/vendor/faker-40.1.2.dist-info/top_level.txt +1 -0
  901. tensorlake/vendor/faker-40.1.2.dist-info/zip-safe +1 -0
  902. tensorlake/vendor/nanoid/__init__.py +3 -0
  903. tensorlake/vendor/nanoid/nanoid/__init__.py +6 -0
  904. tensorlake/vendor/nanoid/nanoid/algorithm.py +7 -0
  905. tensorlake/vendor/nanoid/nanoid/generate.py +10 -0
  906. tensorlake/vendor/nanoid/nanoid/method.py +25 -0
  907. tensorlake/vendor/nanoid/nanoid/non_secure_generate.py +19 -0
  908. tensorlake/vendor/nanoid/nanoid/resources.py +2 -0
  909. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/INSTALLER +1 -0
  910. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/LICENSE +24 -0
  911. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/METADATA +114 -0
  912. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/RECORD +21 -0
  913. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/REQUESTED +0 -0
  914. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/WHEEL +4 -0
  915. tensorlake/vendor/nanoid/nanoid-2.0.0.dist-info/top_level.txt +1 -0
  916. tensorlake/vendor/polyfactory/__init__.py +15 -0
  917. tensorlake/vendor/polyfactory/__metadata__.py +12 -0
  918. tensorlake/vendor/polyfactory/constants.py +39 -0
  919. tensorlake/vendor/polyfactory/decorators.py +31 -0
  920. tensorlake/vendor/polyfactory/exceptions.py +18 -0
  921. tensorlake/vendor/polyfactory/factories/__init__.py +5 -0
  922. tensorlake/vendor/polyfactory/factories/attrs_factory.py +81 -0
  923. tensorlake/vendor/polyfactory/factories/base.py +1264 -0
  924. tensorlake/vendor/polyfactory/factories/beanie_odm_factory.py +88 -0
  925. tensorlake/vendor/polyfactory/factories/dataclass_factory.py +57 -0
  926. tensorlake/vendor/polyfactory/factories/msgspec_factory.py +69 -0
  927. tensorlake/vendor/polyfactory/factories/odmantic_odm_factory.py +60 -0
  928. tensorlake/vendor/polyfactory/factories/pydantic_factory.py +730 -0
  929. tensorlake/vendor/polyfactory/factories/sqlalchemy_factory.py +353 -0
  930. tensorlake/vendor/polyfactory/factories/typed_dict_factory.py +59 -0
  931. tensorlake/vendor/polyfactory/field_meta.py +224 -0
  932. tensorlake/vendor/polyfactory/fields.py +80 -0
  933. tensorlake/vendor/polyfactory/persistence.py +53 -0
  934. tensorlake/vendor/polyfactory/py.typed +0 -0
  935. tensorlake/vendor/polyfactory/pytest_plugin.py +124 -0
  936. tensorlake/vendor/polyfactory/utils/__init__.py +0 -0
  937. tensorlake/vendor/polyfactory/utils/_internal.py +8 -0
  938. tensorlake/vendor/polyfactory/utils/deprecation.py +151 -0
  939. tensorlake/vendor/polyfactory/utils/helpers.py +188 -0
  940. tensorlake/vendor/polyfactory/utils/model_coverage.py +149 -0
  941. tensorlake/vendor/polyfactory/utils/normalize_type.py +103 -0
  942. tensorlake/vendor/polyfactory/utils/predicates.py +192 -0
  943. tensorlake/vendor/polyfactory/utils/types.py +31 -0
  944. tensorlake/vendor/polyfactory/value_generators/__init__.py +0 -0
  945. tensorlake/vendor/polyfactory/value_generators/complex_types.py +156 -0
  946. tensorlake/vendor/polyfactory/value_generators/constrained_collections.py +137 -0
  947. tensorlake/vendor/polyfactory/value_generators/constrained_dates.py +41 -0
  948. tensorlake/vendor/polyfactory/value_generators/constrained_numbers.py +445 -0
  949. tensorlake/vendor/polyfactory/value_generators/constrained_path.py +13 -0
  950. tensorlake/vendor/polyfactory/value_generators/constrained_strings.py +139 -0
  951. tensorlake/vendor/polyfactory/value_generators/constrained_url.py +10 -0
  952. tensorlake/vendor/polyfactory/value_generators/constrained_uuid.py +31 -0
  953. tensorlake/vendor/polyfactory/value_generators/primitives.py +132 -0
  954. tensorlake/vendor/polyfactory/value_generators/regex.py +147 -0
  955. tensorlake/vendor/polyfactory-3.2.0.dist-info/INSTALLER +1 -0
  956. tensorlake/vendor/polyfactory-3.2.0.dist-info/METADATA +211 -0
  957. tensorlake/vendor/polyfactory-3.2.0.dist-info/RECORD +83 -0
  958. tensorlake/vendor/polyfactory-3.2.0.dist-info/REQUESTED +0 -0
  959. tensorlake/vendor/polyfactory-3.2.0.dist-info/WHEEL +4 -0
  960. tensorlake/vendor/polyfactory-3.2.0.dist-info/licenses/LICENSE +21 -0
  961. tensorlake-0.4.31.data/scripts/function-executor +5 -0
  962. tensorlake-0.4.31.data/scripts/tensorlake-build-images +4 -0
  963. tensorlake-0.4.31.data/scripts/tensorlake-create-sandbox-image +4 -0
  964. tensorlake-0.4.31.data/scripts/tensorlake-deploy +4 -0
  965. tensorlake-0.4.31.data/scripts/tensorlake.exe +0 -0
  966. tensorlake-0.4.31.data/scripts/tl.exe +0 -0
  967. tensorlake-0.4.31.dist-info/METADATA +243 -0
  968. tensorlake-0.4.31.dist-info/RECORD +971 -0
  969. tensorlake-0.4.31.dist-info/WHEEL +4 -0
  970. tensorlake-0.4.31.dist-info/licenses/LICENSE +202 -0
  971. 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,6 @@
1
+ from .dfs_bottom_up import dfs_bottom_up, dfs_bottom_up_unique_only
2
+
3
+ __all__ = [
4
+ "dfs_bottom_up_unique_only",
5
+ "dfs_bottom_up",
6
+ ]
@@ -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,4 @@
1
+ from .blob import BLOB, BLOBChunk
2
+ from .blob_store import BLOBStore
3
+
4
+ __all__ = ["BLOB", "BLOBChunk", "BLOBStore"]
@@ -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