mage-ai 0.9.68__py3-none-any.whl → 0.9.70__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 (316) hide show
  1. mage_ai/api/policies/BackfillPolicy.py +1 -0
  2. mage_ai/api/policies/PipelinePolicy.py +1 -0
  3. mage_ai/api/policies/WorkspacePolicy.py +1 -0
  4. mage_ai/api/presenters/BackfillPresenter.py +1 -0
  5. mage_ai/api/resources/GitBranchResource.py +56 -23
  6. mage_ai/api/resources/GitCustomBranchResource.py +29 -1
  7. mage_ai/api/resources/OauthResource.py +1 -1
  8. mage_ai/api/resources/PipelineResource.py +11 -5
  9. mage_ai/api/resources/PipelineRunResource.py +41 -4
  10. mage_ai/api/resources/PipelineScheduleResource.py +4 -0
  11. mage_ai/api/resources/PullRequestResource.py +6 -4
  12. mage_ai/api/resources/SeedResource.py +2 -1
  13. mage_ai/api/resources/SessionResource.py +13 -1
  14. mage_ai/api/resources/WorkspaceResource.py +5 -4
  15. mage_ai/authentication/permissions/constants.py +2 -0
  16. mage_ai/authentication/permissions/seed.py +32 -21
  17. mage_ai/authentication/providers/active_directory.py +4 -3
  18. mage_ai/authentication/providers/okta.py +22 -83
  19. mage_ai/cache/block_action_object/__init__.py +1 -1
  20. mage_ai/cluster_manager/kubernetes/workload_manager.py +52 -1
  21. mage_ai/cluster_manager/workspace/base.py +6 -0
  22. mage_ai/cluster_manager/workspace/kubernetes.py +22 -1
  23. mage_ai/command_center/applications/utils.py +2 -2
  24. mage_ai/command_center/presenters/text.py +1 -1
  25. mage_ai/data_preparation/executors/k8s_block_executor.py +30 -7
  26. mage_ai/data_preparation/executors/k8s_pipeline_executor.py +30 -7
  27. mage_ai/data_preparation/executors/streaming_pipeline_executor.py +78 -8
  28. mage_ai/data_preparation/git/__init__.py +50 -22
  29. mage_ai/data_preparation/git/api.py +62 -7
  30. mage_ai/data_preparation/git/utils.py +45 -21
  31. mage_ai/data_preparation/models/block/__init__.py +31 -8
  32. mage_ai/data_preparation/models/block/data_integration/mixins.py +16 -5
  33. mage_ai/data_preparation/models/block/dynamic/child.py +3 -0
  34. mage_ai/data_preparation/models/block/dynamic/utils.py +9 -4
  35. mage_ai/data_preparation/models/block/dynamic/variables.py +2 -2
  36. mage_ai/data_preparation/models/block/extension/utils.py +1 -0
  37. mage_ai/data_preparation/models/block/global_data_product/__init__.py +25 -2
  38. mage_ai/data_preparation/models/block/integration/__init__.py +1 -1
  39. mage_ai/data_preparation/models/block/remote/__init__.py +0 -0
  40. mage_ai/data_preparation/models/block/remote/models.py +58 -0
  41. mage_ai/data_preparation/models/block/sql/__init__.py +1 -1
  42. mage_ai/data_preparation/models/block/utils.py +38 -0
  43. mage_ai/data_preparation/models/constants.py +2 -0
  44. mage_ai/data_preparation/models/global_data_product/__init__.py +12 -0
  45. mage_ai/data_preparation/models/pipeline.py +31 -11
  46. mage_ai/data_preparation/models/triggers/__init__.py +4 -2
  47. mage_ai/data_preparation/models/utils.py +6 -0
  48. mage_ai/data_preparation/models/variable.py +18 -4
  49. mage_ai/data_preparation/repo_manager.py +3 -2
  50. mage_ai/data_preparation/shared/utils.py +1 -1
  51. mage_ai/data_preparation/storage/local_storage.py +12 -6
  52. mage_ai/data_preparation/templates/data_exporters/mysql.py +2 -2
  53. mage_ai/data_preparation/templates/data_exporters/oracledb.py +27 -0
  54. mage_ai/data_preparation/templates/repo/metadata.yaml +1 -0
  55. mage_ai/io/bigquery.py +131 -58
  56. mage_ai/io/mysql.py +38 -6
  57. mage_ai/io/snowflake.py +152 -29
  58. mage_ai/orchestration/db/migrations/versions/42a14d6143f1_update_token_column_type.py +54 -0
  59. mage_ai/orchestration/db/models/oauth.py +14 -13
  60. mage_ai/orchestration/db/models/schedules.py +30 -2
  61. mage_ai/orchestration/job_manager.py +6 -0
  62. mage_ai/orchestration/notification/sender.py +37 -15
  63. mage_ai/orchestration/pipeline_scheduler_original.py +48 -31
  64. mage_ai/orchestration/queue/celery_queue.py +8 -1
  65. mage_ai/orchestration/queue/process_queue.py +67 -4
  66. mage_ai/orchestration/queue/queue.py +8 -0
  67. mage_ai/orchestration/triggers/api.py +29 -1
  68. mage_ai/orchestration/triggers/global_data_product.py +9 -4
  69. mage_ai/orchestration/triggers/utils.py +10 -1
  70. mage_ai/orchestration/utils/resources.py +3 -0
  71. mage_ai/server/api/downloads.py +4 -1
  72. mage_ai/server/api/runs.py +151 -0
  73. mage_ai/server/constants.py +1 -1
  74. mage_ai/server/frontend_dist/404.html +6 -6
  75. mage_ai/server/frontend_dist/_next/static/{i8pymuJDTVHdWjUP1QSh1 → RhDiJSkcjCsh4xxX4BFBk}/_buildManifest.js +1 -1
  76. mage_ai/server/frontend_dist/_next/static/chunks/1557-b3502f3f1aa92ac7.js +1 -0
  77. mage_ai/server/frontend_dist/_next/static/chunks/2717-d9200be634dd6766.js +1 -0
  78. mage_ai/server/frontend_dist/_next/static/chunks/3548-9d26185b3fb663b1.js +1 -0
  79. mage_ai/server/frontend_dist/_next/static/chunks/5699-6d708c6b2153ea08.js +1 -0
  80. mage_ai/server/frontend_dist/_next/static/chunks/7361-8a23dd8360593e7a.js +1 -0
  81. mage_ai/server/frontend_dist/_next/static/chunks/7966-b9b85ba10667e654.js +1 -0
  82. mage_ai/server/frontend_dist/_next/static/chunks/9624-8b8e100079ab69e1.js +1 -0
  83. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-2a69553d8c6eeb53.js +1 -0
  84. mage_ai/server/frontend_dist/_next/static/chunks/pages/index-4e12783b064c1cfe.js +1 -0
  85. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-4bfc84ff07d7656f.js +1 -0
  86. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-a66b4c7641ae03eb.js → frontend_dist/_next/static/chunks/pages/pipeline-runs-6d183f91a2ff6668.js} +1 -1
  87. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-7181b086c93784d2.js +1 -0
  88. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-38e1fbcfbfc1014e.js +1 -0
  89. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-b645a6d13ab9fe3a.js +1 -0
  90. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-59aca25a5b1d3998.js +1 -0
  91. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-eb11c5390c982b49.js +1 -0
  92. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-cb88fd075a357fcf.js → triggers-4612d15a65c35912.js} +1 -1
  93. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-3591d035bb3bb2b8.js +1 -0
  94. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-32985f3f7c7dd3ab.js +1 -0
  95. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/settings-c2e9ef989c8bfa73.js +1 -0
  96. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-349af617d05f001b.js +1 -0
  97. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-60d01d3887e31136.js +1 -0
  98. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-86814e581acaf5db.js → users-a4db8710f703c729.js} +1 -1
  99. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-09414a8b66fb6f06.js +1 -0
  100. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/triggers-9cba3211434a8966.js → frontend_dist/_next/static/chunks/pages/triggers-a599c6ac89be8c8d.js} +1 -1
  101. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-3433c8b22e8342aa.js +1 -0
  102. mage_ai/server/frontend_dist/block-layout.html +2 -2
  103. mage_ai/server/frontend_dist/compute.html +2 -2
  104. mage_ai/server/frontend_dist/files.html +2 -2
  105. mage_ai/server/frontend_dist/global-data-products/[...slug].html +2 -2
  106. mage_ai/server/frontend_dist/global-data-products.html +2 -2
  107. mage_ai/server/frontend_dist/global-hooks/[...slug].html +2 -2
  108. mage_ai/server/frontend_dist/global-hooks.html +2 -2
  109. mage_ai/server/frontend_dist/index.html +2 -2
  110. mage_ai/server/frontend_dist/manage/files.html +2 -2
  111. mage_ai/server/frontend_dist/manage/settings.html +2 -2
  112. mage_ai/server/frontend_dist/manage/users/[user].html +2 -2
  113. mage_ai/server/frontend_dist/manage/users/new.html +2 -2
  114. mage_ai/server/frontend_dist/manage/users.html +2 -2
  115. mage_ai/server/frontend_dist/manage.html +2 -2
  116. mage_ai/server/frontend_dist/oauth.html +2 -2
  117. mage_ai/server/frontend_dist/overview.html +2 -2
  118. mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  119. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  120. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  121. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +2 -2
  122. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  123. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  124. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  125. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  126. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  127. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  128. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  129. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +2 -2
  130. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  131. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  132. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  133. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  134. mage_ai/server/frontend_dist/pipelines.html +2 -2
  135. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +2 -2
  136. mage_ai/server/frontend_dist/platform/global-hooks.html +2 -2
  137. mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  138. mage_ai/server/frontend_dist/settings/platform/preferences.html +2 -2
  139. mage_ai/server/frontend_dist/settings/platform/settings.html +2 -2
  140. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +2 -2
  141. mage_ai/server/frontend_dist/settings/workspace/permissions.html +2 -2
  142. mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  143. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +2 -2
  144. mage_ai/server/frontend_dist/settings/workspace/roles.html +2 -2
  145. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  146. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +2 -2
  147. mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  148. mage_ai/server/frontend_dist/settings.html +2 -2
  149. mage_ai/server/frontend_dist/sign-in.html +6 -6
  150. mage_ai/server/frontend_dist/templates/[...slug].html +2 -2
  151. mage_ai/server/frontend_dist/templates.html +2 -2
  152. mage_ai/server/frontend_dist/terminal.html +2 -2
  153. mage_ai/server/frontend_dist/test.html +2 -2
  154. mage_ai/server/frontend_dist/triggers.html +2 -2
  155. mage_ai/server/frontend_dist/version-control.html +2 -2
  156. mage_ai/server/frontend_dist_base_path_template/404.html +6 -6
  157. mage_ai/server/frontend_dist_base_path_template/_next/static/{CKCvjsYCf2imD2X8zAOBf → TdpLLFome13qvM0gXvpHs}/_buildManifest.js +1 -1
  158. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-b3502f3f1aa92ac7.js +1 -0
  159. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-d9200be634dd6766.js +1 -0
  160. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-9d26185b3fb663b1.js +1 -0
  161. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5699-6d708c6b2153ea08.js +1 -0
  162. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7361-8a23dd8360593e7a.js +1 -0
  163. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7966-b9b85ba10667e654.js +1 -0
  164. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-8b8e100079ab69e1.js +1 -0
  165. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-2a69553d8c6eeb53.js +1 -0
  166. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/index-4e12783b064c1cfe.js +1 -0
  167. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-4bfc84ff07d7656f.js +1 -0
  168. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipeline-runs-a66b4c7641ae03eb.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-6d183f91a2ff6668.js} +1 -1
  169. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-7181b086c93784d2.js +1 -0
  170. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-38e1fbcfbfc1014e.js +1 -0
  171. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-b645a6d13ab9fe3a.js +1 -0
  172. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-59aca25a5b1d3998.js +1 -0
  173. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-eb11c5390c982b49.js +1 -0
  174. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-cb88fd075a357fcf.js → triggers-4612d15a65c35912.js} +1 -1
  175. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-3591d035bb3bb2b8.js +1 -0
  176. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-32985f3f7c7dd3ab.js +1 -0
  177. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-c2e9ef989c8bfa73.js +1 -0
  178. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-349af617d05f001b.js +1 -0
  179. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-60d01d3887e31136.js +1 -0
  180. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-86814e581acaf5db.js → users-a4db8710f703c729.js} +1 -1
  181. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-09414a8b66fb6f06.js +1 -0
  182. mage_ai/server/{frontend_dist/_next/static/chunks/pages/triggers-9cba3211434a8966.js → frontend_dist_base_path_template/_next/static/chunks/pages/triggers-a599c6ac89be8c8d.js} +1 -1
  183. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-3433c8b22e8342aa.js +1 -0
  184. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  185. mage_ai/server/frontend_dist_base_path_template/compute.html +2 -2
  186. mage_ai/server/frontend_dist_base_path_template/files.html +2 -2
  187. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +2 -2
  188. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +2 -2
  189. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +2 -2
  190. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +2 -2
  191. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  192. mage_ai/server/frontend_dist_base_path_template/manage/files.html +2 -2
  193. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +2 -2
  194. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +2 -2
  195. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +2 -2
  196. mage_ai/server/frontend_dist_base_path_template/manage/users.html +2 -2
  197. mage_ai/server/frontend_dist_base_path_template/manage.html +2 -2
  198. mage_ai/server/frontend_dist_base_path_template/oauth.html +2 -2
  199. mage_ai/server/frontend_dist_base_path_template/overview.html +2 -2
  200. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +2 -2
  201. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  202. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +2 -2
  203. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +2 -2
  204. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  205. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +2 -2
  206. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  207. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  208. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +2 -2
  209. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +2 -2
  210. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +2 -2
  211. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +2 -2
  212. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +2 -2
  213. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  214. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +2 -2
  215. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  216. mage_ai/server/frontend_dist_base_path_template/pipelines.html +2 -2
  217. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +2 -2
  218. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +2 -2
  219. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +2 -2
  220. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +2 -2
  221. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +2 -2
  222. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +2 -2
  223. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +2 -2
  224. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +2 -2
  225. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +2 -2
  226. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +2 -2
  227. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +2 -2
  228. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +2 -2
  229. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +2 -2
  230. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  231. mage_ai/server/frontend_dist_base_path_template/sign-in.html +6 -6
  232. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +2 -2
  233. mage_ai/server/frontend_dist_base_path_template/templates.html +2 -2
  234. mage_ai/server/frontend_dist_base_path_template/terminal.html +2 -2
  235. mage_ai/server/frontend_dist_base_path_template/test.html +2 -2
  236. mage_ai/server/frontend_dist_base_path_template/triggers.html +2 -2
  237. mage_ai/server/frontend_dist_base_path_template/version-control.html +2 -2
  238. mage_ai/server/scheduler_manager.py +9 -0
  239. mage_ai/server/server.py +47 -17
  240. mage_ai/server/utils/output_display.py +2 -2
  241. mage_ai/server/websocket_server.py +1 -0
  242. mage_ai/services/aws/ecs/ecs.py +1 -0
  243. mage_ai/services/k8s/config.py +4 -4
  244. mage_ai/services/k8s/utils.py +97 -0
  245. mage_ai/settings/keys/auth.py +2 -0
  246. mage_ai/settings/server.py +1 -1
  247. mage_ai/shared/parsers.py +6 -1
  248. mage_ai/streaming/sources/influxdb.py +2 -0
  249. mage_ai/streaming/sources/kafka.py +1 -1
  250. mage_ai/tests/api/endpoints/mixins.py +10 -9
  251. mage_ai/tests/api/endpoints/test_seeds.py +24 -0
  252. mage_ai/tests/api/operations/base/mixins.py +1 -1
  253. mage_ai/tests/api/operations/test_sessions.py +53 -2
  254. mage_ai/tests/api/resources/test_pipeline_resource.py +2 -2
  255. mage_ai/tests/authentication/oauth/test_utils.py +1 -1
  256. mage_ai/tests/authentication/providers/test_okta.py +43 -0
  257. mage_ai/tests/data_preparation/models/block/test_global_data_product.py +2 -0
  258. mage_ai/tests/orchestration/db/models/test_oauth.py +3 -3
  259. mage_ai/tests/orchestration/queue/test_process_queue.py +1 -0
  260. mage_ai/tests/orchestration/triggers/test_global_data_product.py +138 -136
  261. mage_ai/tests/server/test_server.py +27 -4
  262. mage_ai/tests/services/k8s/test_job_manager.py +9 -6
  263. mage_ai/version_control/branch/utils.py +2 -1
  264. mage_ai/version_control/models.py +3 -2
  265. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/METADATA +5 -5
  266. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/RECORD +272 -264
  267. mage_ai/server/frontend_dist/_next/static/chunks/1557-01f0843dc6ac4971.js +0 -1
  268. mage_ai/server/frontend_dist/_next/static/chunks/2717-b5f9575799b594d5.js +0 -1
  269. mage_ai/server/frontend_dist/_next/static/chunks/3548-961ff79ca70038c7.js +0 -1
  270. mage_ai/server/frontend_dist/_next/static/chunks/5699-6efc749f2f8ddd20.js +0 -1
  271. mage_ai/server/frontend_dist/_next/static/chunks/7361-18d9d8be96e1ce97.js +0 -1
  272. mage_ai/server/frontend_dist/_next/static/chunks/7966-f07b2913f7326b50.js +0 -1
  273. mage_ai/server/frontend_dist/_next/static/chunks/9624-59b2f803f9c88cd6.js +0 -1
  274. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-08790743315de36a.js +0 -1
  275. mage_ai/server/frontend_dist/_next/static/chunks/pages/index-13760bb72d823b69.js +0 -1
  276. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-852d403c7bda21b3.js +0 -1
  277. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-ff4bd7a8ec3bab40.js +0 -1
  278. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a8b61d8d239fd16f.js +0 -1
  279. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-bd0aff5a5ed8888c.js +0 -1
  280. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-d1ee961387c58b7f.js +0 -1
  281. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-f028ef3880ed856c.js +0 -1
  282. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-ceb06e1616ee9610.js +0 -1
  283. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-8ff16ef9566e911a.js +0 -1
  284. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/settings-74d76300942dcee8.js +0 -1
  285. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-d7a8bc51bb7a1082.js +0 -1
  286. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-79a4cf66a623e667.js +0 -1
  287. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-f59d34429fe022ee.js +0 -1
  288. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-5753fac7c1bfdc88.js +0 -1
  289. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-01f0843dc6ac4971.js +0 -1
  290. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-b5f9575799b594d5.js +0 -1
  291. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-961ff79ca70038c7.js +0 -1
  292. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5699-6efc749f2f8ddd20.js +0 -1
  293. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7361-18d9d8be96e1ce97.js +0 -1
  294. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7966-f07b2913f7326b50.js +0 -1
  295. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-59b2f803f9c88cd6.js +0 -1
  296. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-08790743315de36a.js +0 -1
  297. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/index-13760bb72d823b69.js +0 -1
  298. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-852d403c7bda21b3.js +0 -1
  299. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-ff4bd7a8ec3bab40.js +0 -1
  300. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a8b61d8d239fd16f.js +0 -1
  301. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-bd0aff5a5ed8888c.js +0 -1
  302. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-d1ee961387c58b7f.js +0 -1
  303. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-f028ef3880ed856c.js +0 -1
  304. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-ceb06e1616ee9610.js +0 -1
  305. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-8ff16ef9566e911a.js +0 -1
  306. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-74d76300942dcee8.js +0 -1
  307. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-d7a8bc51bb7a1082.js +0 -1
  308. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-79a4cf66a623e667.js +0 -1
  309. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-f59d34429fe022ee.js +0 -1
  310. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-5753fac7c1bfdc88.js +0 -1
  311. /mage_ai/server/frontend_dist/_next/static/{i8pymuJDTVHdWjUP1QSh1 → RhDiJSkcjCsh4xxX4BFBk}/_ssgManifest.js +0 -0
  312. /mage_ai/server/frontend_dist_base_path_template/_next/static/{CKCvjsYCf2imD2X8zAOBf → TdpLLFome13qvM0gXvpHs}/_ssgManifest.js +0 -0
  313. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/LICENSE +0 -0
  314. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/WHEEL +0 -0
  315. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/entry_points.txt +0 -0
  316. {mage_ai-0.9.68.dist-info → mage_ai-0.9.70.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,5 @@
1
1
  import os
2
2
  from datetime import datetime, timedelta, timezone
3
- from unittest.mock import patch
4
3
 
5
4
  from freezegun import freeze_time
6
5
 
@@ -9,13 +8,16 @@ from mage_ai.data_preparation.models.constants import BlockType
9
8
  from mage_ai.data_preparation.models.global_data_product import GlobalDataProduct
10
9
  from mage_ai.data_preparation.models.pipeline import Pipeline
11
10
  from mage_ai.orchestration.db.models.schedules import PipelineRun, PipelineSchedule
12
- from mage_ai.orchestration.pipeline_scheduler import PipelineScheduler, schedule_all
11
+
12
+ # from mage_ai.orchestration.pipeline_scheduler import PipelineScheduler, schedule_all
13
13
  from mage_ai.orchestration.triggers.global_data_product import (
14
14
  fetch_or_create_pipeline_schedule,
15
15
  trigger_and_check_status,
16
16
  )
17
17
  from mage_ai.tests.base_test import DBTestCase
18
18
 
19
+ # from unittest.mock import patch
20
+
19
21
 
20
22
  class TriggerGlobalDataProductTest(DBTestCase):
21
23
  def setUp(self):
@@ -204,140 +206,140 @@ class TriggerGlobalDataProductTest(DBTestCase):
204
206
  count,
205
207
  )
206
208
 
207
- def test_trigger_and_check_status_when_there_are_more_running(self):
208
- now = datetime.utcnow().replace(tzinfo=timezone.utc)
209
-
210
- pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
211
- pipeline_run1 = PipelineRun.create(
212
- execution_date=now - timedelta(seconds=11),
213
- pipeline_schedule_id=pipeline_schedule.id,
214
- pipeline_uuid=self.global_data_product.pipeline.uuid,
215
- status=PipelineRun.PipelineRunStatus.RUNNING,
216
- )
217
- pipeline_run2 = PipelineRun.create(
218
- execution_date=now - timedelta(seconds=6),
219
- pipeline_schedule_id=pipeline_schedule.id,
220
- pipeline_uuid=self.global_data_product.pipeline.uuid,
221
- status=PipelineRun.PipelineRunStatus.RUNNING,
222
- )
223
- pipeline_run3 = PipelineRun.create(
224
- execution_date=now - timedelta(seconds=5),
225
- pipeline_schedule_id=pipeline_schedule.id,
226
- pipeline_uuid=self.global_data_product.pipeline.uuid,
227
- status=PipelineRun.PipelineRunStatus.RUNNING,
228
- )
229
- pipeline_run3_id = pipeline_run3.id
230
- pipeline_run4 = PipelineRun.create(
231
- execution_date=now - timedelta(seconds=0),
232
- pipeline_schedule_id=pipeline_schedule.id,
233
- pipeline_uuid=self.global_data_product.pipeline.uuid,
234
- status=PipelineRun.PipelineRunStatus.RUNNING,
235
- )
236
-
237
- count = PipelineRun.query.filter(
238
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
239
- ).count()
240
-
241
- self.global_data_product.outdated_after = dict(seconds=5)
242
- self.global_data_product.outdated_starting_at = {}
243
-
244
- try:
245
- trigger_and_check_status(
246
- self.global_data_product,
247
- error_on_failure=False,
248
- poll_interval=1,
249
- poll_timeout=2,
250
- should_schedule=False,
251
- )
252
- except Exception:
253
- pass
254
-
255
- self.assertEqual(
256
- PipelineRun.query.filter(
257
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
258
- ).count(),
259
- count - 1,
260
- )
261
-
262
- self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run1.id).count(), 1)
263
- self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run2.id).count(), 1)
264
- self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run3_id).count(), 0)
265
- self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run4.id).count(), 1)
266
-
267
- def test_trigger_and_check_status_should_create_new_pipeline_run(self):
268
- now = datetime.utcnow().replace(tzinfo=timezone.utc)
269
- pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
270
- PipelineRun.create(
271
- execution_date=now - timedelta(seconds=2),
272
- pipeline_schedule_id=pipeline_schedule.id,
273
- pipeline_uuid=self.global_data_product.pipeline.uuid,
274
- status=PipelineRun.PipelineRunStatus.COMPLETED,
275
- )
276
-
277
- count = PipelineRun.query.filter(
278
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
279
- ).count()
280
-
281
- self.global_data_product.outdated_after = dict(seconds=2)
282
- self.global_data_product.outdated_starting_at = {}
283
-
284
- try:
285
- trigger_and_check_status(
286
- self.global_data_product,
287
- error_on_failure=False,
288
- poll_interval=1,
289
- poll_timeout=2,
290
- should_schedule=False,
291
- )
292
- except Exception:
293
- pass
294
-
295
- self.assertEqual(
296
- PipelineRun.query.filter(
297
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
298
- ).count(),
299
- count + 1,
300
- )
301
-
302
- def test_trigger_and_check_status_with_schedule_all(self):
303
- pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
304
-
305
- count = PipelineRun.query.filter(
306
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
307
- ).count()
308
-
309
- self.global_data_product.outdated_after = dict(seconds=2)
310
- self.global_data_product.outdated_starting_at = {}
311
-
312
- trigger_and_check_status(
313
- self.global_data_product,
314
- check_status=False,
315
- error_on_failure=False,
316
- poll_interval=1,
317
- poll_timeout=2,
318
- should_schedule=False,
319
- )
320
-
321
- with patch.object(PipelineScheduler, 'schedule') as _:
322
- schedule_all()
323
-
324
- pipeline_runs = PipelineRun.query.filter(
325
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
326
- ).all()
327
-
328
- pipeline_runs.sort(key=lambda pr: pr.execution_date)
329
- pipeline_run = pipeline_runs[-1]
330
-
331
- self.assertEqual(
332
- pipeline_run.status,
333
- PipelineRun.PipelineRunStatus.RUNNING,
334
- )
335
- self.assertEqual(
336
- PipelineRun.query.filter(
337
- PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
338
- ).count(),
339
- count + 1,
340
- )
209
+ # def test_trigger_and_check_status_when_there_are_more_running(self):
210
+ # now = datetime.utcnow().replace(tzinfo=timezone.utc)
211
+
212
+ # pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
213
+ # pipeline_run1 = PipelineRun.create(
214
+ # execution_date=now - timedelta(seconds=11),
215
+ # pipeline_schedule_id=pipeline_schedule.id,
216
+ # pipeline_uuid=self.global_data_product.pipeline.uuid,
217
+ # status=PipelineRun.PipelineRunStatus.RUNNING,
218
+ # )
219
+ # pipeline_run2 = PipelineRun.create(
220
+ # execution_date=now - timedelta(seconds=6),
221
+ # pipeline_schedule_id=pipeline_schedule.id,
222
+ # pipeline_uuid=self.global_data_product.pipeline.uuid,
223
+ # status=PipelineRun.PipelineRunStatus.RUNNING,
224
+ # )
225
+ # pipeline_run3 = PipelineRun.create(
226
+ # execution_date=now - timedelta(seconds=5),
227
+ # pipeline_schedule_id=pipeline_schedule.id,
228
+ # pipeline_uuid=self.global_data_product.pipeline.uuid,
229
+ # status=PipelineRun.PipelineRunStatus.RUNNING,
230
+ # )
231
+ # pipeline_run3_id = pipeline_run3.id
232
+ # pipeline_run4 = PipelineRun.create(
233
+ # execution_date=now - timedelta(seconds=0),
234
+ # pipeline_schedule_id=pipeline_schedule.id,
235
+ # pipeline_uuid=self.global_data_product.pipeline.uuid,
236
+ # status=PipelineRun.PipelineRunStatus.RUNNING,
237
+ # )
238
+
239
+ # count = PipelineRun.query.filter(
240
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
241
+ # ).count()
242
+
243
+ # self.global_data_product.outdated_after = dict(seconds=5)
244
+ # self.global_data_product.outdated_starting_at = {}
245
+
246
+ # try:
247
+ # trigger_and_check_status(
248
+ # self.global_data_product,
249
+ # error_on_failure=False,
250
+ # poll_interval=1,
251
+ # poll_timeout=2,
252
+ # should_schedule=False,
253
+ # )
254
+ # except Exception:
255
+ # pass
256
+
257
+ # self.assertEqual(
258
+ # PipelineRun.query.filter(
259
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
260
+ # ).count(),
261
+ # count - 1,
262
+ # )
263
+
264
+ # self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run1.id).count(), 1)
265
+ # self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run2.id).count(), 1)
266
+ # self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run3_id).count(), 0)
267
+ # self.assertEqual(PipelineRun.query.filter(PipelineRun.id == pipeline_run4.id).count(), 1)
268
+
269
+ # def test_trigger_and_check_status_should_create_new_pipeline_run(self):
270
+ # now = datetime.utcnow().replace(tzinfo=timezone.utc)
271
+ # pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
272
+ # PipelineRun.create(
273
+ # execution_date=now - timedelta(seconds=2),
274
+ # pipeline_schedule_id=pipeline_schedule.id,
275
+ # pipeline_uuid=self.global_data_product.pipeline.uuid,
276
+ # status=PipelineRun.PipelineRunStatus.COMPLETED,
277
+ # )
278
+
279
+ # count = PipelineRun.query.filter(
280
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
281
+ # ).count()
282
+
283
+ # self.global_data_product.outdated_after = dict(seconds=2)
284
+ # self.global_data_product.outdated_starting_at = {}
285
+
286
+ # try:
287
+ # trigger_and_check_status(
288
+ # self.global_data_product,
289
+ # error_on_failure=False,
290
+ # poll_interval=1,
291
+ # poll_timeout=2,
292
+ # should_schedule=False,
293
+ # )
294
+ # except Exception:
295
+ # pass
296
+
297
+ # self.assertEqual(
298
+ # PipelineRun.query.filter(
299
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
300
+ # ).count(),
301
+ # count + 1,
302
+ # )
303
+
304
+ # def test_trigger_and_check_status_with_schedule_all(self):
305
+ # pipeline_schedule = fetch_or_create_pipeline_schedule(self.global_data_product)
306
+
307
+ # count = PipelineRun.query.filter(
308
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
309
+ # ).count()
310
+
311
+ # self.global_data_product.outdated_after = dict(seconds=2)
312
+ # self.global_data_product.outdated_starting_at = {}
313
+
314
+ # trigger_and_check_status(
315
+ # self.global_data_product,
316
+ # check_status=False,
317
+ # error_on_failure=False,
318
+ # poll_interval=1,
319
+ # poll_timeout=2,
320
+ # should_schedule=False,
321
+ # )
322
+
323
+ # with patch.object(PipelineScheduler, 'schedule') as _:
324
+ # schedule_all()
325
+
326
+ # pipeline_runs = PipelineRun.query.filter(
327
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
328
+ # ).all()
329
+
330
+ # pipeline_runs.sort(key=lambda pr: pr.execution_date)
331
+ # pipeline_run = pipeline_runs[-1]
332
+
333
+ # self.assertEqual(
334
+ # pipeline_run.status,
335
+ # PipelineRun.PipelineRunStatus.RUNNING,
336
+ # )
337
+ # self.assertEqual(
338
+ # PipelineRun.query.filter(
339
+ # PipelineRun.pipeline_schedule_id == pipeline_schedule.id,
340
+ # ).count(),
341
+ # count + 1,
342
+ # )
341
343
 
342
344
  def test_fetch_or_create_pipeline_schedule(self):
343
345
  self.assertEqual(PipelineSchedule.query.filter(
@@ -8,7 +8,7 @@ import tornado.ioloop
8
8
 
9
9
  import mage_ai.server.server as server_module
10
10
  from mage_ai.authentication.passwords import create_bcrypt_hash, generate_salt
11
- from mage_ai.data_preparation.repo_manager import ProjectType
11
+ from mage_ai.data_preparation.repo_manager import ProjectType, get_project_uuid
12
12
  from mage_ai.orchestration.db.models.oauth import (
13
13
  Oauth2Application,
14
14
  Permission,
@@ -21,7 +21,6 @@ from mage_ai.server.server import (
21
21
  make_app,
22
22
  replace_base_path,
23
23
  )
24
- from mage_ai.settings.repo import get_repo_name
25
24
  from mage_ai.tests.base_test import AsyncDBTestCase
26
25
 
27
26
 
@@ -150,7 +149,10 @@ class ServerTests(AsyncDBTestCase):
150
149
  def test_initialize_user_authentication_subproject(self):
151
150
  initialize_user_authentication(ProjectType.SUB)
152
151
 
153
- owner_role = Role.get_role(f'{get_repo_name()}_{Role.DefaultRole.OWNER}')
152
+ project_uuid = get_project_uuid()
153
+ project_uuid_truncated = project_uuid[:8]
154
+
155
+ owner_role = Role.get_role(f'{Role.DefaultRole.OWNER}_{project_uuid_truncated}')
154
156
  self.assertTrue(len(owner_role.users) > 0)
155
157
 
156
158
  owner_user = User.query.filter(User.email == 'admin@admin.com').one_or_none()
@@ -169,7 +171,28 @@ class ServerTests(AsyncDBTestCase):
169
171
  )
170
172
  initialize_user_authentication(ProjectType.SUB)
171
173
 
172
- owner_role = Role.get_role(f'{get_repo_name()}_{Role.DefaultRole.OWNER}')
174
+ project_uuid = get_project_uuid()
175
+ project_uuid_truncated = project_uuid[:8]
176
+ owner_role = Role.get_role(f'{Role.DefaultRole.OWNER}_{project_uuid_truncated}')
177
+ self.assertTrue(len(owner_role.users) == 0)
178
+
179
+ owner_user = User.query.filter(User.email == 'admin@admin.com').one_or_none()
180
+ self.assertIsNotNone(owner_user)
181
+
182
+ def test_initialize_user_authentication_subproject_admin_exists(self):
183
+ password_salt = generate_salt()
184
+ owner_role = Role.get_role(Role.DefaultRole.OWNER)
185
+ User.create(
186
+ email='admin@admin.com',
187
+ password_hash=create_bcrypt_hash('admin', password_salt),
188
+ password_salt=password_salt,
189
+ username='admin',
190
+ )
191
+ initialize_user_authentication(ProjectType.SUB)
192
+
193
+ project_uuid = get_project_uuid()
194
+ project_uuid_truncated = project_uuid[:8]
195
+ owner_role = Role.get_role(f'{Role.DefaultRole.OWNER}_{project_uuid_truncated}')
173
196
  self.assertTrue(len(owner_role.users) == 0)
174
197
 
175
198
  owner_user = User.query.filter(User.email == 'admin@admin.com').one_or_none()
@@ -7,6 +7,10 @@ from kubernetes.client import (
7
7
  V1Container,
8
8
  V1EnvFromSource,
9
9
  V1EnvVar,
10
+ V1NodeAffinity,
11
+ V1NodeSelector,
12
+ V1NodeSelectorRequirement,
13
+ V1NodeSelectorTerm,
10
14
  V1Pod,
11
15
  V1PodSpec,
12
16
  V1SecretEnvSource,
@@ -377,13 +381,12 @@ class JobManagerTests(TestCase):
377
381
 
378
382
  # Pod
379
383
  self.assertEqual(job.spec.template.spec.affinity, V1Affinity(
380
- **dict(
381
- node_affinity=dict(
382
- required_during_scheduling_ignored_during_execution=dict(
384
+ node_affinity=V1NodeAffinity(
385
+ required_during_scheduling_ignored_during_execution=V1NodeSelector(
383
386
  node_selector_terms=[
384
- dict(
387
+ V1NodeSelectorTerm(
385
388
  match_expressions=[
386
- dict(
389
+ V1NodeSelectorRequirement(
387
390
  key='kubernetes.io/os',
388
391
  operator='In',
389
392
  values=['linux']
@@ -394,7 +397,7 @@ class JobManagerTests(TestCase):
394
397
  )
395
398
  )
396
399
  )
397
- ))
400
+ )
398
401
 
399
402
  self.assertEqual(job.spec.template.spec.service_account_name, 'secretaccount')
400
403
  self.assertEqual(job.spec.template.spec.image_pull_secrets,
@@ -1,12 +1,13 @@
1
1
  from typing import List
2
2
 
3
- from mage_ai.data_preparation.git.api import push_raw
4
3
  from mage_ai.shared.strings import capitalize_remove_underscore_lower
5
4
 
6
5
 
7
6
  async def push(branch) -> List[str]:
8
7
  from git.exc import GitCommandError
9
8
 
9
+ from mage_ai.data_preparation.git.api import push_raw
10
+
10
11
  project = branch.project
11
12
  user = project.user
12
13
  provider = user.provider
@@ -10,11 +10,12 @@ from dataclasses import dataclass, field
10
10
  from typing import Any, Callable, Dict, List
11
11
 
12
12
  from mage_ai.authentication.oauth.constants import ProviderName
13
- from mage_ai.data_preparation.git.api import get_access_token_for_user, get_user
13
+ from mage_ai.data_preparation.git.api import get_user
14
14
  from mage_ai.data_preparation.git.utils import (
15
15
  execute_on_remote_branch,
16
16
  get_access_token,
17
17
  get_auth_type_from_url,
18
+ get_oauth_access_token_for_user,
18
19
  get_provider_from_remote_url,
19
20
  )
20
21
  from mage_ai.data_preparation.preferences import Preferences, get_preferences
@@ -544,7 +545,7 @@ class ProjectUser(BaseVersionControl):
544
545
  @property
545
546
  def access_token(self) -> str:
546
547
  if self.user and self.provider:
547
- access_token = get_access_token_for_user(self.user, provider=self.provider.name)
548
+ access_token = get_oauth_access_token_for_user(self.user, provider=self.provider.name)
548
549
  if access_token:
549
550
  return access_token.token
550
551
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mage-ai
3
- Version: 0.9.68
3
+ Version: 0.9.70
4
4
  Summary: Mage is a tool for building and deploying data pipelines.
5
5
  Home-page: https://github.com/mage-ai/mage-ai
6
6
  Author: Mage
@@ -24,14 +24,14 @@ Requires-Dist: cryptography ==41.0.6
24
24
  Requires-Dist: dask >=2022.2.0
25
25
  Requires-Dist: datadog ==0.44.0
26
26
  Requires-Dist: freezegun ==1.2.2
27
- Requires-Dist: great-expectations ==0.15.50
27
+ Requires-Dist: great-expectations ==0.18.12
28
28
  Requires-Dist: httpx ==0.23.1
29
29
  Requires-Dist: inflection ==0.5.1
30
30
  Requires-Dist: ipykernel ==6.15.0
31
31
  Requires-Dist: ipython ==8.10.0
32
32
  Requires-Dist: itsdangerous ~=1.1.0
33
33
  Requires-Dist: joblib >=1.1.0
34
- Requires-Dist: jupyter-server-proxy ==3.2.1
34
+ Requires-Dist: jupyter-server-proxy ==3.2.3
35
35
  Requires-Dist: jupyter-server ==1.23.5
36
36
  Requires-Dist: jupyter-client ==7.4.4
37
37
  Requires-Dist: ldap3 ==2.9.1
@@ -57,7 +57,7 @@ Requires-Dist: terminado ==0.17.1
57
57
  Requires-Dist: thefuzz[speedup] ==0.19.0
58
58
  Requires-Dist: tornado ==6.3.3
59
59
  Requires-Dist: typer[all] ==0.9.0
60
- Requires-Dist: typing-extensions ==4.5.0
60
+ Requires-Dist: typing-extensions ==4.10.0
61
61
  Requires-Dist: watchdog ==4.0.0
62
62
  Provides-Extra: ai
63
63
  Requires-Dist: astor >=0.8.1 ; extra == 'ai'
@@ -98,7 +98,7 @@ Requires-Dist: google-cloud-iam ~=2.13.0 ; extra == 'all'
98
98
  Requires-Dist: google-cloud-pubsub ~=2.19.0 ; extra == 'all'
99
99
  Requires-Dist: google-cloud-run ~=0.10.1 ; extra == 'all'
100
100
  Requires-Dist: google-cloud-storage ~=2.5.0 ; extra == 'all'
101
- Requires-Dist: great-expectations ==0.15.50 ; extra == 'all'
101
+ Requires-Dist: great-expectations ==0.18.12 ; extra == 'all'
102
102
  Requires-Dist: gspread ==5.7.2 ; extra == 'all'
103
103
  Requires-Dist: influxdb-client ==1.36.1 ; extra == 'all'
104
104
  Requires-Dist: kafka-python ==2.0.2 ; extra == 'all'