mage-ai 0.9.66__py3-none-any.whl → 0.9.68__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 (263) hide show
  1. mage_ai/api/monitors/BaseMonitor.py +1 -2
  2. mage_ai/api/policies/PipelinePolicy.py +2 -0
  3. mage_ai/api/resources/BlockLayoutItemResource.py +2 -2
  4. mage_ai/api/resources/BlockResource.py +4 -3
  5. mage_ai/api/resources/CacheItemResource.py +1 -1
  6. mage_ai/api/resources/GitBranchResource.py +3 -5
  7. mage_ai/api/resources/PageBlockLayoutResource.py +2 -2
  8. mage_ai/api/resources/PipelineResource.py +13 -0
  9. mage_ai/api/resources/PipelineRunResource.py +10 -1
  10. mage_ai/cache/tag.py +3 -0
  11. mage_ai/cluster_manager/manage.py +4 -1
  12. mage_ai/data_preparation/decorators.py +15 -0
  13. mage_ai/data_preparation/executors/k8s_block_executor.py +8 -1
  14. mage_ai/data_preparation/executors/k8s_pipeline_executor.py +12 -1
  15. mage_ai/data_preparation/executors/streaming_pipeline_executor.py +22 -12
  16. mage_ai/data_preparation/git/api.py +3 -0
  17. mage_ai/data_preparation/git/clients/gitlab.py +3 -2
  18. mage_ai/data_preparation/logging/gcs_logger_manager.py +7 -4
  19. mage_ai/data_preparation/models/block/__init__.py +45 -86
  20. mage_ai/data_preparation/models/block/block_factory.py +77 -0
  21. mage_ai/data_preparation/models/block/dbt/block.py +5 -7
  22. mage_ai/data_preparation/models/block/global_data_product/__init__.py +9 -3
  23. mage_ai/data_preparation/models/block/integration/__init__.py +12 -8
  24. mage_ai/data_preparation/models/block/platform/mixins.py +1 -1
  25. mage_ai/data_preparation/models/pipeline.py +80 -13
  26. mage_ai/data_preparation/storage/gcs_storage.py +28 -3
  27. mage_ai/data_preparation/storage/local_storage.py +18 -3
  28. mage_ai/data_preparation/storage/s3_storage.py +7 -2
  29. mage_ai/data_preparation/templates/constants.py +7 -0
  30. mage_ai/data_preparation/templates/data_loaders/streaming/generic_python.py +23 -0
  31. mage_ai/data_preparation/templates/template.py +6 -2
  32. mage_ai/data_preparation/variable_manager.py +2 -1
  33. mage_ai/io/bigquery.py +2 -0
  34. mage_ai/io/export_utils.py +3 -0
  35. mage_ai/io/oracledb.py +152 -5
  36. mage_ai/io/sql.py +4 -0
  37. mage_ai/orchestration/db/__init__.py +2 -2
  38. mage_ai/orchestration/db/models/schedules.py +2 -2
  39. mage_ai/orchestration/job_manager.py +6 -1
  40. mage_ai/orchestration/notification/sender.py +8 -0
  41. mage_ai/orchestration/pipeline_scheduler_original.py +10 -1
  42. mage_ai/server/constants.py +1 -1
  43. mage_ai/server/frontend_dist/404.html +2 -2
  44. mage_ai/server/frontend_dist/_next/static/chunks/3548-961ff79ca70038c7.js +1 -0
  45. mage_ai/server/frontend_dist/_next/static/chunks/{4241-ccd0126f5750cc35.js → 4241-4499461184ba0d23.js} +1 -1
  46. mage_ai/server/frontend_dist/_next/static/chunks/5627-237a3de578538022.js +1 -0
  47. mage_ai/server/frontend_dist/_next/static/chunks/{7966-5c1786fb7e7a48f5.js → 7966-f07b2913f7326b50.js} +1 -1
  48. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-08790743315de36a.js +1 -0
  49. mage_ai/server/frontend_dist/_next/static/chunks/pages/index-13760bb72d823b69.js +1 -0
  50. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-8bbfa0c19b5e4cb3.js +1 -0
  51. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-852d403c7bda21b3.js +1 -0
  52. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-597b74828bf105db.js +1 -0
  53. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a8b61d8d239fd16f.js +1 -0
  54. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-bd0aff5a5ed8888c.js +1 -0
  55. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-3f5c14076ddde20e.js +1 -0
  56. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1417ad1c821d720a.js +1 -0
  57. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-d1ee961387c58b7f.js +1 -0
  58. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-90abafc7ed61c582.js +1 -0
  59. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-cb88fd075a357fcf.js +1 -0
  60. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-ceb06e1616ee9610.js +1 -0
  61. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-8ff16ef9566e911a.js +1 -0
  62. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-d7a8bc51bb7a1082.js +1 -0
  63. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-f59d34429fe022ee.js +1 -0
  64. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-9cba3211434a8966.js +1 -0
  65. mage_ai/server/{frontend_dist_base_path_template/_next/static/wxqkF4diPqRxUfP6Ac6ai → frontend_dist/_next/static/i8pymuJDTVHdWjUP1QSh1}/_buildManifest.js +1 -1
  66. mage_ai/server/frontend_dist/block-layout.html +2 -2
  67. mage_ai/server/frontend_dist/compute.html +2 -2
  68. mage_ai/server/frontend_dist/files.html +2 -2
  69. mage_ai/server/frontend_dist/global-data-products/[...slug].html +2 -2
  70. mage_ai/server/frontend_dist/global-data-products.html +2 -2
  71. mage_ai/server/frontend_dist/global-hooks/[...slug].html +2 -2
  72. mage_ai/server/frontend_dist/global-hooks.html +2 -2
  73. mage_ai/server/frontend_dist/index.html +2 -2
  74. mage_ai/server/frontend_dist/manage/files.html +2 -2
  75. mage_ai/server/frontend_dist/manage/settings.html +2 -2
  76. mage_ai/server/frontend_dist/manage/users/[user].html +2 -2
  77. mage_ai/server/frontend_dist/manage/users/new.html +2 -2
  78. mage_ai/server/frontend_dist/manage/users.html +2 -2
  79. mage_ai/server/frontend_dist/manage.html +2 -2
  80. mage_ai/server/frontend_dist/oauth.html +3 -3
  81. mage_ai/server/frontend_dist/overview.html +2 -2
  82. mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  83. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  84. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  85. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +2 -2
  86. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  87. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  88. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  89. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  90. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  91. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  92. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  93. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +2 -2
  94. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  95. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  96. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  97. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  98. mage_ai/server/frontend_dist/pipelines.html +2 -2
  99. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +2 -2
  100. mage_ai/server/frontend_dist/platform/global-hooks.html +2 -2
  101. mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  102. mage_ai/server/frontend_dist/settings/platform/preferences.html +2 -2
  103. mage_ai/server/frontend_dist/settings/platform/settings.html +2 -2
  104. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +2 -2
  105. mage_ai/server/frontend_dist/settings/workspace/permissions.html +2 -2
  106. mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  107. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +2 -2
  108. mage_ai/server/frontend_dist/settings/workspace/roles.html +2 -2
  109. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  110. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +2 -2
  111. mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  112. mage_ai/server/frontend_dist/settings.html +2 -2
  113. mage_ai/server/frontend_dist/sign-in.html +5 -5
  114. mage_ai/server/frontend_dist/templates/[...slug].html +2 -2
  115. mage_ai/server/frontend_dist/templates.html +2 -2
  116. mage_ai/server/frontend_dist/terminal.html +2 -2
  117. mage_ai/server/frontend_dist/test.html +2 -2
  118. mage_ai/server/frontend_dist/triggers.html +2 -2
  119. mage_ai/server/frontend_dist/version-control.html +2 -2
  120. mage_ai/server/frontend_dist_base_path_template/404.html +2 -2
  121. mage_ai/server/{frontend_dist/_next/static/rtugsJoijF2SsCCB5_yKS → frontend_dist_base_path_template/_next/static/CKCvjsYCf2imD2X8zAOBf}/_buildManifest.js +1 -1
  122. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-961ff79ca70038c7.js +1 -0
  123. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{4241-ccd0126f5750cc35.js → 4241-4499461184ba0d23.js} +1 -1
  124. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5627-237a3de578538022.js +1 -0
  125. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7966-5c1786fb7e7a48f5.js → 7966-f07b2913f7326b50.js} +1 -1
  126. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-08790743315de36a.js +1 -0
  127. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/index-13760bb72d823b69.js +1 -0
  128. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-8bbfa0c19b5e4cb3.js +1 -0
  129. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-852d403c7bda21b3.js +1 -0
  130. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-597b74828bf105db.js +1 -0
  131. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a8b61d8d239fd16f.js +1 -0
  132. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-bd0aff5a5ed8888c.js +1 -0
  133. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-3f5c14076ddde20e.js +1 -0
  134. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1417ad1c821d720a.js +1 -0
  135. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-d1ee961387c58b7f.js +1 -0
  136. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-90abafc7ed61c582.js +1 -0
  137. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-cb88fd075a357fcf.js +1 -0
  138. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-ceb06e1616ee9610.js +1 -0
  139. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-8ff16ef9566e911a.js +1 -0
  140. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-d7a8bc51bb7a1082.js +1 -0
  141. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-f59d34429fe022ee.js +1 -0
  142. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-9cba3211434a8966.js +1 -0
  143. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  144. mage_ai/server/frontend_dist_base_path_template/compute.html +2 -2
  145. mage_ai/server/frontend_dist_base_path_template/files.html +2 -2
  146. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +2 -2
  147. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +2 -2
  148. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +2 -2
  149. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +2 -2
  150. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  151. mage_ai/server/frontend_dist_base_path_template/manage/files.html +2 -2
  152. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +2 -2
  153. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +2 -2
  154. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +2 -2
  155. mage_ai/server/frontend_dist_base_path_template/manage/users.html +2 -2
  156. mage_ai/server/frontend_dist_base_path_template/manage.html +2 -2
  157. mage_ai/server/frontend_dist_base_path_template/oauth.html +3 -3
  158. mage_ai/server/frontend_dist_base_path_template/overview.html +2 -2
  159. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +2 -2
  160. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  161. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +2 -2
  162. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +2 -2
  163. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  164. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +2 -2
  165. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  166. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  167. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +2 -2
  168. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +2 -2
  169. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +2 -2
  170. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +2 -2
  171. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +2 -2
  172. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  173. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +2 -2
  174. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  175. mage_ai/server/frontend_dist_base_path_template/pipelines.html +2 -2
  176. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +2 -2
  177. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +2 -2
  178. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +2 -2
  179. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +2 -2
  180. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +2 -2
  181. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +2 -2
  182. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +2 -2
  183. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +2 -2
  184. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +2 -2
  185. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +2 -2
  186. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +2 -2
  187. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +2 -2
  188. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +2 -2
  189. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  190. mage_ai/server/frontend_dist_base_path_template/sign-in.html +5 -5
  191. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +2 -2
  192. mage_ai/server/frontend_dist_base_path_template/templates.html +2 -2
  193. mage_ai/server/frontend_dist_base_path_template/terminal.html +2 -2
  194. mage_ai/server/frontend_dist_base_path_template/test.html +2 -2
  195. mage_ai/server/frontend_dist_base_path_template/triggers.html +2 -2
  196. mage_ai/server/frontend_dist_base_path_template/version-control.html +2 -2
  197. mage_ai/services/aws/s3/s3.py +8 -2
  198. mage_ai/services/k8s/job_manager.py +8 -0
  199. mage_ai/services/slack/slack.py +10 -1
  200. mage_ai/services/spark/spark.py +9 -2
  201. mage_ai/settings/backends.py +8 -8
  202. mage_ai/settings/models/configuration_option.py +10 -9
  203. mage_ai/settings/server.py +6 -1
  204. mage_ai/shared/files.py +19 -1
  205. mage_ai/shared/logger.py +12 -6
  206. mage_ai/shared/path_fixer.py +3 -0
  207. mage_ai/streaming/sources/base.py +5 -0
  208. mage_ai/streaming/sources/base_python.py +30 -0
  209. mage_ai/streaming/sources/kafka.py +2 -1
  210. mage_ai/streaming/sources/mongodb.py +4 -0
  211. mage_ai/streaming/sources/source_factory.py +25 -0
  212. mage_ai/tests/data_preparation/models/block/dbt/test_block.py +2 -2
  213. mage_ai/tests/data_preparation/models/block/dbt/test_block_sql.py +1 -1
  214. mage_ai/tests/data_preparation/models/block/dbt/test_block_yaml.py +1 -1
  215. mage_ai/tests/data_preparation/models/test_block.py +41 -3
  216. mage_ai/tests/orchestration/test_pipeline_scheduler.py +2 -0
  217. mage_ai/tests/settings/models/test_configuration_option.py +2 -2
  218. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/METADATA +3 -3
  219. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/RECORD +225 -222
  220. mage_ai/server/frontend_dist/_next/static/chunks/181-e61915415a976861.js +0 -1
  221. mage_ai/server/frontend_dist/_next/static/chunks/3548-13563a1ff815f922.js +0 -1
  222. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-913116aa749f7ca6.js +0 -1
  223. mage_ai/server/frontend_dist/_next/static/chunks/pages/index-64851458dde54ad9.js +0 -1
  224. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-d3a5fd3119fdb1e4.js +0 -1
  225. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-42789d698d28a92f.js +0 -1
  226. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-d05040edba41b2ac.js +0 -1
  227. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-aaf393c86fc1bda3.js +0 -1
  228. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-d84556cefbe31a1a.js +0 -1
  229. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-cf656cbe37ecaacc.js +0 -1
  230. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1b688d61f8efe07a.js +0 -1
  231. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-ed3331d22d5cff7d.js +0 -1
  232. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-d94e48bad89ba1e0.js +0 -1
  233. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-f508c2f261297724.js +0 -1
  234. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-f99e99aa8f45529c.js +0 -1
  235. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-6826000cdffc36b8.js +0 -1
  236. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-dde29a463495cebb.js +0 -1
  237. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-7d38b2f7c3e918a1.js +0 -1
  238. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-ab98a7b3a678669e.js +0 -1
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/181-e61915415a976861.js +0 -1
  240. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-13563a1ff815f922.js +0 -1
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-913116aa749f7ca6.js +0 -1
  242. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/index-64851458dde54ad9.js +0 -1
  243. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-d3a5fd3119fdb1e4.js +0 -1
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-42789d698d28a92f.js +0 -1
  245. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-d05040edba41b2ac.js +0 -1
  246. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-aaf393c86fc1bda3.js +0 -1
  247. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-d84556cefbe31a1a.js +0 -1
  248. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-cf656cbe37ecaacc.js +0 -1
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-1b688d61f8efe07a.js +0 -1
  250. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-ed3331d22d5cff7d.js +0 -1
  251. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-d94e48bad89ba1e0.js +0 -1
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-f508c2f261297724.js +0 -1
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-f99e99aa8f45529c.js +0 -1
  254. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-6826000cdffc36b8.js +0 -1
  255. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-dde29a463495cebb.js +0 -1
  256. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-7d38b2f7c3e918a1.js +0 -1
  257. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-ab98a7b3a678669e.js +0 -1
  258. /mage_ai/server/frontend_dist/_next/static/{rtugsJoijF2SsCCB5_yKS → i8pymuJDTVHdWjUP1QSh1}/_ssgManifest.js +0 -0
  259. /mage_ai/server/frontend_dist_base_path_template/_next/static/{wxqkF4diPqRxUfP6Ac6ai → CKCvjsYCf2imD2X8zAOBf}/_ssgManifest.js +0 -0
  260. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/LICENSE +0 -0
  261. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/WHEEL +0 -0
  262. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/entry_points.txt +0 -0
  263. {mage_ai-0.9.66.dist-info → mage_ai-0.9.68.dist-info}/top_level.txt +0 -0
@@ -24,8 +24,6 @@ class BaseMonitor:
24
24
  if self.error.type:
25
25
  data['type'] = self.error.type
26
26
 
27
- loop = asyncio.get_event_loop()
28
-
29
27
  kwargs = dict(
30
28
  resource=self.resource,
31
29
  **extract(
@@ -48,6 +46,7 @@ class BaseMonitor:
48
46
  ),
49
47
  )
50
48
 
49
+ loop = asyncio.get_event_loop()
51
50
  if loop is not None:
52
51
  loop.create_task(
53
52
  UsageStatisticLogger().error(
@@ -85,9 +85,11 @@ PipelinePolicy.allow_write([
85
85
  'conditionals',
86
86
  'clone_pipeline_uuid',
87
87
  'custom_template_uuid',
88
+ 'description',
88
89
  'extensions',
89
90
  'llm',
90
91
  'name',
92
+ 'tags',
91
93
  'type',
92
94
  ], scopes=[
93
95
  OauthScope.CLIENT_PRIVATE,
@@ -6,7 +6,7 @@ import urllib.parse
6
6
 
7
7
  from mage_ai.api.errors import ApiError
8
8
  from mage_ai.api.resources.GenericResource import GenericResource
9
- from mage_ai.data_preparation.models.block import Block
9
+ from mage_ai.data_preparation.models.block.block_factory import BlockFactory
10
10
  from mage_ai.data_preparation.models.constants import BlockType
11
11
  from mage_ai.data_preparation.models.widget.constants import ChartType
12
12
  from mage_ai.data_preparation.variable_manager import get_global_variables
@@ -73,7 +73,7 @@ class BlockLayoutItemResource(GenericResource):
73
73
  data_source_type = data_source_config.get('type')
74
74
  pipeline_uuid = data_source_config.get('pipeline_uuid')
75
75
 
76
- block = Block.get_block(
76
+ block = BlockFactory.get_block(
77
77
  block_config.get('name') or file_path or uuid,
78
78
  block_uuid,
79
79
  block_type,
@@ -12,6 +12,7 @@ from mage_ai.cache.block_action_object.constants import (
12
12
  OBJECT_TYPE_MAGE_TEMPLATE,
13
13
  )
14
14
  from mage_ai.data_preparation.models.block import Block
15
+ from mage_ai.data_preparation.models.block.block_factory import BlockFactory
15
16
  from mage_ai.data_preparation.models.block.utils import clean_name
16
17
  from mage_ai.data_preparation.models.constants import (
17
18
  FILE_EXTENSION_TO_BLOCK_LANGUAGE,
@@ -163,7 +164,7 @@ class BlockResource(GenericResource):
163
164
  if payload.get('type') == BlockType.DBT and language == BlockLanguage.SQL and content:
164
165
  from mage_ai.data_preparation.models.block.dbt import DBTBlock
165
166
 
166
- dbt_block = DBTBlock(
167
+ dbt_block = DBTBlock.create(
167
168
  name,
168
169
  clean_name(name),
169
170
  BlockType.DBT,
@@ -323,7 +324,7 @@ class BlockResource(GenericResource):
323
324
  if BlockType.DBT == block_type:
324
325
  from mage_ai.data_preparation.models.block.dbt import DBTBlock
325
326
 
326
- block = DBTBlock(
327
+ block = DBTBlock.create(
327
328
  block_uuid,
328
329
  block_uuid,
329
330
  block_type,
@@ -331,7 +332,7 @@ class BlockResource(GenericResource):
331
332
  language=language,
332
333
  )
333
334
  else:
334
- block = Block.get_block(block_uuid, block_uuid, block_type, language=language)
335
+ block = BlockFactory.get_block(block_uuid, block_uuid, block_type, language=language)
335
336
 
336
337
  if not block.exists():
337
338
  error.update(ApiError.RESOURCE_NOT_FOUND)
@@ -50,7 +50,7 @@ class CacheItemResource(AsyncBaseResource):
50
50
  )
51
51
 
52
52
  if CacheItemType.DBT == item_type:
53
- block = DBTBlock(
53
+ block = DBTBlock.create(
54
54
  pk,
55
55
  pk,
56
56
  BlockType.DBT,
@@ -152,14 +152,10 @@ class GitBranchResource(GenericResource):
152
152
  )
153
153
  http_access_token = git_manager.get_access_token()
154
154
 
155
+ config_overwrite = None
155
156
  token = None
156
157
  if access_token:
157
158
  token = access_token.token
158
- elif http_access_token:
159
- token = http_access_token
160
-
161
- config_overwrite = None
162
- if token:
163
159
  user_from_api = api.get_user(token, provider=provider)
164
160
  # Default to mage user email if no email is returned from API
165
161
  email = user_from_api.get(
@@ -169,6 +165,8 @@ class GitBranchResource(GenericResource):
169
165
  username=user_from_api.get('username'),
170
166
  email=email,
171
167
  )
168
+ elif http_access_token:
169
+ token = http_access_token
172
170
 
173
171
  # Recreate git manager with updated config
174
172
  git_manager = self.get_git_manager(
@@ -3,7 +3,7 @@ import urllib.parse
3
3
 
4
4
  from mage_ai.api.errors import ApiError
5
5
  from mage_ai.api.resources.GenericResource import GenericResource
6
- from mage_ai.data_preparation.models.block import Block
6
+ from mage_ai.data_preparation.models.block.block_factory import BlockFactory
7
7
  from mage_ai.presenters.block_layout.page import PageBlockLayout
8
8
  from mage_ai.shared.hash import extract, ignore_keys, merge_dict
9
9
  from mage_ai.shared.utils import clean_name
@@ -52,7 +52,7 @@ class PageBlockLayoutResource(GenericResource):
52
52
  if len(parts) >= 2:
53
53
  block_uuid_use = os.path.join(*parts[1:])
54
54
 
55
- block = Block.get_block(
55
+ block = BlockFactory.get_block(
56
56
  block_uuid_use,
57
57
  block_uuid_use,
58
58
  block_type,
@@ -362,6 +362,8 @@ class PipelineResource(BaseResource):
362
362
  clone_pipeline_uuid = payload.get('clone_pipeline_uuid')
363
363
  template_uuid = payload.get('custom_template_uuid')
364
364
  name = payload.get('name')
365
+ description = payload.get('description')
366
+ tags = payload.get('tags')
365
367
  pipeline_type = payload.get('type')
366
368
  llm_payload = payload.get('llm')
367
369
  pipeline = None
@@ -375,8 +377,10 @@ class PipelineResource(BaseResource):
375
377
  else:
376
378
  pipeline = Pipeline.create(
377
379
  name,
380
+ description=description,
378
381
  pipeline_type=pipeline_type,
379
382
  repo_path=get_repo_path(),
383
+ tags=tags,
380
384
  )
381
385
 
382
386
  if llm_payload:
@@ -451,6 +455,15 @@ class PipelineResource(BaseResource):
451
455
  cache = await PipelineCache.initialize_cache()
452
456
  cache.add_model(resource.model)
453
457
 
458
+ tags = resource.model.tags
459
+ if tags:
460
+ from mage_ai.cache.tag import TagCache
461
+
462
+ cache = await TagCache.initialize_cache()
463
+
464
+ for tag_uuid in tags:
465
+ cache.add_pipeline(tag_uuid, resource.model)
466
+
454
467
  self.on_create_callback = _on_create_callback
455
468
 
456
469
  return self(pipeline, user, **kwargs)
@@ -12,7 +12,7 @@ from mage_ai.data_preparation.models.triggers import (
12
12
  ScheduleStatus,
13
13
  ScheduleType,
14
14
  )
15
- from mage_ai.orchestration.db import safe_db_query
15
+ from mage_ai.orchestration.db import db_connection, safe_db_query
16
16
  from mage_ai.orchestration.db.models.schedules import (
17
17
  BlockRun,
18
18
  PipelineRun,
@@ -241,6 +241,15 @@ class PipelineRunResource(DatabaseResource):
241
241
  has_next = results_size > limit
242
242
  final_end_idx = results_size - 1 if has_next else results_size
243
243
 
244
+ # Expire pipeline runs that are in progress so that the latest status is returned
245
+ # the next time they are fetched.
246
+ for run in results:
247
+ if run.status in (
248
+ PipelineRun.PipelineRunStatus.RUNNING,
249
+ PipelineRun.PipelineRunStatus.INITIAL,
250
+ ):
251
+ db_connection.session.expire(run)
252
+
244
253
  result_set = self.build_result_set(
245
254
  results[0:final_end_idx],
246
255
  user,
mage_ai/cache/tag.py CHANGED
@@ -144,6 +144,9 @@ class TagCache(BaseCache):
144
144
 
145
145
  mapping[key][KEY_FOR_PIPELINES] = pipelines_dict
146
146
 
147
+ if not pipelines_dict and mapping[key].keys() == set([KEY_FOR_PIPELINES]):
148
+ mapping.pop(key, None)
149
+
147
150
  self.set(self.cache_key, mapping)
148
151
 
149
152
  async def initialize_cache_for_all_objects(self) -> None:
@@ -70,11 +70,14 @@ def get_workspaces(cluster_type: ClusterType, **kwargs) -> List[Workspace]:
70
70
  repo_path = get_repo_path()
71
71
  projects_folder = os.path.join(repo_path, 'projects')
72
72
  if is_main_project:
73
+ # sort by file last modified time
73
74
  projects = [
74
- f.name.split('.')[0]
75
+ f
75
76
  for f in os.scandir(projects_folder)
76
77
  if not f.is_dir() and f.name.endswith('.yaml')
77
78
  ]
79
+ projects.sort(key=lambda f: os.path.getmtime(f.path), reverse=True)
80
+ projects = [os.path.splitext(f.name)[0] for f in projects]
78
81
  else:
79
82
  instances = get_instances(cluster_type, **kwargs)
80
83
  projects = [instance.get('name') for instance in instances]
@@ -103,3 +103,18 @@ def data_integration_query(function):
103
103
 
104
104
  def preprocesser_functions(function):
105
105
  return function
106
+
107
+
108
+ def streaming_source(cls):
109
+ return cls
110
+
111
+
112
+ def collect_decorated_objs(decorated_objs):
113
+ """
114
+ Method to collect the decorated objects (function or class)
115
+ """
116
+ def custom_code(obj):
117
+ decorated_objs.append(obj)
118
+ return obj
119
+
120
+ return custom_code
@@ -1,6 +1,9 @@
1
1
  from typing import Dict
2
2
 
3
+ from jinja2 import Template
4
+
3
5
  from mage_ai.data_preparation.executors.block_executor import BlockExecutor
6
+ from mage_ai.data_preparation.shared.utils import get_template_vars
4
7
  from mage_ai.services.k8s.config import K8sExecutorConfig
5
8
  from mage_ai.services.k8s.constants import DEFAULT_NAMESPACE
6
9
  from mage_ai.services.k8s.job_manager import JobManager as K8sJobManager
@@ -29,9 +32,13 @@ class K8sBlockExecutor(BlockExecutor):
29
32
  job_name_prefix = self.executor_config.job_name_prefix
30
33
 
31
34
  if self.executor_config.namespace:
32
- namespace = self.executor_config.namespace
35
+ namespace = Template(self.executor_config.namespace).render(
36
+ variables=lambda x: global_vars.get(x) if global_vars else None,
37
+ **get_template_vars()
38
+ )
33
39
  else:
34
40
  namespace = DEFAULT_NAMESPACE
41
+
35
42
  job_manager = K8sJobManager(
36
43
  job_name=f'mage-{job_name_prefix}-block-{block_run_id}',
37
44
  logger=self.logger,
@@ -1,8 +1,11 @@
1
1
  import traceback
2
2
  from typing import Dict
3
3
 
4
+ from jinja2 import Template
5
+
4
6
  from mage_ai.data_preparation.executors.pipeline_executor import PipelineExecutor
5
7
  from mage_ai.data_preparation.models.pipeline import Pipeline
8
+ from mage_ai.data_preparation.shared.utils import get_template_vars
6
9
  from mage_ai.services.k8s.config import K8sExecutorConfig
7
10
  from mage_ai.services.k8s.constants import DEFAULT_NAMESPACE
8
11
  from mage_ai.services.k8s.job_manager import JobManager as K8sJobManager
@@ -39,6 +42,7 @@ class K8sPipelineExecutor(PipelineExecutor):
39
42
  ) -> None:
40
43
  job_manager = self.get_job_manager(
41
44
  pipeline_run_id=pipeline_run_id,
45
+ global_vars=global_vars,
42
46
  **kwargs,
43
47
  )
44
48
  cmd = self._run_commands(
@@ -54,15 +58,22 @@ class K8sPipelineExecutor(PipelineExecutor):
54
58
  def get_job_manager(
55
59
  self,
56
60
  pipeline_run_id: int = None,
61
+ global_vars: Dict = None,
57
62
  **kwargs,
58
63
  ) -> K8sJobManager:
64
+ if global_vars is None:
65
+ global_vars = dict()
59
66
  if not self.executor_config.job_name_prefix:
60
67
  job_name_prefix = 'data-prep'
61
68
  else:
62
69
  job_name_prefix = self.executor_config.job_name_prefix
63
70
 
64
71
  if self.executor_config.namespace:
65
- namespace = self.executor_config.namespace
72
+
73
+ namespace = Template(self.executor_config.namespace).render(
74
+ variables=lambda x: global_vars.get(x) if global_vars else None,
75
+ **get_template_vars()
76
+ )
66
77
  else:
67
78
  namespace = DEFAULT_NAMESPACE
68
79
 
@@ -10,7 +10,7 @@ from jinja2 import Template
10
10
 
11
11
  from mage_ai.data_preparation.executors.pipeline_executor import PipelineExecutor
12
12
  from mage_ai.data_preparation.logging.logger import DictLogger
13
- from mage_ai.data_preparation.models.constants import BlockType
13
+ from mage_ai.data_preparation.models.constants import BlockLanguage, BlockType
14
14
  from mage_ai.data_preparation.models.pipeline import Pipeline
15
15
  from mage_ai.data_preparation.shared.stream import StreamToLogger
16
16
  from mage_ai.data_preparation.shared.utils import get_template_vars
@@ -107,18 +107,28 @@ class StreamingPipelineExecutor(PipelineExecutor):
107
107
 
108
108
  if global_vars is None:
109
109
  global_vars = dict()
110
- source_config = self.__interpolate_vars(
111
- self.source_block.content,
112
- global_vars=global_vars,
113
- )
114
- source = SourceFactory.get_source(
115
- source_config,
116
- checkpoint_path=os.path.join(
117
- self.pipeline.pipeline_variables_dir,
118
- 'streaming_checkpoint',
119
- ),
120
- )
121
110
 
111
+ # Initialize source block
112
+ if self.source_block.language == BlockLanguage.PYTHON:
113
+ source = SourceFactory.get_python_source(
114
+ self.source_block.content,
115
+ global_vars=global_vars,
116
+ )
117
+ else:
118
+ # Default to YAML config
119
+ source_config = self.__interpolate_vars(
120
+ self.source_block.content,
121
+ global_vars=global_vars,
122
+ )
123
+ source = SourceFactory.get_source(
124
+ source_config,
125
+ checkpoint_path=os.path.join(
126
+ self.pipeline.pipeline_variables_dir,
127
+ 'streaming_checkpoint',
128
+ ),
129
+ )
130
+
131
+ # Initialize destination blocks
122
132
  sinks_by_uuid = dict()
123
133
  for sink_block in self.sink_blocks:
124
134
  sinks_by_uuid[sink_block.uuid] = SinkFactory.get_sink(
@@ -15,8 +15,10 @@ from mage_ai.data_preparation.git.utils import (
15
15
  )
16
16
  from mage_ai.data_preparation.repo_manager import get_project_uuid
17
17
  from mage_ai.orchestration.db.models.oauth import Oauth2AccessToken, User
18
+ from mage_ai.server.logger import Logger
18
19
 
19
20
  API_ENDPOINT = 'https://api.github.com'
21
+ logger = Logger().new_server_logger(__name__)
20
22
 
21
23
 
22
24
  def get_oauth_client_id(provider: str) -> str:
@@ -262,4 +264,5 @@ def get_user(token: str, provider: str = ProviderName.GITHUB) -> Dict:
262
264
  try:
263
265
  return GitClient.get_client_for_provider(provider)(token).get_user()
264
266
  except Exception:
267
+ logger.exception('Error fetching user from git provider.')
265
268
  return dict()
@@ -3,14 +3,15 @@ from urllib.parse import quote_plus
3
3
 
4
4
  import requests
5
5
 
6
- from mage_ai.authentication.oauth.constants import GITLAB_HOST
7
6
  from mage_ai.data_preparation.git.clients.base import Client
7
+ from mage_ai.settings import get_settings_value
8
+ from mage_ai.settings.keys import GITLAB_HOST
8
9
 
9
10
 
10
11
  class GitlabClient(Client):
11
12
  def __init__(self, access_token: str):
12
13
  super().__init__(access_token)
13
- self.hostname = GITLAB_HOST or 'https://gitlab.com'
14
+ self.hostname = get_settings_value(GITLAB_HOST, 'https://gitlab.com')
14
15
 
15
16
  def get_user(self):
16
17
  # For GitLab, we don't need to make a request to the API to get the username
@@ -10,9 +10,9 @@ from mage_ai.shared.config import BaseConfig
10
10
 
11
11
  @dataclass
12
12
  class GCSConfig(BaseConfig):
13
- path_to_credentials: str
14
13
  bucket: str
15
14
  prefix: str
15
+ path_to_credentials: str = None
16
16
 
17
17
 
18
18
  class GCSLoggerManager(LoggerManager):
@@ -23,9 +23,12 @@ class GCSLoggerManager(LoggerManager):
23
23
  ):
24
24
  super().__init__(repo_config=repo_config, **kwargs)
25
25
  self.gcs_config = GCSConfig.load(config=self.logging_config.destination_config)
26
- credentials = service_account.Credentials.from_service_account_file(
27
- self.gcs_config.path_to_credentials
28
- )
26
+ if self.gcs_config.path_to_credentials:
27
+ credentials = service_account.Credentials.from_service_account_file(
28
+ self.gcs_config.path_to_credentials
29
+ )
30
+ else:
31
+ credentials = None
29
32
  self.gcs_client = storage.Client(credentials=credentials)
30
33
 
31
34
  def create_log_filepath_dir(self, path):