mage-ai 0.9.73__py3-none-any.whl → 0.9.75__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 (430) hide show
  1. mage_ai/ai/constants.py +2 -2
  2. mage_ai/ai/llm_pipeline_wizard.py +11 -7
  3. mage_ai/ai/openai_client.py +18 -5
  4. mage_ai/api/constants.py +4 -5
  5. mage_ai/api/oauth_scope.py +2 -2
  6. mage_ai/api/operations/constants.py +2 -2
  7. mage_ai/api/presenters/SyncPresenter.py +4 -1
  8. mage_ai/authentication/oauth/constants.py +2 -2
  9. mage_ai/authentication/operation_history/constants.py +2 -2
  10. mage_ai/authentication/permissions/constants.py +5 -6
  11. mage_ai/cache/constants.py +2 -2
  12. mage_ai/cache/dbt/constants.py +2 -3
  13. mage_ai/cluster_manager/constants.py +2 -2
  14. mage_ai/cluster_manager/kubernetes/workload_manager.py +3 -2
  15. mage_ai/command_center/constants.py +13 -13
  16. mage_ai/data_cleaner/column_types/constants.py +2 -2
  17. mage_ai/data_cleaner/transformer_actions/column.py +19 -7
  18. mage_ai/data_cleaner/transformer_actions/constants.py +10 -9
  19. mage_ai/data_integrations/destinations/constants.py +1 -0
  20. mage_ai/data_integrations/sources/constants.py +2 -0
  21. mage_ai/data_preparation/git/utils.py +4 -1
  22. mage_ai/data_preparation/logging/__init__.py +2 -2
  23. mage_ai/data_preparation/logging/logger.py +3 -3
  24. mage_ai/data_preparation/models/block/__init__.py +6 -0
  25. mage_ai/data_preparation/models/block/data_integration/constants.py +2 -2
  26. mage_ai/data_preparation/models/block/dbt/constants.py +3 -3
  27. mage_ai/data_preparation/models/block/dynamic/factory.py +40 -3
  28. mage_ai/data_preparation/models/block/dynamic/utils.py +31 -33
  29. mage_ai/data_preparation/models/block/dynamic/variables.py +1 -1
  30. mage_ai/data_preparation/models/block/settings/dynamic/constants.py +3 -3
  31. mage_ai/data_preparation/models/block/settings/dynamic/mixins.py +63 -4
  32. mage_ai/data_preparation/models/block/settings/global_data_products/models.py +2 -2
  33. mage_ai/data_preparation/models/constants.py +11 -11
  34. mage_ai/data_preparation/models/global_hooks/constants.py +7 -8
  35. mage_ai/data_preparation/models/global_hooks/models.py +5 -5
  36. mage_ai/data_preparation/models/pipeline.py +5 -0
  37. mage_ai/data_preparation/models/project/constants.py +2 -2
  38. mage_ai/data_preparation/models/triggers/__init__.py +6 -4
  39. mage_ai/data_preparation/models/variables/constants.py +5 -5
  40. mage_ai/data_preparation/models/widget/constants.py +5 -5
  41. mage_ai/data_preparation/preferences.py +9 -16
  42. mage_ai/data_preparation/repo_manager.py +2 -2
  43. mage_ai/data_preparation/sync/__init__.py +2 -2
  44. mage_ai/data_preparation/templates/data_exporters/streaming/elasticsearch.yaml +3 -0
  45. mage_ai/data_preparation/templates/data_exporters/streaming/generic_python.py +1 -1
  46. mage_ai/data_preparation/templates/data_loaders/streaming/nats.yaml +9 -3
  47. mage_ai/errors/constants.py +2 -2
  48. mage_ai/io/base.py +57 -16
  49. mage_ai/io/config.py +3 -3
  50. mage_ai/io/export_utils.py +2 -2
  51. mage_ai/io/google_cloud_storage.py +3 -2
  52. mage_ai/io/io_config.py +3 -2
  53. mage_ai/io/oracledb.py +2 -4
  54. mage_ai/io/postgres.py +40 -20
  55. mage_ai/io/utils.py +18 -0
  56. mage_ai/kernels/magic/constants.py +4 -4
  57. mage_ai/orchestration/constants.py +2 -2
  58. mage_ai/orchestration/db/__init__.py +3 -3
  59. mage_ai/orchestration/db/constants.py +2 -2
  60. mage_ai/orchestration/db/models/oauth.py +5 -5
  61. mage_ai/orchestration/db/models/schedules.py +28 -8
  62. mage_ai/orchestration/db/models/schedules_project_platform.py +10 -8
  63. mage_ai/orchestration/job_manager.py +2 -2
  64. mage_ai/orchestration/monitor/monitor_stats.py +2 -2
  65. mage_ai/orchestration/notification/config.py +2 -2
  66. mage_ai/orchestration/pipeline_scheduler_original.py +4 -12
  67. mage_ai/orchestration/queue/config.py +2 -2
  68. mage_ai/orchestration/queue/process_queue.py +3 -3
  69. mage_ai/presenters/charts/data_sources/constants.py +2 -2
  70. mage_ai/presenters/interactions/constants.py +4 -4
  71. mage_ai/presenters/pages/models/constants.py +4 -4
  72. mage_ai/server/constants.py +1 -1
  73. mage_ai/server/frontend_dist/404.html +3 -3
  74. mage_ai/server/frontend_dist/_next/static/38-PtskJFUTYUpRhT1qF_/_buildManifest.js +1 -0
  75. mage_ai/server/frontend_dist/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
  76. mage_ai/server/frontend_dist/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
  77. mage_ai/server/frontend_dist/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
  78. mage_ai/server/frontend_dist/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
  79. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3763-39a5174f6a3924db.js → frontend_dist/_next/static/chunks/3763-aabe2703076636b0.js} +1 -1
  80. mage_ai/server/frontend_dist/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
  81. mage_ai/server/frontend_dist/_next/static/chunks/449-f689774546860ca4.js +1 -0
  82. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
  83. mage_ai/server/frontend_dist/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
  84. mage_ai/server/frontend_dist/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
  85. mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-663c909dcda4c23a.js → _app-13bf3b7dcef50c29.js} +2 -2
  86. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
  87. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
  88. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
  89. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
  90. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
  91. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
  92. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
  93. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/overview-1aad7093c6d39257.js → frontend_dist/_next/static/chunks/pages/manage/overview-aae747f487e08d51.js} +1 -1
  94. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
  95. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
  96. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
  97. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
  98. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{users-a5e9d77ed5b50205.js → users-b99379d0aa6a8c25.js} +1 -1
  99. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
  100. mage_ai/server/frontend_dist/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
  101. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-e51cd04bd4d1fffe.js +1 -0
  102. mage_ai/server/frontend_dist/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
  103. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
  104. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
  105. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
  106. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-432da20df91511fb.js +1 -0
  107. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
  108. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
  109. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
  110. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
  111. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
  112. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-e3d7fdfeb7f806f7.js} +1 -1
  113. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{settings-cd49372ae1702963.js → settings-0abf8a1b7243f93b.js} +1 -1
  114. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
  115. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
  116. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
  117. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js → frontend_dist/_next/static/chunks/pages/pipelines-38187954b6ec4b40.js} +1 -1
  118. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
  119. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
  120. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
  121. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
  122. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
  123. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
  124. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
  125. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
  126. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
  127. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
  128. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
  129. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
  130. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-5212c01a9dc558da.js → users-3ee783f5139c76a1.js} +1 -1
  131. mage_ai/server/frontend_dist/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
  132. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
  133. mage_ai/server/frontend_dist/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
  134. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
  135. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
  136. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
  137. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
  138. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-43534cc51fce8644.js → webpack-0bc44da590c7cf85.js} +1 -1
  139. mage_ai/server/frontend_dist/block-layout.html +3 -3
  140. mage_ai/server/frontend_dist/compute.html +6 -6
  141. mage_ai/server/frontend_dist/files.html +6 -6
  142. mage_ai/server/frontend_dist/global-data-products/[...slug].html +6 -6
  143. mage_ai/server/frontend_dist/global-data-products.html +6 -6
  144. mage_ai/server/frontend_dist/global-hooks/[...slug].html +6 -6
  145. mage_ai/server/frontend_dist/global-hooks.html +6 -6
  146. mage_ai/server/frontend_dist/index.html +3 -3
  147. mage_ai/server/frontend_dist/manage/files.html +6 -6
  148. mage_ai/server/frontend_dist/manage/overview.html +6 -6
  149. mage_ai/server/frontend_dist/manage/pipeline-runs.html +6 -6
  150. mage_ai/server/frontend_dist/manage/settings.html +6 -6
  151. mage_ai/server/frontend_dist/manage/users/[user].html +6 -6
  152. mage_ai/server/frontend_dist/manage/users/new.html +6 -6
  153. mage_ai/server/frontend_dist/manage/users.html +6 -6
  154. mage_ai/server/frontend_dist/manage.html +6 -6
  155. mage_ai/server/frontend_dist/oauth.html +4 -4
  156. mage_ai/server/frontend_dist/overview.html +6 -6
  157. mage_ai/server/frontend_dist/pipeline-runs.html +6 -6
  158. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  159. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +6 -6
  160. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +6 -6
  161. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +3 -3
  162. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +6 -6
  163. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  164. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  165. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +6 -6
  166. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +6 -6
  167. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +6 -6
  168. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +6 -6
  169. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +6 -6
  170. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  171. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +6 -6
  172. mage_ai/server/frontend_dist/pipelines/[pipeline].html +3 -3
  173. mage_ai/server/frontend_dist/pipelines.html +6 -6
  174. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +6 -6
  175. mage_ai/server/frontend_dist/platform/global-hooks.html +6 -6
  176. mage_ai/server/frontend_dist/settings/account/profile.html +6 -6
  177. mage_ai/server/frontend_dist/settings/platform/preferences.html +6 -6
  178. mage_ai/server/frontend_dist/settings/platform/settings.html +6 -6
  179. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +6 -6
  180. mage_ai/server/frontend_dist/settings/workspace/permissions.html +6 -6
  181. mage_ai/server/frontend_dist/settings/workspace/preferences.html +6 -6
  182. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +6 -6
  183. mage_ai/server/frontend_dist/settings/workspace/roles.html +6 -6
  184. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +6 -6
  185. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +6 -6
  186. mage_ai/server/frontend_dist/settings/workspace/users.html +6 -6
  187. mage_ai/server/frontend_dist/settings.html +3 -3
  188. mage_ai/server/frontend_dist/sign-in.html +7 -7
  189. mage_ai/server/frontend_dist/templates/[...slug].html +6 -6
  190. mage_ai/server/frontend_dist/templates.html +6 -6
  191. mage_ai/server/frontend_dist/terminal.html +6 -6
  192. mage_ai/server/frontend_dist/test.html +3 -3
  193. mage_ai/server/frontend_dist/triggers.html +6 -6
  194. mage_ai/server/frontend_dist/v2/canvas.html +2 -2
  195. mage_ai/server/frontend_dist/v2.html +2 -2
  196. mage_ai/server/frontend_dist/version-control.html +6 -6
  197. mage_ai/server/frontend_dist_base_path_template/404.html +3 -3
  198. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
  199. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
  200. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
  201. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
  202. mage_ai/server/{frontend_dist/_next/static/chunks/3763-39a5174f6a3924db.js → frontend_dist_base_path_template/_next/static/chunks/3763-aabe2703076636b0.js} +1 -1
  203. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
  204. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/449-f689774546860ca4.js +1 -0
  205. mage_ai/server/{frontend_dist/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist_base_path_template/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
  206. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
  207. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
  208. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-bb4a0e0d783622a8.js → _app-0392ef723ea2c6f8.js} +2 -2
  209. mage_ai/server/{frontend_dist/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist_base_path_template/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
  210. mage_ai/server/{frontend_dist/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist_base_path_template/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
  211. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
  212. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
  213. mage_ai/server/{frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
  214. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
  215. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
  216. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/overview-1aad7093c6d39257.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/overview-aae747f487e08d51.js} +1 -1
  217. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
  218. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
  219. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
  220. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
  221. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{users-a5e9d77ed5b50205.js → users-b99379d0aa6a8c25.js} +1 -1
  222. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
  223. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
  224. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-e51cd04bd4d1fffe.js +1 -0
  225. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
  226. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
  227. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
  228. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
  229. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-432da20df91511fb.js +1 -0
  230. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
  231. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
  232. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
  233. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
  234. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
  235. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-e3d7fdfeb7f806f7.js} +1 -1
  236. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{settings-cd49372ae1702963.js → settings-0abf8a1b7243f93b.js} +1 -1
  237. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
  238. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
  240. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-38187954b6ec4b40.js} +1 -1
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
  242. mage_ai/server/{frontend_dist/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
  243. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
  245. mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
  246. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
  247. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
  248. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
  250. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
  251. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-5212c01a9dc558da.js → users-3ee783f5139c76a1.js} +1 -1
  254. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
  255. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
  256. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
  257. mage_ai/server/{frontend_dist/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist_base_path_template/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
  258. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
  259. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
  260. mage_ai/server/{frontend_dist/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist_base_path_template/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
  261. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-9eb1dd2ee735aaac.js → webpack-12ad70eb5c31aa92.js} +1 -1
  262. mage_ai/server/frontend_dist_base_path_template/_next/static/dxnSzgIvSG4Ke5LM-tPQX/_buildManifest.js +1 -0
  263. mage_ai/server/frontend_dist_base_path_template/block-layout.html +3 -3
  264. mage_ai/server/frontend_dist_base_path_template/compute.html +6 -6
  265. mage_ai/server/frontend_dist_base_path_template/files.html +6 -6
  266. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +6 -6
  267. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +6 -6
  268. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +6 -6
  269. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +6 -6
  270. mage_ai/server/frontend_dist_base_path_template/index.html +3 -3
  271. mage_ai/server/frontend_dist_base_path_template/manage/files.html +6 -6
  272. mage_ai/server/frontend_dist_base_path_template/manage/overview.html +6 -6
  273. mage_ai/server/frontend_dist_base_path_template/manage/pipeline-runs.html +6 -6
  274. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +6 -6
  275. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +6 -6
  276. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +6 -6
  277. mage_ai/server/frontend_dist_base_path_template/manage/users.html +6 -6
  278. mage_ai/server/frontend_dist_base_path_template/manage.html +6 -6
  279. mage_ai/server/frontend_dist_base_path_template/oauth.html +5 -5
  280. mage_ai/server/frontend_dist_base_path_template/overview.html +6 -6
  281. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +6 -6
  282. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  283. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +6 -6
  284. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +6 -6
  285. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +3 -3
  286. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +6 -6
  287. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  288. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  289. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +6 -6
  290. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +6 -6
  291. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +6 -6
  292. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +6 -6
  293. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +6 -6
  294. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  295. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +6 -6
  296. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +3 -3
  297. mage_ai/server/frontend_dist_base_path_template/pipelines.html +6 -6
  298. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +6 -6
  299. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +6 -6
  300. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +6 -6
  301. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +6 -6
  302. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +6 -6
  303. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +6 -6
  304. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +6 -6
  305. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +6 -6
  306. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +6 -6
  307. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +6 -6
  308. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +6 -6
  309. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +6 -6
  310. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +6 -6
  311. mage_ai/server/frontend_dist_base_path_template/settings.html +3 -3
  312. mage_ai/server/frontend_dist_base_path_template/sign-in.html +7 -7
  313. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +6 -6
  314. mage_ai/server/frontend_dist_base_path_template/templates.html +6 -6
  315. mage_ai/server/frontend_dist_base_path_template/terminal.html +6 -6
  316. mage_ai/server/frontend_dist_base_path_template/test.html +3 -3
  317. mage_ai/server/frontend_dist_base_path_template/triggers.html +6 -6
  318. mage_ai/server/frontend_dist_base_path_template/v2/canvas.html +2 -2
  319. mage_ai/server/frontend_dist_base_path_template/v2.html +2 -2
  320. mage_ai/server/frontend_dist_base_path_template/version-control.html +6 -6
  321. mage_ai/server/kernel_output_parser.py +2 -3
  322. mage_ai/server/kernels.py +2 -3
  323. mage_ai/server/scheduler_manager.py +2 -2
  324. mage_ai/server/server.py +21 -0
  325. mage_ai/server/websockets/constants.py +4 -4
  326. mage_ai/services/compute/aws/constants.py +2 -2
  327. mage_ai/services/compute/aws/steps.py +16 -10
  328. mage_ai/services/compute/constants.py +4 -4
  329. mage_ai/services/compute/models.py +4 -4
  330. mage_ai/services/k8s/config.py +4 -0
  331. mage_ai/services/k8s/job_manager.py +2 -0
  332. mage_ai/services/spark/constants.py +3 -3
  333. mage_ai/services/spark/models/jobs.py +2 -2
  334. mage_ai/services/spark/models/sqls.py +2 -2
  335. mage_ai/services/spark/models/stages.py +4 -4
  336. mage_ai/services/spark/models/threads.py +2 -2
  337. mage_ai/services/teams/config.py +13 -2
  338. mage_ai/services/teams/teams.py +13 -11
  339. mage_ai/settings/backends.py +3 -2
  340. mage_ai/settings/models/configuration_option.py +3 -3
  341. mage_ai/settings/server.py +5 -0
  342. mage_ai/shared/constants.py +4 -2
  343. mage_ai/shared/custom_logger.py +13 -13
  344. mage_ai/shared/enum.py +8 -0
  345. mage_ai/shared/environments.py +27 -3
  346. mage_ai/shared/logger.py +2 -2
  347. mage_ai/shared/models.py +2 -1
  348. mage_ai/streaming/constants.py +3 -3
  349. mage_ai/streaming/sinks/elasticsearch.py +15 -5
  350. mage_ai/streaming/sinks/kafka.py +2 -2
  351. mage_ai/streaming/sinks/postgres.py +6 -0
  352. mage_ai/streaming/sources/amazon_sqs.py +2 -2
  353. mage_ai/streaming/sources/base.py +2 -2
  354. mage_ai/streaming/sources/kafka.py +20 -4
  355. mage_ai/streaming/sources/nats_js.py +10 -3
  356. mage_ai/streaming/sources/shared.py +3 -2
  357. mage_ai/system/constants.py +2 -2
  358. mage_ai/tests/api/endpoints/test_blocks.py +1 -101
  359. mage_ai/tests/api/endpoints/test_configuration_options.py +1 -48
  360. mage_ai/tests/api/endpoints/test_configuration_options_project_platform.py +68 -0
  361. mage_ai/tests/api/endpoints/test_custom_designs.py +1 -106
  362. mage_ai/tests/api/endpoints/test_custom_designs_project_platform.py +132 -0
  363. mage_ai/tests/api/endpoints/test_dbt_blocks.py +111 -0
  364. mage_ai/tests/api/endpoints/test_file_contents.py +0 -48
  365. mage_ai/tests/api/endpoints/test_file_contents_with_project_platform.py +66 -0
  366. mage_ai/tests/api/endpoints/test_pipelines.py +0 -134
  367. mage_ai/tests/api/endpoints/test_pipelines_with_project_platform.py +143 -0
  368. mage_ai/tests/api/policies/permissions/test_base_policy_with_permissions.py +2 -2
  369. mage_ai/tests/data_cleaner/transformer_actions/test_trim_transformer.py +161 -0
  370. mage_ai/tests/data_preparation/models/block/dbt/test_profiles.py +1 -1
  371. mage_ai/tests/data_preparation/models/block/dynamic/test_combos.py +1 -1
  372. mage_ai/tests/data_preparation/models/block/hook/test_hook_block.py +3 -2
  373. mage_ai/tests/data_preparation/models/test_block.py +7 -0
  374. mage_ai/tests/data_preparation/models/test_blocks_helper.py +1 -1
  375. mage_ai/tests/data_preparation/models/variables/test_summarizer.py +1 -1
  376. mage_ai/tests/data_preparation/sync/test_git_sync.py +6 -6
  377. mage_ai/tests/data_preparation/test_repo_manager.py +0 -63
  378. mage_ai/tests/data_preparation/test_repo_manager_project_platform.py +67 -0
  379. mage_ai/tests/data_preparation/test_variable_manager.py +0 -51
  380. mage_ai/tests/data_preparation/test_variable_manager_project_platform.py +41 -0
  381. mage_ai/tests/io/create_table/test_postgresql.py +27 -0
  382. mage_ai/tests/orchestration/notification/test_config.py +3 -3
  383. mage_ai/tests/orchestration/queue/test_process_queue.py +3 -2
  384. mage_ai/tests/orchestration/test_pipeline_scheduler.py +1 -0
  385. mage_ai/tests/settings/test_platform.py +2 -2
  386. mage_ai/tests/streaming/sinks/test_generic_io.py +25 -21
  387. mage_ai/usage_statistics/constants.py +4 -4
  388. mage_ai-0.9.75.dist-info/METADATA +377 -0
  389. {mage_ai-0.9.73.dist-info → mage_ai-0.9.75.dist-info}/RECORD +397 -388
  390. {mage_ai-0.9.73.dist-info → mage_ai-0.9.75.dist-info}/WHEEL +1 -1
  391. mage_ai/server/frontend_dist/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
  392. mage_ai/server/frontend_dist/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
  393. mage_ai/server/frontend_dist/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
  394. mage_ai/server/frontend_dist/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
  395. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
  396. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
  397. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
  398. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
  399. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
  400. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
  401. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
  402. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
  403. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
  404. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
  405. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
  406. mage_ai/server/frontend_dist/_next/static/kxGpiudO3f9aX6FAiqydf/_buildManifest.js +0 -1
  407. mage_ai/server/frontend_dist_base_path_template/_next/static/H5pcGxWf1BkhXDRs2BqiI/_buildManifest.js +0 -1
  408. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
  409. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
  410. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
  411. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
  412. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
  413. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
  414. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
  415. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
  416. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
  417. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
  418. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
  419. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
  420. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
  421. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
  422. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
  423. mage_ai-0.9.73.dist-info/METADATA +0 -543
  424. /mage_ai/server/frontend_dist/_next/static/{kxGpiudO3f9aX6FAiqydf → 38-PtskJFUTYUpRhT1qF_}/_ssgManifest.js +0 -0
  425. /mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-663c909dcda4c23a.js.LICENSE.txt → _app-13bf3b7dcef50c29.js.LICENSE.txt} +0 -0
  426. /mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-bb4a0e0d783622a8.js.LICENSE.txt → _app-0392ef723ea2c6f8.js.LICENSE.txt} +0 -0
  427. /mage_ai/server/frontend_dist_base_path_template/_next/static/{H5pcGxWf1BkhXDRs2BqiI → dxnSzgIvSG4Ke5LM-tPQX}/_ssgManifest.js +0 -0
  428. {mage_ai-0.9.73.dist-info → mage_ai-0.9.75.dist-info}/LICENSE +0 -0
  429. {mage_ai-0.9.73.dist-info → mage_ai-0.9.75.dist-info}/entry_points.txt +0 -0
  430. {mage_ai-0.9.73.dist-info → mage_ai-0.9.75.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
  DBT_DIRECTORY_NAME = 'dbt'
4
4
 
@@ -13,12 +13,12 @@ SKIP_LIMIT_ADAPTER_NAMES = [
13
13
  ]
14
14
 
15
15
 
16
- class Flag(str, Enum):
16
+ class Flag(StrEnum):
17
17
  PROFILES_DIR = 'profiles-dir'
18
18
  PROJECT_DIR = 'project-dir'
19
19
 
20
20
 
21
- class LogLevel(str, Enum):
21
+ class LogLevel(StrEnum):
22
22
  DEBUG = 'debug'
23
23
  INFO = 'info'
24
24
  WARN = 'warn'
@@ -39,6 +39,26 @@ def calculate_item_count(
39
39
  check_upstream_block_uuids_only: Optional[List[str]] = None,
40
40
  update_upstream_item_count_callback: Optional[Callable] = None,
41
41
  ) -> int:
42
+ """
43
+ Calculates the item count for a given block based on its upstream blocks' output.
44
+
45
+ This method builds counters for the block and multiplies their item counts to determine
46
+ the total item count. If a counter has an item count of zero and is included in
47
+ `check_upstream_block_uuids_only`, the method recursively calculates the item count
48
+ for the corresponding upstream block. An optional callback can be provided to update
49
+ the item count based on upstream block outputs.
50
+
51
+ Args:
52
+ block: The block for which to calculate the item count.
53
+ execution_partition (Optional[str]): The execution partition identifier.
54
+ check_upstream_block_uuids_only (Optional[List[str]]): A list of UUIDs for upstream blocks
55
+ to check when their item count is zero.
56
+ update_upstream_item_count_callback (Optional[Callable]): A callback function that can
57
+ update the item count based on the upstream block's output.
58
+
59
+ Returns:
60
+ int: The calculated item count for the block.
61
+ """
42
62
  counters = build_counters(block, execution_partition)
43
63
 
44
64
  uuid_counts = [
@@ -95,7 +115,9 @@ class DynamicBlockFactory(DynamicBlockWrapperBase):
95
115
  ])
96
116
 
97
117
  # If item count is 0 because the upstream blocks haven’t output anything yet
98
- item_count_total = max(self.__calculate_item_count(), upstream_blocks_count)
118
+ item_count_total = self.__calculate_item_count()
119
+ if item_count_total == 0:
120
+ item_count_total = upstream_blocks_count
99
121
 
100
122
  upstream_block_runs = self.__upstream_block_runs()
101
123
  upstream_block_runs_completed = len([
@@ -174,6 +196,19 @@ class DynamicBlockFactory(DynamicBlockWrapperBase):
174
196
  return self._counters
175
197
 
176
198
  def __calculate_item_count(self) -> int:
199
+ """
200
+ Calculates the item count for the current block, ensuring downstream execution even if an
201
+ upstream block has no output.
202
+
203
+ This method calculates the item count by checking the output of upstream blocks. If an
204
+ upstream block has been spawned multiple times but has no output, it ensures that the
205
+ downstream block is still executed by returning an item count of 1. An internal callback
206
+ updates the item count based on the upstream block's completed runs.
207
+
208
+ Returns:
209
+ int: The calculated item count for the block, ensuring downstream block execution.
210
+ """
211
+
177
212
  # If an upstream block indeed has no output (e.g. no return statement),
178
213
  # we need to ensure that the downstream block is still executed.
179
214
 
@@ -226,10 +261,12 @@ class DynamicBlockFactory(DynamicBlockWrapperBase):
226
261
  if completed_count == spawn_count:
227
262
  return 1
228
263
 
229
- # If no upstream block has been spawned,
264
+ # If no upstream block has been spawned and the upstream block runs are completed,
230
265
  # we need to return 1 so that the downstream block is still executed.
231
266
  if spawn_count == 0:
232
- return 1
267
+ upstream_block_runs = self.__upstream_block_runs()
268
+ if all(b.status == BlockRun.BlockRunStatus.COMPLETED for b in upstream_block_runs):
269
+ return 1
233
270
 
234
271
  return output_item_count
235
272
 
@@ -1,7 +1,6 @@
1
1
  import json
2
2
  import os
3
3
  from dataclasses import dataclass, field
4
- from enum import Enum
5
4
  from typing import Any, Dict, List, Optional, Tuple, Union
6
5
 
7
6
  import pandas as pd
@@ -38,11 +37,12 @@ from mage_ai.data_preparation.models.utils import (
38
37
  from mage_ai.server.kernel_output_parser import DataType
39
38
  from mage_ai.shared.array import find
40
39
  from mage_ai.shared.custom_logger import DX_PRINTER
40
+ from mage_ai.shared.enum import StrEnum
41
41
  from mage_ai.shared.hash import ignore_keys_with_blank_values
42
42
  from mage_ai.shared.models import BaseDataClass
43
43
 
44
44
 
45
- class DynamicBlockFlag(str, Enum):
45
+ class DynamicBlockFlag(StrEnum):
46
46
  CLONE_OF_ORIGINAL = 'clone_of_original'
47
47
  DYNAMIC = 'dynamic'
48
48
  DYNAMIC_CHILD = 'dynamic_child'
@@ -1012,42 +1012,40 @@ def check_all_dynamic_upstreams_completed(
1012
1012
  execution_partition=execution_partition,
1013
1013
  pipeline=pipeline,
1014
1014
  ):
1015
- if not upstream_block.upstream_blocks:
1016
- return True
1017
-
1018
1015
  from mage_ai.orchestration.db.models.schedules import BlockRun
1019
1016
 
1020
- upstreams_done = all([
1021
- check_all_dynamic_upstreams_completed(
1022
- b,
1023
- block_runs=block_runs,
1024
- execution_partition=execution_partition,
1025
- )
1026
- for b in upstream_block.upstream_blocks
1027
- ])
1017
+ if upstream_block.upstream_blocks:
1018
+ upstreams_done = all([
1019
+ check_all_dynamic_upstreams_completed(
1020
+ b,
1021
+ block_runs=block_runs,
1022
+ execution_partition=execution_partition,
1023
+ )
1024
+ for b in upstream_block.upstream_blocks
1025
+ ])
1028
1026
 
1029
- if not upstreams_done:
1030
- return False
1027
+ if not upstreams_done:
1028
+ return False
1031
1029
 
1032
- is_dynamic_child = is_dynamic_block_child(upstream_block)
1033
- if is_dynamic_child:
1034
- combos = build_combinations_for_dynamic_child(
1035
- upstream_block,
1036
- execution_partition=execution_partition,
1037
- )
1030
+ is_dynamic_child = is_dynamic_block_child(upstream_block)
1031
+ if is_dynamic_child:
1032
+ combos = build_combinations_for_dynamic_child(
1033
+ upstream_block,
1034
+ execution_partition=execution_partition,
1035
+ )
1038
1036
 
1039
- selected = [
1040
- br
1041
- for br in block_runs
1042
- if pipeline.get_block(
1043
- br.block_uuid,
1044
- ).uuid
1045
- == upstream_block.uuid
1046
- and br.status == BlockRun.BlockRunStatus.COMPLETED
1047
- ]
1048
-
1049
- if len(list(selected)) < len(combos) + 1:
1050
- return False
1037
+ selected = [
1038
+ br
1039
+ for br in block_runs
1040
+ if pipeline.get_block(
1041
+ br.block_uuid,
1042
+ ).uuid
1043
+ == upstream_block.uuid
1044
+ and br.status == BlockRun.BlockRunStatus.COMPLETED
1045
+ ]
1046
+
1047
+ if len(list(selected)) < len(combos) + 1:
1048
+ return False
1051
1049
 
1052
1050
  return all([
1053
1051
  br.status == BlockRun.BlockRunStatus.COMPLETED
@@ -734,7 +734,7 @@ def fetch_input_variables_for_dynamic_upstream_blocks(
734
734
  )
735
735
  if index is not None:
736
736
  pair = lazy_variable_controller.render(
737
- child_dynamic_block_index=dynamic_block_index,
737
+ child_dynamic_block_index=index,
738
738
  )
739
739
  child_data, metadata = pair
740
740
 
@@ -1,8 +1,8 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
- DEFAULT_STREAM_POLL_INTERVAL = 60
3
+ DEFAULT_STREAM_POLL_INTERVAL = 15
4
4
 
5
5
 
6
- class ModeType(str, Enum):
6
+ class ModeType(StrEnum):
7
7
  DEFAULT = 'default'
8
8
  STREAM = 'stream'
@@ -45,7 +45,12 @@ class DynamicMixin:
45
45
 
46
46
  @property
47
47
  def is_dynamic_parent(self) -> bool:
48
- return self.__dynamic_configuration().parent is not None
48
+ parent = self.__dynamic_configuration().parent
49
+ if isinstance(parent, bool):
50
+ return parent
51
+ elif isinstance(parent, list):
52
+ return len(parent) > 0
53
+ return parent is not None
49
54
 
50
55
  @property
51
56
  def is_dynamic_child(self) -> bool:
@@ -57,6 +62,20 @@ class DynamicMixin:
57
62
 
58
63
  @property
59
64
  def is_dynamic_child_streaming(self) -> bool:
65
+ """
66
+ Indicates whether current block is dynamic child with stream mode.
67
+
68
+ This property checks if the current block is in dynamic v2 mode (`self.is_dynamic_v2`)
69
+ and whether any of its upstream blocks either:
70
+ - Should dynamically generate the current block and have dynamic stream mode enabled, or
71
+ - recursively check whether upstream block is dynamic child block with stream mode.
72
+
73
+ If any of these conditions are met for any upstream block, the current block is dynamic
74
+ child with stream mode.
75
+
76
+ Returns:
77
+ bool: `True` if current block is dynamic child with stream mode., `False` otherwise.
78
+ """
60
79
  return self.is_dynamic_v2 and any(
61
80
  (
62
81
  upstream_block.should_dynamically_generate_block(self)
@@ -68,10 +87,24 @@ class DynamicMixin:
68
87
 
69
88
  @property
70
89
  def should_reduce_output(self) -> bool:
71
- return self.__dynamic_configuration().reduce_output is not None
90
+ reduce_output = self.__dynamic_configuration().reduce_output
91
+ if isinstance(reduce_output, bool):
92
+ return reduce_output
93
+ elif isinstance(reduce_output, list):
94
+ return len(reduce_output) > 0
95
+ return reduce_output is not None
72
96
 
73
97
  @property
74
98
  def is_dynamic_stream_mode_enabled(self) -> bool:
99
+ """
100
+ Indicates whether dynamic stream mode is enabled.
101
+
102
+ This property checks if the setting "type: stream" is in the modes list.
103
+ If the settings are present, dynamic stream mode is considered enabled.
104
+
105
+ Returns:
106
+ bool: `True` if dynamic stream mode is enabled, `False` otherwise.
107
+ """
75
108
  return self.settings_for_mode(ModeType.STREAM) is not None
76
109
 
77
110
  def build_dynamic_uuid(self, index: int) -> str:
@@ -98,6 +131,22 @@ class DynamicMixin:
98
131
  return False
99
132
 
100
133
  def should_dynamically_generate_block(self, block) -> bool:
134
+ """
135
+ Determines whether a block should be dynamically generated based on the parent
136
+ configuration.
137
+
138
+ This method checks the `parent` attribute from the dynamic configuration.
139
+ - If `parent` is `True`, the block should be dynamically generated.
140
+ - If `parent` is a list, the block should be dynamically generated only if its UUID is
141
+ present in the `parent` list.
142
+ - If `parent` is neither `True` nor a list, the block should not be dynamically generated.
143
+
144
+ Args:
145
+ block: The block object that contains the `uuid` attribute to be checked.
146
+
147
+ Returns:
148
+ bool: `True` if the block should be dynamically generated, `False` otherwise.
149
+ """
101
150
  parent = self.__dynamic_configuration().parent
102
151
 
103
152
  if parent is True:
@@ -111,8 +160,18 @@ class DynamicMixin:
111
160
  def __dynamic_configuration(self) -> DynamicConfiguration:
112
161
  if self.configuration:
113
162
  config = self.configuration.get('dynamic', {})
163
+ reduce_output = self.configuration.get('reduce_output')
114
164
  if config and isinstance(config, dict):
115
- return DynamicConfiguration.load(**config)
165
+ dynamic_configuration = DynamicConfiguration.load(**config)
116
166
  elif isinstance(config, DynamicConfiguration):
117
- return config
167
+ dynamic_configuration = config
168
+ else:
169
+ dynamic_configuration = DynamicConfiguration()
170
+
171
+ # For backward compatible with dynamic block v1
172
+ if isinstance(config, bool):
173
+ dynamic_configuration.parent = config
174
+ if isinstance(reduce_output, bool):
175
+ dynamic_configuration.reduce_output = reduce_output
176
+ return dynamic_configuration
118
177
  return DynamicConfiguration()
@@ -1,11 +1,11 @@
1
1
  from dataclasses import dataclass
2
- from enum import Enum
3
2
  from typing import Optional
4
3
 
4
+ from mage_ai.shared.enum import StrEnum
5
5
  from mage_ai.shared.models import BaseDataClass
6
6
 
7
7
 
8
- class GlobalDataProductObjectType(str, Enum):
8
+ class GlobalDataProductObjectType(StrEnum):
9
9
  BLOCK = 'block'
10
10
  PIPELINE = 'pipeline'
11
11
 
@@ -1,9 +1,9 @@
1
1
  import os
2
- from enum import Enum
3
2
 
4
3
  from mage_ai.data_preparation.models.variables.constants import (
5
4
  VariableAggregateDataType,
6
5
  )
6
+ from mage_ai.shared.enum import StrEnum
7
7
 
8
8
  DATAFRAME_ANALYSIS_KEYS = frozenset([
9
9
  VariableAggregateDataType.INSIGHTS.value,
@@ -15,7 +15,7 @@ DATA_INTEGRATION_CATALOG_FILE = 'data_integration_catalog.json'
15
15
  DATAFRAME_ANALYSIS_MAX_COLUMNS = 100
16
16
  DATAFRAME_ANALYSIS_MAX_ROWS = 100_000
17
17
  DATAFRAME_SAMPLE_COUNT = 1000
18
- DATAFRAME_SAMPLE_COUNT_PREVIEW = 10
18
+ DATAFRAME_SAMPLE_COUNT_PREVIEW = int(os.getenv('DATAFRAME_SAMPLE_COUNT_PREVIEW', 10) or 10)
19
19
  DATAFRAME_SAMPLE_MAX_COLUMNS = 1000
20
20
  DYNAMIC_CHILD_BLOCK_SAMPLE_COUNT_PREVIEW = 10
21
21
  LOGS_SUBDIR = '.logs'
@@ -31,12 +31,12 @@ VARIABLE_DIR = '.variables'
31
31
  PIPELINE_RUN_STATUS_LAST_RUN_FAILED = 'last_run_failed'
32
32
 
33
33
 
34
- class AIMode(str, Enum):
34
+ class AIMode(StrEnum):
35
35
  OPEN_AI = 'open_ai'
36
36
  HUGGING_FACE = 'hugging_face'
37
37
 
38
38
 
39
- class BlockLanguage(str, Enum):
39
+ class BlockLanguage(StrEnum):
40
40
  MARKDOWN = 'markdown'
41
41
  PYTHON = 'python'
42
42
  R = 'r'
@@ -44,14 +44,14 @@ class BlockLanguage(str, Enum):
44
44
  YAML = 'yaml'
45
45
 
46
46
 
47
- class BlockStatus(str, Enum):
47
+ class BlockStatus(StrEnum):
48
48
  EXECUTED = 'executed'
49
49
  FAILED = 'failed'
50
50
  NOT_EXECUTED = 'not_executed'
51
51
  UPDATED = 'updated'
52
52
 
53
53
 
54
- class BlockType(str, Enum):
54
+ class BlockType(StrEnum):
55
55
  CALLBACK = 'callback'
56
56
  CONDITIONAL = 'conditional'
57
57
  CHART = 'chart'
@@ -71,7 +71,7 @@ class BlockType(str, Enum):
71
71
  PIPELINE = 'pipeline'
72
72
 
73
73
 
74
- class BlockColor(str, Enum):
74
+ class BlockColor(StrEnum):
75
75
  BLUE = 'blue'
76
76
  GREY = 'grey'
77
77
  PINK = 'pink'
@@ -80,12 +80,12 @@ class BlockColor(str, Enum):
80
80
  YELLOW = 'yellow'
81
81
 
82
82
 
83
- class CallbackStatus(str, Enum):
83
+ class CallbackStatus(StrEnum):
84
84
  FAILURE = 'failure'
85
85
  SUCCESS = 'success'
86
86
 
87
87
 
88
- class ExecutorType(str, Enum):
88
+ class ExecutorType(StrEnum):
89
89
  AZURE_CONTAINER_INSTANCE = 'azure_container_instance'
90
90
  ECS = 'ecs'
91
91
  GCP_CLOUD_RUN = 'gcp_cloud_run'
@@ -100,7 +100,7 @@ class ExecutorType(str, Enum):
100
100
  return executor_type.upper() in cls.__members__
101
101
 
102
102
 
103
- class PipelineType(str, Enum):
103
+ class PipelineType(StrEnum):
104
104
  INTEGRATION = 'integration'
105
105
  DATABRICKS = 'databricks'
106
106
  PYTHON = 'python'
@@ -109,7 +109,7 @@ class PipelineType(str, Enum):
109
109
  EXECUTION_FRAMEWORK = 'execution_framework'
110
110
 
111
111
 
112
- class PipelineStatus(str, Enum):
112
+ class PipelineStatus(StrEnum):
113
113
  ACTIVE = ('active',) # At least one active trigger
114
114
  INACTIVE = ('inactive',) # All inactive triggers
115
115
  NO_SCHEDULES = ('no_schedules',) # No triggers
@@ -1,6 +1,5 @@
1
- from enum import Enum
2
-
3
1
  from mage_ai.authentication.permissions.constants import EntityName
2
+ from mage_ai.shared.enum import StrEnum
4
3
 
5
4
  GLOBAL_HOOKS_FILENAME = 'global_hooks.yaml'
6
5
 
@@ -30,7 +29,7 @@ RESTRICTED_RESOURCE_TYPES = [
30
29
  RESOURCE_TYPES = [en for en in EntityName if en not in DISABLED_RESOURCE_TYPES]
31
30
 
32
31
 
33
- class HookOutputKey(str, Enum):
32
+ class HookOutputKey(StrEnum):
34
33
  ERROR = 'error'
35
34
  META = 'meta'
36
35
  METADATA = 'metadata'
@@ -40,7 +39,7 @@ class HookOutputKey(str, Enum):
40
39
  RESOURCES = 'resources'
41
40
 
42
41
 
43
- class HookInputKey(str, Enum):
42
+ class HookInputKey(StrEnum):
44
43
  HOOK = 'hook'
45
44
  PROJECT = 'project'
46
45
  RESOURCE_ID = 'resource_id'
@@ -67,12 +66,12 @@ VALID_KEYS_FOR_INPUT_OUTPUT_DATA_ALL = \
67
66
  INTERNAL_DEFAULT_PREDICATE_VALUE = '__INTERNAL_DEFAULT_PREDICATE_VALUE__'
68
67
 
69
68
 
70
- class PredicateAndOrOperator(str, Enum):
69
+ class PredicateAndOrOperator(StrEnum):
71
70
  AND = 'and'
72
71
  OR = 'or'
73
72
 
74
73
 
75
- class PredicateObjectType(str, Enum):
74
+ class PredicateObjectType(StrEnum):
76
75
  ERROR = HookOutputKey.ERROR.value
77
76
  HOOK = HookInputKey.HOOK.value
78
77
  META = HookOutputKey.META.value
@@ -89,7 +88,7 @@ class PredicateObjectType(str, Enum):
89
88
  USER = HookInputKey.USER.value
90
89
 
91
90
 
92
- class PredicateOperator(str, Enum):
91
+ class PredicateOperator(StrEnum):
93
92
  EQUALS = 'EQUALS'
94
93
  GREATER_THAN = 'GREATER_THAN'
95
94
  GREATER_THAN_OR_EQUALS = 'GREATER_THAN_OR_EQUALS'
@@ -102,7 +101,7 @@ class PredicateOperator(str, Enum):
102
101
  PRESENT = 'PRESENT'
103
102
 
104
103
 
105
- class PredicateValueDataType(str, Enum):
104
+ class PredicateValueDataType(StrEnum):
106
105
  BOOLEAN = 'BOOLEAN'
107
106
  DICTIONARY = 'DICTIONARY'
108
107
  FLOAT = 'FLOAT'
@@ -2,7 +2,6 @@ import hashlib
2
2
  import os
3
3
  from dataclasses import dataclass, field, make_dataclass
4
4
  from datetime import datetime
5
- from enum import Enum
6
5
  from typing import Dict, List, Tuple, Union
7
6
 
8
7
  import yaml
@@ -30,6 +29,7 @@ from mage_ai.settings.platform import (
30
29
  )
31
30
  from mage_ai.settings.repo import get_repo_path
32
31
  from mage_ai.shared.array import find, find_index, flatten
32
+ from mage_ai.shared.enum import StrEnum
33
33
  from mage_ai.shared.environments import is_debug, is_test
34
34
  from mage_ai.shared.hash import (
35
35
  dig,
@@ -44,7 +44,7 @@ from mage_ai.shared.models import BaseDataClass
44
44
  from mage_ai.shared.multi import run_parallel_multiple_args
45
45
 
46
46
 
47
- class HookOperation(str, Enum):
47
+ class HookOperation(StrEnum):
48
48
  CREATE = OperationType.CREATE.value
49
49
  DELETE = OperationType.DELETE.value
50
50
  DETAIL = OperationType.DETAIL.value
@@ -54,18 +54,18 @@ class HookOperation(str, Enum):
54
54
  UPDATE_ANYWHERE = 'update_anywhere'
55
55
 
56
56
 
57
- class HookCondition(str, Enum):
57
+ class HookCondition(StrEnum):
58
58
  FAILURE = 'failure'
59
59
  SUCCESS = 'success'
60
60
 
61
61
 
62
- class HookStrategy(str, Enum):
62
+ class HookStrategy(StrEnum):
63
63
  BREAK = 'break'
64
64
  CONTINUE = 'continue'
65
65
  RAISE = 'raise'
66
66
 
67
67
 
68
- class HookStage(str, Enum):
68
+ class HookStage(StrEnum):
69
69
  AFTER = 'after'
70
70
  BEFORE = 'before'
71
71
 
@@ -4,6 +4,7 @@ import json
4
4
  import os
5
5
  import shutil
6
6
  import tempfile
7
+ import time
7
8
  import zipfile
8
9
  from datetime import datetime, timezone
9
10
  from io import BytesIO
@@ -2328,6 +2329,10 @@ class Pipeline:
2328
2329
  extension_uuid: str = None,
2329
2330
  widget: bool = False,
2330
2331
  ):
2332
+ # Introduce a small delay to prevent multiple changes from generating
2333
+ # identical timestamps for the pipeline YAML file
2334
+ time.sleep(0.0004)
2335
+
2331
2336
  blocks_current = sorted([b.uuid for b in self.blocks_by_uuid.values()])
2332
2337
 
2333
2338
  if block_uuid is not None:
@@ -1,7 +1,7 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
 
4
- class FeatureUUID(str, Enum):
4
+ class FeatureUUID(StrEnum):
5
5
  ADD_NEW_BLOCK_V2 = 'add_new_block_v2'
6
6
  AUTOMATIC_KERNEL_CLEANUP = 'automatic_kernel_cleanup'
7
7
  CODE_BLOCK_V2 = 'code_block_v2'
@@ -1,4 +1,3 @@
1
- import enum
2
1
  import os
3
2
  import traceback
4
3
  from dataclasses import dataclass, field
@@ -12,6 +11,7 @@ from mage_ai.data_preparation.models.constants import PIPELINES_FOLDER
12
11
  from mage_ai.settings.repo import get_repo_path
13
12
  from mage_ai.shared.config import BaseConfig
14
13
  from mage_ai.shared.constants import VALID_ENVS
14
+ from mage_ai.shared.enum import StrEnum
15
15
  from mage_ai.shared.hash import index_by
16
16
  from mage_ai.shared.io import safe_write
17
17
  from mage_ai.shared.yaml import load_yaml
@@ -19,12 +19,12 @@ from mage_ai.shared.yaml import load_yaml
19
19
  TRIGGER_FILE_NAME = 'triggers.yaml'
20
20
 
21
21
 
22
- class ScheduleStatus(str, enum.Enum):
22
+ class ScheduleStatus(StrEnum):
23
23
  ACTIVE = 'active'
24
24
  INACTIVE = 'inactive'
25
25
 
26
26
 
27
- class ScheduleType(str, enum.Enum):
27
+ class ScheduleType(StrEnum):
28
28
  API = 'api'
29
29
  EVENT = 'event'
30
30
  TIME = 'time'
@@ -37,7 +37,7 @@ SCHEDULE_TYPE_TO_LABEL = {
37
37
  }
38
38
 
39
39
 
40
- class ScheduleInterval(str, enum.Enum):
40
+ class ScheduleInterval(StrEnum):
41
41
  ONCE = '@once'
42
42
  HOURLY = '@hourly'
43
43
  DAILY = '@daily'
@@ -266,6 +266,8 @@ def build_triggers(
266
266
 
267
267
  # Add flag to settings so frontend can detect triggers with invalid cron expressions
268
268
  if not trigger.has_valid_schedule_interval:
269
+ if not trigger.settings:
270
+ trigger.settings = dict()
269
271
  trigger.settings['invalid_schedule_interval'] = True
270
272
 
271
273
  triggers.append(trigger)
@@ -1,4 +1,4 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
  CONFIG_JSON_FILE = 'config.json'
4
4
  DATAFRAME_COLUMN_TYPES_FILE = 'data_column_types.json'
@@ -14,7 +14,7 @@ MEDIA_IMAGE_VISUALIZATION_FILE = 'visualization.png'
14
14
  UBJSON_MODEL_FILENAME = 'model.ubj'
15
15
 
16
16
 
17
- class VariableType(str, Enum):
17
+ class VariableType(StrEnum):
18
18
  CUSTOM_OBJECT = 'custom_object'
19
19
  DATAFRAME = 'dataframe'
20
20
  DATAFRAME_ANALYSIS = 'dataframe_analysis'
@@ -31,7 +31,7 @@ class VariableType(str, Enum):
31
31
  SPARK_DATAFRAME = 'spark_dataframe'
32
32
 
33
33
 
34
- class VariableAggregateDataType(str, Enum):
34
+ class VariableAggregateDataType(StrEnum):
35
35
  INSIGHTS = 'insights'
36
36
  METADATA = 'metadata'
37
37
  RESOURCE_USAGE = 'resource_usage'
@@ -41,7 +41,7 @@ class VariableAggregateDataType(str, Enum):
41
41
  TYPE = 'type'
42
42
 
43
43
 
44
- class VariableAggregateDataTypeFilename(str, Enum):
44
+ class VariableAggregateDataTypeFilename(StrEnum):
45
45
  INSIGHTS = f'{VariableAggregateDataType.INSIGHTS}.json'
46
46
  METADATA = f'{VariableAggregateDataType.METADATA}.json'
47
47
  RESOURCE_USAGE = f'{VariableAggregateDataType.RESOURCE_USAGE}.json'
@@ -67,6 +67,6 @@ JSON_SAMPLE_FILE = VariableAggregateDataTypeFilename.SAMPLE_DATA.value
67
67
  METADATA_FILE = VariableAggregateDataTypeFilename.TYPE.value
68
68
 
69
69
 
70
- class VariableAggregateSummaryGroupType(str, Enum):
70
+ class VariableAggregateSummaryGroupType(StrEnum):
71
71
  DYNAMIC = 'dynamic'
72
72
  PARTS = 'parts'
@@ -1,7 +1,7 @@
1
- from enum import Enum
2
-
3
1
  from dateutil.relativedelta import relativedelta
4
2
 
3
+ from mage_ai.shared.enum import StrEnum
4
+
5
5
  VARIABLE_NAME_BUCKETS = 'buckets'
6
6
  VARIABLE_NAME_GROUP_BY = 'group_by'
7
7
  VARIABLE_NAME_ORDER_BY = 'order_by'
@@ -14,7 +14,7 @@ VARIABLE_NAME_X = 'x'
14
14
  VARIABLE_NAME_Y = 'y'
15
15
 
16
16
 
17
- class AggregationFunction(str, Enum):
17
+ class AggregationFunction(StrEnum):
18
18
  AVERAGE = 'average'
19
19
  COUNT = 'count'
20
20
  COUNT_DISTINCT = 'count_distinct'
@@ -25,7 +25,7 @@ class AggregationFunction(str, Enum):
25
25
  SUM = 'sum'
26
26
 
27
27
 
28
- class TimeInterval(str, Enum):
28
+ class TimeInterval(StrEnum):
29
29
  DAY = 'day'
30
30
  HOUR = 'hour'
31
31
  MINUTE = 'minute'
@@ -36,7 +36,7 @@ class TimeInterval(str, Enum):
36
36
  YEAR = 'year'
37
37
 
38
38
 
39
- class ChartType(str, Enum):
39
+ class ChartType(StrEnum):
40
40
  BAR_CHART = 'bar chart'
41
41
  CUSTOM = 'custom'
42
42
  HISTOGRAM = 'histogram'