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,6 +1,5 @@
1
1
  from abc import abstractmethod
2
2
  from dataclasses import dataclass, field
3
- from enum import Enum
4
3
  from typing import Dict, List
5
4
 
6
5
  from mage_ai.data_preparation.models.project import Project
@@ -10,6 +9,7 @@ from mage_ai.services.compute.constants import (
10
9
  ComputeManagementApplicationTab,
11
10
  )
12
11
  from mage_ai.services.spark.constants import ComputeServiceUUID
12
+ from mage_ai.shared.enum import StrEnum
13
13
  from mage_ai.shared.hash import merge_dict
14
14
  from mage_ai.shared.models import BaseDataClass
15
15
 
@@ -35,7 +35,7 @@ class ConnectionCredential(BaseDataClass):
35
35
  self.error = ErrorMessage.load(**self.error)
36
36
 
37
37
 
38
- class SetupStepStatus(str, Enum):
38
+ class SetupStepStatus(StrEnum):
39
39
  COMPLETED = 'completed'
40
40
  ERROR = 'error'
41
41
  INCOMPLETE = 'incomplete'
@@ -137,7 +137,7 @@ class ComputeConnection(SetupStep):
137
137
 
138
138
 
139
139
  class ComputeService:
140
- uuid = ComputeServiceUUID.STANDALONE_CLUSTER
140
+ service_uuid = ComputeServiceUUID.STANDALONE_CLUSTER
141
141
 
142
142
  def __init__(self, project: Project, with_clusters: bool = False):
143
143
  self.project = project
@@ -169,7 +169,7 @@ class ComputeService:
169
169
 
170
170
  @property
171
171
  def uuid(self) -> ComputeServiceUUID:
172
- return self.__class__.uuid
172
+ return self.__class__.service_uuid
173
173
 
174
174
  @abstractmethod
175
175
  def active_cluster(self, **kwargs) -> Dict:
@@ -58,6 +58,7 @@ class K8sExecutorConfig(BaseConfig):
58
58
  service_account_name = DEFAULT_SERVICE_ACCOUNT_NAME
59
59
  affinity = None
60
60
  node_selector = None
61
+ scheduler_name = None
61
62
  tolerations = []
62
63
  volumes = []
63
64
  image_pull_secrets = {}
@@ -71,6 +72,8 @@ class K8sExecutorConfig(BaseConfig):
71
72
 
72
73
  if executor_config.pod.get('node_selector'):
73
74
  node_selector = executor_config.pod['node_selector']
75
+ if executor_config.pod.get('scheduler_name'):
76
+ scheduler_name = executor_config.pod['scheduler_name']
74
77
 
75
78
  if executor_config.pod.get('tolerations'):
76
79
  tolerations += [V1Toleration(**e) for e in executor_config.pod['tolerations']]
@@ -123,6 +126,7 @@ class K8sExecutorConfig(BaseConfig):
123
126
  containers=[container],
124
127
  image_pull_secrets=image_pull_secrets,
125
128
  node_selector=node_selector,
129
+ scheduler_name=scheduler_name,
126
130
  restart_policy='Never',
127
131
  service_account_name=service_account_name,
128
132
  tolerations=tolerations,
@@ -172,6 +172,8 @@ class JobManager():
172
172
  pod_spec.tolerations = mage_server_pod_spec.tolerations
173
173
  if not pod_spec.node_selector:
174
174
  pod_spec.node_selector = mage_server_pod_spec.node_selector
175
+ if not pod_spec.scheduler_name:
176
+ pod_spec.scheduler_name = mage_server_pod_spec.scheduler_name
175
177
  pod_spec.image_pull_secrets = pod_spec.image_pull_secrets if pod_spec.image_pull_secrets \
176
178
  else mage_server_pod_spec.image_pull_secrets
177
179
  return pod_spec
@@ -1,12 +1,12 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
  SPARK_DIRECTORY_NAME = '.spark'
4
4
 
5
5
 
6
- class ComputeServiceUUID(str, Enum):
6
+ class ComputeServiceUUID(StrEnum):
7
7
  AWS_EMR = 'AWS_EMR'
8
8
  STANDALONE_CLUSTER = 'STANDALONE_CLUSTER'
9
9
 
10
10
 
11
- class SparkMaster(str, Enum):
11
+ class SparkMaster(StrEnum):
12
12
  LOCAL = 'local'
@@ -1,12 +1,12 @@
1
1
  from dataclasses import dataclass, field
2
- from enum import Enum
3
2
  from typing import Dict, List
4
3
 
5
4
  from mage_ai.services.spark.models.applications import Application
6
5
  from mage_ai.services.spark.models.base import BaseSparkModel
6
+ from mage_ai.shared.enum import StrEnum
7
7
 
8
8
 
9
- class JobStatus(str, Enum):
9
+ class JobStatus(StrEnum):
10
10
  FAILED = 'FAILED'
11
11
  RUNNING = 'RUNNING'
12
12
  SUCCEEDED = 'SUCCEEDED'
@@ -1,14 +1,14 @@
1
1
  from dataclasses import dataclass, field
2
- from enum import Enum
3
2
  from typing import List
4
3
 
5
4
  from mage_ai.services.spark.models.applications import Application
6
5
  from mage_ai.services.spark.models.base import BaseSparkModel
7
6
  from mage_ai.services.spark.models.jobs import Job
8
7
  from mage_ai.services.spark.models.stages import StageAttempt
8
+ from mage_ai.shared.enum import StrEnum
9
9
 
10
10
 
11
- class SqlStatus(str, Enum):
11
+ class SqlStatus(StrEnum):
12
12
  COMPLETED = 'COMPLETED'
13
13
 
14
14
 
@@ -1,25 +1,25 @@
1
1
  from dataclasses import dataclass, field
2
- from enum import Enum
3
2
  from typing import Dict, List
4
3
 
5
4
  from mage_ai.services.spark.models.applications import Application
6
5
  from mage_ai.services.spark.models.base import BaseSparkModel
7
6
  from mage_ai.services.spark.models.metrics import Metrics
7
+ from mage_ai.shared.enum import StrEnum
8
8
 
9
9
 
10
- class Locality(str, Enum):
10
+ class Locality(StrEnum):
11
11
  NODE_LOCAL = 'NODE_LOCAL'
12
12
  PROCESS_LOCAL = 'PROCESS_LOCAL'
13
13
  RACK_LOCAL = 'RACK_LOCAL'
14
14
 
15
15
 
16
- class StageStatus(str, Enum):
16
+ class StageStatus(StrEnum):
17
17
  COMPLETE = 'COMPLETE'
18
18
  PENDING = 'PENDING'
19
19
  SKIPPED = 'SKIPPED'
20
20
 
21
21
 
22
- class TaskStatus(str, Enum):
22
+ class TaskStatus(StrEnum):
23
23
  SUCCESS = 'SUCCESS'
24
24
 
25
25
 
@@ -1,11 +1,11 @@
1
1
  from dataclasses import dataclass, field
2
- from enum import Enum
3
2
  from typing import List
4
3
 
5
4
  from mage_ai.services.spark.models.base import BaseSparkModel
5
+ from mage_ai.shared.enum import StrEnum
6
6
 
7
7
 
8
- class ThreadState(str, Enum):
8
+ class ThreadState(StrEnum):
9
9
  RUNNABLE = 'RUNNABLE'
10
10
  TIMED_WAITING = 'TIMED_WAITING'
11
11
  WAITING = 'WAITING'
@@ -1,11 +1,22 @@
1
1
  from dataclasses import dataclass
2
+ from typing import List
3
+
2
4
  from mage_ai.shared.config import BaseConfig
3
5
 
4
6
 
5
7
  @dataclass
6
8
  class TeamsConfig(BaseConfig):
7
- webhook_url: str = None
9
+ webhook_url: List[str] = None
10
+
11
+ def __post_init__(self):
12
+ # Normalize webhook_url to a list if it's provided as a string
13
+ if isinstance(self.webhook_url, str):
14
+ self.webhook_url = [self.webhook_url]
15
+ elif self.webhook_url is None:
16
+ self.webhook_url = []
8
17
 
9
18
  @property
10
19
  def is_valid(self) -> bool:
11
- return self.webhook_url is not None and self.webhook_url != 'None'
20
+ return bool(self.webhook_url) and all(
21
+ url and url != 'None' and url.strip() != '' for url in self.webhook_url
22
+ )
@@ -1,19 +1,21 @@
1
- from mage_ai.services.teams.config import TeamsConfig
2
1
  import requests
3
2
 
3
+ from mage_ai.services.teams.config import TeamsConfig
4
+
4
5
 
5
6
  def send_teams_message(
6
7
  config: TeamsConfig,
7
8
  message: str,
8
9
  title: str = 'Mage pipeline run status logs',
9
10
  ) -> None:
10
- requests.post(
11
- url=config.webhook_url,
12
- json={
13
- 'summary': title,
14
- 'sections': [{
15
- 'activityTitle': title,
16
- 'activitySubtitle': message,
17
- }],
18
- },
19
- )
11
+ for url in config.webhook_url:
12
+ requests.post(
13
+ url=url,
14
+ json={
15
+ 'summary': title,
16
+ 'sections': [{
17
+ 'activityTitle': title,
18
+ 'activitySubtitle': message,
19
+ }],
20
+ },
21
+ )
@@ -1,13 +1,14 @@
1
1
  import base64
2
2
  import logging
3
3
  import os
4
- from enum import Enum
5
4
  from typing import Optional
6
5
 
6
+ from mage_ai.shared.enum import StrEnum
7
+
7
8
  logger = logging.getLogger(__name__)
8
9
 
9
10
 
10
- class BackendType(str, Enum):
11
+ class BackendType(StrEnum):
11
12
  """
12
13
  Enum for the different types of settings backends.
13
14
  """
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
3
  from dataclasses import dataclass
4
- from enum import Enum
5
4
  from pathlib import Path
6
5
  from typing import Dict, Union
7
6
 
@@ -15,6 +14,7 @@ from mage_ai.data_preparation.models.pipeline import Pipeline
15
14
  from mage_ai.data_preparation.shared.utils import get_template_vars
16
15
  from mage_ai.settings.platform import project_platform_activated
17
16
  from mage_ai.settings.repo import get_repo_path
17
+ from mage_ai.shared.enum import StrEnum
18
18
  from mage_ai.shared.files import get_full_file_paths_containing_multi_items
19
19
  from mage_ai.shared.hash import merge_dict
20
20
  from mage_ai.shared.models import BaseDataClass
@@ -37,11 +37,11 @@ async def read_file(full_path: str) -> str:
37
37
  return config
38
38
 
39
39
 
40
- class ConfigurationType(str, Enum):
40
+ class ConfigurationType(StrEnum):
41
41
  DBT = 'dbt'
42
42
 
43
43
 
44
- class OptionType(str, Enum):
44
+ class OptionType(StrEnum):
45
45
  PROFILES = 'profiles'
46
46
  PROJECTS = 'projects'
47
47
  TARGETS = 'targets'
@@ -161,6 +161,11 @@ NEW_RELIC_CONFIG_PATH = os.getenv('NEW_RELIC_CONFIG_PATH', '')
161
161
  # If enabled, the /metrics route will expose Tornado server metrics
162
162
  ENABLE_PROMETHEUS = get_bool_value(os.getenv('ENABLE_PROMETHEUS', 'False'))
163
163
 
164
+ # API switch configuration
165
+ # If disabled, those AI APIs will not be used in backend.
166
+ ENABLE_OPEN_AI = get_bool_value(os.getenv('ENABLE_OPEN_AI') or 'True')
167
+ ENABLE_HUGGING_FACE = get_bool_value(os.getenv('ENABLE_HUGGING_FACE') or 'True')
168
+
164
169
  # OpenTelemetry Configuration
165
170
  OTEL_EXPORTER_OTLP_ENDPOINT = os.getenv('OTEL_EXPORTER_OTLP_ENDPOINT', None)
166
171
  OTEL_EXPORTER_OTLP_HTTP_ENDPOINT = os.getenv('OTEL_EXPORTER_HTTP_OTLP_ENDPOINT', None)
@@ -1,15 +1,17 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
  ENV_DEV = 'dev'
4
4
  ENV_PROD = 'prod'
5
5
  ENV_STAGING = 'staging'
6
6
  ENV_TEST = 'test'
7
+ ENV_TEST_MAGE = 'test_mage'
7
8
 
8
9
  VALID_ENVS = frozenset([
9
10
  ENV_DEV,
10
11
  ENV_PROD,
11
12
  ENV_STAGING,
12
13
  ENV_TEST,
14
+ ENV_TEST_MAGE,
13
15
  ])
14
16
 
15
17
  SAMPLE_SIZE = 1000
@@ -20,7 +22,7 @@ GCS_PREFIX = 'gs://'
20
22
  ENV_VAR_INSTANCE_TYPE = 'INSTANCE_TYPE'
21
23
 
22
24
 
23
- class InstanceType(str, Enum):
25
+ class InstanceType(StrEnum):
24
26
  SERVER_AND_SCHEDULER = 'server_and_scheduler'
25
27
  SCHEDULER = 'scheduler'
26
28
  WEB_SERVER = 'web_server'
@@ -1,15 +1,15 @@
1
1
  import inspect
2
2
  import logging
3
- from enum import Enum
4
3
 
5
4
  import simplejson
6
5
 
7
6
  from mage_ai.data_preparation.models.constants import BlockType
7
+ from mage_ai.shared.enum import StrEnum
8
8
  from mage_ai.shared.environments import is_deus_ex_machina
9
9
  from mage_ai.shared.parsers import encode_complex
10
10
 
11
11
 
12
- class Color(str, Enum):
12
+ class Color(StrEnum):
13
13
  BLUE = "\x1b[1;34m"
14
14
  BOLD_RED = "\x1b[31;1m"
15
15
  GREEN = "\x1b[1;32m"
@@ -64,19 +64,19 @@ class ColorPrinter:
64
64
  self.label = None
65
65
 
66
66
  def debug(self, *args, **kwargs):
67
- self.print(color=Color.PURPLE, *args, **kwargs)
67
+ self.print(*args, color=Color.PURPLE, **kwargs)
68
68
 
69
69
  def info(self, *args, **kwargs):
70
- self.print(color=Color.BLUE, *args, **kwargs)
70
+ self.print(*args, color=Color.BLUE, **kwargs)
71
71
 
72
72
  def warning(self, *args, **kwargs):
73
- self.print(color=Color.GREEN, *args, **kwargs)
73
+ self.print(*args, color=Color.GREEN, **kwargs)
74
74
 
75
75
  def error(self, *args, **kwargs):
76
- self.print(color=Color.RED, *args, **kwargs)
76
+ self.print(*args, color=Color.RED, **kwargs)
77
77
 
78
78
  def critical(self, *args, **kwargs):
79
- self.print(color=Color.BOLD_RED, *args, **kwargs)
79
+ self.print(*args, color=Color.BOLD_RED, **kwargs)
80
80
 
81
81
  def print(self, *args, **kwargs):
82
82
  if not is_deus_ex_machina():
@@ -183,39 +183,39 @@ class CustomFormatter(logging.Formatter):
183
183
  def debug(self, p: int = 0, *args, **kwargs):
184
184
  if is_deus_ex_machina():
185
185
  if p:
186
- self.print(color=Color.PURPLE, *args, **kwargs)
186
+ self.print(*args, color=Color.PURPLE, **kwargs)
187
187
  else:
188
188
  super().debug(*args, **kwargs)
189
189
 
190
190
  def info(self, p: int = 0, *args, **kwargs):
191
191
  if is_deus_ex_machina():
192
192
  if p:
193
- self.print(color=Color.BLUE, *args, **kwargs)
193
+ self.print(*args, color=Color.BLUE, **kwargs)
194
194
  else:
195
195
  super().info(*args, **kwargs)
196
196
 
197
197
  def warning(self, p: int = 0, *args, **kwargs):
198
198
  if is_deus_ex_machina():
199
199
  if p:
200
- self.print(color=Color.YELLOW, *args, **kwargs)
200
+ self.print(*args, color=Color.YELLOW, **kwargs)
201
201
  else:
202
202
  super().warning(*args, **kwargs)
203
203
 
204
204
  def error(self, p: int = 0, *args, **kwargs):
205
205
  if is_deus_ex_machina():
206
206
  if p:
207
- self.print(color=Color.RED, *args, **kwargs)
207
+ self.print(*args, color=Color.RED, **kwargs)
208
208
  else:
209
209
  super().error(*args, **kwargs)
210
210
 
211
211
  def critical(self, p: int = 0, *args, **kwargs):
212
212
  if is_deus_ex_machina():
213
213
  if p:
214
- self.print(color=Color.BOLD_RED, *args, **kwargs)
214
+ self.print(*args, color=Color.BOLD_RED, **kwargs)
215
215
  else:
216
216
  super().critical(*args, **kwargs)
217
217
 
218
- def print(self, color: Color, *args, **kwargs):
218
+ def print(self, *args, color: Color, **kwargs):
219
219
  more = None
220
220
  if kwargs:
221
221
  more = simplejson.dumps(
mage_ai/shared/enum.py ADDED
@@ -0,0 +1,8 @@
1
+ try:
2
+ # breaking change introduced in python 3.11
3
+ from enum import Enum, IntEnum, StrEnum # noqa: F401
4
+ except ImportError: # pragma: no cover
5
+ from enum import Enum, IntEnum # noqa: F401 # pragma: no cover
6
+
7
+ class StrEnum(str, Enum): # pragma: no cover
8
+ pass # pragma: no cover
@@ -1,7 +1,13 @@
1
1
  import os
2
2
  import sys
3
3
 
4
- from mage_ai.shared.constants import ENV_DEV, ENV_PROD, ENV_STAGING, ENV_TEST
4
+ from mage_ai.shared.constants import (
5
+ ENV_DEV,
6
+ ENV_PROD,
7
+ ENV_STAGING,
8
+ ENV_TEST,
9
+ ENV_TEST_MAGE,
10
+ )
5
11
 
6
12
 
7
13
  def is_deus_ex_machina():
@@ -16,8 +22,24 @@ def is_dev():
16
22
  return os.getenv('ENV', None) == 'dev' or os.getenv('ENV', None) == 'development'
17
23
 
18
24
 
25
+ def is_test_mage():
26
+ """
27
+ The "test_mage" environment is used for running unit tests in the CI/CD pipeline.
28
+ When running unit tests, a "test.db" sqlite database is temporarily created for
29
+ storing test metadata. Refer to the mage_ai/orchestration/db/__init__.py file for
30
+ implementation details. The test_mage environment is separate from the "test"
31
+ environment so that Mage's unit tests don't affect a user's own testing metadata db.
32
+ """
33
+ return os.getenv('ENV', None) == 'test_mage' or any('unittest' in v for v in sys.argv)
34
+
35
+
19
36
  def is_test():
20
- return os.getenv('ENV', None) == 'test' or any('unittest' in v for v in sys.argv)
37
+ """
38
+ The "test" environment is the default environment for testing where users may have
39
+ their own specific tests that they want to run with their own test metadata db at a
40
+ specific location.
41
+ """
42
+ return os.getenv('ENV', None) == 'test' or is_test_mage()
21
43
 
22
44
 
23
45
  def is_production():
@@ -29,7 +51,9 @@ def is_staging():
29
51
 
30
52
 
31
53
  def get_env():
32
- if is_test():
54
+ if is_test_mage():
55
+ return ENV_TEST_MAGE
56
+ elif is_test():
33
57
  return ENV_TEST
34
58
  elif is_production():
35
59
  return ENV_PROD
mage_ai/shared/logger.py CHANGED
@@ -2,10 +2,10 @@ import json
2
2
  import logging
3
3
  import time
4
4
  from contextlib import contextmanager, redirect_stdout
5
- from enum import Enum
6
5
  from typing import Callable, List
7
6
 
8
7
  from mage_ai.settings import SERVER_LOGGING_TEMPLATE
8
+ from mage_ai.shared.enum import StrEnum
9
9
  from mage_ai.shared.hash import merge_dict
10
10
 
11
11
  logger = logging.getLogger(__name__)
@@ -107,7 +107,7 @@ def set_logging_format(logging_format: str = None, level: str = None) -> None:
107
107
  root_logger.exception('Invalid logging level %s', level)
108
108
 
109
109
 
110
- class LoggingLevel(str, Enum):
110
+ class LoggingLevel(StrEnum):
111
111
  DEBUG = 'DEBUG'
112
112
  INFO = 'INFO'
113
113
  WARNING = 'WARNING'
mage_ai/shared/models.py CHANGED
@@ -7,12 +7,13 @@ from typing import Any, Dict, List, Optional, Type, Union
7
7
 
8
8
  import inflection
9
9
 
10
+ from mage_ai.shared.enum import StrEnum
10
11
  from mage_ai.shared.environments import is_debug
11
12
  from mage_ai.shared.hash import merge_dict
12
13
  from mage_ai.shared.parsers import encode_complex
13
14
 
14
15
 
15
- class BaseEnum(str, Enum):
16
+ class BaseEnum(StrEnum):
16
17
  @classmethod
17
18
  def has_value(cls, value: Union[Any, str]) -> bool:
18
19
  if isinstance(value, cls):
@@ -1,10 +1,10 @@
1
- from enum import Enum
1
+ from mage_ai.shared.enum import StrEnum
2
2
 
3
3
  DEFAULT_BATCH_SIZE = 100
4
4
  DEFAULT_TIMEOUT_MS = 500
5
5
 
6
6
 
7
- class SourceType(str, Enum):
7
+ class SourceType(StrEnum):
8
8
  ACTIVEMQ = 'activemq'
9
9
  AMAZON_SQS = 'amazon_sqs'
10
10
  AZURE_EVENT_HUB = 'azure_event_hub'
@@ -17,7 +17,7 @@ class SourceType(str, Enum):
17
17
  MONGODB = 'mongodb'
18
18
 
19
19
 
20
- class SinkType(str, Enum):
20
+ class SinkType(StrEnum):
21
21
  ACTIVEMQ = 'activemq'
22
22
  AMAZON_S3 = 'amazon_s3'
23
23
  AZURE_DATA_LAKE = 'azure_data_lake'
@@ -16,6 +16,8 @@ class ElasticSearchConfig(BaseConfig):
16
16
  api_key: str = None
17
17
  ca_cert: str = None
18
18
  _id: str = None
19
+ _op_type: str = None
20
+ _source: str = None
19
21
 
20
22
 
21
23
  class ElasticSearchSink(BaseSink):
@@ -51,9 +53,17 @@ class ElasticSearchSink(BaseSink):
51
53
 
52
54
  def batch_write(self, messages: List[Dict]):
53
55
  self._print(f'Batch ingest data {messages}, time={time.time()}')
54
- if self.config._id is not None:
55
- docs = [{'_index': self.config.index_name, '_id': doc[self.config._id],
56
- 'doc': doc} for doc in messages]
57
- else:
58
- docs = [{'_index': self.config.index_name, 'doc': doc} for doc in messages]
56
+ docs = []
57
+ for msg in messages:
58
+ doc = {'_index': self.config.index_name}
59
+ if self.config._id is not None:
60
+ doc['id'] = msg[self.config._id]
61
+ if self.config._op_type is not None:
62
+ doc['_op_type'] = self.config._op_type
63
+ if self.config._source is not None:
64
+ doc[self.config._source] = msg
65
+ else:
66
+ doc['_doc'] = msg
67
+ docs.append(doc)
68
+
59
69
  helpers.bulk(self.client, docs)
@@ -1,17 +1,17 @@
1
1
  import json
2
2
  import time
3
3
  from dataclasses import dataclass
4
- from enum import Enum
5
4
  from typing import Dict, List
6
5
 
7
6
  from kafka import KafkaProducer
8
7
 
9
8
  from mage_ai.shared.config import BaseConfig
9
+ from mage_ai.shared.enum import StrEnum
10
10
  from mage_ai.streaming.constants import DEFAULT_BATCH_SIZE, DEFAULT_TIMEOUT_MS
11
11
  from mage_ai.streaming.sinks.base import BaseSink
12
12
 
13
13
 
14
- class SecurityProtocol(str, Enum):
14
+ class SecurityProtocol(StrEnum):
15
15
  SASL_SSL = 'SASL_SSL'
16
16
  SSL = 'SSL'
17
17
 
@@ -23,6 +23,9 @@ class PostgresConfig(BaseConfig):
23
23
  port: int = 5432
24
24
  unique_conflict_method: str = UNIQUE_CONFLICT_METHOD_IGNORE
25
25
  unique_constraints: List = field(default_factory=list)
26
+ allow_reserved_words: bool = False
27
+ auto_clean_name: bool = True
28
+ case_sensitive: bool = False
26
29
 
27
30
 
28
31
  class PostgresSink(BaseSink):
@@ -57,6 +60,9 @@ class PostgresSink(BaseSink):
57
60
  if_exists=ExportWritePolicy.APPEND,
58
61
  unique_conflict_method=self.config.unique_conflict_method,
59
62
  unique_constraints=self.config.unique_constraints,
63
+ allow_reserved_words=self.config.allow_reserved_words,
64
+ auto_clean_name=self.config.auto_clean_name,
65
+ case_sensitive=self.config.case_sensitive,
60
66
  )
61
67
 
62
68
  def destroy(self):
@@ -2,12 +2,12 @@ import json
2
2
  import threading
3
3
  import time
4
4
  from dataclasses import dataclass
5
- from enum import Enum
6
5
  from typing import Callable, Dict
7
6
 
8
7
  import boto3
9
8
 
10
9
  from mage_ai.shared.config import BaseConfig
10
+ from mage_ai.shared.enum import StrEnum
11
11
  from mage_ai.streaming.constants import DEFAULT_BATCH_SIZE
12
12
  from mage_ai.streaming.sources.base import BaseSource
13
13
  from mage_ai.streaming.sources.shared import SerDeConfig, SerializationMethod
@@ -15,7 +15,7 @@ from mage_ai.streaming.sources.shared import SerDeConfig, SerializationMethod
15
15
  DEFAULT_WAIT_TIME_SECONDS = 1
16
16
 
17
17
 
18
- class MessageDeletionMethod(str, Enum):
18
+ class MessageDeletionMethod(StrEnum):
19
19
  AFTER_RECEIVED = 'AFTER_RECEIVED'
20
20
  MANUAL = 'MANUAL'
21
21
 
@@ -1,12 +1,12 @@
1
1
  import json
2
2
  from abc import ABC, abstractmethod
3
- from enum import Enum
4
3
  from typing import Callable, Dict
5
4
 
5
+ from mage_ai.shared.enum import StrEnum
6
6
  from mage_ai.shared.environments import is_test
7
7
 
8
8
 
9
- class SourceConsumeMethod(str, Enum):
9
+ class SourceConsumeMethod(StrEnum):
10
10
  BATCH_READ = 'BATCH_READ'
11
11
  READ = 'READ'
12
12
  READ_ASYNC = 'READ_ASYNC'