mage-ai 0.9.55__py3-none-any.whl → 0.9.57__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 (377) hide show
  1. mage_ai/api/parsers/ProjectParser.py +29 -0
  2. mage_ai/api/policies/BlockPolicy.py +1 -0
  3. mage_ai/api/policies/CustomDesignPolicy.py +3 -0
  4. mage_ai/api/policies/GitBranchPolicy.py +9 -0
  5. mage_ai/api/policies/GitCustomBranchPolicy.py +1 -0
  6. mage_ai/api/policies/GlobalHookPolicy.py +3 -0
  7. mage_ai/api/policies/ProjectPolicy.py +28 -0
  8. mage_ai/api/presenters/ProjectPresenter.py +4 -0
  9. mage_ai/api/resources/BlockResource.py +14 -1
  10. mage_ai/api/resources/FileResource.py +1 -1
  11. mage_ai/api/resources/GitFileResource.py +1 -1
  12. mage_ai/api/resources/GlobalHookResource.py +55 -10
  13. mage_ai/api/resources/PipelineResource.py +12 -11
  14. mage_ai/api/resources/ProjectResource.py +95 -7
  15. mage_ai/authentication/operation_history/models.py +1 -1
  16. mage_ai/cache/dbt/cache.py +1 -1
  17. mage_ai/cache/dbt/utils.py +22 -2
  18. mage_ai/cluster_manager/kubernetes/workload_manager.py +17 -7
  19. mage_ai/data_preparation/models/block/__init__.py +71 -5
  20. mage_ai/data_preparation/models/block/dbt/block_sql.py +13 -3
  21. mage_ai/data_preparation/models/block/dbt/dbt_adapter.py +15 -1
  22. mage_ai/data_preparation/models/block/dbt/profiles.py +14 -12
  23. mage_ai/data_preparation/models/block/platform/mixins.py +6 -2
  24. mage_ai/data_preparation/models/block/platform/utils.py +9 -1
  25. mage_ai/data_preparation/models/file.py +1 -1
  26. mage_ai/data_preparation/models/global_hooks/models.py +2 -2
  27. mage_ai/data_preparation/models/project/__init__.py +74 -4
  28. mage_ai/data_preparation/models/project/constants.py +1 -0
  29. mage_ai/data_preparation/repo_manager.py +3 -0
  30. mage_ai/orchestration/db/models/schedules.py +64 -102
  31. mage_ai/orchestration/db/models/schedules_project_platform.py +365 -0
  32. mage_ai/orchestration/pipeline_scheduler.py +5 -1700
  33. mage_ai/orchestration/pipeline_scheduler_original.py +1635 -0
  34. mage_ai/orchestration/pipeline_scheduler_project_platform.py +1701 -0
  35. mage_ai/server/constants.py +1 -1
  36. mage_ai/server/frontend_dist/404.html +2 -2
  37. mage_ai/server/frontend_dist/_next/static/A7VXVGKgLQCukXcjdysDz/_buildManifest.js +1 -0
  38. mage_ai/server/frontend_dist/_next/static/chunks/1557-724bfc3eabd095f7.js +1 -0
  39. mage_ai/server/frontend_dist/_next/static/chunks/161-33f26e485ddef393.js +1 -0
  40. mage_ai/server/frontend_dist/_next/static/chunks/2646-78905b899b68f4eb.js +1 -0
  41. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3419-ad674b271b8520ce.js → frontend_dist/_next/static/chunks/3419-b8bd26f5946bec5a.js} +1 -1
  42. mage_ai/server/frontend_dist/_next/static/chunks/3437-ce26fc28e114b44e.js +1 -0
  43. mage_ai/server/frontend_dist/_next/static/chunks/3540-9bb48b08f439d0a0.js +1 -0
  44. mage_ai/server/frontend_dist/_next/static/chunks/3745-61b1c63bb56bb670.js +1 -0
  45. mage_ai/server/frontend_dist/_next/static/chunks/{5729.0f2748e9e6dab951.js → 5189.dca121eccea793be.js} +1 -1
  46. mage_ai/server/frontend_dist/_next/static/chunks/5457-b373ebdf4d05d8e2.js +1 -0
  47. mage_ai/server/frontend_dist/_next/static/chunks/5533-3455832bc3f8429b.js +1 -0
  48. mage_ai/server/frontend_dist/_next/static/chunks/5729-9d8204ab91da631d.js +1 -0
  49. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/5810-e26a0768db1cfdba.js → frontend_dist/_next/static/chunks/5810-addfa3491ae6b01c.js} +1 -1
  50. mage_ai/server/frontend_dist/_next/static/chunks/8264-68db2a8334ad48f1.js +1 -0
  51. mage_ai/server/frontend_dist/_next/static/chunks/8432-0ace6fb7bdbc6864.js +1 -0
  52. mage_ai/server/frontend_dist/_next/static/chunks/8731-82571147875a2d58.js +1 -0
  53. mage_ai/server/frontend_dist/_next/static/chunks/874-d9e1b3c9c00ebac9.js +1 -0
  54. mage_ai/server/frontend_dist/_next/static/chunks/9264-5df6e4c7b1e85c02.js +1 -0
  55. mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-0d183e2f234d52c6.js → _app-4c0239ca6203e827.js} +1 -1
  56. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-822e66aa2e90cf4c.js +1 -0
  57. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-373217c5de51aeef.js +1 -0
  58. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-1e4838e534c8f31e.js → [...slug]-0325e76a2f3e08c1.js} +1 -1
  59. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-bb38f73540efeac4.js → global-data-products-927ebbdc29529765.js} +1 -1
  60. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-a172f5a447bd8925.js +1 -0
  61. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-97bec2ac883e0c26.js +1 -0
  62. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-02d001d99eeaae3f.js +1 -0
  63. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-2e577bfd4f0db2b7.js +1 -0
  64. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-1827574a4ba95a72.js +1 -0
  65. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-a913c361bcc0d1a9.js +1 -0
  66. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-4e6fdcbbfc931d67.js +1 -0
  67. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-1c327edcf05df9c9.js +1 -0
  68. mage_ai/server/frontend_dist/_next/static/chunks/pages/{oauth-eba7027969034415.js → oauth-bd8494f8875c5c97.js} +1 -1
  69. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-5a98e6a531410afb.js +1 -0
  70. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-1442183d13edec2e.js +1 -0
  71. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-b526282c8ac49986.js → [...slug]-38b2241cdd10320c.js} +1 -1
  72. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-515eb343210aa1fb.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-1c646dbef65d6a69.js} +1 -1
  73. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-fe4d1321da8291cb.js → dashboard-35cb916a18ac4e1f.js} +1 -1
  74. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-cd1918632dfef29d.js +1 -0
  75. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{logs-c011d465f61138ee.js → logs-67b0572c84db0940.js} +1 -1
  76. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-46c0dabd155581a0.js → block-runs-40201b626ea3a664.js} +1 -1
  77. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-f2a052cb8a20fe47.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d1f23308effebe03.js} +1 -1
  78. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-579899cbaedcdefc.js → monitors-9a116d88f00916ff.js} +1 -1
  79. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/{[run]-7a2265b7e44bed0b.js → [run]-2d5abcd019d4bea1.js} +1 -1
  80. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{runs-9b53da919db959bd.js → runs-5363a7ae9afe8983.js} +1 -1
  81. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{settings-1839276725bfd757.js → settings-931a1b3112866a72.js} +1 -1
  82. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{syncs-68d779bc62185470.js → syncs-5ec5367cb877db38.js} +1 -1
  83. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-01f4528602f4ba2a.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-8366661f8e2b2959.js} +1 -1
  84. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-358523847fdbf547.js → triggers-378f8dada7d0c1dd.js} +1 -1
  85. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-627be24ef4963cfb.js +1 -0
  86. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/[...slug]-814bbd11e10c26dc.js +1 -0
  87. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks-021ec25e05862f8f.js +1 -0
  88. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-00393e67ab1e6788.js → frontend_dist/_next/static/chunks/pages/settings/account/profile-2b0aa123043519b8.js} +1 -1
  89. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-05186e17c94347c1.js +1 -0
  90. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/settings-efe8bf1bf3177a7e.js +1 -0
  91. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-eaeba99f9547a20a.js → [...slug]-aa5d871de1f3f7b0.js} +1 -1
  92. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-c3140516cc28e467.js → permissions-ce45aad47049d993.js} +1 -1
  93. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-1bc694b056ff0bcb.js +1 -0
  94. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-f6ff0e219a4b9ffd.js → [...slug]-88d29d1774db67e4.js} +1 -1
  95. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-22ff9d862736b2ec.js → roles-d8ca763e405cd9d1.js} +1 -1
  96. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{sync-data-614925e838d1974c.js → sync-data-42bd909eb8951040.js} +1 -1
  97. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-5b88dfb1c6d0d16c.js → [...slug]-250dfdf22bfe67e9.js} +1 -1
  98. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-eb904db7ac7ea57c.js → users-97c4ce119f7238b5.js} +1 -1
  99. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-dcdd0c71f99aebad.js → frontend_dist/_next/static/chunks/pages/sign-in-1af3ba18ff646dd4.js} +1 -1
  100. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/[...slug]-ff9d49355393daea.js +1 -0
  101. mage_ai/server/frontend_dist/_next/static/chunks/pages/{templates-5ebfe79c24d8c4b4.js → templates-299a2c8f2dd89cf3.js} +1 -1
  102. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-fb3f398009a02879.js +1 -0
  103. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-59a08e06f4ef6c3a.js +1 -0
  104. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-551b85802515e313.js +1 -0
  105. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-1362aeda4a31dd41.js +1 -0
  106. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-fea697dd168c6d0c.js → webpack-17c3a8f588f14cfd.js} +1 -1
  107. mage_ai/server/frontend_dist/block-layout.html +2 -2
  108. mage_ai/server/frontend_dist/compute.html +2 -2
  109. mage_ai/server/frontend_dist/files.html +2 -2
  110. mage_ai/server/frontend_dist/global-data-products/[...slug].html +2 -2
  111. mage_ai/server/frontend_dist/global-data-products.html +2 -2
  112. mage_ai/server/frontend_dist/global-hooks/[...slug].html +2 -2
  113. mage_ai/server/frontend_dist/global-hooks.html +2 -2
  114. mage_ai/server/frontend_dist/index.html +2 -2
  115. mage_ai/server/frontend_dist/manage/files.html +2 -2
  116. mage_ai/server/frontend_dist/manage/settings.html +2 -2
  117. mage_ai/server/frontend_dist/manage/users/[user].html +2 -2
  118. mage_ai/server/frontend_dist/manage/users/new.html +2 -2
  119. mage_ai/server/frontend_dist/manage/users.html +2 -2
  120. mage_ai/server/frontend_dist/manage.html +2 -2
  121. mage_ai/server/frontend_dist/oauth.html +3 -3
  122. mage_ai/server/frontend_dist/overview.html +2 -2
  123. mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  124. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  125. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  126. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +2 -2
  127. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  128. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  129. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  130. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  131. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  132. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  133. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  134. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +2 -2
  135. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  136. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  137. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  138. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  139. mage_ai/server/frontend_dist/pipelines.html +2 -2
  140. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +24 -0
  141. mage_ai/server/frontend_dist/platform/global-hooks.html +24 -0
  142. mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  143. mage_ai/server/frontend_dist/settings/platform/preferences.html +24 -0
  144. mage_ai/server/frontend_dist/settings/platform/settings.html +24 -0
  145. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +2 -2
  146. mage_ai/server/frontend_dist/settings/workspace/permissions.html +2 -2
  147. mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  148. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +2 -2
  149. mage_ai/server/frontend_dist/settings/workspace/roles.html +2 -2
  150. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  151. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +2 -2
  152. mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  153. mage_ai/server/frontend_dist/settings.html +2 -2
  154. mage_ai/server/frontend_dist/sign-in.html +3 -3
  155. mage_ai/server/frontend_dist/templates/[...slug].html +2 -2
  156. mage_ai/server/frontend_dist/templates.html +2 -2
  157. mage_ai/server/frontend_dist/terminal.html +2 -2
  158. mage_ai/server/frontend_dist/test.html +2 -2
  159. mage_ai/server/frontend_dist/triggers.html +2 -2
  160. mage_ai/server/frontend_dist/version-control.html +2 -2
  161. mage_ai/server/frontend_dist_base_path_template/404.html +4 -4
  162. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-724bfc3eabd095f7.js +1 -0
  163. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/161-33f26e485ddef393.js +1 -0
  164. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2646-78905b899b68f4eb.js +1 -0
  165. mage_ai/server/{frontend_dist/_next/static/chunks/3419-ad674b271b8520ce.js → frontend_dist_base_path_template/_next/static/chunks/3419-b8bd26f5946bec5a.js} +1 -1
  166. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3437-ce26fc28e114b44e.js +1 -0
  167. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3540-9bb48b08f439d0a0.js +1 -0
  168. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3745-61b1c63bb56bb670.js +1 -0
  169. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5729.0f2748e9e6dab951.js → 5189.dca121eccea793be.js} +1 -1
  170. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-b373ebdf4d05d8e2.js +1 -0
  171. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5533-3455832bc3f8429b.js +1 -0
  172. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5729-9d8204ab91da631d.js +1 -0
  173. mage_ai/server/{frontend_dist/_next/static/chunks/5810-e26a0768db1cfdba.js → frontend_dist_base_path_template/_next/static/chunks/5810-addfa3491ae6b01c.js} +1 -1
  174. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-68db2a8334ad48f1.js +1 -0
  175. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8432-0ace6fb7bdbc6864.js +1 -0
  176. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8731-82571147875a2d58.js +1 -0
  177. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/874-d9e1b3c9c00ebac9.js +1 -0
  178. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-5df6e4c7b1e85c02.js +1 -0
  179. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-0d183e2f234d52c6.js → _app-4c0239ca6203e827.js} +1 -1
  180. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-822e66aa2e90cf4c.js +1 -0
  181. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-373217c5de51aeef.js +1 -0
  182. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-1e4838e534c8f31e.js → [...slug]-0325e76a2f3e08c1.js} +1 -1
  183. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-bb38f73540efeac4.js → global-data-products-927ebbdc29529765.js} +1 -1
  184. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-a172f5a447bd8925.js +1 -0
  185. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-97bec2ac883e0c26.js +1 -0
  186. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-02d001d99eeaae3f.js +1 -0
  187. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-2e577bfd4f0db2b7.js +1 -0
  188. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-1827574a4ba95a72.js +1 -0
  189. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-a913c361bcc0d1a9.js +1 -0
  190. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-4e6fdcbbfc931d67.js +1 -0
  191. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-1c327edcf05df9c9.js +1 -0
  192. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{oauth-eba7027969034415.js → oauth-bd8494f8875c5c97.js} +1 -1
  193. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-5a98e6a531410afb.js +1 -0
  194. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-1442183d13edec2e.js +1 -0
  195. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-b526282c8ac49986.js → [...slug]-38b2241cdd10320c.js} +1 -1
  196. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-515eb343210aa1fb.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-1c646dbef65d6a69.js} +1 -1
  197. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-fe4d1321da8291cb.js → dashboard-35cb916a18ac4e1f.js} +1 -1
  198. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-cd1918632dfef29d.js +1 -0
  199. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{logs-c011d465f61138ee.js → logs-67b0572c84db0940.js} +1 -1
  200. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-46c0dabd155581a0.js → block-runs-40201b626ea3a664.js} +1 -1
  201. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-f2a052cb8a20fe47.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d1f23308effebe03.js} +1 -1
  202. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-579899cbaedcdefc.js → monitors-9a116d88f00916ff.js} +1 -1
  203. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/{[run]-7a2265b7e44bed0b.js → [run]-2d5abcd019d4bea1.js} +1 -1
  204. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{runs-9b53da919db959bd.js → runs-5363a7ae9afe8983.js} +1 -1
  205. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{settings-1839276725bfd757.js → settings-931a1b3112866a72.js} +1 -1
  206. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{syncs-68d779bc62185470.js → syncs-5ec5367cb877db38.js} +1 -1
  207. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-01f4528602f4ba2a.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-8366661f8e2b2959.js} +1 -1
  208. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-358523847fdbf547.js → triggers-378f8dada7d0c1dd.js} +1 -1
  209. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-627be24ef4963cfb.js +1 -0
  210. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/[...slug]-814bbd11e10c26dc.js +1 -0
  211. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-021ec25e05862f8f.js +1 -0
  212. mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/account/profile-00393e67ab1e6788.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-2b0aa123043519b8.js} +1 -1
  213. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-05186e17c94347c1.js +1 -0
  214. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-efe8bf1bf3177a7e.js +1 -0
  215. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-eaeba99f9547a20a.js → [...slug]-aa5d871de1f3f7b0.js} +1 -1
  216. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-c3140516cc28e467.js → permissions-ce45aad47049d993.js} +1 -1
  217. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-1bc694b056ff0bcb.js +1 -0
  218. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-f6ff0e219a4b9ffd.js → [...slug]-88d29d1774db67e4.js} +1 -1
  219. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-22ff9d862736b2ec.js → roles-d8ca763e405cd9d1.js} +1 -1
  220. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{sync-data-614925e838d1974c.js → sync-data-42bd909eb8951040.js} +1 -1
  221. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-5b88dfb1c6d0d16c.js → [...slug]-250dfdf22bfe67e9.js} +1 -1
  222. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-eb904db7ac7ea57c.js → users-97c4ce119f7238b5.js} +1 -1
  223. mage_ai/server/{frontend_dist/_next/static/chunks/pages/sign-in-dcdd0c71f99aebad.js → frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-1af3ba18ff646dd4.js} +1 -1
  224. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-ff9d49355393daea.js +1 -0
  225. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{templates-5ebfe79c24d8c4b4.js → templates-299a2c8f2dd89cf3.js} +1 -1
  226. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-fb3f398009a02879.js +1 -0
  227. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-59a08e06f4ef6c3a.js +1 -0
  228. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-551b85802515e313.js +1 -0
  229. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-1362aeda4a31dd41.js +1 -0
  230. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-d30cb09c85b4c4f0.js → webpack-b55fe1e575d8ac9d.js} +1 -1
  231. mage_ai/server/frontend_dist_base_path_template/_next/static/wSRrM15xnvA8lOWcaque7/_buildManifest.js +1 -0
  232. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  233. mage_ai/server/frontend_dist_base_path_template/compute.html +5 -5
  234. mage_ai/server/frontend_dist_base_path_template/files.html +5 -5
  235. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +5 -5
  236. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +5 -5
  237. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +5 -5
  238. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +5 -5
  239. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  240. mage_ai/server/frontend_dist_base_path_template/manage/files.html +5 -5
  241. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +5 -5
  242. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +5 -5
  243. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +5 -5
  244. mage_ai/server/frontend_dist_base_path_template/manage/users.html +5 -5
  245. mage_ai/server/frontend_dist_base_path_template/manage.html +5 -5
  246. mage_ai/server/frontend_dist_base_path_template/oauth.html +3 -3
  247. mage_ai/server/frontend_dist_base_path_template/overview.html +5 -5
  248. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +5 -5
  249. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +5 -5
  250. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +5 -5
  251. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +5 -5
  252. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  253. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +5 -5
  254. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +5 -5
  255. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
  256. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +5 -5
  257. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +5 -5
  258. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +5 -5
  259. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +5 -5
  260. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +5 -5
  261. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +5 -5
  262. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +5 -5
  263. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  264. mage_ai/server/frontend_dist_base_path_template/pipelines.html +5 -5
  265. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +24 -0
  266. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +24 -0
  267. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +5 -5
  268. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +24 -0
  269. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +24 -0
  270. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +5 -5
  271. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +5 -5
  272. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +5 -5
  273. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +5 -5
  274. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +5 -5
  275. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +5 -5
  276. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +5 -5
  277. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +5 -5
  278. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  279. mage_ai/server/frontend_dist_base_path_template/sign-in.html +11 -11
  280. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +5 -5
  281. mage_ai/server/frontend_dist_base_path_template/templates.html +5 -5
  282. mage_ai/server/frontend_dist_base_path_template/terminal.html +5 -5
  283. mage_ai/server/frontend_dist_base_path_template/test.html +2 -2
  284. mage_ai/server/frontend_dist_base_path_template/triggers.html +5 -5
  285. mage_ai/server/frontend_dist_base_path_template/version-control.html +5 -5
  286. mage_ai/server/websocket_server.py +33 -22
  287. mage_ai/settings/models/configuration_option.py +15 -1
  288. mage_ai/settings/platform/__init__.py +44 -20
  289. mage_ai/shared/io.py +3 -0
  290. mage_ai/streaming/sinks/rabbitmq.py +3 -1
  291. mage_ai/streaming/sources/rabbitmq.py +5 -2
  292. mage_ai/tests/api/endpoints/test_pipeline_runs.py +4 -0
  293. mage_ai/tests/api/endpoints/test_projects.py +1 -0
  294. mage_ai/tests/api/resources/test_pipeline_resource.py +2 -2
  295. mage_ai/tests/data_preparation/models/block/platform/test_mixins.py +4 -3
  296. mage_ai/tests/data_preparation/models/test_block.py +2 -1
  297. mage_ai/tests/data_preparation/models/test_project.py +27 -7
  298. mage_ai/tests/orchestration/db/models/test_schedules.py +25 -7
  299. mage_ai/tests/orchestration/test_pipeline_scheduler.py +6 -261
  300. mage_ai/tests/orchestration/test_pipeline_scheduler_project_platform.py +286 -0
  301. mage_ai/tests/shared/mixins.py +1 -0
  302. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/METADATA +1 -1
  303. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/RECORD +309 -286
  304. mage_ai/server/frontend_dist/_next/static/7yQskzl_RfcpoOQn1DPQV/_buildManifest.js +0 -1
  305. mage_ai/server/frontend_dist/_next/static/chunks/1125-fbdaaef471846c61.js +0 -1
  306. mage_ai/server/frontend_dist/_next/static/chunks/1952-c4ba37bc172d7051.js +0 -1
  307. mage_ai/server/frontend_dist/_next/static/chunks/2646-d8612648f7836101.js +0 -1
  308. mage_ai/server/frontend_dist/_next/static/chunks/3437-91f6098316edaf17.js +0 -1
  309. mage_ai/server/frontend_dist/_next/static/chunks/3745-0aacee8ac93a042a.js +0 -1
  310. mage_ai/server/frontend_dist/_next/static/chunks/5332-c5abdf5c8d65a52e.js +0 -1
  311. mage_ai/server/frontend_dist/_next/static/chunks/5457-6e700aadac17ceec.js +0 -1
  312. mage_ai/server/frontend_dist/_next/static/chunks/8264-dad1f090c4278137.js +0 -1
  313. mage_ai/server/frontend_dist/_next/static/chunks/8432-ec2b97cbf32ec5a7.js +0 -1
  314. mage_ai/server/frontend_dist/_next/static/chunks/8731-9e0ad513b0dfce83.js +0 -1
  315. mage_ai/server/frontend_dist/_next/static/chunks/874-18d9f33cdd028e9d.js +0 -1
  316. mage_ai/server/frontend_dist/_next/static/chunks/9264-4428392376aa9dd4.js +0 -1
  317. mage_ai/server/frontend_dist/_next/static/chunks/9626-2627bc34f11b2906.js +0 -1
  318. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-5ead3afa88d14721.js +0 -1
  319. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-87b31b998e9f1222.js +0 -1
  320. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-a7d74042d52c3c38.js +0 -1
  321. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-cf7f1ba0b44ec0fb.js +0 -1
  322. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-899b362caff47d4d.js +0 -1
  323. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-b9ddd48737fba474.js +0 -1
  324. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-1e8731ba2559fef4.js +0 -1
  325. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-a6307396dfa82c88.js +0 -1
  326. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-fc5aafe5085739a9.js +0 -1
  327. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-c008f0201864d693.js +0 -1
  328. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-321f47b2dba4c780.js +0 -1
  329. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-bf4d162b5460acc6.js +0 -1
  330. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-62ee3e957688c725.js +0 -1
  331. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-33d9fb90871be84c.js +0 -1
  332. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-f4ff09cfff8bad46.js +0 -1
  333. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/[...slug]-04b0a55e8ad6f814.js +0 -1
  334. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-88025dd0ed3051a6.js +0 -1
  335. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-b936dd972db94c6b.js +0 -1
  336. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-e5e49ac3b9282aaa.js +0 -1
  337. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-a5372e488b5f44a2.js +0 -1
  338. mage_ai/server/frontend_dist_base_path_template/_next/static/2_SHgS8M315ekLG0qkZzC/_buildManifest.js +0 -1
  339. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1125-fbdaaef471846c61.js +0 -1
  340. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-c4ba37bc172d7051.js +0 -1
  341. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2646-d8612648f7836101.js +0 -1
  342. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3437-91f6098316edaf17.js +0 -1
  343. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3745-0aacee8ac93a042a.js +0 -1
  344. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5332-c5abdf5c8d65a52e.js +0 -1
  345. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-6e700aadac17ceec.js +0 -1
  346. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-dad1f090c4278137.js +0 -1
  347. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8432-ec2b97cbf32ec5a7.js +0 -1
  348. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8731-9e0ad513b0dfce83.js +0 -1
  349. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/874-18d9f33cdd028e9d.js +0 -1
  350. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-4428392376aa9dd4.js +0 -1
  351. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9626-2627bc34f11b2906.js +0 -1
  352. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-5ead3afa88d14721.js +0 -1
  353. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-87b31b998e9f1222.js +0 -1
  354. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-a7d74042d52c3c38.js +0 -1
  355. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-cf7f1ba0b44ec0fb.js +0 -1
  356. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-899b362caff47d4d.js +0 -1
  357. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-b9ddd48737fba474.js +0 -1
  358. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-1e8731ba2559fef4.js +0 -1
  359. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-a6307396dfa82c88.js +0 -1
  360. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-fc5aafe5085739a9.js +0 -1
  361. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-c008f0201864d693.js +0 -1
  362. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-321f47b2dba4c780.js +0 -1
  363. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-bf4d162b5460acc6.js +0 -1
  364. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-62ee3e957688c725.js +0 -1
  365. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-33d9fb90871be84c.js +0 -1
  366. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-f4ff09cfff8bad46.js +0 -1
  367. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-04b0a55e8ad6f814.js +0 -1
  368. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-88025dd0ed3051a6.js +0 -1
  369. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-b936dd972db94c6b.js +0 -1
  370. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-e5e49ac3b9282aaa.js +0 -1
  371. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-a5372e488b5f44a2.js +0 -1
  372. /mage_ai/server/frontend_dist/_next/static/{7yQskzl_RfcpoOQn1DPQV → A7VXVGKgLQCukXcjdysDz}/_ssgManifest.js +0 -0
  373. /mage_ai/server/frontend_dist_base_path_template/_next/static/{2_SHgS8M315ekLG0qkZzC → wSRrM15xnvA8lOWcaque7}/_ssgManifest.js +0 -0
  374. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/LICENSE +0 -0
  375. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/WHEEL +0 -0
  376. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/entry_points.txt +0 -0
  377. {mage_ai-0.9.55.dist-info → mage_ai-0.9.57.dist-info}/top_level.txt +0 -0
@@ -731,9 +731,7 @@ class WorkloadManager:
731
731
 
732
732
  return env_vars
733
733
 
734
- def __get_configurable_parameters(
735
- self, workspace_config: KubernetesWorkspaceConfig
736
- ) -> Dict:
734
+ def get_default_values(self) -> Dict:
737
735
  service_account_name_default = None
738
736
  storage_class_name_default = None
739
737
  storage_access_mode_default = None
@@ -757,19 +755,31 @@ class WorkloadManager:
757
755
  except Exception:
758
756
  pass
759
757
 
758
+ return dict(
759
+ service_account_name=service_account_name_default,
760
+ storage_class_name=storage_class_name_default,
761
+ storage_access_mode=storage_access_mode_default,
762
+ storage_request_size=storage_request_size_default,
763
+ )
764
+
765
+ def __get_configurable_parameters(
766
+ self, workspace_config: KubernetesWorkspaceConfig
767
+ ) -> Dict:
768
+ default_values = self.get_default_values()
769
+
760
770
  storage_request_size = workspace_config.storage_request_size
761
771
  if storage_request_size is None:
762
- storage_request_size = storage_request_size_default
772
+ storage_request_size = default_values.get('storage_request_size')
763
773
  else:
764
774
  storage_request_size = f'{storage_request_size}Gi'
765
775
 
766
776
  return dict(
767
777
  service_account_name=workspace_config.service_account_name
768
- or service_account_name_default,
778
+ or default_values.get('service_account_name'),
769
779
  storage_class_name=workspace_config.storage_class_name
770
- or storage_class_name_default,
780
+ or default_values.get('storage_class_name'),
771
781
  storage_access_mode=workspace_config.storage_access_mode
772
- or storage_access_mode_default,
782
+ or default_values.get('storage_access_mode'),
773
783
  storage_request_size=storage_request_size,
774
784
  )
775
785
 
@@ -12,9 +12,11 @@ from contextlib import contextmanager, redirect_stderr, redirect_stdout
12
12
  from datetime import datetime
13
13
  from inspect import Parameter, isfunction, signature
14
14
  from logging import Logger
15
+ from pathlib import Path
15
16
  from queue import Queue
16
17
  from typing import Any, Callable, Dict, Generator, List, Set, Tuple, Union
17
18
 
19
+ import inflection
18
20
  import pandas as pd
19
21
  import simplejson
20
22
  import yaml
@@ -57,6 +59,7 @@ from mage_ai.data_preparation.models.constants import (
57
59
  DATAFRAME_ANALYSIS_MAX_COLUMNS,
58
60
  DATAFRAME_ANALYSIS_MAX_ROWS,
59
61
  DATAFRAME_SAMPLE_COUNT_PREVIEW,
62
+ FILE_EXTENSION_TO_BLOCK_LANGUAGE,
60
63
  NON_PIPELINE_EXECUTABLE_BLOCK_TYPES,
61
64
  BlockColor,
62
65
  BlockLanguage,
@@ -84,6 +87,10 @@ from mage_ai.shared.environments import get_env, is_debug
84
87
  from mage_ai.shared.hash import extract, ignore_keys, merge_dict
85
88
  from mage_ai.shared.logger import BlockFunctionExec
86
89
  from mage_ai.shared.parsers import encode_complex
90
+ from mage_ai.shared.path_fixer import (
91
+ add_root_repo_path_to_relative_path,
92
+ get_path_parts,
93
+ )
87
94
  from mage_ai.shared.strings import format_enum
88
95
  from mage_ai.shared.utils import clean_name as clean_name_orig
89
96
  from mage_ai.shared.utils import is_spark_env
@@ -586,7 +593,7 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
586
593
  def file_path(self) -> str:
587
594
  file_path = self.get_file_path_from_source()
588
595
  if file_path:
589
- return file_path
596
+ return add_root_repo_path_to_relative_path(file_path)
590
597
 
591
598
  return self.__build_file_path(
592
599
  self.repo_path or os.getcwd(),
@@ -753,16 +760,28 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
753
760
  )
754
761
  file_is_from_another_project = (
755
762
  file_path_from_source and
756
- from_another_project(file_path_from_source)
763
+ from_another_project(
764
+ file_path=file_path_from_source,
765
+ other_file_path=pipeline.dir_path if pipeline else None,
766
+ )
757
767
  )
768
+ absolute_file_path = add_root_repo_path_to_relative_path(
769
+ file_path_from_source,
770
+ ) if file_path_from_source else None
771
+
772
+ if not file_is_from_another_project and \
773
+ (not absolute_file_path or not os.path.exists(absolute_file_path)):
758
774
 
759
- if not file_is_from_another_project:
760
775
  if not replicated_block and \
761
776
  (BlockType.DBT != block_type or BlockLanguage.YAML == language) and \
762
777
  BlockType.GLOBAL_DATA_PRODUCT != block_type:
763
778
 
764
779
  block_directory = self.file_directory_name(block_type)
765
- block_dir_path = os.path.join(repo_path, block_directory)
780
+ if absolute_file_path:
781
+ block_dir_path = os.path.dirname(absolute_file_path)
782
+ else:
783
+ block_dir_path = os.path.join(repo_path, block_directory)
784
+
766
785
  if not os.path.exists(block_dir_path):
767
786
  os.mkdir(block_dir_path)
768
787
  with open(os.path.join(block_dir_path, '__init__.py'), 'w'):
@@ -895,6 +914,41 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
895
914
  status=status,
896
915
  )
897
916
 
917
+ @classmethod
918
+ def get_block_from_file_path(self, file_path: str) -> 'Block':
919
+ parts = get_path_parts(file_path)
920
+
921
+ if parts and len(parts) >= 3:
922
+ # If file_path == transformers/test4.py
923
+ # parts ==
924
+ # ('/home/src/default_repo/default_platform2/project3', 'transformers', 'test4.py')
925
+
926
+ # If project platform platform activated, then parts ==
927
+ # ('/home/src', 'default_repo', 'data_loaders/astral_violet.py')
928
+
929
+ root_project_full_path, path, file_path_base = parts
930
+
931
+ if project_platform_activated():
932
+ # ('data_loaders', 'astral_violet.py')
933
+ file_parts = Path(file_path_base).parts
934
+ block_type = inflection.singularize(str(file_parts[0]))
935
+ block_uuid = str(Path(*file_parts[1:]).with_suffix(''))
936
+ else:
937
+ block_type = inflection.singularize(str(path))
938
+ block_uuid = str(Path(file_path_base).with_suffix(''))
939
+
940
+ extension = Path(file_path).suffix.replace('.', '')
941
+ configuration = dict(file_path=file_path, file_source=dict(path=file_path))
942
+ language = FILE_EXTENSION_TO_BLOCK_LANGUAGE.get(extension)
943
+
944
+ return self.get_block(
945
+ block_uuid,
946
+ block_uuid,
947
+ block_type,
948
+ configuration=configuration,
949
+ language=language,
950
+ )
951
+
898
952
  def all_upstream_blocks_completed(
899
953
  self,
900
954
  completed_block_uuids: Set[str],
@@ -945,6 +999,8 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
945
999
  if len(pipelines) == 0:
946
1000
  os.remove(self.file_path)
947
1001
  return
1002
+
1003
+ # TODO (tommy dang): delete this block from all pipelines in all projects
948
1004
  # If pipeline is not specified, delete the block from all pipelines and delete the file.
949
1005
  pipelines = Pipeline.get_pipelines_by_block(self, widget=widget)
950
1006
  if not force:
@@ -954,6 +1010,7 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
954
1010
  f'Block {self.uuid} has downstream dependencies in pipeline {p.uuid}. '
955
1011
  'Please remove the dependencies before deleting the block.'
956
1012
  )
1013
+
957
1014
  for p in pipelines:
958
1015
  p.delete_block(
959
1016
  p.get_block(self.uuid, widget=widget),
@@ -961,6 +1018,7 @@ class Block(DataIntegrationMixin, SparkBlock, ProjectPlatformAccessible):
961
1018
  commit=commit,
962
1019
  force=force,
963
1020
  )
1021
+
964
1022
  os.remove(self.file_path)
965
1023
 
966
1024
  def execute_with_callback(
@@ -2336,7 +2394,15 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
2336
2394
  self.__update_pipeline_block(widget=widget)
2337
2395
  return self
2338
2396
 
2339
- async def update_content_async(self, content, widget=False) -> 'Block':
2397
+ async def update_content_async(
2398
+ self,
2399
+ content,
2400
+ error_if_file_missing: bool = True,
2401
+ widget: bool = False,
2402
+ ) -> 'Block':
2403
+ if error_if_file_missing and not self.file.exists():
2404
+ raise Exception(f'File for block {self.uuid} does not exist at {self.file.file_path}.')
2405
+
2340
2406
  block_content = await self.content_async()
2341
2407
  if content != block_content:
2342
2408
  self.status = BlockStatus.UPDATED
@@ -65,7 +65,9 @@ class DBTBlockSQL(DBTBlock, ProjectPlatformAccessible):
65
65
  if file_path:
66
66
  return file_path
67
67
 
68
- file_path = self.configuration.get('file_path')
68
+ file_path = self.configuration.get('file_path') or ''
69
+ if file_path and Path(file_path).parts[0] == 'dbt':
70
+ file_path = os.path.join(*Path(file_path).parts[1:]) or ''
69
71
 
70
72
  return str((Path(self.repo_path)) / DBT_DIRECTORY_NAME / file_path)
71
73
 
@@ -82,9 +84,15 @@ class DBTBlockSQL(DBTBlock, ProjectPlatformAccessible):
82
84
  if project_path:
83
85
  return project_path
84
86
 
87
+ try:
88
+ diff = Path(self.file_path).relative_to(self.base_project_path)
89
+ if diff:
90
+ diff = Path(diff).parts[0]
91
+ except ValueError:
92
+ diff = self.file_path
93
+
85
94
  return str(
86
- Path(self.base_project_path) /
87
- self.configuration.get('file_path', '').split(os.sep)[0]
95
+ Path(self.base_project_path) / diff,
88
96
  )
89
97
 
90
98
  @property
@@ -187,6 +195,7 @@ class DBTBlockSQL(DBTBlock, ProjectPlatformAccessible):
187
195
  # Get upstream nodes via dbt list
188
196
  with Profiles(self.project_path, self.pipeline.variables) as profiles:
189
197
  try:
198
+
190
199
  args = [
191
200
  'list',
192
201
  # project-dir
@@ -218,6 +227,7 @@ class DBTBlockSQL(DBTBlock, ProjectPlatformAccessible):
218
227
  pipeline=self.pipeline,
219
228
  uuid=self.uuid,
220
229
  ),
230
+ hydrate_configuration=False,
221
231
  )
222
232
  ]
223
233
 
@@ -199,7 +199,21 @@ class DBTAdapter:
199
199
  profiles_path = self.__profiles.interpolate()
200
200
 
201
201
  # set dbt flags
202
- user_config = read_user_config(profiles_path)
202
+ # Need to add profiles.yml file
203
+ try:
204
+ user_config = read_user_config(profiles_path)
205
+ except Exception as err:
206
+ print(f'[ERROR] DBTAdapter.open: {err}.')
207
+
208
+ if not profiles_path.endswith('profiles.yaml') and \
209
+ not profiles_path.endswith('profiles.yml'):
210
+
211
+ try:
212
+ user_config = read_user_config(os.path.join(profiles_path, 'profiles.yml'))
213
+ except Exception as err2:
214
+ print(f'[ERROR] DBTAdapter.open: {err2}.')
215
+ raise err
216
+
203
217
  adapter_config = DBTAdapterConfig(
204
218
  project_dir=self.project_path,
205
219
  profiles_dir=profiles_path,
@@ -135,19 +135,21 @@ class Profiles(object):
135
135
 
136
136
  # write interpolated profiles.yml
137
137
  interpoalted_profiles_full_path = interpolated_profiles_dir / PROFILES_FILE_NAME
138
- if os.path.exists(interpoalted_profiles_full_path):
139
- try:
140
- with interpoalted_profiles_full_path.open('w') as f:
141
- yaml.safe_dump(self.profiles, f)
142
- except Exception as e:
143
- raise ProfilesError(
144
- f'Failed to write interpolated `{PROFILES_FILE_NAME}`' +
145
- f' to `{interpolated_profiles_dir}`: {e}'
146
- )
138
+ if not os.path.exists(interpoalted_profiles_full_path):
139
+ os.makedirs(os.path.dirname(interpoalted_profiles_full_path), exist_ok=True)
140
+
141
+ try:
142
+ with interpoalted_profiles_full_path.open('w') as f:
143
+ yaml.safe_dump(self.profiles, f)
144
+ except Exception as e:
145
+ raise ProfilesError(
146
+ f'Failed to write interpolated `{PROFILES_FILE_NAME}`' +
147
+ f' to `{interpolated_profiles_dir}`: {e}'
148
+ )
147
149
 
148
- self.__interpolated_profiles_dir = str(interpolated_profiles_dir)
149
- self.is_interpolated = True
150
- return self.__interpolated_profiles_dir
150
+ self.__interpolated_profiles_dir = str(interpolated_profiles_dir)
151
+ self.is_interpolated = True
152
+ return self.__interpolated_profiles_dir
151
153
 
152
154
  def __del__(self) -> None:
153
155
  self.clean()
@@ -79,7 +79,10 @@ class ProjectPlatformAccessible:
79
79
  return config
80
80
 
81
81
  def is_from_another_project(self) -> bool:
82
- return self.project_platform_activated and from_another_project(self.__file_source_path())
82
+ return self.project_platform_activated and from_another_project(
83
+ self.__file_source_path(),
84
+ other_file_path=self.pipeline.dir_path if self.pipeline else None,
85
+ )
83
86
 
84
87
  def get_file_path_from_source(self) -> str:
85
88
  if not self.project_platform_activated:
@@ -201,6 +204,7 @@ class ProjectPlatformAccessible:
201
204
  block_class,
202
205
  block_dict,
203
206
  node: Dict = None,
207
+ hydrate_configuration: bool = True,
204
208
  ):
205
209
  block_type = block_dict['block_type']
206
210
  configuration = block_dict['configuration'] or {}
@@ -209,7 +213,7 @@ class ProjectPlatformAccessible:
209
213
  pipeline = block_dict['pipeline']
210
214
  uuid = block_dict['uuid']
211
215
 
212
- if self.project_platform_activated:
216
+ if hydrate_configuration and self.project_platform_activated:
213
217
  # self.project_path
214
218
  # /home/src/default_platform/default_repo/dbt/demo
215
219
  # node['original_file_path']
@@ -8,12 +8,20 @@ from mage_ai.settings.platform import (
8
8
  )
9
9
  from mage_ai.settings.repo import get_repo_path
10
10
  from mage_ai.shared.files import find_directory
11
+ from mage_ai.shared.path_fixer import get_path_parts, remove_base_repo_directory_name
11
12
 
12
13
 
13
- def from_another_project(file_path: str) -> bool:
14
+ def from_another_project(file_path: str, other_file_path: str = None) -> bool:
14
15
  if not file_path or not project_platform_activated():
15
16
  return False
16
17
 
18
+ if other_file_path:
19
+ tup1 = get_path_parts(remove_base_repo_directory_name(file_path))
20
+ tup2 = get_path_parts(remove_base_repo_directory_name(other_file_path))
21
+
22
+ if len(tup1) >= 2 and len(tup2) >= 2:
23
+ return tup1[1] != tup2[1]
24
+
17
25
  active_repo_path = get_repo_path(root_project=False)
18
26
  paths = get_repo_paths_for_file_path(
19
27
  file_path,
@@ -484,7 +484,7 @@ def traverse(
484
484
 
485
485
  def __should_update_dbt_cache(dir_path: str, filename: str) -> bool:
486
486
  project_model = Project(root_project=True)
487
- if project_model and project_model.is_feature_enabled(FeatureUUID.DBT_V2):
487
+ if project_model and project_model.is_feature_enabled(FeatureUUID.DBT_V2) and dir_path:
488
488
  # If the file is a SQL or YAML file
489
489
  if (
490
490
  filename.endswith('.sql') or
@@ -1085,9 +1085,9 @@ class GlobalHooks(BaseDataClass):
1085
1085
  user=user,
1086
1086
  )
1087
1087
 
1088
- def save(self, file_path: str = None) -> None:
1088
+ def save(self, file_path: str = None, repo_path: str = None) -> None:
1089
1089
  if not file_path:
1090
- file_path = self.file_path()
1090
+ file_path = self.file_path(repo_path=repo_path)
1091
1091
 
1092
1092
  content_original = None
1093
1093
  if os.path.exists(file_path):
@@ -3,11 +3,13 @@ from typing import Dict, List
3
3
 
4
4
  import aiohttp
5
5
 
6
+ from mage_ai.cluster_manager.constants import KUBE_NAMESPACE, ClusterType
6
7
  from mage_ai.data_preparation.models.project.constants import FeatureUUID
7
- from mage_ai.data_preparation.repo_manager import get_repo_config
8
+ from mage_ai.data_preparation.repo_manager import get_cluster_type, get_repo_config
8
9
  from mage_ai.server.constants import VERSION
9
10
  from mage_ai.settings.platform import (
10
11
  active_project_settings,
12
+ platform_settings,
11
13
  project_platform_activated,
12
14
  project_platform_settings,
13
15
  )
@@ -35,6 +37,34 @@ class Project():
35
37
  root_project=self.root_project,
36
38
  )
37
39
  self.version = VERSION
40
+ self._features = None
41
+
42
+ self.__repo_config_root_project = None
43
+
44
+ if project_platform_activated():
45
+ self.__repo_config_root_project = get_repo_config(
46
+ repo_path=get_repo_path(root_project=True),
47
+ root_project=True,
48
+ )
49
+
50
+ @property
51
+ def workspace_config_defaults(self) -> Dict:
52
+ config = self.repo_config.workspace_config_defaults or {}
53
+ cluster_type = get_cluster_type()
54
+ try:
55
+ if cluster_type == ClusterType.K8S:
56
+ from mage_ai.cluster_manager.kubernetes.workload_manager import (
57
+ WorkloadManager,
58
+ )
59
+ workload_manager = WorkloadManager(os.getenv(KUBE_NAMESPACE))
60
+ k8s_default_values = workload_manager.get_default_values()
61
+
62
+ if not config.get('k8s'):
63
+ config['k8s'] = k8s_default_values
64
+ except Exception:
65
+ pass
66
+
67
+ return config
38
68
 
39
69
  @property
40
70
  def help_improve_mage(self) -> bool:
@@ -50,15 +80,51 @@ class Project():
50
80
 
51
81
  @property
52
82
  def features(self) -> Dict:
83
+ if self._features:
84
+ return self._features
85
+
86
+ self._features = {}
87
+ features = self.features_defined
88
+
89
+ for uuid in FeatureUUID:
90
+ key = uuid.value
91
+ self._features[key] = features.get(key) if features else None
92
+
93
+ return self._features
94
+
95
+ @features.setter
96
+ def features(self, x):
97
+ self._features = x
98
+
99
+ @property
100
+ def features_defined(self) -> Dict:
53
101
  data = {}
54
- features = self.repo_config.features
102
+ features = self.repo_config.features if self.repo_config else {}
103
+
104
+ if project_platform_activated() and self.__repo_config_root_project:
105
+ settings = platform_settings()
106
+ if settings.get('features') and (settings.get('features') or {}).get('override'):
107
+ features.update(self.features_override)
55
108
 
56
109
  for uuid in FeatureUUID:
57
110
  key = uuid.value
58
- data[key] = features.get(key) if features else None
111
+ if FeatureUUID.PROJECT_PLATFORM == uuid:
112
+ data[key] = project_platform_activated()
113
+ else:
114
+ if features and key in features:
115
+ data[key] = features.get(key)
59
116
 
60
117
  return data
61
118
 
119
+ @property
120
+ def features_override(self) -> Dict:
121
+ if project_platform_activated() and self.__repo_config_root_project:
122
+ settings = self.platform_settings()
123
+ if settings.get('features') and (settings.get('features') or {}).get('override'):
124
+ return self.__repo_config_root_project.features or {}
125
+
126
+ return {}
127
+
62
128
  @property
63
129
  def emr_config(self) -> Dict:
64
130
  return self.repo_config.emr_config or None
@@ -85,6 +151,10 @@ class Project():
85
151
 
86
152
  return False
87
153
 
154
+ def platform_settings(self) -> Dict:
155
+ if project_platform_activated():
156
+ return platform_settings(mage_projects_only=True)
157
+
88
158
  def repo_path_for_database_query(self, key: str) -> List[str]:
89
159
  if self.settings:
90
160
  query_arr = dig(self.settings, ['database', 'query', key])
@@ -102,7 +172,7 @@ class Project():
102
172
  return project_platform_settings(mage_projects_only=True)
103
173
 
104
174
  def is_feature_enabled(self, feature_name: FeatureUUID) -> bool:
105
- feature_enabled = self.repo_config.features.get(feature_name.value, False)
175
+ feature_enabled = self.features.get(feature_name.value, False)
106
176
 
107
177
  if is_debug():
108
178
  print(f'[Project.is_feature_enabled]: {feature_name} | {feature_enabled}')
@@ -12,3 +12,4 @@ class FeatureUUID(str, Enum):
12
12
  LOCAL_TIMEZONE = 'display_local_timezone'
13
13
  NOTEBOOK_BLOCK_OUTPUT_SPLIT_VIEW = 'notebook_block_output_split_view'
14
14
  OPERATION_HISTORY = 'operation_history'
15
+ PROJECT_PLATFORM = 'project_platform'
@@ -64,6 +64,7 @@ class RepoConfig:
64
64
  self.s3_bucket = None
65
65
  self.s3_path_prefix = None
66
66
  self.logging_config = None
67
+ self.variables_dir = None
67
68
  self.variables_retention_period = None
68
69
 
69
70
  from mage_ai.data_preparation.shared.utils import get_template_vars
@@ -122,6 +123,7 @@ class RepoConfig:
122
123
  self.openai_api_key = repo_config.get('openai_api_key')
123
124
  self.pipelines = repo_config.get('pipelines')
124
125
  self.retry_config = repo_config.get('retry_config')
126
+ self.workspace_config_defaults = repo_config.get('workspace_config_defaults')
125
127
 
126
128
  self.ldap_config = repo_config.get('ldap_config')
127
129
 
@@ -194,6 +196,7 @@ class RepoConfig:
194
196
  spark_config=self.spark_config,
195
197
  variables_dir=self.remote_variables_dir if remote else self.variables_dir,
196
198
  variables_retention_period=self.variables_retention_period,
199
+ workspace_config_defaults=self.workspace_config_defaults
197
200
  )
198
201
 
199
202
  def save(self, **kwargs) -> None: