mage-ai 0.9.70__py3-none-any.whl → 0.9.71__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 mage-ai might be problematic. Click here for more details.

Files changed (568) hide show
  1. mage_ai/ai/utils/xgboost.py +222 -0
  2. mage_ai/api/errors.py +37 -25
  3. mage_ai/api/operations/base.py +13 -1
  4. mage_ai/api/parsers/PipelineScheduleParser.py +1 -1
  5. mage_ai/api/policies/BlockOutputPolicy.py +40 -17
  6. mage_ai/api/policies/GlobalDataProductPolicy.py +91 -41
  7. mage_ai/api/policies/KernelPolicy.py +55 -32
  8. mage_ai/api/policies/KernelProcessPolicy.py +56 -0
  9. mage_ai/api/policies/OutputPolicy.py +73 -41
  10. mage_ai/api/policies/PipelinePolicy.py +206 -138
  11. mage_ai/api/presenters/BlockLayoutItemPresenter.py +9 -7
  12. mage_ai/api/presenters/BlockPresenter.py +1 -1
  13. mage_ai/api/presenters/GlobalDataProductPresenter.py +6 -1
  14. mage_ai/api/presenters/KernelPresenter.py +5 -26
  15. mage_ai/api/presenters/KernelProcessPresenter.py +28 -0
  16. mage_ai/api/presenters/PipelinePresenter.py +18 -5
  17. mage_ai/api/presenters/StatusPresenter.py +2 -0
  18. mage_ai/api/presenters/SyncPresenter.py +25 -0
  19. mage_ai/api/resources/AutocompleteItemResource.py +1 -1
  20. mage_ai/api/resources/BlockLayoutItemResource.py +90 -44
  21. mage_ai/api/resources/BlockOutputResource.py +42 -9
  22. mage_ai/api/resources/BlockResource.py +4 -3
  23. mage_ai/api/resources/BlockRunResource.py +27 -22
  24. mage_ai/api/resources/ClusterResource.py +4 -1
  25. mage_ai/api/resources/CustomTemplateResource.py +34 -14
  26. mage_ai/api/resources/DataProviderResource.py +1 -1
  27. mage_ai/api/resources/ExecutionStateResource.py +3 -1
  28. mage_ai/api/resources/FileContentResource.py +8 -2
  29. mage_ai/api/resources/FileResource.py +10 -4
  30. mage_ai/api/resources/FileVersionResource.py +3 -1
  31. mage_ai/api/resources/GitBranchResource.py +46 -9
  32. mage_ai/api/resources/GlobalDataProductResource.py +44 -7
  33. mage_ai/api/resources/GlobalHookResource.py +4 -1
  34. mage_ai/api/resources/IntegrationDestinationResource.py +6 -2
  35. mage_ai/api/resources/IntegrationSourceResource.py +8 -4
  36. mage_ai/api/resources/IntegrationSourceStreamResource.py +6 -2
  37. mage_ai/api/resources/KernelProcessResource.py +44 -0
  38. mage_ai/api/resources/KernelResource.py +25 -3
  39. mage_ai/api/resources/OutputResource.py +33 -11
  40. mage_ai/api/resources/PageBlockLayoutResource.py +34 -23
  41. mage_ai/api/resources/PipelineInteractionResource.py +31 -15
  42. mage_ai/api/resources/PipelineResource.py +250 -123
  43. mage_ai/api/resources/PipelineRunResource.py +11 -3
  44. mage_ai/api/resources/PipelineScheduleResource.py +7 -2
  45. mage_ai/api/resources/PipelineTriggerResource.py +6 -1
  46. mage_ai/api/resources/ProjectResource.py +18 -7
  47. mage_ai/api/resources/SecretResource.py +1 -1
  48. mage_ai/api/resources/SeedResource.py +8 -1
  49. mage_ai/api/resources/StatusResource.py +21 -6
  50. mage_ai/api/resources/SyncResource.py +6 -8
  51. mage_ai/api/resources/VariableResource.py +46 -26
  52. mage_ai/api/resources/VersionControlProjectResource.py +9 -2
  53. mage_ai/api/resources/WidgetResource.py +1 -1
  54. mage_ai/api/resources/WorkspaceResource.py +1 -1
  55. mage_ai/api/views.py +47 -40
  56. mage_ai/authentication/permissions/seed.py +16 -2
  57. mage_ai/authentication/providers/oidc.py +21 -1
  58. mage_ai/autocomplete/utils.py +13 -9
  59. mage_ai/cache/base.py +1 -1
  60. mage_ai/cache/block.py +18 -12
  61. mage_ai/cache/block_action_object/__init__.py +32 -4
  62. mage_ai/cache/file.py +22 -19
  63. mage_ai/cache/pipeline.py +18 -12
  64. mage_ai/cli/main.py +1 -0
  65. mage_ai/cluster_manager/aws/emr_cluster_manager.py +9 -5
  66. mage_ai/cluster_manager/config.py +2 -2
  67. mage_ai/cluster_manager/manage.py +1 -1
  68. mage_ai/cluster_manager/workspace/base.py +1 -1
  69. mage_ai/command_center/applications/factory.py +10 -7
  70. mage_ai/command_center/files/factory.py +17 -15
  71. mage_ai/command_center/utils.py +25 -13
  72. mage_ai/data/__init__.py +0 -0
  73. mage_ai/data/constants.py +45 -0
  74. mage_ai/data/models/__init__.py +0 -0
  75. mage_ai/data/models/base.py +119 -0
  76. mage_ai/data/models/constants.py +1 -0
  77. mage_ai/data/models/generator.py +115 -0
  78. mage_ai/data/models/manager.py +168 -0
  79. mage_ai/data/models/pyarrow/__init__.py +0 -0
  80. mage_ai/data/models/pyarrow/record_batch.py +55 -0
  81. mage_ai/data/models/pyarrow/shared.py +21 -0
  82. mage_ai/data/models/pyarrow/table.py +8 -0
  83. mage_ai/data/models/reader.py +103 -0
  84. mage_ai/data/models/utils.py +59 -0
  85. mage_ai/data/models/writer.py +91 -0
  86. mage_ai/data/tabular/__init__.py +0 -0
  87. mage_ai/data/tabular/constants.py +23 -0
  88. mage_ai/data/tabular/mocks.py +19 -0
  89. mage_ai/data/tabular/models.py +126 -0
  90. mage_ai/data/tabular/reader.py +602 -0
  91. mage_ai/data/tabular/utils.py +102 -0
  92. mage_ai/data/tabular/writer.py +266 -0
  93. mage_ai/data/variables/__init__.py +0 -0
  94. mage_ai/data/variables/wrapper.py +54 -0
  95. mage_ai/data_cleaner/analysis/charts.py +61 -39
  96. mage_ai/data_cleaner/column_types/column_type_detector.py +53 -31
  97. mage_ai/data_cleaner/estimators/encoders.py +5 -2
  98. mage_ai/data_integrations/utils/scheduler.py +16 -11
  99. mage_ai/data_preparation/decorators.py +1 -0
  100. mage_ai/data_preparation/executors/block_executor.py +237 -155
  101. mage_ai/data_preparation/executors/streaming_pipeline_executor.py +1 -1
  102. mage_ai/data_preparation/git/__init__.py +27 -7
  103. mage_ai/data_preparation/git/api.py +7 -1
  104. mage_ai/data_preparation/git/utils.py +22 -16
  105. mage_ai/data_preparation/logging/logger_manager.py +4 -3
  106. mage_ai/data_preparation/models/block/__init__.py +1542 -878
  107. mage_ai/data_preparation/models/block/data_integration/mixins.py +4 -3
  108. mage_ai/data_preparation/models/block/dynamic/__init__.py +17 -6
  109. mage_ai/data_preparation/models/block/dynamic/child.py +41 -102
  110. mage_ai/data_preparation/models/block/dynamic/constants.py +1 -0
  111. mage_ai/data_preparation/models/block/dynamic/counter.py +296 -0
  112. mage_ai/data_preparation/models/block/dynamic/data.py +16 -0
  113. mage_ai/data_preparation/models/block/dynamic/factory.py +163 -0
  114. mage_ai/data_preparation/models/block/dynamic/models.py +19 -0
  115. mage_ai/data_preparation/models/block/dynamic/shared.py +92 -0
  116. mage_ai/data_preparation/models/block/dynamic/utils.py +291 -168
  117. mage_ai/data_preparation/models/block/dynamic/variables.py +384 -144
  118. mage_ai/data_preparation/models/block/dynamic/wrappers.py +77 -0
  119. mage_ai/data_preparation/models/block/extension/utils.py +10 -1
  120. mage_ai/data_preparation/models/block/global_data_product/__init__.py +10 -1
  121. mage_ai/data_preparation/models/block/integration/__init__.py +6 -2
  122. mage_ai/data_preparation/models/block/outputs.py +722 -0
  123. mage_ai/data_preparation/models/block/platform/mixins.py +7 -8
  124. mage_ai/data_preparation/models/block/r/__init__.py +56 -38
  125. mage_ai/data_preparation/models/block/settings/__init__.py +0 -0
  126. mage_ai/data_preparation/models/block/settings/dynamic/__init__.py +0 -0
  127. mage_ai/data_preparation/models/block/settings/dynamic/constants.py +7 -0
  128. mage_ai/data_preparation/models/block/settings/dynamic/mixins.py +118 -0
  129. mage_ai/data_preparation/models/block/settings/dynamic/models.py +31 -0
  130. mage_ai/data_preparation/models/block/settings/global_data_products/__init__.py +0 -0
  131. mage_ai/data_preparation/models/block/settings/global_data_products/mixins.py +20 -0
  132. mage_ai/data_preparation/models/block/settings/global_data_products/models.py +46 -0
  133. mage_ai/data_preparation/models/block/settings/variables/__init__.py +0 -0
  134. mage_ai/data_preparation/models/block/settings/variables/mixins.py +74 -0
  135. mage_ai/data_preparation/models/block/settings/variables/models.py +49 -0
  136. mage_ai/data_preparation/models/block/spark/mixins.py +2 -1
  137. mage_ai/data_preparation/models/block/sql/__init__.py +30 -5
  138. mage_ai/data_preparation/models/block/sql/utils/shared.py +21 -3
  139. mage_ai/data_preparation/models/block/utils.py +127 -70
  140. mage_ai/data_preparation/models/constants.py +19 -14
  141. mage_ai/data_preparation/models/custom_templates/custom_block_template.py +18 -13
  142. mage_ai/data_preparation/models/custom_templates/custom_pipeline_template.py +33 -16
  143. mage_ai/data_preparation/models/custom_templates/utils.py +1 -1
  144. mage_ai/data_preparation/models/file.py +41 -28
  145. mage_ai/data_preparation/models/global_data_product/__init__.py +88 -58
  146. mage_ai/data_preparation/models/global_hooks/models.py +1 -0
  147. mage_ai/data_preparation/models/interfaces.py +29 -0
  148. mage_ai/data_preparation/models/pipeline.py +365 -180
  149. mage_ai/data_preparation/models/pipelines/integration_pipeline.py +1 -2
  150. mage_ai/data_preparation/models/pipelines/seed.py +1 -1
  151. mage_ai/data_preparation/models/project/__init__.py +66 -18
  152. mage_ai/data_preparation/models/project/constants.py +2 -0
  153. mage_ai/data_preparation/models/triggers/__init__.py +120 -24
  154. mage_ai/data_preparation/models/utils.py +467 -17
  155. mage_ai/data_preparation/models/variable.py +1028 -137
  156. mage_ai/data_preparation/models/variables/__init__.py +0 -0
  157. mage_ai/data_preparation/models/variables/cache.py +149 -0
  158. mage_ai/data_preparation/models/variables/constants.py +72 -0
  159. mage_ai/data_preparation/models/variables/summarizer.py +336 -0
  160. mage_ai/data_preparation/models/variables/utils.py +77 -0
  161. mage_ai/data_preparation/models/widget/__init__.py +63 -41
  162. mage_ai/data_preparation/models/widget/charts.py +40 -27
  163. mage_ai/data_preparation/models/widget/constants.py +2 -0
  164. mage_ai/data_preparation/models/widget/utils.py +3 -3
  165. mage_ai/data_preparation/preferences.py +3 -3
  166. mage_ai/data_preparation/repo_manager.py +55 -21
  167. mage_ai/data_preparation/storage/base_storage.py +2 -2
  168. mage_ai/data_preparation/storage/gcs_storage.py +7 -4
  169. mage_ai/data_preparation/storage/local_storage.py +6 -3
  170. mage_ai/data_preparation/storage/s3_storage.py +5 -2
  171. mage_ai/data_preparation/templates/data_exporters/streaming/oracledb.yaml +8 -0
  172. mage_ai/data_preparation/variable_manager.py +281 -76
  173. mage_ai/io/base.py +3 -2
  174. mage_ai/io/bigquery.py +1 -0
  175. mage_ai/io/redshift.py +7 -5
  176. mage_ai/kernels/__init__.py +0 -0
  177. mage_ai/kernels/models.py +188 -0
  178. mage_ai/kernels/utils.py +169 -0
  179. mage_ai/orchestration/concurrency.py +6 -2
  180. mage_ai/orchestration/db/__init__.py +1 -0
  181. mage_ai/orchestration/db/migrations/versions/0227396a216c_add_userproject_table.py +38 -0
  182. mage_ai/orchestration/db/models/dynamic/__init__.py +0 -0
  183. mage_ai/orchestration/db/models/dynamic/controller.py +67 -0
  184. mage_ai/orchestration/db/models/oauth.py +2 -9
  185. mage_ai/orchestration/db/models/projects.py +10 -0
  186. mage_ai/orchestration/db/models/schedules.py +204 -187
  187. mage_ai/orchestration/db/models/schedules_project_platform.py +18 -12
  188. mage_ai/orchestration/db/models/utils.py +46 -5
  189. mage_ai/orchestration/metrics/pipeline_run.py +8 -9
  190. mage_ai/orchestration/notification/sender.py +1 -0
  191. mage_ai/orchestration/pipeline_scheduler_original.py +32 -8
  192. mage_ai/orchestration/pipeline_scheduler_project_platform.py +1 -1
  193. mage_ai/orchestration/run_status_checker.py +11 -4
  194. mage_ai/orchestration/triggers/api.py +12 -1
  195. mage_ai/presenters/charts/data_sources/base.py +4 -2
  196. mage_ai/presenters/charts/data_sources/block.py +15 -9
  197. mage_ai/presenters/charts/data_sources/chart_code.py +8 -5
  198. mage_ai/presenters/charts/data_sources/constants.py +1 -0
  199. mage_ai/presenters/charts/data_sources/system_metrics.py +22 -0
  200. mage_ai/presenters/interactions/models.py +11 -7
  201. mage_ai/presenters/pages/loaders/pipelines.py +5 -3
  202. mage_ai/presenters/pages/models/page_components/pipeline_schedules.py +3 -1
  203. mage_ai/presenters/utils.py +2 -0
  204. mage_ai/server/api/blocks.py +2 -1
  205. mage_ai/server/api/downloads.py +5 -1
  206. mage_ai/server/api/triggers.py +3 -1
  207. mage_ai/server/constants.py +1 -1
  208. mage_ai/server/frontend_dist/404.html +5 -5
  209. mage_ai/server/frontend_dist/_next/static/UZLabyPgcxtZvp0O0EUUS/_buildManifest.js +1 -0
  210. mage_ai/server/frontend_dist/_next/static/chunks/1376-22de38b4ad008d8a.js +1 -0
  211. mage_ai/server/frontend_dist/_next/static/chunks/{1557-b3502f3f1aa92ac7.js → 1557-25a7d985d5564fd3.js} +1 -1
  212. mage_ai/server/frontend_dist/_next/static/chunks/1668-30b4619b9534519b.js +1 -0
  213. mage_ai/server/frontend_dist/_next/static/chunks/1799-c42db95a015689ee.js +1 -0
  214. mage_ai/server/frontend_dist/_next/static/chunks/2996-2108b53b9d371d8d.js +1 -0
  215. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3763-61b542dafdbf5754.js → frontend_dist/_next/static/chunks/3763-40780c6d1e4b261d.js} +1 -1
  216. mage_ai/server/frontend_dist/_next/static/chunks/3782-129dd2a2448a2e36.js +1 -0
  217. mage_ai/server/frontend_dist/_next/static/chunks/3958-bcdfa414ccfa1eb2.js +1 -0
  218. mage_ai/server/frontend_dist/_next/static/chunks/4168-97fd1578d1a38315.js +1 -0
  219. mage_ai/server/frontend_dist/_next/static/chunks/4982-fa5a238b139fbdd2.js +1 -0
  220. mage_ai/server/frontend_dist/_next/static/chunks/5699-176f445e1313f001.js +1 -0
  221. mage_ai/server/frontend_dist/_next/static/chunks/7162-7dd03f0f605de721.js +1 -0
  222. mage_ai/server/frontend_dist/_next/static/chunks/7779-68d2b72a90c5f925.js +1 -0
  223. mage_ai/server/frontend_dist/_next/static/chunks/7966-5446a8e43711e2f9.js +1 -0
  224. mage_ai/server/frontend_dist/_next/static/chunks/8023-6c2f172f48dcb99b.js +1 -0
  225. mage_ai/server/frontend_dist/_next/static/chunks/8095-c351b8a735d73e0c.js +1 -0
  226. mage_ai/server/frontend_dist/_next/static/chunks/{main-77fe248a6fbd12d8.js → main-b99d4e30a88d9dc7.js} +1 -1
  227. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-9fe2d9d07c94e968.js +1 -0
  228. mage_ai/server/frontend_dist/_next/static/chunks/pages/{block-layout-14f952f66964022f.js → block-layout-7f4b735c67115df5.js} +1 -1
  229. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/[...slug]-e7d48e6b0c3068ac.js +1 -0
  230. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products-b943f31f050fc3a4.js +1 -0
  231. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/overview-597b74828bf105db.js → frontend_dist/_next/static/chunks/pages/overview-9f1ac4ec003884f3.js} +1 -1
  232. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-7181b086c93784d2.js → [...slug]-7e737f6fc7e83e9b.js} +1 -1
  233. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-d94488e3f2eeef36.js +1 -0
  234. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-cc641a7fa8473796.js +1 -0
  235. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-a5c0362763a21fa8.js → block-runs-284309877f3c5a5a.js} +1 -1
  236. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-26250e5335194ade.js +1 -0
  237. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-7acc7afc00df17c2.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-5f4c8128b2413fd8.js} +1 -1
  238. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-4ebfc8e400315dda.js +1 -0
  239. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-e5e0150a256aadb3.js +1 -0
  240. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/{profile-3f0df3decc856ee9.js → profile-3ae43c932537b254.js} +1 -1
  241. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-32985f3f7c7dd3ab.js → frontend_dist/_next/static/chunks/pages/settings/platform/preferences-b603d7fe4b175256.js} +1 -1
  242. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-c2e9ef989c8bfa73.js → frontend_dist/_next/static/chunks/pages/settings/platform/settings-319ddbabc239e91b.js} +1 -1
  243. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-47b64ced27c24985.js → [...slug]-5c360f72e4498855.js} +1 -1
  244. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-e5a4d3d815cec25d.js → permissions-fb29fa6c2bd90bb0.js} +1 -1
  245. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-3b76fa959ffa09d3.js +1 -0
  246. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-379e1ee292504842.js → [...slug]-3b787b42f1093b1f.js} +1 -1
  247. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles-0b83fbdd39e85f5b.js +1 -0
  248. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-a1e6950974d643a8.js +1 -0
  249. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-2af9afbe727d88aa.js → [...slug]-0aa019d87db8b0b8.js} +1 -1
  250. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-a4db8710f703c729.js → users-88c694d19207f2ec.js} +1 -1
  251. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-31d0d50f7f30462b.js +1 -0
  252. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-d079359c241db804.js → webpack-ac7fdc472bedf682.js} +1 -1
  253. mage_ai/server/frontend_dist/block-layout.html +3 -3
  254. mage_ai/server/frontend_dist/compute.html +6 -6
  255. mage_ai/server/frontend_dist/files.html +6 -6
  256. mage_ai/server/frontend_dist/global-data-products/[...slug].html +6 -6
  257. mage_ai/server/frontend_dist/global-data-products.html +6 -6
  258. mage_ai/server/frontend_dist/global-hooks/[...slug].html +6 -6
  259. mage_ai/server/frontend_dist/global-hooks.html +6 -6
  260. mage_ai/server/frontend_dist/index.html +3 -3
  261. mage_ai/server/frontend_dist/manage/files.html +6 -6
  262. mage_ai/server/frontend_dist/manage/settings.html +6 -6
  263. mage_ai/server/frontend_dist/manage/users/[user].html +6 -6
  264. mage_ai/server/frontend_dist/manage/users/new.html +6 -6
  265. mage_ai/server/frontend_dist/manage/users.html +6 -6
  266. mage_ai/server/frontend_dist/manage.html +6 -6
  267. mage_ai/server/frontend_dist/oauth.html +5 -5
  268. mage_ai/server/frontend_dist/overview.html +6 -6
  269. mage_ai/server/frontend_dist/pipeline-runs.html +6 -6
  270. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  271. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +6 -6
  272. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +6 -6
  273. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +3 -3
  274. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +6 -6
  275. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  276. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  277. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +6 -6
  278. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +6 -6
  279. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +6 -6
  280. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +6 -6
  281. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +6 -6
  282. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  283. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +6 -6
  284. mage_ai/server/frontend_dist/pipelines/[pipeline].html +3 -3
  285. mage_ai/server/frontend_dist/pipelines.html +6 -6
  286. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +6 -6
  287. mage_ai/server/frontend_dist/platform/global-hooks.html +6 -6
  288. mage_ai/server/frontend_dist/settings/account/profile.html +6 -6
  289. mage_ai/server/frontend_dist/settings/platform/preferences.html +6 -6
  290. mage_ai/server/frontend_dist/settings/platform/settings.html +6 -6
  291. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +6 -6
  292. mage_ai/server/frontend_dist/settings/workspace/permissions.html +6 -6
  293. mage_ai/server/frontend_dist/settings/workspace/preferences.html +6 -6
  294. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +6 -6
  295. mage_ai/server/frontend_dist/settings/workspace/roles.html +6 -6
  296. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +6 -6
  297. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +6 -6
  298. mage_ai/server/frontend_dist/settings/workspace/users.html +6 -6
  299. mage_ai/server/frontend_dist/settings.html +3 -3
  300. mage_ai/server/frontend_dist/sign-in.html +12 -12
  301. mage_ai/server/frontend_dist/templates/[...slug].html +6 -6
  302. mage_ai/server/frontend_dist/templates.html +6 -6
  303. mage_ai/server/frontend_dist/terminal.html +6 -6
  304. mage_ai/server/frontend_dist/test.html +3 -3
  305. mage_ai/server/frontend_dist/triggers.html +6 -6
  306. mage_ai/server/frontend_dist/version-control.html +6 -6
  307. mage_ai/server/frontend_dist_base_path_template/404.html +5 -5
  308. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1376-22de38b4ad008d8a.js +1 -0
  309. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1557-b3502f3f1aa92ac7.js → 1557-25a7d985d5564fd3.js} +1 -1
  310. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1668-30b4619b9534519b.js +1 -0
  311. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1799-c42db95a015689ee.js +1 -0
  312. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2996-2108b53b9d371d8d.js +1 -0
  313. mage_ai/server/{frontend_dist/_next/static/chunks/3763-61b542dafdbf5754.js → frontend_dist_base_path_template/_next/static/chunks/3763-40780c6d1e4b261d.js} +1 -1
  314. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-129dd2a2448a2e36.js +1 -0
  315. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3958-bcdfa414ccfa1eb2.js +1 -0
  316. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4168-97fd1578d1a38315.js +1 -0
  317. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4982-fa5a238b139fbdd2.js +1 -0
  318. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5699-176f445e1313f001.js +1 -0
  319. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7162-7dd03f0f605de721.js +1 -0
  320. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7779-68d2b72a90c5f925.js +1 -0
  321. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7966-5446a8e43711e2f9.js +1 -0
  322. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8023-6c2f172f48dcb99b.js +1 -0
  323. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8095-c351b8a735d73e0c.js +1 -0
  324. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{main-70b78159c2bb3fe1.js → main-384298e9133cec76.js} +1 -1
  325. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-13a578bce3b7f30c.js +1 -0
  326. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{block-layout-14f952f66964022f.js → block-layout-7f4b735c67115df5.js} +1 -1
  327. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/[...slug]-e7d48e6b0c3068ac.js +1 -0
  328. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products-b943f31f050fc3a4.js +1 -0
  329. mage_ai/server/{frontend_dist/_next/static/chunks/pages/overview-597b74828bf105db.js → frontend_dist_base_path_template/_next/static/chunks/pages/overview-9f1ac4ec003884f3.js} +1 -1
  330. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-7181b086c93784d2.js → [...slug]-7e737f6fc7e83e9b.js} +1 -1
  331. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-d94488e3f2eeef36.js +1 -0
  332. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-cc641a7fa8473796.js +1 -0
  333. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-a5c0362763a21fa8.js → block-runs-284309877f3c5a5a.js} +1 -1
  334. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-26250e5335194ade.js +1 -0
  335. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-7acc7afc00df17c2.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-5f4c8128b2413fd8.js} +1 -1
  336. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-4ebfc8e400315dda.js +1 -0
  337. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-e5e0150a256aadb3.js +1 -0
  338. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/{profile-3f0df3decc856ee9.js → profile-3ae43c932537b254.js} +1 -1
  339. mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/platform/preferences-32985f3f7c7dd3ab.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-b603d7fe4b175256.js} +1 -1
  340. mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/platform/settings-c2e9ef989c8bfa73.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-319ddbabc239e91b.js} +1 -1
  341. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-47b64ced27c24985.js → [...slug]-5c360f72e4498855.js} +1 -1
  342. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-e5a4d3d815cec25d.js → permissions-fb29fa6c2bd90bb0.js} +1 -1
  343. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-3b76fa959ffa09d3.js +1 -0
  344. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-379e1ee292504842.js → [...slug]-3b787b42f1093b1f.js} +1 -1
  345. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles-0b83fbdd39e85f5b.js +1 -0
  346. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-a1e6950974d643a8.js +1 -0
  347. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-2af9afbe727d88aa.js → [...slug]-0aa019d87db8b0b8.js} +1 -1
  348. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-a4db8710f703c729.js → users-88c694d19207f2ec.js} +1 -1
  349. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-31d0d50f7f30462b.js +1 -0
  350. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-68c003fb6a175cd7.js → webpack-481689d9989710cd.js} +1 -1
  351. mage_ai/server/frontend_dist_base_path_template/_next/static/kcptwoOU-JJJg6Vwpkfmx/_buildManifest.js +1 -0
  352. mage_ai/server/frontend_dist_base_path_template/block-layout.html +3 -3
  353. mage_ai/server/frontend_dist_base_path_template/compute.html +6 -6
  354. mage_ai/server/frontend_dist_base_path_template/files.html +6 -6
  355. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +6 -6
  356. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +6 -6
  357. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +6 -6
  358. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +6 -6
  359. mage_ai/server/frontend_dist_base_path_template/index.html +3 -3
  360. mage_ai/server/frontend_dist_base_path_template/manage/files.html +6 -6
  361. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +6 -6
  362. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +6 -6
  363. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +6 -6
  364. mage_ai/server/frontend_dist_base_path_template/manage/users.html +6 -6
  365. mage_ai/server/frontend_dist_base_path_template/manage.html +6 -6
  366. mage_ai/server/frontend_dist_base_path_template/oauth.html +5 -5
  367. mage_ai/server/frontend_dist_base_path_template/overview.html +6 -6
  368. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +6 -6
  369. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  370. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +6 -6
  371. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +6 -6
  372. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +3 -3
  373. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +6 -6
  374. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  375. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  376. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +6 -6
  377. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +6 -6
  378. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +6 -6
  379. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +6 -6
  380. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +6 -6
  381. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  382. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +6 -6
  383. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +3 -3
  384. mage_ai/server/frontend_dist_base_path_template/pipelines.html +6 -6
  385. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +6 -6
  386. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +6 -6
  387. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +6 -6
  388. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +6 -6
  389. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +6 -6
  390. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +6 -6
  391. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +6 -6
  392. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +6 -6
  393. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +6 -6
  394. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +6 -6
  395. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +6 -6
  396. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +6 -6
  397. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +6 -6
  398. mage_ai/server/frontend_dist_base_path_template/settings.html +3 -3
  399. mage_ai/server/frontend_dist_base_path_template/sign-in.html +12 -12
  400. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +6 -6
  401. mage_ai/server/frontend_dist_base_path_template/templates.html +6 -6
  402. mage_ai/server/frontend_dist_base_path_template/terminal.html +6 -6
  403. mage_ai/server/frontend_dist_base_path_template/test.html +3 -3
  404. mage_ai/server/frontend_dist_base_path_template/triggers.html +6 -6
  405. mage_ai/server/frontend_dist_base_path_template/version-control.html +6 -6
  406. mage_ai/server/kernel_output_parser.py +4 -1
  407. mage_ai/server/scheduler_manager.py +9 -0
  408. mage_ai/server/server.py +35 -31
  409. mage_ai/server/utils/custom_output.py +284 -0
  410. mage_ai/server/utils/execute_custom_code.py +245 -0
  411. mage_ai/server/utils/output_display.py +123 -289
  412. mage_ai/server/websocket_server.py +116 -69
  413. mage_ai/services/k8s/config.py +23 -0
  414. mage_ai/services/k8s/job_manager.py +6 -1
  415. mage_ai/services/ssh/aws/emr/utils.py +8 -8
  416. mage_ai/settings/keys/auth.py +1 -0
  417. mage_ai/settings/platform/__init__.py +159 -38
  418. mage_ai/settings/platform/constants.py +5 -0
  419. mage_ai/settings/platform/utils.py +53 -10
  420. mage_ai/settings/repo.py +26 -12
  421. mage_ai/settings/server.py +128 -37
  422. mage_ai/shared/array.py +24 -1
  423. mage_ai/shared/complex.py +45 -0
  424. mage_ai/shared/config.py +2 -1
  425. mage_ai/shared/custom_logger.py +11 -0
  426. mage_ai/shared/dates.py +10 -6
  427. mage_ai/shared/files.py +63 -8
  428. mage_ai/shared/hash.py +33 -9
  429. mage_ai/shared/io.py +9 -5
  430. mage_ai/shared/models.py +82 -24
  431. mage_ai/shared/outputs.py +87 -0
  432. mage_ai/shared/parsers.py +141 -15
  433. mage_ai/shared/path_fixer.py +11 -7
  434. mage_ai/shared/singletons/__init__.py +0 -0
  435. mage_ai/shared/singletons/base.py +47 -0
  436. mage_ai/shared/singletons/memory.py +38 -0
  437. mage_ai/shared/strings.py +34 -1
  438. mage_ai/shared/yaml.py +24 -0
  439. mage_ai/streaming/sinks/oracledb.py +57 -0
  440. mage_ai/streaming/sinks/sink_factory.py +4 -0
  441. mage_ai/system/__init__.py +0 -0
  442. mage_ai/system/constants.py +14 -0
  443. mage_ai/system/memory/__init__.py +0 -0
  444. mage_ai/system/memory/constants.py +1 -0
  445. mage_ai/system/memory/manager.py +174 -0
  446. mage_ai/system/memory/presenters.py +158 -0
  447. mage_ai/system/memory/process.py +216 -0
  448. mage_ai/system/memory/samples.py +13 -0
  449. mage_ai/system/memory/utils.py +656 -0
  450. mage_ai/system/memory/wrappers.py +177 -0
  451. mage_ai/system/models.py +58 -0
  452. mage_ai/system/storage/__init__.py +0 -0
  453. mage_ai/system/storage/utils.py +29 -0
  454. mage_ai/tests/api/endpoints/mixins.py +2 -2
  455. mage_ai/tests/api/endpoints/test_blocks.py +2 -1
  456. mage_ai/tests/api/endpoints/test_custom_designs.py +4 -4
  457. mage_ai/tests/api/endpoints/test_pipeline_runs.py +2 -2
  458. mage_ai/tests/api/endpoints/test_projects.py +2 -1
  459. mage_ai/tests/api/operations/base/test_base.py +27 -27
  460. mage_ai/tests/api/operations/base/test_base_with_user_authentication.py +27 -27
  461. mage_ai/tests/api/operations/base/test_base_with_user_permissions.py +23 -23
  462. mage_ai/tests/api/operations/test_syncs.py +6 -4
  463. mage_ai/tests/api/resources/test_pipeline_resource.py +9 -2
  464. mage_ai/tests/authentication/providers/test_oidc.py +59 -0
  465. mage_ai/tests/base_test.py +2 -2
  466. mage_ai/tests/data/__init__.py +0 -0
  467. mage_ai/tests/data/models/__init__.py +0 -0
  468. mage_ai/tests/data_preparation/executors/test_block_executor.py +23 -16
  469. mage_ai/tests/data_preparation/git/test_git.py +4 -1
  470. mage_ai/tests/data_preparation/models/block/dynamic/test_combos.py +305 -0
  471. mage_ai/tests/data_preparation/models/block/dynamic/test_counter.py +212 -0
  472. mage_ai/tests/data_preparation/models/block/dynamic/test_factory.py +360 -0
  473. mage_ai/tests/data_preparation/models/block/dynamic/test_variables.py +332 -0
  474. mage_ai/tests/data_preparation/models/block/hook/test_hook_block.py +2 -2
  475. mage_ai/tests/data_preparation/models/block/platform/test_mixins.py +1 -1
  476. mage_ai/tests/data_preparation/models/block/sql/utils/test_shared.py +26 -1
  477. mage_ai/tests/data_preparation/models/block/test_global_data_product.py +3 -2
  478. mage_ai/tests/data_preparation/models/custom_templates/test_utils.py +5 -4
  479. mage_ai/tests/data_preparation/models/global_hooks/test_hook.py +3 -0
  480. mage_ai/tests/data_preparation/models/global_hooks/test_predicates.py +9 -3
  481. mage_ai/tests/data_preparation/models/test_block.py +115 -120
  482. mage_ai/tests/data_preparation/models/test_blocks_helper.py +114 -0
  483. mage_ai/tests/data_preparation/models/test_global_data_product.py +41 -24
  484. mage_ai/tests/data_preparation/models/test_pipeline.py +9 -6
  485. mage_ai/tests/data_preparation/models/test_project.py +4 -1
  486. mage_ai/tests/data_preparation/models/test_utils.py +80 -0
  487. mage_ai/tests/data_preparation/models/test_variable.py +242 -69
  488. mage_ai/tests/data_preparation/models/variables/__init__.py +0 -0
  489. mage_ai/tests/data_preparation/models/variables/test_summarizer.py +481 -0
  490. mage_ai/tests/data_preparation/storage/shared/__init__.py +0 -0
  491. mage_ai/tests/data_preparation/test_repo_manager.py +6 -7
  492. mage_ai/tests/data_preparation/test_variable_manager.py +57 -48
  493. mage_ai/tests/factory.py +64 -43
  494. mage_ai/tests/orchestration/db/models/test_schedules.py +3 -3
  495. mage_ai/tests/orchestration/db/models/test_schedules_dynamic_blocks.py +279 -0
  496. mage_ai/tests/orchestration/test_pipeline_scheduler.py +1 -0
  497. mage_ai/tests/orchestration/triggers/test_global_data_product.py +3 -2
  498. mage_ai/tests/orchestration/triggers/test_utils.py +3 -2
  499. mage_ai/tests/services/k8s/test_job_manager.py +18 -0
  500. mage_ai/tests/streaming/sinks/test_oracledb.py +38 -0
  501. mage_ai/tests/test_shared.py +61 -0
  502. mage_ai/usage_statistics/logger.py +7 -2
  503. mage_ai/utils/code.py +33 -19
  504. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/METADATA +5 -2
  505. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/RECORD +513 -417
  506. mage_ai/data_preparation/models/global_data_product/constants.py +0 -6
  507. mage_ai/server/frontend_dist/_next/static/RhDiJSkcjCsh4xxX4BFBk/_buildManifest.js +0 -1
  508. mage_ai/server/frontend_dist/_next/static/chunks/2631-b9f9bea3f1cf906d.js +0 -1
  509. mage_ai/server/frontend_dist/_next/static/chunks/3782-ef4cd4f0b52072d0.js +0 -1
  510. mage_ai/server/frontend_dist/_next/static/chunks/4783-422429203610c318.js +0 -1
  511. mage_ai/server/frontend_dist/_next/static/chunks/5699-6d708c6b2153ea08.js +0 -1
  512. mage_ai/server/frontend_dist/_next/static/chunks/635-0d6b7c8804bcd2dc.js +0 -1
  513. mage_ai/server/frontend_dist/_next/static/chunks/7022-0d52dd8868621fb0.js +0 -1
  514. mage_ai/server/frontend_dist/_next/static/chunks/7361-8a23dd8360593e7a.js +0 -1
  515. mage_ai/server/frontend_dist/_next/static/chunks/7966-b9b85ba10667e654.js +0 -1
  516. mage_ai/server/frontend_dist/_next/static/chunks/8095-bdce03896ef9639a.js +0 -1
  517. mage_ai/server/frontend_dist/_next/static/chunks/8146-6bed4e7401e067e6.js +0 -1
  518. mage_ai/server/frontend_dist/_next/static/chunks/9265-d2a1aaec75ec69b8.js +0 -1
  519. mage_ai/server/frontend_dist/_next/static/chunks/9440-4069842b90d4b801.js +0 -1
  520. mage_ai/server/frontend_dist/_next/static/chunks/9832-67896490f6e8a014.js +0 -1
  521. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-2a69553d8c6eeb53.js +0 -1
  522. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/[...slug]-591abd392dc50ed4.js +0 -1
  523. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products-78e8e88f2a757a18.js +0 -1
  524. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-95ffcd3e2b27e567.js +0 -1
  525. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-b645a6d13ab9fe3a.js +0 -1
  526. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-1ed9045b2f1dfd65.js +0 -1
  527. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1417ad1c821d720a.js +0 -1
  528. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-59aca25a5b1d3998.js +0 -1
  529. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-349af617d05f001b.js +0 -1
  530. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles-36fa165a48af586b.js +0 -1
  531. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-60d01d3887e31136.js +0 -1
  532. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-3433c8b22e8342aa.js +0 -1
  533. mage_ai/server/frontend_dist_base_path_template/_next/static/TdpLLFome13qvM0gXvpHs/_buildManifest.js +0 -1
  534. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2631-b9f9bea3f1cf906d.js +0 -1
  535. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-ef4cd4f0b52072d0.js +0 -1
  536. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4783-422429203610c318.js +0 -1
  537. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5699-6d708c6b2153ea08.js +0 -1
  538. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/635-0d6b7c8804bcd2dc.js +0 -1
  539. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7022-0d52dd8868621fb0.js +0 -1
  540. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7361-8a23dd8360593e7a.js +0 -1
  541. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7966-b9b85ba10667e654.js +0 -1
  542. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8095-bdce03896ef9639a.js +0 -1
  543. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8146-6bed4e7401e067e6.js +0 -1
  544. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9265-d2a1aaec75ec69b8.js +0 -1
  545. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9440-4069842b90d4b801.js +0 -1
  546. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9832-67896490f6e8a014.js +0 -1
  547. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-2a69553d8c6eeb53.js +0 -1
  548. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/[...slug]-591abd392dc50ed4.js +0 -1
  549. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products-78e8e88f2a757a18.js +0 -1
  550. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-95ffcd3e2b27e567.js +0 -1
  551. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-b645a6d13ab9fe3a.js +0 -1
  552. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-1ed9045b2f1dfd65.js +0 -1
  553. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1417ad1c821d720a.js +0 -1
  554. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-59aca25a5b1d3998.js +0 -1
  555. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-349af617d05f001b.js +0 -1
  556. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles-36fa165a48af586b.js +0 -1
  557. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-60d01d3887e31136.js +0 -1
  558. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-3433c8b22e8342aa.js +0 -1
  559. mage_ai/shared/memory.py +0 -90
  560. mage_ai/tests/data_preparation/models/block/dynamic/test_dynamic_helpers.py +0 -48
  561. /mage_ai/{tests/data_preparation/shared → ai/utils}/__init__.py +0 -0
  562. /mage_ai/server/frontend_dist/_next/static/{RhDiJSkcjCsh4xxX4BFBk → UZLabyPgcxtZvp0O0EUUS}/_ssgManifest.js +0 -0
  563. /mage_ai/server/frontend_dist_base_path_template/_next/static/{TdpLLFome13qvM0gXvpHs → kcptwoOU-JJJg6Vwpkfmx}/_ssgManifest.js +0 -0
  564. /mage_ai/tests/data_preparation/{shared → storage/shared}/test_secrets.py +0 -0
  565. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/LICENSE +0 -0
  566. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/WHEEL +0 -0
  567. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/entry_points.txt +0 -0
  568. {mage_ai-0.9.70.dist-info → mage_ai-0.9.71.dist-info}/top_level.txt +0 -0
@@ -62,29 +62,38 @@ from mage_ai.usage_statistics.logger import UsageStatisticLogger
62
62
 
63
63
 
64
64
  @safe_db_query
65
- def query_pipeline_schedules(pipeline_uuids: List[str]):
65
+ def query_pipeline_schedules(
66
+ pipeline_uuids: List[str],
67
+ context_data: Dict = None,
68
+ repo_path: str = None,
69
+ ):
66
70
  a = aliased(PipelineSchedule, name='a')
67
71
  result = (
68
- PipelineSchedule.
69
- select(*[
70
- a.created_at,
71
- a.id,
72
- a.name,
73
- a.pipeline_uuid,
74
- a.schedule_interval,
75
- a.schedule_type,
76
- a.start_time,
77
- a.status,
78
- a.updated_at,
79
- ]).
80
- filter(
72
+ PipelineSchedule.select(
73
+ *[
74
+ a.created_at,
75
+ a.id,
76
+ a.name,
77
+ a.pipeline_uuid,
78
+ a.schedule_interval,
79
+ a.schedule_type,
80
+ a.start_time,
81
+ a.status,
82
+ a.updated_at,
83
+ ]
84
+ ).filter(
81
85
  a.pipeline_uuid.in_(pipeline_uuids),
82
86
  or_(
83
- a.repo_path.in_(Project().repo_path_for_database_query(
84
- 'pipeline_schedules',
85
- )),
87
+ a.repo_path.in_(
88
+ Project(
89
+ context_data=context_data,
90
+ repo_path=repo_path,
91
+ ).repo_path_for_database_query(
92
+ 'pipeline_schedules',
93
+ )
94
+ ),
86
95
  a.repo_path.is_(None),
87
- )
96
+ ),
88
97
  )
89
98
  ).all()
90
99
  return group_by(lambda x: x.pipeline_uuid, result)
@@ -94,6 +103,7 @@ class PipelineResource(BaseResource):
94
103
  @classmethod
95
104
  @safe_db_query
96
105
  async def collection(self, query, meta, user, **kwargs):
106
+ context_data = kwargs.get('context_data')
97
107
  limit = (meta or {}).get(META_KEY_LIMIT, None)
98
108
  if limit is not None:
99
109
  limit = int(limit)
@@ -123,7 +133,11 @@ class PipelineResource(BaseResource):
123
133
  if repo_path:
124
134
  repo_path = repo_path[0]
125
135
  if not repo_path:
126
- repo_path = get_repo_path(root_project=False)
136
+ repo_path = get_repo_path(
137
+ context_data=context_data,
138
+ root_project=False,
139
+ user=user,
140
+ )
127
141
 
128
142
  search_query = query.get('search', [None])
129
143
  if search_query:
@@ -154,9 +168,12 @@ class PipelineResource(BaseResource):
154
168
 
155
169
  history_by_pipeline_uuid = {}
156
170
  if from_history_days is not None and is_number(from_history_days):
157
- timestamp_start = (datetime.utcnow() - timedelta(
158
- hours=24 * int(from_history_days),
159
- )).timestamp()
171
+ timestamp_start = (
172
+ datetime.utcnow()
173
+ - timedelta(
174
+ hours=24 * int(from_history_days),
175
+ )
176
+ ).timestamp()
160
177
  history = load_pipelines_detail(timestamp_start=timestamp_start)
161
178
  history = sorted(
162
179
  history,
@@ -180,21 +197,29 @@ class PipelineResource(BaseResource):
180
197
 
181
198
  if NO_TAGS_QUERY in tags:
182
199
  pipeline_uuids_with_tags = set(cache.get_all_pipeline_uuids_with_tags())
183
- all_pipeline_uuids = set(Pipeline.get_all_pipelines(repo_path))
184
- pipeline_uuids_without_tags = list(all_pipeline_uuids - pipeline_uuids_with_tags)
200
+ all_pipeline_uuids = set(
201
+ Pipeline.get_all_pipelines(repo_path=repo_path)
202
+ )
203
+ pipeline_uuids_without_tags = list(
204
+ all_pipeline_uuids - pipeline_uuids_with_tags
205
+ )
185
206
  pipeline_uuids = pipeline_uuids + pipeline_uuids_without_tags
186
207
  else:
187
- pipeline_uuids = Pipeline.get_all_pipelines(repo_path)
208
+ pipeline_uuids = Pipeline.get_all_pipelines(repo_path=repo_path)
188
209
 
189
210
  if search_query:
190
- pipeline_uuids = list(filter(
191
- lambda x: search_query.lower() in x.lower() or
192
- search_query.lower() in x.lower().split(' '),
193
- pipeline_uuids,
194
- ))
211
+ pipeline_uuids = list(
212
+ filter(
213
+ lambda x: search_query.lower() in x.lower()
214
+ or search_query.lower() in x.lower().split(' '),
215
+ pipeline_uuids,
216
+ )
217
+ )
195
218
 
196
219
  total_count = len(pipeline_uuids)
197
- await UsageStatisticLogger().pipelines_impression(lambda: total_count)
220
+ await UsageStatisticLogger(
221
+ context_data=context_data, repo_path=repo_path,
222
+ ).pipelines_impression(lambda: total_count)
198
223
 
199
224
  if not sorts:
200
225
  pipeline_uuids = sorted(pipeline_uuids, reverse=reverse_sort)
@@ -205,7 +230,7 @@ class PipelineResource(BaseResource):
205
230
  if offset:
206
231
  pipeline_uuids = pipeline_uuids[offset:]
207
232
  if limit:
208
- pipeline_uuids = pipeline_uuids[:(limit + 1)]
233
+ pipeline_uuids = pipeline_uuids[: (limit + 1)]
209
234
  offset_limit_applied = True
210
235
 
211
236
  cache = await PipelineCache.initialize_cache()
@@ -215,7 +240,10 @@ class PipelineResource(BaseResource):
215
240
  return await Pipeline.get_async(uuid, repo_path=repo_path)
216
241
  except Exception as err:
217
242
  err_message = f'Error loading pipeline {uuid}: {err}.'
218
- if err.__class__.__name__ == 'OSError' and 'Too many open files' in err.strerror:
243
+ if (
244
+ err.__class__.__name__ == 'OSError'
245
+ and 'Too many open files' in err.strerror
246
+ ):
219
247
  raise Exception(err_message)
220
248
  else:
221
249
  print(err_message)
@@ -226,7 +254,10 @@ class PipelineResource(BaseResource):
226
254
  return Pipeline(uuid, config=config, repo_path=repo_path)
227
255
  except Exception as err:
228
256
  err_message = f'Error loading pipeline sync {uuid}: {err}.'
229
- if err.__class__.__name__ == 'OSError' and 'Too many open files' in err.strerror:
257
+ if (
258
+ err.__class__.__name__ == 'OSError'
259
+ and 'Too many open files' in err.strerror
260
+ ):
230
261
  raise Exception(err_message)
231
262
  else:
232
263
  print(err_message)
@@ -239,10 +270,13 @@ class PipelineResource(BaseResource):
239
270
  for pipeline_dict in cache.get_models(types=pipeline_types):
240
271
  pipeline_uuid_from_cache = pipeline_dict['pipeline']['uuid']
241
272
  if pipeline_uuid_from_cache in pipeline_uuids:
242
- pipelines.append(Pipeline(
243
- pipeline_uuid_from_cache,
244
- config=pipeline_dict['pipeline'],
245
- ))
273
+ pipelines.append(
274
+ Pipeline(
275
+ pipeline_uuid_from_cache,
276
+ config=pipeline_dict['pipeline'],
277
+ repo_path=repo_path,
278
+ )
279
+ )
246
280
  else:
247
281
  for uuid in pipeline_uuids:
248
282
  pipeline_dict = cache.get_model(dict(uuid=uuid, repo_path=repo_path))
@@ -253,10 +287,13 @@ class PipelineResource(BaseResource):
253
287
  else:
254
288
  # Add pipeline with type "invalid" so pipeline with invalid config
255
289
  # can still be displayed in UI and visible to user
256
- pipelines.append(Pipeline(
257
- uuid,
258
- config=dict(type='invalid'),
259
- ))
290
+ pipelines.append(
291
+ Pipeline(
292
+ uuid,
293
+ config=dict(type='invalid'),
294
+ repo_path=repo_path,
295
+ )
296
+ )
260
297
  else:
261
298
  pipeline_uuids_miss.append(uuid)
262
299
 
@@ -269,7 +306,11 @@ class PipelineResource(BaseResource):
269
306
 
270
307
  mapping = {}
271
308
  if include_schedules:
272
- mapping = query_pipeline_schedules(pipeline_uuids)
309
+ mapping = query_pipeline_schedules(
310
+ pipeline_uuids,
311
+ context_data=context_data,
312
+ repo_path=repo_path,
313
+ )
273
314
 
274
315
  filtered_pipelines = []
275
316
  for pipeline in pipelines:
@@ -279,15 +320,23 @@ class PipelineResource(BaseResource):
279
320
  pipeline.schedules = schedules
280
321
 
281
322
  if pipeline_statuses and (
282
- (PipelineStatus.ACTIVE in pipeline_statuses and
283
- any(s.status == ScheduleStatus.ACTIVE
284
- for s in pipeline.schedules)) or
285
- (PipelineStatus.INACTIVE in pipeline_statuses and
286
- len(pipeline.schedules) > 0 and
287
- all(s.status == ScheduleStatus.INACTIVE
288
- for s in pipeline.schedules)) or
289
- (PipelineStatus.NO_SCHEDULES in pipeline_statuses and
290
- len(pipeline.schedules) == 0)
323
+ (
324
+ PipelineStatus.ACTIVE in pipeline_statuses
325
+ and any(
326
+ s.status == ScheduleStatus.ACTIVE for s in pipeline.schedules
327
+ )
328
+ )
329
+ or (
330
+ PipelineStatus.INACTIVE in pipeline_statuses
331
+ and len(pipeline.schedules) > 0
332
+ and all(
333
+ s.status == ScheduleStatus.INACTIVE for s in pipeline.schedules
334
+ )
335
+ )
336
+ or (
337
+ PipelineStatus.NO_SCHEDULES in pipeline_statuses
338
+ and len(pipeline.schedules) == 0
339
+ )
291
340
  ):
292
341
  filtered_pipelines.append(pipeline)
293
342
 
@@ -300,6 +349,7 @@ class PipelineResource(BaseResource):
300
349
  pipeline.history = history_by_pipeline_uuid.get(pipeline.uuid)
301
350
 
302
351
  if sorts:
352
+
303
353
  def _sort_key(p, sorts=sorts, reverse_sort=reverse_sort):
304
354
  bools = []
305
355
  vals = []
@@ -307,24 +357,35 @@ class PipelineResource(BaseResource):
307
357
  if 'blocks' == k.lower():
308
358
  val = len(p.blocks_by_uuid)
309
359
  vals.append(val)
310
- bools.append(val is None if not reverse_sort else val is not None)
360
+ bools.append(
361
+ val is None if not reverse_sort else val is not None
362
+ )
311
363
  elif 'triggers' == k.lower():
312
364
  val = len(p.schedules)
313
365
  vals.append(val)
314
- bools.append(val is None if not reverse_sort else val is not None)
366
+ bools.append(
367
+ val is None if not reverse_sort else val is not None
368
+ )
315
369
  elif 'status' == k.lower():
316
370
  if len(p.schedules) == 0:
317
371
  val = 'no_schedules'
318
- elif find(lambda s: s.status == 'active', p.schedules) is not None:
372
+ elif (
373
+ find(lambda s: s.status == 'active', p.schedules)
374
+ is not None
375
+ ):
319
376
  val = 'active'
320
377
  else:
321
378
  val = 'inactive'
322
379
  vals.append(val)
323
- bools.append(val is None if not reverse_sort else val is not None)
380
+ bools.append(
381
+ val is None if not reverse_sort else val is not None
382
+ )
324
383
  elif hasattr(p, k):
325
384
  val = getattr(p, k)
326
385
  vals.append(val)
327
- bools.append(val is None if not reverse_sort else val is not None)
386
+ bools.append(
387
+ val is None if not reverse_sort else val is not None
388
+ )
328
389
  else:
329
390
  bools.append(False)
330
391
 
@@ -359,12 +420,15 @@ class PipelineResource(BaseResource):
359
420
  'results': len(arr),
360
421
  'next': has_next,
361
422
  }
362
-
423
+ for p in arr:
424
+ p.context_data = context_data
363
425
  return result_set
364
426
 
365
427
  @classmethod
366
428
  @safe_db_query
367
429
  async def create(self, payload, user, **kwargs):
430
+ context_data = kwargs.get('context_data')
431
+
368
432
  clone_pipeline_uuid = payload.get('clone_pipeline_uuid')
369
433
  template_uuid = payload.get('custom_template_uuid')
370
434
  name = payload.get('name')
@@ -374,18 +438,22 @@ class PipelineResource(BaseResource):
374
438
  llm_payload = payload.get('llm')
375
439
  pipeline = None
376
440
 
441
+ repo_path = get_repo_path(context_data=context_data, user=user)
377
442
  if template_uuid:
378
- custom_template = CustomPipelineTemplate.load(template_uuid=template_uuid)
443
+ custom_template = CustomPipelineTemplate.load(
444
+ repo_path,
445
+ template_uuid=template_uuid,
446
+ )
379
447
  pipeline = custom_template.create_pipeline(name)
380
448
  elif clone_pipeline_uuid is not None:
381
- source = Pipeline.get(clone_pipeline_uuid)
449
+ source = Pipeline.get(clone_pipeline_uuid, repo_path=repo_path)
382
450
  pipeline = await Pipeline.duplicate(source, name)
383
451
  else:
384
452
  pipeline = Pipeline.create(
385
453
  name,
386
454
  description=description,
387
455
  pipeline_type=pipeline_type,
388
- repo_path=get_repo_path(),
456
+ repo_path=repo_path,
389
457
  tags=tags,
390
458
  )
391
459
 
@@ -409,25 +477,37 @@ class PipelineResource(BaseResource):
409
477
  block_payload['configuration'] = configuration
410
478
 
411
479
  block_uuid = f'{pipeline.uuid}_block_{block_number}'
412
- block_resource = await BlockResource.create(merge_dict(
413
- dict(
414
- name=block_uuid,
415
- type=block_payload.get('block_type'),
480
+ block_resource = await BlockResource.create(
481
+ merge_dict(
482
+ dict(
483
+ name=block_uuid,
484
+ type=block_payload.get('block_type'),
485
+ ),
486
+ ignore_keys(
487
+ block_payload,
488
+ [
489
+ 'block_type',
490
+ 'upstream_blocks',
491
+ ],
492
+ ),
493
+ ),
494
+ user,
495
+ **merge_dict(
496
+ kwargs,
497
+ dict(
498
+ parent_model=pipeline,
499
+ ),
416
500
  ),
417
- ignore_keys(block_payload, [
418
- 'block_type',
419
- 'upstream_blocks',
420
- ]),
421
- ), user, **merge_dict(kwargs, dict(
422
- parent_model=pipeline,
423
- )))
501
+ )
424
502
 
425
503
  upstream_block_uuids = block_payload.get('upstream_blocks')
426
504
 
427
505
  pipeline.add_block(
428
506
  block_resource.model,
429
507
  None,
430
- priority=len(upstream_block_uuids) if upstream_block_uuids else 0,
508
+ priority=len(upstream_block_uuids)
509
+ if upstream_block_uuids
510
+ else 0,
431
511
  widget=False,
432
512
  )
433
513
 
@@ -441,11 +521,17 @@ class PipelineResource(BaseResource):
441
521
 
442
522
  if upstream_block_uuids and len(upstream_block_uuids) >= 1:
443
523
  block = config['block']
444
- arr = [f'{pipeline.uuid}_block_{bn}' for bn in upstream_block_uuids]
524
+ arr = [
525
+ f'{pipeline.uuid}_block_{bn}'
526
+ for bn in upstream_block_uuids
527
+ ]
445
528
  block.update(dict(upstream_blocks=arr))
446
529
 
447
530
  if pipeline:
448
- await UsageStatisticLogger().pipeline_create(
531
+ await UsageStatisticLogger(
532
+ context_data=context_data,
533
+ repo_path=repo_path,
534
+ ).pipeline_create(
449
535
  pipeline,
450
536
  clone_pipeline_uuid=clone_pipeline_uuid,
451
537
  llm_payload=llm_payload,
@@ -472,19 +558,26 @@ class PipelineResource(BaseResource):
472
558
 
473
559
  self.on_create_callback = _on_create_callback
474
560
 
561
+ pipeline.context_data = context_data
475
562
  return self(pipeline, user, **kwargs)
476
563
 
477
564
  @classmethod
478
565
  @safe_db_query
479
- async def __fetch_model(self, pipeline_uuid: str, **kqwargs):
566
+ async def __fetch_model(self, pipeline_uuid: str, repo_path: str, **kwargs):
480
567
  all_projects = project_platform_activated()
481
568
 
482
569
  if all_projects:
483
570
  return await get_pipeline_from_platform_async(
484
571
  pipeline_uuid,
572
+ repo_path=repo_path,
573
+ context_data=kwargs.get('context_data'),
485
574
  )
486
575
 
487
- return await Pipeline.get_async(pipeline_uuid, all_projects=all_projects)
576
+ return await Pipeline.get_async(
577
+ pipeline_uuid,
578
+ all_projects=all_projects,
579
+ repo_path=repo_path,
580
+ )
488
581
 
489
582
  @classmethod
490
583
  @safe_db_query
@@ -494,23 +587,33 @@ class PipelineResource(BaseResource):
494
587
  **kwargs,
495
588
  ):
496
589
  pipeline_uuid = urllib.parse.unquote(pk)
497
- return await self.__fetch_model(pipeline_uuid, **kwargs)
590
+ user = kwargs.get('user')
591
+ repo_path = get_repo_path(context_data=kwargs.get('context_data'), user=user)
592
+ return await self.__fetch_model(pipeline_uuid, repo_path, **kwargs)
498
593
 
499
594
  @classmethod
500
595
  @safe_db_query
501
596
  async def member(self, pk, user, **kwargs):
502
- pipeline = await self.__fetch_model(pk, **kwargs)
597
+ context_data = kwargs.get('context_data')
598
+
599
+ repo_path = get_repo_path(context_data=context_data, user=user)
600
+ pipeline = await self.__fetch_model(pk, repo_path, **kwargs)
503
601
 
504
602
  api_operation_action = kwargs.get('api_operation_action', None)
505
603
  if api_operation_action != DELETE:
506
604
  kernel_name = PIPELINE_TO_KERNEL_NAME[pipeline.type]
507
605
  switch_active_kernel(
508
606
  kernel_name,
509
- emr_config=pipeline.executor_config if kernel_name == KernelName.PYSPARK else None,
607
+ emr_config=pipeline.executor_config
608
+ if kernel_name == KernelName.PYSPARK
609
+ else None,
510
610
  )
511
611
 
512
612
  if api_operation_action == DETAIL:
513
- if Project(pipeline.repo_config).is_feature_enabled(
613
+ if Project(
614
+ context_data=context_data,
615
+ repo_config=pipeline.repo_config,
616
+ ).is_feature_enabled(
514
617
  FeatureUUID.OPERATION_HISTORY,
515
618
  ):
516
619
  record_detail_pipeline(
@@ -537,6 +640,7 @@ class PipelineResource(BaseResource):
537
640
  if mapping.get(pipeline.uuid):
538
641
  pipeline.schedules = mapping[pipeline.uuid] or []
539
642
 
643
+ pipeline.context_data = context_data
540
644
  return self(pipeline, user, **kwargs)
541
645
 
542
646
  @safe_db_query
@@ -563,26 +667,30 @@ class PipelineResource(BaseResource):
563
667
 
564
668
  block_cache = await BlockCache.initialize_cache()
565
669
  for block in pipeline.blocks_by_uuid.values():
566
- block_cache.remove_pipeline(block, pipeline.uuid, pipeline.repo_path)
670
+ block_cache.remove_pipeline(
671
+ block, pipeline.uuid, pipeline.repo_path
672
+ )
567
673
 
568
674
  self.on_delete_callback = _on_delete_callback
569
675
  return self.model.delete()
570
676
 
571
677
  @safe_db_query
572
678
  async def update(self, payload, **kwargs):
679
+ context_data = kwargs.get('context_data')
573
680
  if 'add_upstream_for_block_uuid' in payload:
574
681
  block_uuid = payload['add_upstream_for_block_uuid']
575
682
  block = self.model.get_block(block_uuid, widget=False)
576
683
  if BlockType.DBT == block.type and block.language == BlockLanguage.SQL:
577
684
  upstream_dbt_blocks_by_uuid = {
578
- block.uuid: block
579
- for block in block.upstream_dbt_blocks()
685
+ block.uuid: block for block in block.upstream_dbt_blocks()
580
686
  }
581
687
  self.model.blocks_by_uuid.update(upstream_dbt_blocks_by_uuid)
582
688
  self.model.validate('A cycle was formed while adding a block')
583
689
  self.model.save()
584
690
  return self
585
691
 
692
+ repo_path = get_repo_path(context_data=context_data, user=self.current_user)
693
+
586
694
  query = kwargs.get('query', {})
587
695
  update_content = query.get('update_content', [False])
588
696
  if update_content:
@@ -596,23 +704,34 @@ class PipelineResource(BaseResource):
596
704
  if 'pipeline_uuid' not in llm_payload:
597
705
  llm_payload['pipeline_uuid'] = self.model.uuid
598
706
 
599
- llm_resource = await LlmResource.create(llm_payload, self.current_user, **kwargs)
707
+ llm_resource = await LlmResource.create(
708
+ llm_payload, self.current_user, **kwargs
709
+ )
600
710
  llm_response = llm_resource.model.get('response')
601
711
 
602
712
  pipeline_doc = None
603
713
  block_docs = []
604
714
  blocks = self.model.blocks_by_uuid.values()
605
715
 
606
- async def _add_markdown_block(block_doc: str, block_uuid: str, priority: int):
607
- return await BlockResource.create(dict(
608
- content=block_doc.strip() if block_doc else block_doc,
609
- language=BlockLanguage.MARKDOWN,
610
- name=f'Documentation for {block_uuid}',
611
- priority=priority,
612
- type=BlockType.MARKDOWN,
613
- ), self.current_user, **merge_dict(kwargs, dict(
614
- parent_model=self.model,
615
- )))
716
+ async def _add_markdown_block(
717
+ block_doc: str, block_uuid: str, priority: int
718
+ ):
719
+ return await BlockResource.create(
720
+ dict(
721
+ content=block_doc.strip() if block_doc else block_doc,
722
+ language=BlockLanguage.MARKDOWN,
723
+ name=f'Documentation for {block_uuid}',
724
+ priority=priority,
725
+ type=BlockType.MARKDOWN,
726
+ ),
727
+ self.current_user,
728
+ **merge_dict(
729
+ kwargs,
730
+ dict(
731
+ parent_model=self.model,
732
+ ),
733
+ ),
734
+ )
616
735
 
617
736
  if LLMUseCase.GENERATE_DOC_FOR_BLOCK == llm_use_case:
618
737
  block_doc = llm_response.get('block_doc')
@@ -656,11 +775,15 @@ class PipelineResource(BaseResource):
656
775
  switch_active_kernel(
657
776
  kernel_name,
658
777
  emr_config=self.model.executor_config
659
- if kernel_name == KernelName.PYSPARK else None,
778
+ if kernel_name == KernelName.PYSPARK
779
+ else None,
660
780
  )
661
781
  except Exception as e:
662
782
  pipeline_type_updated = payload.get('type')
663
- if pipeline_type_updated is not None and pipeline_type_updated != pipeline_type:
783
+ if (
784
+ pipeline_type_updated is not None
785
+ and pipeline_type_updated != pipeline_type
786
+ ):
664
787
  await self.model.update(dict(type=pipeline_type))
665
788
 
666
789
  raise e
@@ -670,9 +793,9 @@ class PipelineResource(BaseResource):
670
793
  trigger_configs_by_name = get_trigger_configs_by_name(pipeline_uuid)
671
794
  triggers_in_code_to_update = []
672
795
  schedules = (
673
- PipelineSchedule.
674
- query.
675
- filter(PipelineSchedule.pipeline_uuid == pipeline_uuid)
796
+ PipelineSchedule.query.filter(
797
+ PipelineSchedule.pipeline_uuid == pipeline_uuid
798
+ )
676
799
  ).all()
677
800
  for schedule in schedules:
678
801
  trigger_config = trigger_configs_by_name.get(schedule.name)
@@ -695,29 +818,30 @@ class PipelineResource(BaseResource):
695
818
  ):
696
819
  if pipeline_runs is not None:
697
820
  pipeline_run_ids = [run.get('id') for run in pipeline_runs]
698
- pipeline_runs_to_cancel = (
699
- PipelineRun.
700
- query.
701
- filter(PipelineRun.id.in_(pipeline_run_ids))
821
+ pipeline_runs_to_cancel = PipelineRun.query.filter(
822
+ PipelineRun.id.in_(pipeline_run_ids)
702
823
  )
703
824
  elif pipeline_schedule_id is not None:
704
- pipeline_runs_to_cancel = PipelineRun.in_progress_runs([pipeline_schedule_id])
825
+ pipeline_runs_to_cancel = PipelineRun.in_progress_runs(
826
+ [pipeline_schedule_id]
827
+ )
705
828
  else:
706
- pipeline_runs_to_cancel = (
707
- PipelineRun.
708
- query.
709
- filter(PipelineRun.pipeline_uuid == pipeline_uuid).
710
- filter(PipelineRun.status.in_([
711
- PipelineRun.PipelineRunStatus.INITIAL,
712
- PipelineRun.PipelineRunStatus.RUNNING,
713
- ]))
829
+ pipeline_runs_to_cancel = PipelineRun.query.filter(
830
+ PipelineRun.pipeline_uuid == pipeline_uuid
831
+ ).filter(
832
+ PipelineRun.status.in_(
833
+ [
834
+ PipelineRun.PipelineRunStatus.INITIAL,
835
+ PipelineRun.PipelineRunStatus.RUNNING,
836
+ ]
837
+ )
714
838
  )
715
839
  for pipeline_run in pipeline_runs_to_cancel:
716
840
  PipelineScheduler(pipeline_run).stop()
717
841
 
718
842
  def retry_pipeline_runs(pipeline_runs):
719
843
  for run in pipeline_runs:
720
- retry_pipeline_run(run)
844
+ retry_pipeline_run(run, repo_path)
721
845
 
722
846
  @safe_db_query
723
847
  def query_incomplete_block_runs(pipeline_uuid: str):
@@ -731,15 +855,18 @@ class PipelineResource(BaseResource):
731
855
  a.pipeline_uuid,
732
856
  ]
733
857
  result = (
734
- PipelineRun.
735
- select(*columns).
736
- join(b, a.id == b.pipeline_run_id).
737
- filter(a.pipeline_uuid == pipeline_uuid).
738
- filter(a.status == PipelineRun.PipelineRunStatus.FAILED).
739
- filter(b.status.not_in([
740
- BlockRun.BlockRunStatus.COMPLETED,
741
- BlockRun.BlockRunStatus.CONDITION_FAILED,
742
- ]))
858
+ PipelineRun.select(*columns)
859
+ .join(b, a.id == b.pipeline_run_id)
860
+ .filter(a.pipeline_uuid == pipeline_uuid)
861
+ .filter(a.status == PipelineRun.PipelineRunStatus.FAILED)
862
+ .filter(
863
+ b.status.not_in(
864
+ [
865
+ BlockRun.BlockRunStatus.COMPLETED,
866
+ BlockRun.BlockRunStatus.CONDITION_FAILED,
867
+ ]
868
+ )
869
+ )
743
870
  ).all()
744
871
 
745
872
  return result