mage-ai 0.8.37__tar.gz → 0.8.39__tar.gz

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 (914) hide show
  1. {mage-ai-0.8.37/mage_ai.egg-info → mage-ai-0.8.39}/PKG-INFO +1 -1
  2. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/logging.py +2 -2
  3. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineRunResource.py +6 -3
  4. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/sources/constants.py +1 -0
  5. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/dbt/__init__.py +20 -0
  6. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/dbt/utils/__init__.py +4 -1
  7. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipeline.py +10 -1
  8. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/base.py +2 -2
  9. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/constants.py +3 -0
  10. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/export_utils.py +14 -1
  11. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/mssql.py +5 -2
  12. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/mysql.py +7 -3
  13. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/postgres.py +64 -21
  14. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/sql.py +35 -6
  15. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/trino.py +7 -3
  16. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/pipeline_scheduler.py +37 -27
  17. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/active_kernel.py +6 -3
  18. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/clusters.py +4 -1
  19. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/integration_sources.py +5 -2
  20. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/client/mage.py +2 -2
  21. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/constants.py +1 -1
  22. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/base.py +2 -2
  23. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/models.py +2 -2
  24. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/404.html +2 -2
  25. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/404.html.html +2 -2
  26. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/2626-905774aafeb2c600.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/2626-e7fa4f83f8214c97.js +1 -1
  27. mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/4178-9103014b7dae3c49.js +1 -0
  28. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/4538-8a3c3e47be976ede.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/4538-347283088b83c6bf.js +1 -1
  29. mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/5141-ddf4ba0a362d6f34.js +1 -0
  30. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/5477-793cd2120261d023.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/5477-b439f211b6146a11.js +1 -1
  31. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/5872-103815a4a043489b.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/5872-1767c45ee6690ae5.js +1 -1
  32. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/5896-f84e336fb8877027.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/5896-10a676bcc86978cc.js +1 -1
  33. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/7400-365cb7888b6db7d9.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/7400-f4db9b5d41f67f75.js +1 -1
  34. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/9386-fb899ca8ecc2a350.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/9386-d4cc11bab74eec8d.js +1 -1
  35. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/9832-c8b8970bb522f302.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/9832-f97919376d52e3bf.js +1 -1
  36. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-9e5f315db570ac77.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-3046bc53d24917c7.js +1 -1
  37. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-79e10a783afec3df.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-e64ba4e8b2bfe73c.js +1 -1
  38. mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-017f6a2de38f8658.js +1 -0
  39. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-1767a2f57f887ef7.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-e1271453ed0c8d6e.js +1 -1
  40. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-52c3ee3817e5554b.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-7446a70bdd8381a5.js +1 -1
  41. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-a23b61bab04a16f3.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-997acba85f777259.js +1 -1
  42. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-de28e502102defde.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-8c903140c99e487c.js +1 -1
  43. mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-6c0ea500b3bc6b61.js +1 -0
  44. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-8a2169d30b643ae7.js → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-783b9526167f1249.js +1 -1
  45. {mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/23nXkA2GRjJCZDwY3kuKd → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/ngCg1gM6urg83y2nV5KHK}/_buildManifest.js +1 -1
  46. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/index.html +2 -2
  47. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/manage.html +2 -2
  48. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  49. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  50. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  51. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  52. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  53. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  54. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  55. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  56. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  57. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  58. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  59. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  60. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  61. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  62. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines.html +2 -2
  63. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  64. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  65. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  66. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  67. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings.html +2 -2
  68. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/sign-in.html +2 -2
  69. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/terminal.html +2 -2
  70. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/test.html +2 -2
  71. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/triggers.html +2 -2
  72. mage-ai-0.8.39/mage_ai/server/logger.py +16 -0
  73. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/scheduler_manager.py +8 -4
  74. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/server.py +7 -14
  75. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/subscriber.py +6 -3
  76. mage-ai-0.8.39/mage_ai/server/terminal_server.py +65 -0
  77. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/frontend_renderer.py +3 -2
  78. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/websocket_server.py +4 -1
  79. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/settings/__init__.py +2 -0
  80. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/logger.py +4 -0
  81. {mage-ai-0.8.37 → mage-ai-0.8.39/mage_ai.egg-info}/PKG-INFO +1 -1
  82. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/SOURCES.txt +24 -22
  83. {mage-ai-0.8.37 → mage-ai-0.8.39}/setup.py +1 -1
  84. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/4178-e17f37d21253b832.js +0 -1
  85. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/5141-2ae9eae00ec2cdfa.js +0 -1
  86. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-6a52671f1853e1a5.js +0 -1
  87. mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-9c21edae8f1b6737.js +0 -1
  88. {mage-ai-0.8.37 → mage-ai-0.8.39}/LICENSE +0 -0
  89. {mage-ai-0.8.37 → mage-ai-0.8.39}/MANIFEST.in +0 -0
  90. {mage-ai-0.8.37 → mage-ai-0.8.39}/README.md +0 -0
  91. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/__init__.py +0 -0
  92. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/__init__.py +0 -0
  93. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/api_context.py +0 -0
  94. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/constants.py +0 -0
  95. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/errors.py +0 -0
  96. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/middleware.py +0 -0
  97. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/monitors/BaseMonitor.py +0 -0
  98. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/monitors/__init__.py +0 -0
  99. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/oauth_scope.py +0 -0
  100. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/__init__.py +0 -0
  101. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/base.py +0 -0
  102. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/constants.py +0 -0
  103. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/AutocompleteItemPolicy.py +0 -0
  104. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BackfillPolicy.py +0 -0
  105. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BasePolicy.py +0 -0
  106. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BlockPolicy.py +0 -0
  107. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BlockRunPolicy.py +0 -0
  108. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ClusterPolicy.py +0 -0
  109. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/DataProviderPolicy.py +0 -0
  110. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/EventRulePolicy.py +0 -0
  111. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ExtensionOptionPolicy.py +0 -0
  112. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FileContentPolicy.py +0 -0
  113. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FilePolicy.py +0 -0
  114. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FileVersionPolicy.py +0 -0
  115. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/GitBranchPolicy.py +0 -0
  116. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationDestinationPolicy.py +0 -0
  117. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationSourcePolicy.py +0 -0
  118. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationSourceStreamPolicy.py +0 -0
  119. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/KernelPolicy.py +0 -0
  120. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/LogPolicy.py +0 -0
  121. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/MonitorStatPolicy.py +0 -0
  122. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/OutputPolicy.py +0 -0
  123. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelinePolicy.py +0 -0
  124. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelineRunPolicy.py +0 -0
  125. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelineSchedulePolicy.py +0 -0
  126. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ProjectPolicy.py +0 -0
  127. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SecretPolicy.py +0 -0
  128. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SessionPolicy.py +0 -0
  129. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SyncPolicy.py +0 -0
  130. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/UserPolicy.py +0 -0
  131. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/VariablePolicy.py +0 -0
  132. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/WidgetPolicy.py +0 -0
  133. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/__init__.py +0 -0
  134. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/AutocompleteItemPresenter.py +0 -0
  135. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BackfillPresenter.py +0 -0
  136. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BasePresenter.py +0 -0
  137. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BlockPresenter.py +0 -0
  138. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BlockRunPresenter.py +0 -0
  139. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ClusterPresenter.py +0 -0
  140. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/DataProviderPresenter.py +0 -0
  141. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/EventRulePresenter.py +0 -0
  142. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ExtensionOptionPresenter.py +0 -0
  143. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FileContentPresenter.py +0 -0
  144. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FilePresenter.py +0 -0
  145. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FileVersionPresenter.py +0 -0
  146. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/GitBranchPresenter.py +0 -0
  147. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationDestinationPresenter.py +0 -0
  148. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationSourcePresenter.py +0 -0
  149. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationSourceStreamPresenter.py +0 -0
  150. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/KernelPresenter.py +0 -0
  151. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/LogPresenter.py +0 -0
  152. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/MonitorStatPresenter.py +0 -0
  153. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/OutputPresenter.py +0 -0
  154. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelinePresenter.py +0 -0
  155. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelineRunPresenter.py +0 -0
  156. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelineSchedulePresenter.py +0 -0
  157. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ProjectPresenter.py +0 -0
  158. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SecretPresenter.py +0 -0
  159. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SessionPresenter.py +0 -0
  160. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SyncPresenter.py +0 -0
  161. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/UserPresenter.py +0 -0
  162. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/VariablePresenter.py +0 -0
  163. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/WidgetPresenter.py +0 -0
  164. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/__init__.py +0 -0
  165. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/mixins/__init__.py +0 -0
  166. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/mixins/users.py +0 -0
  167. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/AutocompleteItemResource.py +0 -0
  168. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BackfillResource.py +0 -0
  169. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BaseResource.py +0 -0
  170. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BlockResource.py +0 -0
  171. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BlockRunResource.py +0 -0
  172. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ClusterResource.py +0 -0
  173. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/DataProviderResource.py +0 -0
  174. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/DatabaseResource.py +0 -0
  175. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/EventRuleResource.py +0 -0
  176. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ExtensionOptionResource.py +0 -0
  177. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileContentResource.py +0 -0
  178. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileResource.py +0 -0
  179. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileVersionResource.py +0 -0
  180. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/GenericResource.py +0 -0
  181. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/GitBranchResource.py +0 -0
  182. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationDestinationResource.py +0 -0
  183. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationSourceResource.py +0 -0
  184. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationSourceStreamResource.py +0 -0
  185. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/KernelResource.py +0 -0
  186. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/LogResource.py +0 -0
  187. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/MonitorStatResource.py +0 -0
  188. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/OutputResource.py +0 -0
  189. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineResource.py +0 -0
  190. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineScheduleResource.py +0 -0
  191. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ProjectResource.py +0 -0
  192. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/Resource.py +0 -0
  193. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SecretResource.py +0 -0
  194. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SessionResource.py +0 -0
  195. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SyncResource.py +0 -0
  196. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/UserResource.py +0 -0
  197. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/VariableResource.py +0 -0
  198. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/WidgetResource.py +0 -0
  199. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/__init__.py +0 -0
  200. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/mixins/__init__.py +0 -0
  201. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/__init__.py +0 -0
  202. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/collections.py +0 -0
  203. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/collective_loaders.py +0 -0
  204. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/result_set.py +0 -0
  205. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/utils.py +0 -0
  206. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/views.py +0 -0
  207. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/__init__.py +0 -0
  208. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/ldap.py +0 -0
  209. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/oauth2.py +0 -0
  210. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/passwords.py +0 -0
  211. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/autocomplete/__init__.py +0 -0
  212. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/autocomplete/utils.py +0 -0
  213. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/__init__.py +0 -0
  214. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/main.py +0 -0
  215. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/utils.py +0 -0
  216. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/__init__.py +0 -0
  217. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/__init__.py +0 -0
  218. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/ecs_task_manager.py +0 -0
  219. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/emr_cluster_manager.py +0 -0
  220. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/cluster_manager.py +0 -0
  221. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/constants.py +0 -0
  222. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/gcp/__init__.py +0 -0
  223. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/gcp/cloud_run_service_manager.py +0 -0
  224. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/kubernetes/__init__.py +0 -0
  225. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/kubernetes/workload_manager.py +0 -0
  226. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/__init__.py +0 -0
  227. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/__init__.py +0 -0
  228. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/calculator.py +0 -0
  229. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/charts.py +0 -0
  230. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/constants.py +0 -0
  231. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/__init__.py +0 -0
  232. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/base.py +0 -0
  233. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/clean_column_names.py +0 -0
  234. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/fix_syntax_errors.py +0 -0
  235. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/impute_values.py +0 -0
  236. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/reformat_values.py +0 -0
  237. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_collinear_columns.py +0 -0
  238. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_columns_with_high_empty_rate.py +0 -0
  239. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_columns_with_single_value.py +0 -0
  240. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_duplicate_rows.py +0 -0
  241. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_outliers.py +0 -0
  242. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/__init__.py +0 -0
  243. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/column_type_detector.py +0 -0
  244. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/constants.py +0 -0
  245. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/data_cleaner.py +0 -0
  246. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/__init__.py +0 -0
  247. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/base.py +0 -0
  248. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/encoders.py +0 -0
  249. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/outlier_removal.py +0 -0
  250. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/pipelines/__init__.py +0 -0
  251. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/pipelines/base.py +0 -0
  252. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/shared/__init__.py +0 -0
  253. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/shared/utils.py +0 -0
  254. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/statistics/__init__.py +0 -0
  255. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/statistics/calculator.py +0 -0
  256. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/__init__.py +0 -0
  257. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/action_code.py +0 -0
  258. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/base.py +0 -0
  259. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/column.py +0 -0
  260. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/constants.py +0 -0
  261. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/custom_action.py +0 -0
  262. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/dependency_resolution.py +0 -0
  263. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/helpers.py +0 -0
  264. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/row.py +0 -0
  265. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/shared.py +0 -0
  266. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/__init__.py +0 -0
  267. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/constants.py +0 -0
  268. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/transformers.py +0 -0
  269. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/__init__.py +0 -0
  270. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/addition.py +0 -0
  271. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/base.py +0 -0
  272. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/constant.py +0 -0
  273. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/date_trunc.py +0 -0
  274. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/difference.py +0 -0
  275. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/distance_between.py +0 -0
  276. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/divide.py +0 -0
  277. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/formatted_date.py +0 -0
  278. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/if_else.py +0 -0
  279. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/multiply.py +0 -0
  280. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/string_replace.py +0 -0
  281. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/string_split.py +0 -0
  282. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/substring.py +0 -0
  283. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/utils.py +0 -0
  284. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/variable_replacer.py +0 -0
  285. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/__init__.py +0 -0
  286. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/destinations/__init__.py +0 -0
  287. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/destinations/constants.py +0 -0
  288. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/logger/__init__.py +0 -0
  289. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/logger/utils.py +0 -0
  290. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/sources/__init__.py +0 -0
  291. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/__init__.py +0 -0
  292. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/config.py +0 -0
  293. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/parsers.py +0 -0
  294. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/scheduler.py +0 -0
  295. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/__init__.py +0 -0
  296. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/decorators.py +0 -0
  297. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/__init__.py +0 -0
  298. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/block_executor.py +0 -0
  299. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/ecs_block_executor.py +0 -0
  300. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/executor_factory.py +0 -0
  301. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/gcp_cloud_run_block_executor.py +0 -0
  302. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/k8s_block_executor.py +0 -0
  303. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pipeline_executor.py +0 -0
  304. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pyspark_block_executor.py +0 -0
  305. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pyspark_pipeline_executor.py +0 -0
  306. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/streaming_pipeline_executor.py +0 -0
  307. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/git/__init__.py +0 -0
  308. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/__init__.py +0 -0
  309. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/gcs_logger_manager.py +0 -0
  310. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger.py +0 -0
  311. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger_manager.py +0 -0
  312. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger_manager_factory.py +0 -0
  313. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/s3_logger_manager.py +0 -0
  314. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/__init__.py +0 -0
  315. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/__init__.py +0 -0
  316. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/constants.py +0 -0
  317. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/errors.py +0 -0
  318. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/__init__.py +0 -0
  319. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/block.py +0 -0
  320. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/great_expectations.py +0 -0
  321. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/utils.py +0 -0
  322. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/integration/__init__.py +0 -0
  323. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/__init__.py +0 -0
  324. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/data_exporter.jinja +0 -0
  325. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/data_loader.jinja +0 -0
  326. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/transformer.jinja +0 -0
  327. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/__init__.py +0 -0
  328. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/bigquery.py +0 -0
  329. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/mssql.py +0 -0
  330. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/mysql.py +0 -0
  331. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/postgres.py +0 -0
  332. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/redshift.py +0 -0
  333. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/snowflake.py +0 -0
  334. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/trino.py +0 -0
  335. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/utils/__init__.py +0 -0
  336. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/utils/shared.py +0 -0
  337. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/utils.py +0 -0
  338. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/constants.py +0 -0
  339. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/errors.py +0 -0
  340. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/file.py +0 -0
  341. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/__init__.py +0 -0
  342. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/integration_pipeline.py +0 -0
  343. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/utils.py +0 -0
  344. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/utils.py +0 -0
  345. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/variable.py +0 -0
  346. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/__init__.py +0 -0
  347. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/charts.py +0 -0
  348. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/constants.py +0 -0
  349. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/utils.py +0 -0
  350. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/preferences.py +0 -0
  351. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/repo_manager.py +0 -0
  352. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/__init__.py +0 -0
  353. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/constants.py +0 -0
  354. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/secrets.py +0 -0
  355. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/stream.py +0 -0
  356. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/utils.py +0 -0
  357. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/__init__.py +0 -0
  358. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/base_storage.py +0 -0
  359. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/local_storage.py +0 -0
  360. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/s3_storage.py +0 -0
  361. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/utils.py +0 -0
  362. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/__init__.py +0 -0
  363. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/base_sync.py +0 -0
  364. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/git_sync.py +0 -0
  365. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/__init__.py +0 -0
  366. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/callbacks/default.py +0 -0
  367. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/custom/python/default.jinja +0 -0
  368. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/azure_blob_storage.py +0 -0
  369. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/bigquery.py +0 -0
  370. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/default.jinja +0 -0
  371. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/file.py +0 -0
  372. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/google_cloud_storage.py +0 -0
  373. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/mysql.py +0 -0
  374. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/postgres.py +0 -0
  375. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/pyspark/default.jinja +0 -0
  376. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/pyspark/s3.py +0 -0
  377. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/r/default.jinja +0 -0
  378. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/redshift.py +0 -0
  379. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/s3.py +0 -0
  380. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/snowflake.py +0 -0
  381. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/kafka.yaml +0 -0
  382. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/kinesis.yaml +0 -0
  383. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/opensearch.yaml +0 -0
  384. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/s3.yaml +0 -0
  385. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/api.py +0 -0
  386. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/azure_blob_storage.py +0 -0
  387. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/bigquery.py +0 -0
  388. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/default.jinja +0 -0
  389. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/file.py +0 -0
  390. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/google_cloud_storage.py +0 -0
  391. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/mysql.py +0 -0
  392. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/postgres.py +0 -0
  393. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/pyspark/default.jinja +0 -0
  394. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/pyspark/s3.py +0 -0
  395. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/r/default.jinja +0 -0
  396. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/redshift.py +0 -0
  397. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/s3.py +0 -0
  398. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/snowflake.py +0 -0
  399. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/azure_event_hub.yaml +0 -0
  400. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/kafka.yaml +0 -0
  401. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/kinesis.yaml +0 -0
  402. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/rabbitmq.yaml +0 -0
  403. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/extensions/great_expectations/default.jinja +0 -0
  404. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline/__init__.py +0 -0
  405. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline/metadata.yaml +0 -0
  406. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline_execution/emr_bootstrap.sh +0 -0
  407. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline_execution/spark_script.jinja +0 -0
  408. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/__init__.py +0 -0
  409. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/charts/__init__.py +0 -0
  410. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/custom/__init__.py +0 -0
  411. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_exporters/__init__.py +0 -0
  412. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_exporters/export_titanic_clean.py +0 -0
  413. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_loaders/__init__.py +0 -0
  414. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_loaders/load_titanic.py +0 -0
  415. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/dbt/profiles.yml +0 -0
  416. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/extensions/__init__.py +0 -0
  417. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/io_config.yaml +0 -0
  418. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/metadata.yaml +0 -0
  419. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/__init__.py +0 -0
  420. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/__init__.py +0 -0
  421. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/metadata.yaml +0 -0
  422. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/requirements.txt +0 -0
  423. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/scratchpads/__init__.py +0 -0
  424. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/transformers/__init__.py +0 -0
  425. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/transformers/fill_in_missing_values.py +0 -0
  426. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/utils/__init__.py +0 -0
  427. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/bigquery.py +0 -0
  428. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/default.py +0 -0
  429. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/mysql.py +0 -0
  430. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/postgres.py +0 -0
  431. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/redshift.py +0 -0
  432. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/s3.py +0 -0
  433. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/snowflake.py +0 -0
  434. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/template.py +0 -0
  435. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/testable.jinja +0 -0
  436. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/data_warehouse_transformer.jinja +0 -0
  437. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default.jinja +0 -0
  438. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default_pyspark.jinja +0 -0
  439. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default_streaming.jinja +0 -0
  440. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/r/default.r +0 -0
  441. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/suggestion_fmt.jinja +0 -0
  442. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/action.jinja +0 -0
  443. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/average.py +0 -0
  444. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/clean_column_name.py +0 -0
  445. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count.py +0 -0
  446. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count_distinct.py +0 -0
  447. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/diff.py +0 -0
  448. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/first.py +0 -0
  449. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/fix_syntax_errors.py +0 -0
  450. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/impute.py +0 -0
  451. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/last.py +0 -0
  452. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/max.py +0 -0
  453. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/median.py +0 -0
  454. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/min.py +0 -0
  455. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/normalize.py +0 -0
  456. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/reformat.py +0 -0
  457. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove.py +0 -0
  458. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove_outliers.py +0 -0
  459. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/select.py +0 -0
  460. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_down.py +0 -0
  461. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_up.py +0 -0
  462. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/standardize.py +0 -0
  463. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/sum.py +0 -0
  464. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/drop_duplicate.py +0 -0
  465. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/filter.py +0 -0
  466. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/remove.py +0 -0
  467. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/sort.py +0 -0
  468. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/utils.py +0 -0
  469. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/__init__.py +0 -0
  470. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/block/__init__.py +0 -0
  471. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/block/convert_content.py +0 -0
  472. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/variable_manager.py +0 -0
  473. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/errors/__init__.py +0 -0
  474. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/errors/base.py +0 -0
  475. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/__init__.py +0 -0
  476. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/constants.py +0 -0
  477. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/great_expectations/__init__.py +0 -0
  478. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/great_expectations/constants.py +0 -0
  479. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/__init__.py +0 -0
  480. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/azure_blob_storage.py +0 -0
  481. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/bigquery.py +0 -0
  482. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/config.py +0 -0
  483. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/file.py +0 -0
  484. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/google_cloud_storage.py +0 -0
  485. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/io_config.py +0 -0
  486. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/redshift.py +0 -0
  487. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/s3.py +0 -0
  488. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/snowflake.py +0 -0
  489. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/utils.py +0 -0
  490. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/__init__.py +0 -0
  491. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/airflow.py +0 -0
  492. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/backfills/__init__.py +0 -0
  493. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/backfills/service.py +0 -0
  494. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/constants.py +0 -0
  495. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/__init__.py +0 -0
  496. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/alembic.ini +0 -0
  497. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/database_manager.py +0 -0
  498. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/errors.py +0 -0
  499. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/README.md +0 -0
  500. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/env.py +0 -0
  501. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/script.py.mako +0 -0
  502. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/053ee2c10d85_add_completed_at.py +0 -0
  503. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/067326f43bc3_add_variables_to_pipelinerun.py +0 -0
  504. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/1d8e65aeefdd_add_settings_to_pipeline_schedule.py +0 -0
  505. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/1f9353eddbc6_add_secrets_table.py +0 -0
  506. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/2266370f589b_add_indexes_to_pipeline_run.py +0 -0
  507. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/26305e46df52_create_backfills_table.py +0 -0
  508. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/3fafd217efa7_add_event_matcher_model.py +0 -0
  509. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/52ab80005742_add_variables_to_pipeline_schedule.py +0 -0
  510. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/5cd59ec4cf1d_add_passed_sla_to_pipeline_run.py +0 -0
  511. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/643b6e65e814_add_unique_indexes_on_authentication_.py +0 -0
  512. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/6aecc9bc451c_update_schedule_type_enum.py +0 -0
  513. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/7ac6fed06918_add_token_column_to_pipeline_schedule_.py +0 -0
  514. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/847ea6602d6f_add_upstream_failed_to_block_run_status.py +0 -0
  515. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/84de4cdd6126_add_sla_to_pipeline_schedule.py +0 -0
  516. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/8971d4cd5b39_add_event_variables_and_metadata_to_.py +0 -0
  517. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/97ff9f55a3c0_create_users_oauth2_applications_and_.py +0 -0
  518. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/b01be687e537_add_started_at_to_block_run.py +0 -0
  519. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/c07a23ff782b_add_initial_tables.py +0 -0
  520. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/ec5df57a1c60_add_metrics_to_block_runs.py +0 -0
  521. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/__init__.py +0 -0
  522. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/base.py +0 -0
  523. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/oauth.py +0 -0
  524. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/schedules.py +0 -0
  525. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/secrets.py +0 -0
  526. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/process.py +0 -0
  527. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/execution_process_manager.py +0 -0
  528. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/job_manager.py +0 -0
  529. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/metrics/__init__.py +0 -0
  530. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/metrics/pipeline_run.py +0 -0
  531. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/monitor/__init__.py +0 -0
  532. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/monitor/monitor_stats.py +0 -0
  533. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/__init__.py +0 -0
  534. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/config.py +0 -0
  535. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/sender.py +0 -0
  536. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/__init__.py +0 -0
  537. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/celery_queue.py +0 -0
  538. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/config.py +0 -0
  539. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/process_queue.py +0 -0
  540. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/queue.py +0 -0
  541. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/queue_factory.py +0 -0
  542. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/run_status_checker.py +0 -0
  543. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/__init__.py +0 -0
  544. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/event_trigger.py +0 -0
  545. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/loop_time_trigger.py +0 -0
  546. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/time_trigger.py +0 -0
  547. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/utils/__init__.py +0 -0
  548. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/utils/resources.py +0 -0
  549. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/__init__.py +0 -0
  550. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/product_purchases.csv +0 -0
  551. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/salary_survey.csv +0 -0
  552. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/titanic_survival.csv +0 -0
  553. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/user_emails.csv +0 -0
  554. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/__init__.py +0 -0
  555. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/__init__.py +0 -0
  556. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/base.py +0 -0
  557. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/blocks.py +0 -0
  558. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/constants.py +0 -0
  559. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/errors.py +0 -0
  560. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/events.py +0 -0
  561. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/projects.py +0 -0
  562. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/triggers.py +0 -0
  563. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/v1.py +0 -0
  564. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/app.py +0 -0
  565. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/client/__init__.py +0 -0
  566. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/__init__.py +0 -0
  567. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/docs_server.py +0 -0
  568. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/execution_manager.py +0 -0
  569. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1150.1378afaa474df64a.js +0 -0
  570. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1240.0819f45820d22263.js +0 -0
  571. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1286-a62050b3f897c6be.js +0 -0
  572. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1450.d383f64c169d4278.js +0 -0
  573. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1774-aa51ef1da7217ff9.js +0 -0
  574. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2083-78a438dbdc57d1e4.js +0 -0
  575. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2125-0b537dc53fe71b18.js +0 -0
  576. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2344-5cd452dd1825dabc.js +0 -0
  577. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2481.0454a0e25dc7e027.js +0 -0
  578. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2508.724531e7f9cf5f36.js +0 -0
  579. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2524-6aeb9419acf5d1b4.js +0 -0
  580. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2545.8371b39c898ae92b.js +0 -0
  581. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/261.0a24b4ece1d29aa1.js +0 -0
  582. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/266.e301071d22592682.js +0 -0
  583. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2714-1e79e9f2e998b544.js +0 -0
  584. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/29107295-989a0767a635d9d5.js +0 -0
  585. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3453.992f4b1667e9882c.js +0 -0
  586. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3467.38cd0654ba6f788f.js +0 -0
  587. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3835.df296b4e4078e985.js +0 -0
  588. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3850-6395783d820def1c.js +0 -0
  589. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3873.4b3eace753998412.js +0 -0
  590. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3898.880191695bb05845.js +0 -0
  591. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4042.5e16d36209052351.js +0 -0
  592. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4092.536ee541241f4538.js +0 -0
  593. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4261-6c235b561c91eca3.js +0 -0
  594. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4388.04098706f32e69e7.js +0 -0
  595. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/440.3ab77942f659ea0c.js +0 -0
  596. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4450.79f14f763d55c63e.js +0 -0
  597. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4454.13a2404adecaa39e.js +0 -0
  598. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4495-4f0340aa82e0c623.js +0 -0
  599. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4776.753ad29fa0a29a4a.js +0 -0
  600. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4804-01a10103ebe26ca8.js +0 -0
  601. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4883.a5bb0edbf8f3cc8f.js +0 -0
  602. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5008.29c2662ecc2b04c7.js +0 -0
  603. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5104.1edcf4437c471dd4.js +0 -0
  604. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5164.857023e800905b6f.js +0 -0
  605. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5729.0f2748e9e6dab951.js +0 -0
  606. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5824.628653557e904674.js +0 -0
  607. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6042.c59010de9e699437.js +0 -0
  608. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6085-692d2f784c0504f2.js +0 -0
  609. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6115.0c85e507543394ea.js +0 -0
  610. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6116.871a682ddf535aca.js +0 -0
  611. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6166-2ee6aff0ca70b2f0.js +0 -0
  612. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6434.10380ee0968636ba.js +0 -0
  613. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6443.7b6d2b4e51018184.js +0 -0
  614. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6507.d3a17777d2c294e6.js +0 -0
  615. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6532-dcc478dab6a58580.js +0 -0
  616. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6958.8f39c585d36737a7.js +0 -0
  617. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7011-81dd8269c4806d26.js +0 -0
  618. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/72fdc299.2d5ec188af5d0049.js +0 -0
  619. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/739.3d24945544b37e52.js +0 -0
  620. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/792.010ca00d79b2112f.js +0 -0
  621. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7947.77be4bec4d47774e.js +0 -0
  622. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7951.fee8b6c27c9ef777.js +0 -0
  623. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8018.968bf87c390e3312.js +0 -0
  624. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8097.b0345f30a7390c1d.js +0 -0
  625. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8180-8de652170ea5ed93.js +0 -0
  626. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8256.290ceb269b1ffe26.js +0 -0
  627. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/826.75268ee34f93393a.js +0 -0
  628. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8277.5003e1d94bb85156.js +0 -0
  629. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/839-c0deab1de13a0fba.js +0 -0
  630. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8762.dff300f86bef8573.js +0 -0
  631. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8789-4f858e520d46973b.js +0 -0
  632. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8807.a68c69c8fe0a8c01.js +0 -0
  633. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8849.db0d50b4d84b09a6.js +0 -0
  634. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8901.21d26d5a1ee473fe.js +0 -0
  635. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8920.5700e380a2999098.js +0 -0
  636. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9258.6c6ef544c701a011.js +0 -0
  637. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9307.d4baf7aebbcef1f0.js +0 -0
  638. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9361.a0820e3069f5ef74.js +0 -0
  639. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9363.6b811b4c86277e07.js +0 -0
  640. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9437.a3c32f45cf9ef69b.js +0 -0
  641. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9565-28e1c30511c95c2d.js +0 -0
  642. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9566.f8bd24768ed14ecb.js +0 -0
  643. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9633.40e5056ca1e2b22a.js +0 -0
  644. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9785.5ff26cb26d84d6a1.js +0 -0
  645. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9855.c4394a68322be9f8.js +0 -0
  646. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9927.e82a3e1e21990d77.js +0 -0
  647. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/bd1a647f.6050372acaa5cc3c.js +0 -0
  648. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/framework-7c365855dab1bf41.js +0 -0
  649. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/main-bb0dd5375146d7fd.js +0 -0
  650. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-7e791bee1e32adec.js +0 -0
  651. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/_error-235304e5badb19eb.js +0 -0
  652. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/index-e34a68d2f6fe16f2.js +0 -0
  653. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-aac92b9ab9034c1a.js +0 -0
  654. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-5f95bb4c3a2d7d46.js +0 -0
  655. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-f8544e3e6ad7c1ff.js +0 -0
  656. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-dbd14363a06d17c5.js +0 -0
  657. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-187456108be8a7e6.js +0 -0
  658. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-675171cfd7d7b346.js +0 -0
  659. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-b2955f0ff960894e.js +0 -0
  660. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-f5842a788b0cb80c.js +0 -0
  661. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-6160e7f91a340354.js +0 -0
  662. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-4e973d4bc0ebcdc1.js +0 -0
  663. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]-ca9457e1a6bced4b.js +0 -0
  664. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-f1844beb127841f3.js +0 -0
  665. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-d72dfc596e943cc4.js +0 -0
  666. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings-d594a66a568306da.js +0 -0
  667. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-404d934deb8950d5.js +0 -0
  668. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/test-85cf18ae78ff535c.js +0 -0
  669. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/polyfills-5cd94c89d3acac5f.js +0 -0
  670. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/webpack-bc5e4eb2c1ff587c.js +0 -0
  671. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/css/d1e8e64d0b07af2f.css +0 -0
  672. {mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/23nXkA2GRjJCZDwY3kuKd → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/ngCg1gM6urg83y2nV5KHK}/_middlewareManifest.js +0 -0
  673. {mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/23nXkA2GRjJCZDwY3kuKd → mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/ngCg1gM6urg83y2nV5KHK}/_ssgManifest.js +0 -0
  674. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/favicon.ico +0 -0
  675. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Bold.ttf +0 -0
  676. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Light.ttf +0 -0
  677. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Medium.ttf +0 -0
  678. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Regular.ttf +0 -0
  679. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Retina.ttf +0 -0
  680. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-SemiBold.ttf +0 -0
  681. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/LICENSE.txt +0 -0
  682. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Black.ttf +0 -0
  683. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BlackItalic.ttf +0 -0
  684. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Bold.ttf +0 -0
  685. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BoldItalic.ttf +0 -0
  686. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Italic.ttf +0 -0
  687. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Light.ttf +0 -0
  688. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-LightItalic.ttf +0 -0
  689. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Medium.ttf +0 -0
  690. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  691. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Regular.ttf +0 -0
  692. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Thin.ttf +0 -0
  693. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-ThinItalic.ttf +0 -0
  694. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/LICENSE.txt +0 -0
  695. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/README.txt +0 -0
  696. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/RobotoMono-Italic-VariableFont_wght.ttf +0 -0
  697. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/RobotoMono-VariableFont_wght.ttf +0 -0
  698. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Bold.ttf +0 -0
  699. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-BoldItalic.ttf +0 -0
  700. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLight.ttf +0 -0
  701. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLightItalic.ttf +0 -0
  702. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Italic.ttf +0 -0
  703. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Light.ttf +0 -0
  704. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-LightItalic.ttf +0 -0
  705. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Medium.ttf +0 -0
  706. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-MediumItalic.ttf +0 -0
  707. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Regular.ttf +0 -0
  708. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBold.ttf +0 -0
  709. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBoldItalic.ttf +0 -0
  710. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Thin.ttf +0 -0
  711. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ThinItalic.ttf +0 -0
  712. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/backfill.jpg +0 -0
  713. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/banner-shape-purple-peach.jpg +0 -0
  714. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/dashboard-api-key.webp +0 -0
  715. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/extensions/great_expectations/logo.png +0 -0
  716. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/extra.jpg +0 -0
  717. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/monitor.jpg +0 -0
  718. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/run B.jpg +0 -0
  719. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/sessions/abstract.png +0 -0
  720. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/vercel.svg +0 -0
  721. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/kernel_output_parser.py +0 -0
  722. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/kernels.py +0 -0
  723. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/__init__.py +0 -0
  724. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/output_display.py +0 -0
  725. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/__init__.py +0 -0
  726. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/__init__.py +0 -0
  727. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/client.py +0 -0
  728. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/config.py +0 -0
  729. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/constants.py +0 -0
  730. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/exceptions.py +0 -0
  731. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/server.py +0 -0
  732. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/__init__.py +0 -0
  733. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/__init__.py +0 -0
  734. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/config.py +0 -0
  735. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/ecs.py +0 -0
  736. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/__init__.py +0 -0
  737. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/config.py +0 -0
  738. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/emr.py +0 -0
  739. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/emr_basics.py +0 -0
  740. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/launcher.py +0 -0
  741. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/resource_manager.py +0 -0
  742. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/events/__init__.py +0 -0
  743. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/events/events.py +0 -0
  744. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/s3/__init__.py +0 -0
  745. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/s3/s3.py +0 -0
  746. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/secrets_manager/__init__.py +0 -0
  747. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/secrets_manager/secrets_manager.py +0 -0
  748. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/datadog/__init__.py +0 -0
  749. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/__init__.py +0 -0
  750. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/config.py +0 -0
  751. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/constants.py +0 -0
  752. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/dbt.py +0 -0
  753. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/__init__.py +0 -0
  754. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/config.py +0 -0
  755. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/email.py +0 -0
  756. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/__init__.py +0 -0
  757. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/__init__.py +0 -0
  758. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/cloud_run.py +0 -0
  759. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/config.py +0 -0
  760. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/__init__.py +0 -0
  761. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/config.py +0 -0
  762. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/google_chat.py +0 -0
  763. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/__init__.py +0 -0
  764. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/config.py +0 -0
  765. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/constants.py +0 -0
  766. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/hightouch.py +0 -0
  767. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/__init__.py +0 -0
  768. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/constants.py +0 -0
  769. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/job_manager.py +0 -0
  770. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/__init__.py +0 -0
  771. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/config.py +0 -0
  772. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/metaplane.py +0 -0
  773. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/__init__.py +0 -0
  774. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/config.py +0 -0
  775. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/slack.py +0 -0
  776. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/__init__.py +0 -0
  777. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/config.py +0 -0
  778. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/constants.py +0 -0
  779. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/stitch.py +0 -0
  780. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/__init__.py +0 -0
  781. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/config.py +0 -0
  782. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/teams.py +0 -0
  783. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/tracking/__init__.py +0 -0
  784. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/tracking/metrics.py +0 -0
  785. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/__init__.py +0 -0
  786. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/array.py +0 -0
  787. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/code.py +0 -0
  788. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/config.py +0 -0
  789. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/constants.py +0 -0
  790. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/conversions.py +0 -0
  791. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/custom_types.py +0 -0
  792. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/dates.py +0 -0
  793. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/environments.py +0 -0
  794. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/hash.py +0 -0
  795. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/http_client.py +0 -0
  796. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/io.py +0 -0
  797. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/multi.py +0 -0
  798. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/parsers.py +0 -0
  799. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/retry.py +0 -0
  800. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/security.py +0 -0
  801. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/strings.py +0 -0
  802. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/urls.py +0 -0
  803. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/utils.py +0 -0
  804. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/__init__.py +0 -0
  805. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/constants.py +0 -0
  806. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/__init__.py +0 -0
  807. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/amazon_s3.py +0 -0
  808. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/base.py +0 -0
  809. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/kafka.py +0 -0
  810. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/kinesis.py +0 -0
  811. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/opensearch.py +0 -0
  812. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/sink_factory.py +0 -0
  813. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/__init__.py +0 -0
  814. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/azure_event_hub.py +0 -0
  815. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/base.py +0 -0
  816. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/kafka.py +0 -0
  817. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/kinesis.py +0 -0
  818. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/rabbitmq.py +0 -0
  819. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/source_factory.py +0 -0
  820. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/__init__.py +0 -0
  821. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/__init__.py +0 -0
  822. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/__init__.py +0 -0
  823. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/base.py +0 -0
  824. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_operations.py +0 -0
  825. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_sessions.py +0 -0
  826. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_users.py +0 -0
  827. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/base_test.py +0 -0
  828. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/__init__.py +0 -0
  829. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/__init__.py +0 -0
  830. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_clean_column_names.py +0 -0
  831. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_fix_syntax_error.py +0 -0
  832. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_impute_values.py +0 -0
  833. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_reformat_values.py +0 -0
  834. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_collinear_columns.py +0 -0
  835. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_columns_with_high_empty_rate.py +0 -0
  836. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_columns_with_single_value.py +0 -0
  837. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_duplicate_rows.py +0 -0
  838. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_outliers.py +0 -0
  839. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/statistics/__init__.py +0 -0
  840. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/statistics/test_calculator.py +0 -0
  841. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/test_column_type_detector.py +0 -0
  842. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/__init__.py +0 -0
  843. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/shared.py +0 -0
  844. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_base.py +0 -0
  845. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_column.py +0 -0
  846. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_custom_actions.py +0 -0
  847. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_helpers.py +0 -0
  848. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_row.py +0 -0
  849. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_utils.py +0 -0
  850. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_variable_replacer.py +0 -0
  851. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/__init__.py +0 -0
  852. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/__init__.py +0 -0
  853. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/block/__init__.py +0 -0
  854. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/block/test_sql.py +0 -0
  855. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_block.py +0 -0
  856. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_pipeline.py +0 -0
  857. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_variable.py +0 -0
  858. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/test_templates.py +0 -0
  859. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/test_variable_manager.py +0 -0
  860. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/factory.py +0 -0
  861. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/__init__.py +0 -0
  862. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/test_config.py +0 -0
  863. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/test_export_utils.py +0 -0
  864. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/__init__.py +0 -0
  865. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/db/__init__.py +0 -0
  866. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/db/test_models.py +0 -0
  867. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/__init__.py +0 -0
  868. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/constants.py +0 -0
  869. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/test_config.py +0 -0
  870. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/test_sender.py +0 -0
  871. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/queue/__init__.py +0 -0
  872. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/queue/test_process_queue.py +0 -0
  873. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_execution_process_manager.py +0 -0
  874. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_job_manager.py +0 -0
  875. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_pipeline_scheduler.py +0 -0
  876. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/__init__.py +0 -0
  877. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/test_event_trigger.py +0 -0
  878. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/test_loop_time_trigger.py +0 -0
  879. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/__init__.py +0 -0
  880. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/__init__.py +0 -0
  881. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/s3/__init__.py +0 -0
  882. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/s3/test_s3.py +0 -0
  883. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/datadog/__init__.py +0 -0
  884. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/datadog/test_datadog.py +0 -0
  885. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/k8s/__init__.py +0 -0
  886. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/k8s/test_job_manager.py +0 -0
  887. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/__init__.py +0 -0
  888. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_io.py +0 -0
  889. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_retry.py +0 -0
  890. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_security.py +0 -0
  891. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/__init__.py +0 -0
  892. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/__init__.py +0 -0
  893. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_amazon_s3.py +0 -0
  894. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_kinesis.py +0 -0
  895. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_opensearch.py +0 -0
  896. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_sink_factory.py +0 -0
  897. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/__init__.py +0 -0
  898. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_azure_event_hub.py +0 -0
  899. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_kafka.py +0 -0
  900. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_kinesis.py +0 -0
  901. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_rabbitmq.py +0 -0
  902. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_source_factory.py +0 -0
  903. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/test_shared.py +0 -0
  904. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/__init__.py +0 -0
  905. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/code.py +0 -0
  906. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/logger/__init__.py +0 -0
  907. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/logger/constants.py +0 -0
  908. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/dependency_links.txt +0 -0
  909. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/entry_points.txt +0 -0
  910. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/requires.txt +0 -0
  911. {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/top_level.txt +0 -0
  912. {mage-ai-0.8.37 → mage-ai-0.8.39}/pyproject.toml +0 -0
  913. {mage-ai-0.8.37 → mage-ai-0.8.39}/requirements.txt +0 -0
  914. {mage-ai-0.8.37 → mage-ai-0.8.39}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mage-ai
3
- Version: 0.8.37
3
+ Version: 0.8.39
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
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
- import logging
2
+ from mage_ai.server.logger import Logger
3
3
 
4
- LOGGER = logging.getLogger(__name__)
4
+ LOGGER = Logger().new_server_logger(__name__)
5
5
 
6
6
 
7
7
  def debug(text):
@@ -6,7 +6,7 @@ from mage_ai.data_preparation.models.constants import PipelineType
6
6
  from mage_ai.data_preparation.models.pipeline import Pipeline
7
7
  from mage_ai.orchestration.db import safe_db_query
8
8
  from mage_ai.orchestration.db.models.schedules import BlockRun, PipelineRun
9
- from mage_ai.orchestration.pipeline_scheduler import get_variables
9
+ from mage_ai.orchestration.pipeline_scheduler import get_variables, stop_pipeline_run
10
10
  from sqlalchemy.orm import selectinload
11
11
 
12
12
 
@@ -219,8 +219,11 @@ class PipelineRunResource(DatabaseResource):
219
219
 
220
220
  return super().update(dict(status=PipelineRun.PipelineRunStatus.RUNNING))
221
221
  elif PipelineRun.PipelineRunStatus.CANCELLED == payload.get('status'):
222
- from mage_ai.orchestration.pipeline_scheduler import PipelineScheduler
222
+ pipeline = Pipeline.get(
223
+ self.model.pipeline_uuid,
224
+ check_if_exists=True,
225
+ )
223
226
 
224
- PipelineScheduler(self.model).stop()
227
+ stop_pipeline_run(self.model, pipeline)
225
228
 
226
229
  return self
@@ -23,6 +23,7 @@ SOURCES = sorted([
23
23
  dict(name='Facebook Ads'),
24
24
  dict(name='Freshdesk'),
25
25
  dict(name='Front'),
26
+ dict(name='Google Ads'),
26
27
  dict(name='Google Analytics'),
27
28
  dict(name='Google Search Console'),
28
29
  dict(name='Google Sheets'),
@@ -4,6 +4,7 @@ from mage_ai.data_preparation.models.block.dbt.utils import (
4
4
  create_upstream_tables,
5
5
  fetch_model_data,
6
6
  load_profiles_async,
7
+ load_profiles_file,
7
8
  parse_attributes,
8
9
  query_from_compiled_sql,
9
10
  run_dbt_tests,
@@ -15,7 +16,9 @@ from mage_ai.shared.hash import merge_dict
15
16
  from typing import Any, Dict, List
16
17
  import json
17
18
  import os
19
+ import shutil
18
20
  import subprocess
21
+ import yaml
19
22
 
20
23
 
21
24
  class DBTBlock(Block):
@@ -120,8 +123,20 @@ class DBTBlock(Block):
120
123
  test_execution=test_execution,
121
124
  )
122
125
  project_full_path = command_line_dict['project_full_path']
126
+ profiles_dir = command_line_dict['profiles_dir']
123
127
  dbt_profile_target = command_line_dict['profile_target']
124
128
 
129
+ # Create a temporary profiles file with variables and secrets interpolated
130
+ attributes_dict = parse_attributes(self)
131
+ profiles_full_path = attributes_dict['profiles_full_path']
132
+ profile = load_profiles_file(profiles_full_path)
133
+
134
+ temp_profile_full_path = f'{profiles_dir}/profiles.yml'
135
+ os.makedirs(os.path.dirname(temp_profile_full_path), exist_ok=True)
136
+
137
+ with open(temp_profile_full_path, 'w') as f:
138
+ yaml.safe_dump(profile, f)
139
+
125
140
  is_sql = BlockLanguage.SQL == self.language
126
141
  if is_sql:
127
142
  create_upstream_tables(
@@ -214,4 +229,9 @@ class DBTBlock(Block):
214
229
  )
215
230
  outputs = [df]
216
231
 
232
+ try:
233
+ shutil.rmtree(profiles_dir)
234
+ except Exception as err:
235
+ print(f'Error removing temporary profile at {temp_profile_full_path}: {err}')
236
+
217
237
  return outputs
@@ -912,11 +912,13 @@ def build_command_line_arguments(
912
912
  project_full_path = f'{get_repo_path()}/dbt/{project_name}'
913
913
  args += block.content.split(' ')
914
914
 
915
+ profiles_dir = f'{project_full_path}/.mage_temp_profiles'
916
+
915
917
  args += [
916
918
  '--project-dir',
917
919
  project_full_path,
918
920
  '--profiles-dir',
919
- project_full_path,
921
+ profiles_dir,
920
922
  ]
921
923
 
922
924
  dbt_profile_target = block.configuration.get('dbt_profile_target') \
@@ -934,6 +936,7 @@ def build_command_line_arguments(
934
936
 
935
937
  return dbt_command, args, dict(
936
938
  profile_target=dbt_profile_target,
939
+ profiles_dir=profiles_dir,
937
940
  project_full_path=project_full_path,
938
941
  )
939
942
 
@@ -180,10 +180,19 @@ class Pipeline:
180
180
  )
181
181
 
182
182
  @classmethod
183
- def get(self, uuid, repo_path: str = None):
183
+ def get(self, uuid, repo_path: str = None, check_if_exists: bool = False):
184
184
  from mage_ai.data_preparation.models.pipelines.integration_pipeline \
185
185
  import IntegrationPipeline
186
186
 
187
+ if check_if_exists and not os.path.exists(
188
+ os.path.join(
189
+ repo_path or get_repo_path(),
190
+ PIPELINES_FOLDER,
191
+ uuid,
192
+ ),
193
+ ):
194
+ return None
195
+
187
196
  pipeline = self(uuid, repo_path=repo_path)
188
197
  if PipelineType.INTEGRATION == pipeline.type:
189
198
  pipeline = IntegrationPipeline(uuid, repo_path=repo_path)
@@ -275,9 +275,9 @@ class BaseSQLDatabase(BaseIO):
275
275
  """
276
276
  return query_string.strip(' \n\t')
277
277
 
278
- def _clean_column_name(self, column_name: str) -> str:
278
+ def _clean_column_name(self, column_name: str, allow_reserved_words: bool = False) -> str:
279
279
  col_new = re.sub(r'\W', '_', column_name.lower())
280
- if col_new.upper() in SQL_RESERVED_WORDS:
280
+ if not allow_reserved_words and col_new.upper() in SQL_RESERVED_WORDS:
281
281
  col_new = f'_{col_new}'
282
282
  return col_new
283
283
 
@@ -841,3 +841,6 @@ SQL_RESERVED_WORDS_SUBSET = {
841
841
  'USER',
842
842
  'WHERE',
843
843
  }
844
+
845
+ UNIQUE_CONFLICT_METHOD_IGNORE = 'IGNORE'
846
+ UNIQUE_CONFLICT_METHOD_UPDATE = 'UPDATE'
@@ -2,7 +2,7 @@ from enum import Enum
2
2
  from mage_ai.shared.utils import clean_name
3
3
  from pandas import DataFrame, Series
4
4
  from pandas.api.types import infer_dtype
5
- from typing import Callable, Dict, Mapping
5
+ from typing import Callable, Dict, List, Mapping
6
6
 
7
7
  """
8
8
  Utilities for exporting Python data frames to external databases.
@@ -31,6 +31,7 @@ class PandasTypes(str, Enum):
31
31
  DATETIME64 = 'datetime64'
32
32
  DECIMAL = 'decimal'
33
33
  INTEGER = 'integer'
34
+ INT64 = 'int64'
34
35
  EMPTY = 'empty'
35
36
  FLOATING = 'floating'
36
37
  MIXED = 'mixed'
@@ -101,6 +102,7 @@ def gen_table_creation_query(
101
102
  dtypes: Mapping[str, str],
102
103
  schema_name: str,
103
104
  table_name: str,
105
+ unique_constraints: List[str] = [],
104
106
  ) -> str:
105
107
  """
106
108
  Generates a database table creation query from a data frame.
@@ -123,4 +125,15 @@ def gen_table_creation_query(
123
125
  else:
124
126
  full_table_name = table_name
125
127
 
128
+ if unique_constraints:
129
+ unique_constraints_clean = [clean_name(col) for col in unique_constraints]
130
+ unique_constraints_escaped = [f'"{col}"'
131
+ for col in unique_constraints_clean]
132
+ index_name = '_'.join([
133
+ clean_name(full_table_name),
134
+ ] + unique_constraints_clean)
135
+ index_name = f'unique{index_name}'[:64]
136
+ query.append(
137
+ f"CONSTRAINT {index_name} UNIQUE ({', '.join(unique_constraints_escaped)})",
138
+ )
126
139
  return f'CREATE TABLE {full_table_name} (' + ','.join(query) + ');'
@@ -3,7 +3,7 @@ from mage_ai.io.export_utils import PandasTypes
3
3
  from mage_ai.io.base import QUERY_ROW_LIMIT
4
4
  from mage_ai.io.sql import BaseSQL
5
5
  from pandas import DataFrame, Series
6
- from typing import Any, IO, Union
6
+ from typing import Any, IO, List, Union
7
7
  import json
8
8
  import numpy as np
9
9
  import pyodbc
@@ -87,8 +87,11 @@ class MSSQL(BaseSQL):
87
87
  self,
88
88
  cursor: Any,
89
89
  df: DataFrame,
90
+ db_dtypes: List[str],
91
+ dtypes: List[str],
90
92
  full_table_name: str,
91
- buffer: Union[IO, None] = None
93
+ buffer: Union[IO, None] = None,
94
+ **kwargs,
92
95
  ) -> None:
93
96
  values_placeholder = ', '.join(["?" for i in range(len(df.columns))])
94
97
  values = []
@@ -5,7 +5,7 @@ from mage_ai.shared.utils import clean_name
5
5
  from mysql.connector import connect
6
6
  from mysql.connector.cursor import MySQLCursor
7
7
  from pandas import DataFrame, Series
8
- from typing import IO, Mapping, Union
8
+ from typing import IO, List, Mapping, Union
9
9
  import numpy as np
10
10
 
11
11
 
@@ -47,7 +47,8 @@ class MySQL(BaseSQL):
47
47
  self,
48
48
  dtypes: Mapping[str, str],
49
49
  schema_name: str,
50
- table_name: str
50
+ table_name: str,
51
+ unique_constraints: List[str] = [],
51
52
  ) -> str:
52
53
  query = []
53
54
  for cname in dtypes:
@@ -73,8 +74,11 @@ class MySQL(BaseSQL):
73
74
  self,
74
75
  cursor: MySQLCursor,
75
76
  df: DataFrame,
77
+ db_dtypes: List[str],
78
+ dtypes: List[str],
76
79
  full_table_name: str,
77
- buffer: Union[IO, None] = None
80
+ buffer: Union[IO, None] = None,
81
+ **kwargs,
78
82
  ) -> None:
79
83
  values_placeholder = ', '.join(["%s" for i in range(len(df.columns))])
80
84
  values = []
@@ -1,4 +1,5 @@
1
1
  from mage_ai.io.config import BaseConfigLoader, ConfigKey
2
+ from mage_ai.io.constants import UNIQUE_CONFLICT_METHOD_UPDATE
2
3
  from mage_ai.io.export_utils import BadConversionError, PandasTypes
3
4
  from mage_ai.io.sql import BaseSQL
4
5
  from mage_ai.shared.parsers import encode_complex
@@ -6,12 +7,21 @@ from mage_ai.shared.utils import is_port_in_use
6
7
  from pandas import DataFrame, Series
7
8
  from psycopg2 import connect, _psycopg
8
9
  from sshtunnel import SSHTunnelForwarder
9
- from typing import Union, IO
10
+ from typing import IO, List, Union
10
11
  import numpy as np
11
12
  import pandas as pd
12
13
  import simplejson
13
14
 
14
15
 
16
+ JSON_SERIALIZABLE_TYPES = frozenset([
17
+ PandasTypes.DATE,
18
+ PandasTypes.DATETIME,
19
+ PandasTypes.DATETIME64,
20
+ PandasTypes.OBJECT,
21
+ PandasTypes.TIME,
22
+ ])
23
+
24
+
15
25
  class Postgres(BaseSQL):
16
26
  """
17
27
  Handles data transfer between a PostgreSQL database and the Mage app.
@@ -159,9 +169,9 @@ class Postgres(BaseSQL):
159
169
  column_type = None
160
170
 
161
171
  if len(values) >= 1:
162
- value = values[0]
163
172
  column_type = 'JSONB'
164
173
 
174
+ value = values[0]
165
175
  if type(value) is list:
166
176
  if len(value) >= 1:
167
177
  item = value[0]
@@ -204,7 +214,7 @@ class Postgres(BaseSQL):
204
214
  return 'bytea'
205
215
  elif dtype in (PandasTypes.FLOATING, PandasTypes.DECIMAL, PandasTypes.MIXED_INTEGER_FLOAT):
206
216
  return 'double precision'
207
- elif dtype == PandasTypes.INTEGER:
217
+ elif dtype == PandasTypes.INTEGER or dtype == PandasTypes.INT64:
208
218
  max_int, min_int = column.max(), column.min()
209
219
  if np.int16(max_int) == max_int and np.int16(min_int) == min_int:
210
220
  return 'smallint'
@@ -229,9 +239,21 @@ class Postgres(BaseSQL):
229
239
  self,
230
240
  cursor: _psycopg.cursor,
231
241
  df: DataFrame,
242
+ db_dtypes: List[str],
243
+ dtypes: List[str],
232
244
  full_table_name: str,
233
- buffer: Union[IO, None] = None
245
+ buffer: Union[IO, None] = None,
246
+ allow_reserved_words: bool = False,
247
+ unique_conflict_method: str = None,
248
+ unique_constraints: List[str] = None,
234
249
  ) -> None:
250
+ def clean_array_value(val):
251
+ if val is None or type(val) is not str or len(val) < 2:
252
+ return val
253
+ if val[0] == '[' and val[-1] == ']':
254
+ return '{' + val[1:-1] + '}'
255
+ return val
256
+
235
257
  df_ = df.copy()
236
258
  columns = df_.columns
237
259
 
@@ -239,28 +261,49 @@ class Postgres(BaseSQL):
239
261
  df_col_dropna = df_[col].dropna()
240
262
  if df_col_dropna.count() == 0:
241
263
  continue
242
- if PandasTypes.OBJECT == df_[col].dtype and type(df_col_dropna.iloc[0]) != str:
264
+ if dtypes[col] in JSON_SERIALIZABLE_TYPES \
265
+ or (df_[col].dtype == PandasTypes.OBJECT and
266
+ type(df_col_dropna.iloc[0]) != str):
243
267
  df_[col] = df_[col].apply(lambda x: simplejson.dumps(
244
268
  x,
245
269
  default=encode_complex,
246
270
  ignore_nan=True,
247
271
  ))
272
+ if '[]' in db_dtypes[col]:
273
+ df_[col] = df_[col].apply(lambda x: clean_array_value(x))
248
274
 
249
- df_.to_csv(
250
- buffer,
251
- header=False,
252
- index=False,
253
- na_rep='',
254
- )
275
+ values = []
255
276
 
256
- buffer.seek(0)
277
+ for _, row in df_.iterrows():
278
+ t = tuple(row)
279
+ if len(t) == 1:
280
+ value = f'({str(t[0])})'
281
+ else:
282
+ value = str(t)
283
+ values.append(value.replace('None', 'NULL'))
284
+ values_string = ', '.join(values)
285
+ insert_columns = ', '.join([f'"{col}"'for col in columns])
286
+
287
+ commands = [
288
+ f'INSERT INTO {full_table_name} ({insert_columns})',
289
+ f'VALUES {values_string}',
290
+ ]
291
+ if unique_constraints and unique_conflict_method:
292
+ unique_constraints = \
293
+ [f'"{self._clean_column_name(col, allow_reserved_words=allow_reserved_words)}"'
294
+ for col in unique_constraints]
295
+ columns_cleaned = \
296
+ [f'"{self._clean_column_name(col, allow_reserved_words=allow_reserved_words)}"'
297
+ for col in columns]
257
298
 
258
- columns_names = ', '.join(columns)
259
- cursor.copy_expert(f"""
260
- COPY {full_table_name} FROM STDIN (
261
- FORMAT csv
262
- , DELIMITER \',\'
263
- , NULL \'\'
264
- , FORCE_NULL({columns_names})
265
- );
266
- """, buffer)
299
+ commands.append(f"ON CONFLICT ({', '.join(unique_constraints)})")
300
+ if UNIQUE_CONFLICT_METHOD_UPDATE == unique_conflict_method:
301
+ update_command = [f'{col} = EXCLUDED.{col}' for col in columns_cleaned]
302
+ commands.append(
303
+ f"DO UPDATE SET {', '.join(update_command)}",
304
+ )
305
+ else:
306
+ commands.append('DO NOTHING')
307
+ cursor.execute(
308
+ '\n'.join(commands)
309
+ )
@@ -43,9 +43,15 @@ class BaseSQL(BaseSQLConnection):
43
43
  self,
44
44
  dtypes: Mapping[str, str],
45
45
  schema_name: str,
46
- table_name: str
46
+ table_name: str,
47
+ unique_constraints: List[str] = [],
47
48
  ) -> str:
48
- return gen_table_creation_query(dtypes, schema_name, table_name)
49
+ return gen_table_creation_query(
50
+ dtypes,
51
+ schema_name,
52
+ table_name,
53
+ unique_constraints=unique_constraints,
54
+ )
49
55
 
50
56
  def build_create_table_as_command(
51
57
  self,
@@ -80,6 +86,8 @@ class BaseSQL(BaseSQLConnection):
80
86
  self,
81
87
  cursor,
82
88
  df: DataFrame,
89
+ db_dtypes: List[str],
90
+ dtypes: List[str],
83
91
  full_table_name: str,
84
92
  buffer: Union[IO, None] = None
85
93
  ) -> None:
@@ -183,6 +191,9 @@ class BaseSQL(BaseSQLConnection):
183
191
  query_string: Union[str, None] = None,
184
192
  drop_table_on_replace: bool = False,
185
193
  cascade_on_drop: bool = False,
194
+ allow_reserved_words: bool = False,
195
+ unique_conflict_method: str = None,
196
+ unique_constraints: List[str] = None,
186
197
  ) -> None:
187
198
  """
188
199
  Exports dataframe to the connected database from a Pandas data frame. If table doesn't
@@ -221,7 +232,10 @@ class BaseSQL(BaseSQLConnection):
221
232
  df = clean_df_for_export(df, self.clean, dtypes)
222
233
 
223
234
  # Clean column names
224
- col_mapping = {col: self._clean_column_name(col) for col in df.columns}
235
+ col_mapping = {col: self._clean_column_name(
236
+ col,
237
+ allow_reserved_words=allow_reserved_words)
238
+ for col in df.columns}
225
239
  df = df.rename(columns=col_mapping)
226
240
  dtypes = infer_dtypes(df)
227
241
 
@@ -263,12 +277,27 @@ class BaseSQL(BaseSQLConnection):
263
277
  )
264
278
  cur.execute(query)
265
279
  else:
280
+ db_dtypes = {col: self.get_type(df[col], dtypes[col]) for col in dtypes}
266
281
  if should_create_table:
267
- db_dtypes = {col: self.get_type(df[col], dtypes[col]) for col in dtypes}
268
- query = self.build_create_table_command(db_dtypes, schema_name, table_name)
282
+ query = self.build_create_table_command(
283
+ db_dtypes,
284
+ schema_name,
285
+ table_name,
286
+ unique_constraints=unique_constraints,
287
+ )
269
288
  cur.execute(query)
270
289
 
271
- self.upload_dataframe(cur, df, full_table_name, buffer)
290
+ self.upload_dataframe(
291
+ cur,
292
+ df,
293
+ db_dtypes,
294
+ dtypes,
295
+ full_table_name,
296
+ buffer,
297
+ allow_reserved_words=allow_reserved_words,
298
+ unique_conflict_method=unique_conflict_method,
299
+ unique_constraints=unique_constraints,
300
+ )
272
301
  self.conn.commit()
273
302
 
274
303
  if verbose:
@@ -15,7 +15,7 @@ from pandas import DataFrame, Series
15
15
  from trino.auth import BasicAuthentication
16
16
  from trino.dbapi import Connection, Cursor as CursorParent
17
17
  from trino.transaction import IsolationLevel
18
- from typing import IO, Mapping, Union
18
+ from typing import IO, List, Mapping, Union
19
19
  import pandas as pd
20
20
 
21
21
 
@@ -86,7 +86,8 @@ class Trino(BaseSQL):
86
86
  self,
87
87
  dtypes: Mapping[str, str],
88
88
  schema_name: str,
89
- table_name: str
89
+ table_name: str,
90
+ unique_constraints: List[str] = [],
90
91
  ):
91
92
  query = []
92
93
  for cname in dtypes:
@@ -123,8 +124,11 @@ class Trino(BaseSQL):
123
124
  self,
124
125
  cursor: Cursor,
125
126
  df: DataFrame,
127
+ db_dtypes: List[str],
128
+ dtypes: List[str],
126
129
  full_table_name: str,
127
- buffer: Union[IO, None] = None
130
+ buffer: Union[IO, None] = None,
131
+ **kwargs,
128
132
  ) -> None:
129
133
  values = []
130
134
  for _, row in df.iterrows():
@@ -81,35 +81,11 @@ class PipelineScheduler:
81
81
  self.schedule()
82
82
 
83
83
  def stop(self) -> None:
84
- if self.pipeline_run.status not in [PipelineRun.PipelineRunStatus.INITIAL,
85
- PipelineRun.PipelineRunStatus.RUNNING]:
86
- return
87
-
88
- self.pipeline_run.update(status=PipelineRun.PipelineRunStatus.CANCELLED)
89
-
90
- # Cancel all the block runs
91
- block_runs_to_cancel = []
92
- running_blocks = []
93
- for b in self.pipeline_run.block_runs:
94
- if b.status in [
95
- BlockRun.BlockRunStatus.INITIAL,
96
- BlockRun.BlockRunStatus.QUEUED,
97
- BlockRun.BlockRunStatus.RUNNING,
98
- ]:
99
- block_runs_to_cancel.append(b)
100
- if b.status == BlockRun.BlockRunStatus.RUNNING:
101
- running_blocks.append(b)
102
- BlockRun.batch_update_status(
103
- [b.id for b in block_runs_to_cancel],
104
- BlockRun.BlockRunStatus.CANCELLED,
84
+ stop_pipeline_run(
85
+ self.pipeline_run,
86
+ self.pipeline,
105
87
  )
106
88
 
107
- if self.pipeline.type in [PipelineType.INTEGRATION, PipelineType.STREAMING]:
108
- job_manager.kill_pipeline_run_job(self.pipeline_run.id)
109
- else:
110
- for b in running_blocks:
111
- job_manager.kill_block_run_job(b.id)
112
-
113
89
  def schedule(self, block_runs: List[BlockRun] = None) -> None:
114
90
  self.__run_heartbeat()
115
91
 
@@ -806,6 +782,40 @@ def run_pipeline(pipeline_run_id, variables, tags):
806
782
  )
807
783
 
808
784
 
785
+ def stop_pipeline_run(
786
+ pipeline_run: PipelineRun,
787
+ pipeline: Pipeline = None,
788
+ ) -> None:
789
+ if pipeline_run.status not in [PipelineRun.PipelineRunStatus.INITIAL,
790
+ PipelineRun.PipelineRunStatus.RUNNING]:
791
+ return
792
+
793
+ pipeline_run.update(status=PipelineRun.PipelineRunStatus.CANCELLED)
794
+
795
+ # Cancel all the block runs
796
+ block_runs_to_cancel = []
797
+ running_blocks = []
798
+ for b in pipeline_run.block_runs:
799
+ if b.status in [
800
+ BlockRun.BlockRunStatus.INITIAL,
801
+ BlockRun.BlockRunStatus.QUEUED,
802
+ BlockRun.BlockRunStatus.RUNNING,
803
+ ]:
804
+ block_runs_to_cancel.append(b)
805
+ if b.status == BlockRun.BlockRunStatus.RUNNING:
806
+ running_blocks.append(b)
807
+ BlockRun.batch_update_status(
808
+ [b.id for b in block_runs_to_cancel],
809
+ BlockRun.BlockRunStatus.CANCELLED,
810
+ )
811
+
812
+ if pipeline and pipeline.type in [PipelineType.INTEGRATION, PipelineType.STREAMING]:
813
+ job_manager.kill_pipeline_run_job(pipeline_run.id)
814
+ else:
815
+ for b in running_blocks:
816
+ job_manager.kill_block_run_job(b.id)
817
+
818
+
809
819
  def check_sla():
810
820
  repo_pipelines = set(Pipeline.get_all_pipelines(get_repo_path()))
811
821
  pipeline_schedules = \
@@ -1,6 +1,9 @@
1
1
  from jupyter_client import KernelClient, KernelManager
2
2
  from jupyter_client.kernelspec import NoSuchKernel
3
3
  from mage_ai.server.kernels import DEFAULT_KERNEL_NAME, KernelName, kernel_managers
4
+ from mage_ai.server.logger import Logger
5
+
6
+ logger = Logger().new_server_logger(__name__)
4
7
 
5
8
 
6
9
  class ActiveKernel():
@@ -13,14 +16,14 @@ active_kernel = ActiveKernel()
13
16
 
14
17
 
15
18
  def switch_active_kernel(kernel_name: KernelName) -> None:
16
- print(f'Switch active kernel: {kernel_name}')
19
+ logger.info(f'Switch active kernel: {kernel_name}')
17
20
  if kernel_managers[kernel_name].is_alive():
18
- print(f'Kernel {kernel_name} is already alive.')
21
+ logger.info(f'Kernel {kernel_name} is already alive.')
19
22
  return
20
23
 
21
24
  for kernel in kernel_managers.values():
22
25
  if kernel.is_alive():
23
- print(f'Shut down current kernel {kernel}.')
26
+ logger.info(f'Shut down current kernel {kernel}.')
24
27
  kernel.request_shutdown()
25
28
 
26
29
  try:
@@ -10,9 +10,12 @@ from mage_ai.cluster_manager.constants import (
10
10
  KUBE_NAMESPACE,
11
11
  KUBE_STORAGE_CLASS_NAME
12
12
  )
13
+ from mage_ai.server.logger import Logger
13
14
  import os
14
15
  import yaml
15
16
 
17
+ logger = Logger().new_server_logger(__name__)
18
+
16
19
 
17
20
  class ClusterType(str, Enum):
18
21
  EMR = 'emr'
@@ -32,7 +35,7 @@ class ApiInstancesHandler(BaseHandler):
32
35
  ecs_instance_manager = EcsTaskManager(cluster_name)
33
36
  instances = ecs_instance_manager.list_tasks()
34
37
  except Exception as e:
35
- print(str(e))
38
+ logger.error(str(e))
36
39
  instances = list()
37
40
  elif cluster_type == ClusterType.CLOUD_RUN:
38
41
  from mage_ai.cluster_manager.gcp.cloud_run_service_manager import CloudRunServiceManager
@@ -1,10 +1,13 @@
1
1
  from mage_ai.data_preparation.models.block import PYTHON_COMMAND
2
+ from mage_ai.server.logger import Logger
2
3
  from typing import List, Dict
3
4
  import importlib
4
5
  import json
5
6
  import subprocess
6
7
  import traceback
7
8
 
9
+ logger = Logger().new_server_logger(__name__)
10
+
8
11
 
9
12
  def get_collection(key: str, available_options: List[Dict]):
10
13
  collection = []
@@ -38,8 +41,8 @@ def get_collection(key: str, available_options: List[Dict]):
38
41
  except Exception:
39
42
  pass
40
43
  except Exception as err:
41
- print(f"Failed to load source {d['uuid']}: {err}")
42
- print(traceback.format_exc())
44
+ logger.error(f"Failed to load source {d['uuid']}: {err}")
45
+ logger.error(traceback.format_exc())
43
46
  continue
44
47
 
45
48
  collection.append(d)