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.
- {mage-ai-0.8.37/mage_ai.egg-info → mage-ai-0.8.39}/PKG-INFO +1 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/logging.py +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineRunResource.py +6 -3
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/sources/constants.py +1 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/dbt/__init__.py +20 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/dbt/utils/__init__.py +4 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipeline.py +10 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/base.py +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/constants.py +3 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/export_utils.py +14 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/mssql.py +5 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/mysql.py +7 -3
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/postgres.py +64 -21
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/sql.py +35 -6
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/trino.py +7 -3
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/pipeline_scheduler.py +37 -27
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/active_kernel.py +6 -3
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/clusters.py +4 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/integration_sources.py +5 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/client/mage.py +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/constants.py +1 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/base.py +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/models.py +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/404.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/404.html.html +2 -2
- 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
- mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/4178-9103014b7dae3c49.js +1 -0
- 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
- mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/5141-ddf4ba0a362d6f34.js +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-017f6a2de38f8658.js +1 -0
- 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
- 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
- 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
- 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
- mage-ai-0.8.39/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-6c0ea500b3bc6b61.js +1 -0
- 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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/index.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/manage.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/pipelines.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/settings.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/sign-in.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/terminal.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/test.html +2 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/triggers.html +2 -2
- mage-ai-0.8.39/mage_ai/server/logger.py +16 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/scheduler_manager.py +8 -4
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/server.py +7 -14
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/subscriber.py +6 -3
- mage-ai-0.8.39/mage_ai/server/terminal_server.py +65 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/frontend_renderer.py +3 -2
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/websocket_server.py +4 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/settings/__init__.py +2 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/logger.py +4 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39/mage_ai.egg-info}/PKG-INFO +1 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/SOURCES.txt +24 -22
- {mage-ai-0.8.37 → mage-ai-0.8.39}/setup.py +1 -1
- mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/4178-e17f37d21253b832.js +0 -1
- mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/5141-2ae9eae00ec2cdfa.js +0 -1
- mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-6a52671f1853e1a5.js +0 -1
- mage-ai-0.8.37/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-9c21edae8f1b6737.js +0 -1
- {mage-ai-0.8.37 → mage-ai-0.8.39}/LICENSE +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/MANIFEST.in +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/README.md +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/api_context.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/middleware.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/monitors/BaseMonitor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/monitors/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/oauth_scope.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/operations/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/AutocompleteItemPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BackfillPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BasePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BlockPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/BlockRunPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ClusterPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/DataProviderPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/EventRulePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ExtensionOptionPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FileContentPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FilePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/FileVersionPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/GitBranchPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationDestinationPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationSourcePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/IntegrationSourceStreamPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/KernelPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/LogPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/MonitorStatPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/OutputPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelinePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelineRunPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/PipelineSchedulePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/ProjectPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SecretPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SessionPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/SyncPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/UserPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/VariablePolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/WidgetPolicy.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/policies/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/AutocompleteItemPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BackfillPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BasePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BlockPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/BlockRunPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ClusterPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/DataProviderPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/EventRulePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ExtensionOptionPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FileContentPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FilePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/FileVersionPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/GitBranchPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationDestinationPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationSourcePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/IntegrationSourceStreamPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/KernelPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/LogPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/MonitorStatPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/OutputPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelinePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelineRunPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/PipelineSchedulePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/ProjectPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SecretPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SessionPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/SyncPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/UserPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/VariablePresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/WidgetPresenter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/mixins/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/presenters/mixins/users.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/AutocompleteItemResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BackfillResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BaseResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BlockResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/BlockRunResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ClusterResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/DataProviderResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/DatabaseResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/EventRuleResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ExtensionOptionResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileContentResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/FileVersionResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/GenericResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/GitBranchResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationDestinationResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationSourceResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/IntegrationSourceStreamResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/KernelResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/LogResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/MonitorStatResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/OutputResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/PipelineScheduleResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/ProjectResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/Resource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SecretResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SessionResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/SyncResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/UserResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/VariableResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/WidgetResource.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/mixins/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/collections.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/resources/shared/collective_loaders.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/result_set.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/api/views.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/ldap.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/oauth2.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/authentication/passwords.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/autocomplete/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/autocomplete/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/main.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cli/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/ecs_task_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/aws/emr_cluster_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/cluster_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/gcp/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/gcp/cloud_run_service_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/kubernetes/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/cluster_manager/kubernetes/workload_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/calculator.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/charts.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/analysis/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/clean_column_names.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/fix_syntax_errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/impute_values.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/reformat_values.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_collinear_columns.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_columns_with_single_value.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_duplicate_rows.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/cleaning_rules/remove_outliers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/column_type_detector.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/column_types/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/data_cleaner.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/encoders.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/estimators/outlier_removal.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/pipelines/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/pipelines/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/shared/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/shared/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/statistics/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/statistics/calculator.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/action_code.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/column.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/custom_action.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/dependency_resolution.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/helpers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/row.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/shared.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/spark/transformers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/addition.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/constant.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/date_trunc.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/difference.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/distance_between.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/divide.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/formatted_date.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/if_else.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/multiply.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/string_replace.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/string_split.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/udf/substring.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_cleaner/transformer_actions/variable_replacer.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/destinations/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/destinations/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/logger/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/logger/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/sources/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/parsers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_integrations/utils/scheduler.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/decorators.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/block_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/ecs_block_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/executor_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/gcp_cloud_run_block_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/k8s_block_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pipeline_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pyspark_block_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/pyspark_pipeline_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/executors/streaming_pipeline_executor.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/git/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/gcs_logger_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/logger_manager_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/logging/s3_logger_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/block.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/great_expectations.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/extension/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/integration/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/data_exporter.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/data_loader.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/r/templates/transformer.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/bigquery.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/mssql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/mysql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/postgres.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/redshift.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/snowflake.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/trino.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/sql/utils/shared.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/file.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/integration_pipeline.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/pipelines/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/variable.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/charts.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/widget/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/preferences.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/repo_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/secrets.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/stream.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/shared/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/base_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/local_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/s3_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/storage/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/base_sync.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/sync/git_sync.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/callbacks/default.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/custom/python/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/azure_blob_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/bigquery.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/file.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/google_cloud_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/mysql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/postgres.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/pyspark/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/pyspark/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/r/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/redshift.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/snowflake.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/kafka.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/kinesis.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/opensearch.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_exporters/streaming/s3.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/api.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/azure_blob_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/bigquery.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/file.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/google_cloud_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/mysql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/postgres.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/pyspark/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/pyspark/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/r/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/redshift.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/snowflake.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/azure_event_hub.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/kafka.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/kinesis.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/data_loaders/streaming/rabbitmq.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/extensions/great_expectations/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline/metadata.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline_execution/emr_bootstrap.sh +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/pipeline_execution/spark_script.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/charts/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/custom/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_exporters/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_exporters/export_titanic_clean.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_loaders/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/data_loaders/load_titanic.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/dbt/profiles.yml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/extensions/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/io_config.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/metadata.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/metadata.yaml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/requirements.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/scratchpads/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/transformers/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/transformers/fill_in_missing_values.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/repo/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/bigquery.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/default.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/mysql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/postgres.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/redshift.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/sensors/snowflake.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/template.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/testable.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/data_warehouse_transformer.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default_pyspark.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/default_streaming.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/r/default.r +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/suggestion_fmt.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/action.jinja +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/average.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count_distinct.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/diff.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/first.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/impute.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/last.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/max.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/median.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/min.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/normalize.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/reformat.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove_outliers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/select.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_down.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_up.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/standardize.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/sum.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/drop_duplicate.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/filter.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/remove.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/sort.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/templates/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/block/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/utils/block/convert_content.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/variable_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/errors/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/errors/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/great_expectations/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/extensions/great_expectations/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/azure_blob_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/bigquery.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/file.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/google_cloud_storage.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/io_config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/redshift.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/snowflake.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/io/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/airflow.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/backfills/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/backfills/service.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/alembic.ini +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/database_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/README.md +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/env.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/script.py.mako +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/053ee2c10d85_add_completed_at.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/067326f43bc3_add_variables_to_pipelinerun.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/1f9353eddbc6_add_secrets_table.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/26305e46df52_create_backfills_table.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/3fafd217efa7_add_event_matcher_model.py +0 -0
- {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
- {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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/6aecc9bc451c_update_schedule_type_enum.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/migrations/versions/c07a23ff782b_add_initial_tables.py +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/oauth.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/schedules.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/models/secrets.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/db/process.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/execution_process_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/job_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/metrics/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/metrics/pipeline_run.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/monitor/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/monitor/monitor_stats.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/notification/sender.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/celery_queue.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/process_queue.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/queue.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/queue/queue_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/run_status_checker.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/event_trigger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/loop_time_trigger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/triggers/time_trigger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/orchestration/utils/resources.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/product_purchases.csv +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/salary_survey.csv +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/titanic_survival.csv +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/sample_datasets/user_emails.csv +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/blocks.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/errors.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/events.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/projects.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/triggers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/api/v1.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/app.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/client/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/data/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/docs_server.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/execution_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1150.1378afaa474df64a.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1240.0819f45820d22263.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1286-a62050b3f897c6be.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1450.d383f64c169d4278.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/1774-aa51ef1da7217ff9.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2083-78a438dbdc57d1e4.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2125-0b537dc53fe71b18.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2344-5cd452dd1825dabc.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2481.0454a0e25dc7e027.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2508.724531e7f9cf5f36.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2524-6aeb9419acf5d1b4.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2545.8371b39c898ae92b.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/261.0a24b4ece1d29aa1.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/266.e301071d22592682.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/2714-1e79e9f2e998b544.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/29107295-989a0767a635d9d5.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3453.992f4b1667e9882c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3467.38cd0654ba6f788f.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3835.df296b4e4078e985.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3850-6395783d820def1c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3873.4b3eace753998412.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/3898.880191695bb05845.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4042.5e16d36209052351.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4092.536ee541241f4538.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4261-6c235b561c91eca3.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4388.04098706f32e69e7.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/440.3ab77942f659ea0c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4450.79f14f763d55c63e.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4454.13a2404adecaa39e.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4495-4f0340aa82e0c623.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4776.753ad29fa0a29a4a.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4804-01a10103ebe26ca8.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/4883.a5bb0edbf8f3cc8f.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5008.29c2662ecc2b04c7.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5104.1edcf4437c471dd4.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5164.857023e800905b6f.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5729.0f2748e9e6dab951.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/5824.628653557e904674.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6042.c59010de9e699437.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6085-692d2f784c0504f2.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6115.0c85e507543394ea.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6116.871a682ddf535aca.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6166-2ee6aff0ca70b2f0.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6434.10380ee0968636ba.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6443.7b6d2b4e51018184.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6507.d3a17777d2c294e6.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6532-dcc478dab6a58580.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/6958.8f39c585d36737a7.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7011-81dd8269c4806d26.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/72fdc299.2d5ec188af5d0049.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/739.3d24945544b37e52.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/792.010ca00d79b2112f.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7947.77be4bec4d47774e.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/7951.fee8b6c27c9ef777.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8018.968bf87c390e3312.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8097.b0345f30a7390c1d.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8180-8de652170ea5ed93.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8256.290ceb269b1ffe26.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/826.75268ee34f93393a.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8277.5003e1d94bb85156.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/839-c0deab1de13a0fba.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8762.dff300f86bef8573.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8789-4f858e520d46973b.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8807.a68c69c8fe0a8c01.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8849.db0d50b4d84b09a6.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8901.21d26d5a1ee473fe.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/8920.5700e380a2999098.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9258.6c6ef544c701a011.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9307.d4baf7aebbcef1f0.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9361.a0820e3069f5ef74.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9363.6b811b4c86277e07.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9437.a3c32f45cf9ef69b.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9565-28e1c30511c95c2d.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9566.f8bd24768ed14ecb.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9633.40e5056ca1e2b22a.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9785.5ff26cb26d84d6a1.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9855.c4394a68322be9f8.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/9927.e82a3e1e21990d77.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/bd1a647f.6050372acaa5cc3c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/framework-7c365855dab1bf41.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/main-bb0dd5375146d7fd.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-7e791bee1e32adec.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/_error-235304e5badb19eb.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/index-e34a68d2f6fe16f2.js +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings-d594a66a568306da.js +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/pages/test-85cf18ae78ff535c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/polyfills-5cd94c89d3acac5f.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/chunks/webpack-bc5e4eb2c1ff587c.js +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/_next/static/css/d1e8e64d0b07af2f.css +0 -0
- {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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/favicon.ico +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Bold.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Light.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Medium.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Regular.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Retina.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-SemiBold.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/LICENSE.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Black.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BlackItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Bold.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BoldItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Italic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Light.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-LightItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Medium.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Regular.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Thin.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-ThinItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/LICENSE.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/README.txt +0 -0
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/RobotoMono-VariableFont_wght.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Bold.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-BoldItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLight.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLightItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Italic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Light.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-LightItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Medium.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-MediumItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Regular.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBold.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBoldItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Thin.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ThinItalic.ttf +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/backfill.jpg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/banner-shape-purple-peach.jpg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/dashboard-api-key.webp +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/extensions/great_expectations/logo.png +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/extra.jpg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/monitor.jpg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/run B.jpg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/images/sessions/abstract.png +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/frontend_dist/vercel.svg +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/kernel_output_parser.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/kernels.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/server/utils/output_display.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/client.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/exceptions.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/airbyte/server.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/ecs/ecs.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/emr.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/emr_basics.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/launcher.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/emr/resource_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/events/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/events/events.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/s3/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/s3/s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/secrets_manager/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/aws/secrets_manager/secrets_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/datadog/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/dbt/dbt.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/email/email.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/cloud_run.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/gcp/cloud_run/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/google_chat/google_chat.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/hightouch/hightouch.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/k8s/job_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/metaplane/metaplane.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/slack/slack.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/stitch/stitch.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/teams/teams.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/tracking/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/services/tracking/metrics.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/array.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/code.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/conversions.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/custom_types.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/dates.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/environments.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/hash.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/http_client.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/io.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/multi.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/parsers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/retry.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/security.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/strings.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/urls.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/shared/utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/amazon_s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/kafka.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/kinesis.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/opensearch.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sinks/sink_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/azure_event_hub.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/kafka.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/kinesis.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/rabbitmq.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/streaming/sources/source_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_operations.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_sessions.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/api/operations/test_users.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/base_test.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_clean_column_names.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_fix_syntax_error.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_impute_values.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_reformat_values.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_collinear_columns.py +0 -0
- {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
- {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
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_duplicate_rows.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_outliers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/statistics/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/statistics/test_calculator.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/test_column_type_detector.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/shared.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_base.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_column.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_custom_actions.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_helpers.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_row.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_cleaner/transformer_actions/test_variable_replacer.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/block/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/block/test_sql.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_block.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_pipeline.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/models/test_variable.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/test_templates.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/data_preparation/test_variable_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/test_config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/io/test_export_utils.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/db/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/db/test_models.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/test_config.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/notification/test_sender.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/queue/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/queue/test_process_queue.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_execution_process_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_job_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/test_pipeline_scheduler.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/test_event_trigger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/orchestration/triggers/test_loop_time_trigger.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/s3/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/aws/s3/test_s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/datadog/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/datadog/test_datadog.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/k8s/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/services/k8s/test_job_manager.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_io.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_retry.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/shared/test_security.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_amazon_s3.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_kinesis.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_opensearch.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sinks/test_sink_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_azure_event_hub.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_kafka.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_kinesis.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_rabbitmq.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/streaming/sources/test_source_factory.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/tests/test_shared.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/code.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/logger/__init__.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/utils/logger/constants.py +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/dependency_links.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/entry_points.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/requires.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai.egg-info/top_level.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/pyproject.toml +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/requirements.txt +0 -0
- {mage-ai-0.8.37 → mage-ai-0.8.39}/setup.cfg +0 -0
|
@@ -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
|
-
|
|
222
|
+
pipeline = Pipeline.get(
|
|
223
|
+
self.model.pipeline_uuid,
|
|
224
|
+
check_if_exists=True,
|
|
225
|
+
)
|
|
223
226
|
|
|
224
|
-
|
|
227
|
+
stop_pipeline_run(self.model, pipeline)
|
|
225
228
|
|
|
226
229
|
return self
|
|
@@ -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
|
{mage-ai-0.8.37 → mage-ai-0.8.39}/mage_ai/data_preparation/models/block/dbt/utils/__init__.py
RENAMED
|
@@ -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
|
-
|
|
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
|
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
250
|
-
buffer,
|
|
251
|
-
header=False,
|
|
252
|
-
index=False,
|
|
253
|
-
na_rep='',
|
|
254
|
-
)
|
|
275
|
+
values = []
|
|
255
276
|
|
|
256
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
)
|
|
266
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
268
|
-
|
|
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(
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
19
|
+
logger.info(f'Switch active kernel: {kernel_name}')
|
|
17
20
|
if kernel_managers[kernel_name].is_alive():
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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)
|