flyte 0.0.1b0__py3-none-any.whl → 2.0.0b46__py3-none-any.whl

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