flyte 0.0.1b0__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.

Potentially problematic release.


This version of flyte might be problematic. Click here for more details.

Files changed (390) hide show
  1. flyte/__init__.py +62 -0
  2. flyte/_api_commons.py +3 -0
  3. flyte/_bin/__init__.py +0 -0
  4. flyte/_bin/runtime.py +126 -0
  5. flyte/_build.py +25 -0
  6. flyte/_cache/__init__.py +12 -0
  7. flyte/_cache/cache.py +146 -0
  8. flyte/_cache/defaults.py +9 -0
  9. flyte/_cache/policy_function_body.py +42 -0
  10. flyte/_cli/__init__.py +0 -0
  11. flyte/_cli/_common.py +287 -0
  12. flyte/_cli/_create.py +42 -0
  13. flyte/_cli/_delete.py +23 -0
  14. flyte/_cli/_deploy.py +140 -0
  15. flyte/_cli/_get.py +235 -0
  16. flyte/_cli/_run.py +152 -0
  17. flyte/_cli/main.py +72 -0
  18. flyte/_code_bundle/__init__.py +8 -0
  19. flyte/_code_bundle/_ignore.py +113 -0
  20. flyte/_code_bundle/_packaging.py +187 -0
  21. flyte/_code_bundle/_utils.py +339 -0
  22. flyte/_code_bundle/bundle.py +178 -0
  23. flyte/_context.py +146 -0
  24. flyte/_datastructures.py +342 -0
  25. flyte/_deploy.py +202 -0
  26. flyte/_doc.py +29 -0
  27. flyte/_docstring.py +32 -0
  28. flyte/_environment.py +43 -0
  29. flyte/_group.py +31 -0
  30. flyte/_hash.py +23 -0
  31. flyte/_image.py +760 -0
  32. flyte/_initialize.py +634 -0
  33. flyte/_interface.py +84 -0
  34. flyte/_internal/__init__.py +3 -0
  35. flyte/_internal/controllers/__init__.py +115 -0
  36. flyte/_internal/controllers/_local_controller.py +118 -0
  37. flyte/_internal/controllers/_trace.py +40 -0
  38. flyte/_internal/controllers/pbhash.py +39 -0
  39. flyte/_internal/controllers/remote/__init__.py +40 -0
  40. flyte/_internal/controllers/remote/_action.py +141 -0
  41. flyte/_internal/controllers/remote/_client.py +43 -0
  42. flyte/_internal/controllers/remote/_controller.py +361 -0
  43. flyte/_internal/controllers/remote/_core.py +402 -0
  44. flyte/_internal/controllers/remote/_informer.py +361 -0
  45. flyte/_internal/controllers/remote/_service_protocol.py +50 -0
  46. flyte/_internal/imagebuild/__init__.py +11 -0
  47. flyte/_internal/imagebuild/docker_builder.py +416 -0
  48. flyte/_internal/imagebuild/image_builder.py +241 -0
  49. flyte/_internal/imagebuild/remote_builder.py +0 -0
  50. flyte/_internal/resolvers/__init__.py +0 -0
  51. flyte/_internal/resolvers/_task_module.py +54 -0
  52. flyte/_internal/resolvers/common.py +31 -0
  53. flyte/_internal/resolvers/default.py +28 -0
  54. flyte/_internal/runtime/__init__.py +0 -0
  55. flyte/_internal/runtime/convert.py +199 -0
  56. flyte/_internal/runtime/entrypoints.py +135 -0
  57. flyte/_internal/runtime/io.py +136 -0
  58. flyte/_internal/runtime/resources_serde.py +138 -0
  59. flyte/_internal/runtime/task_serde.py +210 -0
  60. flyte/_internal/runtime/taskrunner.py +190 -0
  61. flyte/_internal/runtime/types_serde.py +54 -0
  62. flyte/_logging.py +124 -0
  63. flyte/_protos/__init__.py +0 -0
  64. flyte/_protos/common/authorization_pb2.py +66 -0
  65. flyte/_protos/common/authorization_pb2.pyi +108 -0
  66. flyte/_protos/common/authorization_pb2_grpc.py +4 -0
  67. flyte/_protos/common/identifier_pb2.py +71 -0
  68. flyte/_protos/common/identifier_pb2.pyi +82 -0
  69. flyte/_protos/common/identifier_pb2_grpc.py +4 -0
  70. flyte/_protos/common/identity_pb2.py +48 -0
  71. flyte/_protos/common/identity_pb2.pyi +72 -0
  72. flyte/_protos/common/identity_pb2_grpc.py +4 -0
  73. flyte/_protos/common/list_pb2.py +36 -0
  74. flyte/_protos/common/list_pb2.pyi +69 -0
  75. flyte/_protos/common/list_pb2_grpc.py +4 -0
  76. flyte/_protos/common/policy_pb2.py +37 -0
  77. flyte/_protos/common/policy_pb2.pyi +27 -0
  78. flyte/_protos/common/policy_pb2_grpc.py +4 -0
  79. flyte/_protos/common/role_pb2.py +37 -0
  80. flyte/_protos/common/role_pb2.pyi +53 -0
  81. flyte/_protos/common/role_pb2_grpc.py +4 -0
  82. flyte/_protos/common/runtime_version_pb2.py +28 -0
  83. flyte/_protos/common/runtime_version_pb2.pyi +24 -0
  84. flyte/_protos/common/runtime_version_pb2_grpc.py +4 -0
  85. flyte/_protos/logs/dataplane/payload_pb2.py +96 -0
  86. flyte/_protos/logs/dataplane/payload_pb2.pyi +168 -0
  87. flyte/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
  88. flyte/_protos/secret/definition_pb2.py +49 -0
  89. flyte/_protos/secret/definition_pb2.pyi +93 -0
  90. flyte/_protos/secret/definition_pb2_grpc.py +4 -0
  91. flyte/_protos/secret/payload_pb2.py +62 -0
  92. flyte/_protos/secret/payload_pb2.pyi +94 -0
  93. flyte/_protos/secret/payload_pb2_grpc.py +4 -0
  94. flyte/_protos/secret/secret_pb2.py +38 -0
  95. flyte/_protos/secret/secret_pb2.pyi +6 -0
  96. flyte/_protos/secret/secret_pb2_grpc.py +198 -0
  97. flyte/_protos/secret/secret_pb2_grpc_grpc.py +198 -0
  98. flyte/_protos/validate/validate/validate_pb2.py +76 -0
  99. flyte/_protos/workflow/node_execution_service_pb2.py +26 -0
  100. flyte/_protos/workflow/node_execution_service_pb2.pyi +4 -0
  101. flyte/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
  102. flyte/_protos/workflow/queue_service_pb2.py +106 -0
  103. flyte/_protos/workflow/queue_service_pb2.pyi +141 -0
  104. flyte/_protos/workflow/queue_service_pb2_grpc.py +172 -0
  105. flyte/_protos/workflow/run_definition_pb2.py +128 -0
  106. flyte/_protos/workflow/run_definition_pb2.pyi +310 -0
  107. flyte/_protos/workflow/run_definition_pb2_grpc.py +4 -0
  108. flyte/_protos/workflow/run_logs_service_pb2.py +41 -0
  109. flyte/_protos/workflow/run_logs_service_pb2.pyi +28 -0
  110. flyte/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
  111. flyte/_protos/workflow/run_service_pb2.py +133 -0
  112. flyte/_protos/workflow/run_service_pb2.pyi +175 -0
  113. flyte/_protos/workflow/run_service_pb2_grpc.py +412 -0
  114. flyte/_protos/workflow/state_service_pb2.py +58 -0
  115. flyte/_protos/workflow/state_service_pb2.pyi +71 -0
  116. flyte/_protos/workflow/state_service_pb2_grpc.py +138 -0
  117. flyte/_protos/workflow/task_definition_pb2.py +72 -0
  118. flyte/_protos/workflow/task_definition_pb2.pyi +65 -0
  119. flyte/_protos/workflow/task_definition_pb2_grpc.py +4 -0
  120. flyte/_protos/workflow/task_service_pb2.py +44 -0
  121. flyte/_protos/workflow/task_service_pb2.pyi +31 -0
  122. flyte/_protos/workflow/task_service_pb2_grpc.py +104 -0
  123. flyte/_resources.py +226 -0
  124. flyte/_retry.py +32 -0
  125. flyte/_reusable_environment.py +25 -0
  126. flyte/_run.py +411 -0
  127. flyte/_secret.py +61 -0
  128. flyte/_task.py +367 -0
  129. flyte/_task_environment.py +200 -0
  130. flyte/_timeout.py +47 -0
  131. flyte/_tools.py +27 -0
  132. flyte/_trace.py +128 -0
  133. flyte/_utils/__init__.py +20 -0
  134. flyte/_utils/asyn.py +119 -0
  135. flyte/_utils/coro_management.py +25 -0
  136. flyte/_utils/file_handling.py +72 -0
  137. flyte/_utils/helpers.py +108 -0
  138. flyte/_utils/lazy_module.py +54 -0
  139. flyte/_utils/uv_script_parser.py +49 -0
  140. flyte/_version.py +21 -0
  141. flyte/connectors/__init__.py +0 -0
  142. flyte/errors.py +143 -0
  143. flyte/extras/__init__.py +5 -0
  144. flyte/extras/_container.py +273 -0
  145. flyte/io/__init__.py +11 -0
  146. flyte/io/_dataframe.py +0 -0
  147. flyte/io/_dir.py +448 -0
  148. flyte/io/_file.py +468 -0
  149. flyte/io/pickle/__init__.py +0 -0
  150. flyte/io/pickle/transformer.py +117 -0
  151. flyte/io/structured_dataset/__init__.py +129 -0
  152. flyte/io/structured_dataset/basic_dfs.py +219 -0
  153. flyte/io/structured_dataset/structured_dataset.py +1061 -0
  154. flyte/py.typed +0 -0
  155. flyte/remote/__init__.py +25 -0
  156. flyte/remote/_client/__init__.py +0 -0
  157. flyte/remote/_client/_protocols.py +131 -0
  158. flyte/remote/_client/auth/__init__.py +12 -0
  159. flyte/remote/_client/auth/_authenticators/__init__.py +0 -0
  160. flyte/remote/_client/auth/_authenticators/base.py +397 -0
  161. flyte/remote/_client/auth/_authenticators/client_credentials.py +73 -0
  162. flyte/remote/_client/auth/_authenticators/device_code.py +118 -0
  163. flyte/remote/_client/auth/_authenticators/external_command.py +79 -0
  164. flyte/remote/_client/auth/_authenticators/factory.py +200 -0
  165. flyte/remote/_client/auth/_authenticators/pkce.py +516 -0
  166. flyte/remote/_client/auth/_channel.py +184 -0
  167. flyte/remote/_client/auth/_client_config.py +83 -0
  168. flyte/remote/_client/auth/_default_html.py +32 -0
  169. flyte/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  170. flyte/remote/_client/auth/_grpc_utils/auth_interceptor.py +288 -0
  171. flyte/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +151 -0
  172. flyte/remote/_client/auth/_keyring.py +143 -0
  173. flyte/remote/_client/auth/_token_client.py +260 -0
  174. flyte/remote/_client/auth/errors.py +16 -0
  175. flyte/remote/_client/controlplane.py +95 -0
  176. flyte/remote/_console.py +18 -0
  177. flyte/remote/_data.py +155 -0
  178. flyte/remote/_logs.py +116 -0
  179. flyte/remote/_project.py +86 -0
  180. flyte/remote/_run.py +873 -0
  181. flyte/remote/_secret.py +132 -0
  182. flyte/remote/_task.py +227 -0
  183. flyte/report/__init__.py +3 -0
  184. flyte/report/_report.py +178 -0
  185. flyte/report/_template.html +124 -0
  186. flyte/storage/__init__.py +24 -0
  187. flyte/storage/_remote_fs.py +34 -0
  188. flyte/storage/_storage.py +251 -0
  189. flyte/storage/_utils.py +5 -0
  190. flyte/types/__init__.py +13 -0
  191. flyte/types/_interface.py +25 -0
  192. flyte/types/_renderer.py +162 -0
  193. flyte/types/_string_literals.py +120 -0
  194. flyte/types/_type_engine.py +2210 -0
  195. flyte/types/_utils.py +80 -0
  196. flyte-0.0.1b0.dist-info/METADATA +179 -0
  197. flyte-0.0.1b0.dist-info/RECORD +390 -0
  198. flyte-0.0.1b0.dist-info/WHEEL +5 -0
  199. flyte-0.0.1b0.dist-info/entry_points.txt +3 -0
  200. flyte-0.0.1b0.dist-info/top_level.txt +1 -0
  201. union/__init__.py +54 -0
  202. union/_api_commons.py +3 -0
  203. union/_bin/__init__.py +0 -0
  204. union/_bin/runtime.py +113 -0
  205. union/_build.py +25 -0
  206. union/_cache/__init__.py +12 -0
  207. union/_cache/cache.py +141 -0
  208. union/_cache/defaults.py +9 -0
  209. union/_cache/policy_function_body.py +42 -0
  210. union/_cli/__init__.py +0 -0
  211. union/_cli/_common.py +263 -0
  212. union/_cli/_create.py +40 -0
  213. union/_cli/_delete.py +23 -0
  214. union/_cli/_deploy.py +120 -0
  215. union/_cli/_get.py +162 -0
  216. union/_cli/_params.py +579 -0
  217. union/_cli/_run.py +150 -0
  218. union/_cli/main.py +72 -0
  219. union/_code_bundle/__init__.py +8 -0
  220. union/_code_bundle/_ignore.py +113 -0
  221. union/_code_bundle/_packaging.py +187 -0
  222. union/_code_bundle/_utils.py +342 -0
  223. union/_code_bundle/bundle.py +176 -0
  224. union/_context.py +146 -0
  225. union/_datastructures.py +295 -0
  226. union/_deploy.py +185 -0
  227. union/_doc.py +29 -0
  228. union/_docstring.py +26 -0
  229. union/_environment.py +43 -0
  230. union/_group.py +31 -0
  231. union/_hash.py +23 -0
  232. union/_image.py +760 -0
  233. union/_initialize.py +585 -0
  234. union/_interface.py +84 -0
  235. union/_internal/__init__.py +3 -0
  236. union/_internal/controllers/__init__.py +77 -0
  237. union/_internal/controllers/_local_controller.py +77 -0
  238. union/_internal/controllers/pbhash.py +39 -0
  239. union/_internal/controllers/remote/__init__.py +40 -0
  240. union/_internal/controllers/remote/_action.py +131 -0
  241. union/_internal/controllers/remote/_client.py +43 -0
  242. union/_internal/controllers/remote/_controller.py +169 -0
  243. union/_internal/controllers/remote/_core.py +341 -0
  244. union/_internal/controllers/remote/_informer.py +260 -0
  245. union/_internal/controllers/remote/_service_protocol.py +44 -0
  246. union/_internal/imagebuild/__init__.py +11 -0
  247. union/_internal/imagebuild/docker_builder.py +416 -0
  248. union/_internal/imagebuild/image_builder.py +243 -0
  249. union/_internal/imagebuild/remote_builder.py +0 -0
  250. union/_internal/resolvers/__init__.py +0 -0
  251. union/_internal/resolvers/_task_module.py +31 -0
  252. union/_internal/resolvers/common.py +24 -0
  253. union/_internal/resolvers/default.py +27 -0
  254. union/_internal/runtime/__init__.py +0 -0
  255. union/_internal/runtime/convert.py +163 -0
  256. union/_internal/runtime/entrypoints.py +121 -0
  257. union/_internal/runtime/io.py +136 -0
  258. union/_internal/runtime/resources_serde.py +134 -0
  259. union/_internal/runtime/task_serde.py +202 -0
  260. union/_internal/runtime/taskrunner.py +179 -0
  261. union/_internal/runtime/types_serde.py +53 -0
  262. union/_logging.py +124 -0
  263. union/_protos/__init__.py +0 -0
  264. union/_protos/common/authorization_pb2.py +66 -0
  265. union/_protos/common/authorization_pb2.pyi +106 -0
  266. union/_protos/common/authorization_pb2_grpc.py +4 -0
  267. union/_protos/common/identifier_pb2.py +71 -0
  268. union/_protos/common/identifier_pb2.pyi +82 -0
  269. union/_protos/common/identifier_pb2_grpc.py +4 -0
  270. union/_protos/common/identity_pb2.py +48 -0
  271. union/_protos/common/identity_pb2.pyi +72 -0
  272. union/_protos/common/identity_pb2_grpc.py +4 -0
  273. union/_protos/common/list_pb2.py +36 -0
  274. union/_protos/common/list_pb2.pyi +69 -0
  275. union/_protos/common/list_pb2_grpc.py +4 -0
  276. union/_protos/common/policy_pb2.py +37 -0
  277. union/_protos/common/policy_pb2.pyi +27 -0
  278. union/_protos/common/policy_pb2_grpc.py +4 -0
  279. union/_protos/common/role_pb2.py +37 -0
  280. union/_protos/common/role_pb2.pyi +51 -0
  281. union/_protos/common/role_pb2_grpc.py +4 -0
  282. union/_protos/common/runtime_version_pb2.py +28 -0
  283. union/_protos/common/runtime_version_pb2.pyi +24 -0
  284. union/_protos/common/runtime_version_pb2_grpc.py +4 -0
  285. union/_protos/logs/dataplane/payload_pb2.py +96 -0
  286. union/_protos/logs/dataplane/payload_pb2.pyi +168 -0
  287. union/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
  288. union/_protos/secret/definition_pb2.py +49 -0
  289. union/_protos/secret/definition_pb2.pyi +93 -0
  290. union/_protos/secret/definition_pb2_grpc.py +4 -0
  291. union/_protos/secret/payload_pb2.py +62 -0
  292. union/_protos/secret/payload_pb2.pyi +94 -0
  293. union/_protos/secret/payload_pb2_grpc.py +4 -0
  294. union/_protos/secret/secret_pb2.py +38 -0
  295. union/_protos/secret/secret_pb2.pyi +6 -0
  296. union/_protos/secret/secret_pb2_grpc.py +198 -0
  297. union/_protos/validate/validate/validate_pb2.py +76 -0
  298. union/_protos/workflow/node_execution_service_pb2.py +26 -0
  299. union/_protos/workflow/node_execution_service_pb2.pyi +4 -0
  300. union/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
  301. union/_protos/workflow/queue_service_pb2.py +75 -0
  302. union/_protos/workflow/queue_service_pb2.pyi +103 -0
  303. union/_protos/workflow/queue_service_pb2_grpc.py +172 -0
  304. union/_protos/workflow/run_definition_pb2.py +100 -0
  305. union/_protos/workflow/run_definition_pb2.pyi +256 -0
  306. union/_protos/workflow/run_definition_pb2_grpc.py +4 -0
  307. union/_protos/workflow/run_logs_service_pb2.py +41 -0
  308. union/_protos/workflow/run_logs_service_pb2.pyi +28 -0
  309. union/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
  310. union/_protos/workflow/run_service_pb2.py +133 -0
  311. union/_protos/workflow/run_service_pb2.pyi +173 -0
  312. union/_protos/workflow/run_service_pb2_grpc.py +412 -0
  313. union/_protos/workflow/state_service_pb2.py +58 -0
  314. union/_protos/workflow/state_service_pb2.pyi +69 -0
  315. union/_protos/workflow/state_service_pb2_grpc.py +138 -0
  316. union/_protos/workflow/task_definition_pb2.py +72 -0
  317. union/_protos/workflow/task_definition_pb2.pyi +65 -0
  318. union/_protos/workflow/task_definition_pb2_grpc.py +4 -0
  319. union/_protos/workflow/task_service_pb2.py +44 -0
  320. union/_protos/workflow/task_service_pb2.pyi +31 -0
  321. union/_protos/workflow/task_service_pb2_grpc.py +104 -0
  322. union/_resources.py +226 -0
  323. union/_retry.py +32 -0
  324. union/_reusable_environment.py +25 -0
  325. union/_run.py +374 -0
  326. union/_secret.py +61 -0
  327. union/_task.py +354 -0
  328. union/_task_environment.py +186 -0
  329. union/_timeout.py +47 -0
  330. union/_tools.py +27 -0
  331. union/_utils/__init__.py +11 -0
  332. union/_utils/asyn.py +119 -0
  333. union/_utils/file_handling.py +71 -0
  334. union/_utils/helpers.py +46 -0
  335. union/_utils/lazy_module.py +54 -0
  336. union/_utils/uv_script_parser.py +49 -0
  337. union/_version.py +21 -0
  338. union/connectors/__init__.py +0 -0
  339. union/errors.py +128 -0
  340. union/extras/__init__.py +5 -0
  341. union/extras/_container.py +263 -0
  342. union/io/__init__.py +11 -0
  343. union/io/_dataframe.py +0 -0
  344. union/io/_dir.py +425 -0
  345. union/io/_file.py +418 -0
  346. union/io/pickle/__init__.py +0 -0
  347. union/io/pickle/transformer.py +117 -0
  348. union/io/structured_dataset/__init__.py +122 -0
  349. union/io/structured_dataset/basic_dfs.py +219 -0
  350. union/io/structured_dataset/structured_dataset.py +1057 -0
  351. union/py.typed +0 -0
  352. union/remote/__init__.py +23 -0
  353. union/remote/_client/__init__.py +0 -0
  354. union/remote/_client/_protocols.py +129 -0
  355. union/remote/_client/auth/__init__.py +12 -0
  356. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  357. union/remote/_client/auth/_authenticators/base.py +391 -0
  358. union/remote/_client/auth/_authenticators/client_credentials.py +73 -0
  359. union/remote/_client/auth/_authenticators/device_code.py +120 -0
  360. union/remote/_client/auth/_authenticators/external_command.py +77 -0
  361. union/remote/_client/auth/_authenticators/factory.py +200 -0
  362. union/remote/_client/auth/_authenticators/pkce.py +515 -0
  363. union/remote/_client/auth/_channel.py +184 -0
  364. union/remote/_client/auth/_client_config.py +83 -0
  365. union/remote/_client/auth/_default_html.py +32 -0
  366. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  367. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +204 -0
  368. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +144 -0
  369. union/remote/_client/auth/_keyring.py +154 -0
  370. union/remote/_client/auth/_token_client.py +258 -0
  371. union/remote/_client/auth/errors.py +16 -0
  372. union/remote/_client/controlplane.py +86 -0
  373. union/remote/_data.py +149 -0
  374. union/remote/_logs.py +74 -0
  375. union/remote/_project.py +86 -0
  376. union/remote/_run.py +820 -0
  377. union/remote/_secret.py +132 -0
  378. union/remote/_task.py +193 -0
  379. union/report/__init__.py +3 -0
  380. union/report/_report.py +178 -0
  381. union/report/_template.html +124 -0
  382. union/storage/__init__.py +24 -0
  383. union/storage/_remote_fs.py +34 -0
  384. union/storage/_storage.py +247 -0
  385. union/storage/_utils.py +5 -0
  386. union/types/__init__.py +11 -0
  387. union/types/_renderer.py +162 -0
  388. union/types/_string_literals.py +120 -0
  389. union/types/_type_engine.py +2131 -0
  390. union/types/_utils.py +80 -0
flyte/_cli/_get.py ADDED
@@ -0,0 +1,235 @@
1
+ import asyncio
2
+ from typing import Tuple, Union
3
+
4
+ import rich_click as click
5
+ from rich.console import Console
6
+ from rich.pretty import pretty_repr
7
+
8
+ from . import _common as common
9
+
10
+
11
+ @click.group(name="get")
12
+ def get():
13
+ """
14
+ Get the value of a task or environment.
15
+ """
16
+
17
+
18
+ @get.command()
19
+ @click.argument("name", type=str, required=False)
20
+ @click.pass_obj
21
+ def project(cfg: common.CLIConfig, name: str | None = None):
22
+ """
23
+ Get the current project.
24
+ """
25
+ from flyte.remote import Project
26
+
27
+ print(cfg)
28
+ cfg.init()
29
+
30
+ console = Console()
31
+ if name:
32
+ console.print(pretty_repr(Project.get(name)))
33
+ else:
34
+ console.print(common.get_table("Projects", Project.listall()))
35
+
36
+
37
+ @get.command(cls=common.CommandBase)
38
+ @click.argument("name", type=str, required=False)
39
+ @click.pass_obj
40
+ def run(cfg: common.CLIConfig, name: str | None = None, project: str | None = None, domain: str | None = None):
41
+ """
42
+ Get the current run.
43
+ """
44
+ from flyte.remote import Run, RunDetails
45
+
46
+ cfg.init(project=project, domain=domain)
47
+
48
+ console = Console()
49
+ if name:
50
+ details = RunDetails.get(name=name)
51
+ console.print(pretty_repr(details))
52
+ else:
53
+ console.print(common.get_table("Runs", Run.listall()))
54
+
55
+
56
+ @get.command(cls=common.CommandBase)
57
+ @click.argument("name", type=str, required=False)
58
+ @click.argument("version", type=str, required=False)
59
+ @click.pass_obj
60
+ def task(
61
+ cfg: common.CLIConfig,
62
+ name: str | None = None,
63
+ version: str | None = None,
64
+ project: str | None = None,
65
+ domain: str | None = None,
66
+ ):
67
+ """
68
+ Get the current task.
69
+ """
70
+ from flyte.remote import Task
71
+
72
+ cfg.init(project=project, domain=domain)
73
+
74
+ console = Console()
75
+ if name:
76
+ if not version:
77
+ raise click.BadParameter("Version is required when getting a task by name.")
78
+ v = Task.get(name=name, version=version)
79
+ if v is None:
80
+ raise click.BadParameter(f"Task {name} not found.")
81
+ t = v.fetch(v)
82
+ console.print(pretty_repr(t))
83
+ else:
84
+ raise click.BadParameter("Task listing is not supported yet, please provide a name.")
85
+ # console.print(common.get_table("Tasks", Task.listall()))
86
+
87
+
88
+ @get.command(cls=common.CommandBase)
89
+ @click.argument("run_name", type=str, required=True)
90
+ @click.argument("action_name", type=str, required=False)
91
+ @click.pass_obj
92
+ def action(
93
+ cfg: common.CLIConfig,
94
+ run_name: str,
95
+ action_name: str | None = None,
96
+ project: str | None = None,
97
+ domain: str | None = None,
98
+ ):
99
+ """
100
+ Get all actions for a run or details for a specific action.
101
+ """
102
+ import flyte.remote as remote
103
+
104
+ cfg.init(project=project, domain=domain)
105
+
106
+ console = Console()
107
+ if action_name:
108
+ console.print(pretty_repr(remote.Action.get(run_name=run_name, name=action_name)))
109
+ else:
110
+ # List all actions for the run
111
+ console.print(common.get_table(f"Actions for {run_name}", remote.Action.listall(for_run_name=run_name)))
112
+
113
+
114
+ @get.command(cls=common.CommandBase)
115
+ @click.argument("run_name", type=str, required=False)
116
+ @click.argument("action_name", type=str, required=False)
117
+ @click.option("--lines", "-l", type=int, default=30, help="Number of lines to show")
118
+ @click.option("--show-ts", is_flag=True, help="Show timestamps")
119
+ @click.option(
120
+ "--follow",
121
+ "-f",
122
+ is_flag=True,
123
+ default=False,
124
+ help="Follow the logs (like tail -f), will open a panel with logs scrolling.",
125
+ )
126
+ @click.pass_obj
127
+ def logs(
128
+ cfg: common.CLIConfig,
129
+ run_name: str,
130
+ action_name: str | None = None,
131
+ project: str | None = None,
132
+ domain: str | None = None,
133
+ lines: int = 30,
134
+ show_ts: bool = False,
135
+ follow: bool = True,
136
+ ):
137
+ """
138
+ Get the current run.
139
+ """
140
+ import flyte.remote as remote
141
+
142
+ cfg.init(project=project, domain=domain)
143
+
144
+ async def _run_log_view(_obj):
145
+ task = asyncio.create_task(_obj.show_logs(max_lines=lines, show_ts=show_ts, raw=not follow))
146
+ try:
147
+ await task
148
+ except KeyboardInterrupt:
149
+ task.cancel()
150
+
151
+ if action_name:
152
+ obj = remote.Action.get(run_name=run_name, name=action_name)
153
+ else:
154
+ obj = remote.Run.get(run_name)
155
+ asyncio.run(_run_log_view(obj))
156
+
157
+
158
+ @get.command(cls=common.CommandBase)
159
+ @click.argument("name", type=str, required=False)
160
+ @click.pass_obj
161
+ def secret(
162
+ cfg: common.CLIConfig,
163
+ name: str | None = None,
164
+ project: str | None = None,
165
+ domain: str | None = None,
166
+ ):
167
+ """
168
+ Get the current secret.
169
+ """
170
+ import flyte.remote as remote
171
+
172
+ cfg.init(project=project, domain=domain)
173
+
174
+ console = Console()
175
+ if name:
176
+ console.print(pretty_repr(remote.Secret.get(name)))
177
+ else:
178
+ console.print(common.get_table("Secrets", remote.Secret.listall()))
179
+
180
+
181
+ @get.command(cls=common.CommandBase)
182
+ @click.argument("run_name", type=str, required=True)
183
+ @click.argument("action_name", type=str, required=False)
184
+ @click.option("--inputs-only", "-i", is_flag=True, help="Show only inputs")
185
+ @click.option("--outputs-only", "-o", is_flag=True, help="Show only outputs")
186
+ @click.pass_obj
187
+ def io(
188
+ cfg: common.CLIConfig,
189
+ run_name: str,
190
+ action_name: str | None = None,
191
+ project: str | None = None,
192
+ domain: str | None = None,
193
+ inputs_only: bool = False,
194
+ outputs_only: bool = False,
195
+ ):
196
+ """
197
+ Get the inputs and outputs of a run or action.
198
+ """
199
+ if inputs_only and outputs_only:
200
+ raise click.BadParameter("Cannot use both --inputs-only and --outputs-only")
201
+
202
+ import flyte.remote as remote
203
+
204
+ cfg.init(project=project, domain=domain)
205
+ console = Console()
206
+ if action_name:
207
+ obj = remote.ActionDetails.get(run_name=run_name, name=action_name)
208
+ else:
209
+ obj = remote.RunDetails.get(run_name)
210
+
211
+ async def _get_io(
212
+ details: Union[remote.RunDetails, remote.ActionDetails],
213
+ ) -> Tuple[remote.ActionInputs | None, remote.ActionOutputs | None | str]:
214
+ if inputs_only or outputs_only:
215
+ if inputs_only:
216
+ return await details.inputs(), None
217
+ elif outputs_only:
218
+ return None, await details.outputs()
219
+ inputs = await details.inputs()
220
+ outputs: remote.ActionOutputs | None | str = None
221
+ try:
222
+ outputs = await details.outputs()
223
+ except Exception:
224
+ # If the outputs are not available, we can still show the inputs
225
+ outputs = "[red]not yet available[/red]"
226
+ return inputs, outputs
227
+
228
+ inputs, outputs = asyncio.run(_get_io(obj))
229
+ # Show inputs and outputs side by side
230
+ console.print(
231
+ common.get_panel(
232
+ "Inputs & Outputs",
233
+ f"[green bold]Inputs[/green bold]\n{inputs}\n\n[blue bold]Outputs[/blue bold]\n{outputs}",
234
+ )
235
+ )
flyte/_cli/_run.py ADDED
@@ -0,0 +1,152 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass, field, fields
4
+ from pathlib import Path
5
+ from types import ModuleType
6
+ from typing import Any, Dict, List, cast
7
+
8
+ import click
9
+ from click import Context
10
+ from rich.console import Console
11
+ from typing_extensions import get_args
12
+
13
+ import flyte
14
+
15
+ from .._code_bundle._utils import CopyFiles
16
+ from .._task import TaskTemplate
17
+ from ..remote import Run
18
+ from . import _common as common
19
+ from ._common import CLIConfig
20
+
21
+
22
+ @dataclass
23
+ class RunArguments:
24
+ project: str = field(
25
+ default=cast(str, common.PROJECT_OPTION.default), metadata={"click.option": common.PROJECT_OPTION}
26
+ )
27
+ domain: str = field(
28
+ default=cast(str, common.DOMAIN_OPTION.default), metadata={"click.option": common.DOMAIN_OPTION}
29
+ )
30
+ local: bool = field(
31
+ default=False,
32
+ metadata={
33
+ "click.option": click.Option(
34
+ ["--local"],
35
+ is_flag=True,
36
+ help="Run the task locally",
37
+ )
38
+ },
39
+ )
40
+ copy_style: CopyFiles = field(
41
+ default="loaded_modules",
42
+ metadata={
43
+ "click.option": click.Option(
44
+ ["--copy-style"],
45
+ type=click.Choice(get_args(CopyFiles)),
46
+ default="loaded_modules",
47
+ help="Copy style to use when running the task",
48
+ )
49
+ },
50
+ )
51
+
52
+ @classmethod
53
+ def from_dict(cls, d: Dict[str, Any]) -> RunArguments:
54
+ return cls(**d)
55
+
56
+ @classmethod
57
+ def options(cls) -> List[click.Option]:
58
+ """
59
+ Return the set of base parameters added to run subcommand.
60
+ """
61
+ return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
62
+
63
+
64
+ class RunTaskCommand(click.Command):
65
+ def __init__(self, obj_name: str, obj: Any, run_args: RunArguments, *args, **kwargs):
66
+ self.obj_name = obj_name
67
+ self.obj = cast(TaskTemplate, obj)
68
+ self.run_args = run_args
69
+ kwargs.pop("name", None)
70
+ super().__init__(obj_name, *args, **kwargs)
71
+
72
+ def invoke(self, ctx: Context):
73
+ obj: CLIConfig = ctx.obj or CLIConfig()
74
+ obj.init(self.run_args.project, self.run_args.domain)
75
+
76
+ r = flyte.with_runcontext(
77
+ copy_style=self.run_args.copy_style,
78
+ version=self.run_args.copy_style,
79
+ mode="local" if self.run_args.local else "remote",
80
+ ).run(self.obj)
81
+ if isinstance(r, Run) and r.action is not None:
82
+ console = Console()
83
+ console.print(
84
+ common.get_panel(
85
+ "Run",
86
+ f"[green bold]Created Run: {r.name} [/green bold] "
87
+ f"(Project: {r.action.action_id.run.project}, Domain: {r.action.action_id.run.domain})\n\n"
88
+ f"[blue bold]{r.url}[/blue bold]",
89
+ )
90
+ )
91
+
92
+
93
+ class TaskPerFileGroup(common.ObjectsPerFileGroup):
94
+ """
95
+ Group that creates a command for each task in the current directory that is not __init__.py.
96
+ """
97
+
98
+ def __init__(self, filename: Path, run_args: RunArguments, *args, **kwargs):
99
+ args = (filename, *args)
100
+ super().__init__(*args, **kwargs)
101
+ self.run_args = run_args
102
+
103
+ def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
104
+ return {k: v for k, v in module.__dict__.items() if isinstance(v, TaskTemplate)}
105
+
106
+ def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
107
+ obj = cast(TaskTemplate, obj)
108
+ return RunTaskCommand(
109
+ obj_name=obj_name,
110
+ obj=obj,
111
+ help=obj.docs.__help__str__() if obj.docs else None,
112
+ run_args=self.run_args,
113
+ )
114
+
115
+
116
+ class TaskFiles(common.FileGroup):
117
+ """
118
+ Group that creates a command for each file in the current directory that is not __init__.py.
119
+ """
120
+
121
+ common_options_enabled = False
122
+
123
+ def __init__(
124
+ self,
125
+ *args,
126
+ directory: Path | None = None,
127
+ **kwargs,
128
+ ):
129
+ if "params" not in kwargs:
130
+ kwargs["params"] = []
131
+ kwargs["params"].extend(RunArguments.options())
132
+ super().__init__(*args, directory=directory, **kwargs)
133
+
134
+ def get_command(self, ctx, filename):
135
+ run_args = RunArguments.from_dict(ctx.params)
136
+ fp = Path(filename)
137
+ if not fp.exists():
138
+ raise click.BadParameter(f"File {filename} does not exist")
139
+ if fp.is_dir():
140
+ return TaskFiles(directory=fp)
141
+ return TaskPerFileGroup(
142
+ filename=Path(filename),
143
+ run_args=run_args,
144
+ name=filename,
145
+ help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
146
+ )
147
+
148
+
149
+ run = TaskFiles(
150
+ name="run",
151
+ help="Run a task from a python file",
152
+ )
flyte/_cli/main.py ADDED
@@ -0,0 +1,72 @@
1
+ import rich_click as click
2
+
3
+ from ._common import CLIConfig
4
+ from ._create import create
5
+ from ._deploy import deploy
6
+ from ._get import get
7
+ from ._run import run
8
+
9
+
10
+ def _verbosity_to_loglevel(verbosity: int) -> int | None:
11
+ """
12
+ Converts a verbosity level from the CLI to a logging level.
13
+
14
+ :param verbosity: verbosity level from the CLI
15
+ :return: logging level
16
+ """
17
+ import logging
18
+
19
+ match verbosity:
20
+ case 0:
21
+ return None
22
+ case 1:
23
+ return logging.WARNING
24
+ case 2:
25
+ return logging.INFO
26
+ case _:
27
+ return logging.DEBUG
28
+
29
+
30
+ @click.group(cls=click.RichGroup)
31
+ @click.option(
32
+ "--endpoint",
33
+ type=str,
34
+ required=False,
35
+ help="The endpoint to connect to, this will override any config and simply used pkce to connect.",
36
+ )
37
+ @click.option(
38
+ "--insecure",
39
+ is_flag=True,
40
+ required=False,
41
+ help="insecure",
42
+ type=bool,
43
+ default=False,
44
+ )
45
+ @click.option(
46
+ "-v",
47
+ "--verbose",
48
+ required=False,
49
+ help="Show verbose messages and exception traces",
50
+ count=True,
51
+ default=0,
52
+ type=int,
53
+ )
54
+ @click.option(
55
+ "--org-override",
56
+ type=str,
57
+ required=False,
58
+ help="Override for org",
59
+ )
60
+ @click.pass_context
61
+ def main(ctx: click.Context, endpoint: str | None, insecure: bool, verbose: int, org_override: str | None):
62
+ """
63
+ v2 cli. Root command, please use one of the subcommands.
64
+ """
65
+ log_level = _verbosity_to_loglevel(verbose)
66
+ ctx.obj = CLIConfig(log_level=log_level, endpoint=endpoint, insecure=insecure, org_override=org_override)
67
+
68
+
69
+ main.add_command(run)
70
+ main.add_command(deploy)
71
+ main.add_command(get) # type: ignore
72
+ main.add_command(create) # type: ignore
@@ -0,0 +1,8 @@
1
+ from ._ignore import GitIgnore, IgnoreGroup, StandardIgnore
2
+ from ._utils import CopyFiles
3
+ from .bundle import build_code_bundle, build_pkl_bundle, download_bundle
4
+
5
+ __all__ = ["CopyFiles", "build_code_bundle", "build_pkl_bundle", "default_ignores", "download_bundle"]
6
+
7
+
8
+ default_ignores = [GitIgnore, StandardIgnore, IgnoreGroup]
@@ -0,0 +1,113 @@
1
+ import os
2
+ import pathlib
3
+ import subprocess
4
+ import tarfile as _tarfile
5
+ from abc import ABC, abstractmethod
6
+ from fnmatch import fnmatch
7
+ from pathlib import Path
8
+ from shutil import which
9
+ from typing import List, Optional, Type
10
+
11
+ from flyte._logging import logger
12
+
13
+
14
+ class Ignore(ABC):
15
+ """Base for Ignores, implements core logic. Children have to implement _is_ignored"""
16
+
17
+ def __init__(self, root: Path):
18
+ self.root = root
19
+
20
+ def is_ignored(self, path: pathlib.Path) -> bool:
21
+ return self._is_ignored(path)
22
+
23
+ def tar_filter(self, tarinfo: _tarfile.TarInfo) -> Optional[_tarfile.TarInfo]:
24
+ if self.is_ignored(pathlib.Path(tarinfo.name)):
25
+ return None
26
+ return tarinfo
27
+
28
+ @abstractmethod
29
+ def _is_ignored(self, path: pathlib.Path) -> bool:
30
+ pass
31
+
32
+
33
+ class GitIgnore(Ignore):
34
+ """Uses git cli (if available) to list all ignored files and compare with those."""
35
+
36
+ def __init__(self, root: Path):
37
+ super().__init__(root)
38
+ self.has_git = which("git") is not None
39
+ self.ignored_files = self._list_ignored_files()
40
+ self.ignored_dirs = self._list_ignored_dirs()
41
+
42
+ def _git_wrapper(self, extra_args: List[str]) -> set[str]:
43
+ if self.has_git:
44
+ out = subprocess.run(
45
+ ["git", "ls-files", "-io", "--exclude-standard", *extra_args],
46
+ cwd=self.root,
47
+ capture_output=True,
48
+ check=False,
49
+ )
50
+ if out.returncode == 0:
51
+ return set(out.stdout.decode("utf-8").split("\n")[:-1])
52
+ logger.info(f"Could not determine ignored paths due to:\n{out.stderr!r}\nNot applying any filters")
53
+ return set()
54
+ logger.info("No git executable found, not applying any filters")
55
+ return set()
56
+
57
+ def _list_ignored_files(self) -> set[str]:
58
+ return self._git_wrapper([])
59
+
60
+ def _list_ignored_dirs(self) -> set[str]:
61
+ return self._git_wrapper(["--directory"])
62
+
63
+ def _is_ignored(self, path: pathlib.Path) -> bool:
64
+ if self.ignored_files:
65
+ # git-ls-files uses POSIX paths
66
+ if Path(path).as_posix() in self.ignored_files:
67
+ return True
68
+ # Ignore empty directories
69
+ if os.path.isdir(os.path.join(self.root, path)) and self.ignored_dirs:
70
+ return Path(path).as_posix() + "/" in self.ignored_dirs
71
+ return False
72
+
73
+
74
+ STANDARD_IGNORE_PATTERNS = ["*.pyc", ".cache", ".cache/*", "__pycache__", "**/__pycache__"]
75
+
76
+
77
+ class StandardIgnore(Ignore):
78
+ """Retains the standard ignore functionality that previously existed. Could in theory
79
+ by fed with custom ignore patterns from cli."""
80
+
81
+ def __init__(self, root: Path, patterns: Optional[List[str]] = None):
82
+ super().__init__(root)
83
+ self.patterns = patterns if patterns else STANDARD_IGNORE_PATTERNS
84
+
85
+ def _is_ignored(self, path: pathlib.Path) -> bool:
86
+ for pattern in self.patterns:
87
+ if fnmatch(str(path), pattern):
88
+ return True
89
+ return False
90
+
91
+
92
+ class IgnoreGroup(Ignore):
93
+ """Groups multiple Ignores and checks a path against them. A file is ignored if any
94
+ Ignore considers it ignored."""
95
+
96
+ def __init__(self, root: Path, *ignores: Type[Ignore]):
97
+ super().__init__(root)
98
+ self.ignores = [ignore(root) for ignore in ignores]
99
+
100
+ def _is_ignored(self, path: pathlib.Path) -> bool:
101
+ for ignore in self.ignores:
102
+ if ignore.is_ignored(path):
103
+ return True
104
+ return False
105
+
106
+ def list_ignored(self) -> List[str]:
107
+ ignored = []
108
+ for dir, _, files in self.root.walk():
109
+ for file in files:
110
+ abs_path = dir / file
111
+ if self.is_ignored(abs_path):
112
+ ignored.append(str(abs_path.relative_to(self.root)))
113
+ return ignored