mage-ai 0.8.26__tar.gz → 0.8.27__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.26/mage_ai.egg-info → mage-ai-0.8.27}/PKG-INFO +1 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/streaming_pipeline_executor.py +2 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/logger_manager.py +7 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/__init__.py +60 -29
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/__init__.py +25 -8
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/utils/shared.py +49 -3
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/variable.py +6 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/repo_manager.py +5 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/shared/secrets.py +6 -3
- mage-ai-0.8.27/mage_ai/data_preparation/templates/sensors/bigquery.py +32 -0
- mage-ai-0.8.27/mage_ai/data_preparation/templates/sensors/mysql.py +33 -0
- mage-ai-0.8.27/mage_ai/data_preparation/templates/sensors/postgres.py +33 -0
- mage-ai-0.8.27/mage_ai/data_preparation/templates/sensors/redshift.py +33 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/sensors/s3.py +11 -7
- mage-ai-0.8.27/mage_ai/data_preparation/templates/sensors/snowflake.py +33 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/postgres.py +13 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/constants.py +1 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/404.html +2 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/404.html.html +2 -2
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/WbTBCvyjQQ9UFFLZOU1E5/_buildManifest.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/2344-f8ae030d6a6863ae.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/2626-e7fa4f83f8214c97.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/4178-663d9f70bffc7a47.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/4178-a6d1bd2be4706f51.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/4261-88b0103fad331620.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/5141-57c3868a80196da8.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/6166-705b4fdecaf11e63.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/6532-b1bd0b3f422abec8.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/8180-8de652170ea5ed93.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/839-15c54471a9a9bf2e.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/9386-9d6a4e5836229264.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/9386-d4cc11bab74eec8d.js +1 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-624f87faa4b5ee9a.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-5f3dbed367342a3d.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-3046bc53d24917c7.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-f6059e27e601627c.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-123556bdfe2e194b.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-050ef37b6672100a.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-5f95bb4c3a2d7d46.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-270c0198eeef1542.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-c9f1df40e0aa6981.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-e0eb0098dcbf27ac.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-d74850779dbe87b3.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-848544a58563dbec.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-204daac985c03b62.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-675171cfd7d7b346.js +1 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-44533e244974a422.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-b2955f0ff960894e.js +1 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d41695001370abc.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-219960b3cc4742e3.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-1767a2f57f887ef7.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-0f373aaa7deb98c9.js +1 -0
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-181343d8eb894426.js → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-bea0439ca2a862ba.js +1 -1
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-7446a70bdd8381a5.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-d72dfc596e943cc4.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-4c9ad80f8f9d1074.js +1 -0
- mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-783b9526167f1249.js +1 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/index.html +2 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/manage.html +4 -4
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipeline-runs.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/pipelines.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/settings/account/profile.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/settings/workspace/preferences.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/settings/workspace/sync-data.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/settings/workspace/users.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/settings.html +2 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/sign-in.html +9 -9
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/terminal.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/test.html +3 -3
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/triggers.html +5 -5
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/server.py +1 -6
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/security.py +9 -2
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/utils.py +7 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/shared/test_security.py +6 -6
- {mage-ai-0.8.26 → mage-ai-0.8.27/mage_ai.egg-info}/PKG-INFO +1 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai.egg-info/SOURCES.txt +37 -32
- {mage-ai-0.8.26 → mage-ai-0.8.27}/setup.py +1 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/1830-3882c19d710feadd.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/2344-a82a406b72fe782b.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/2626-30c0fab7c3926578.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/3688-562e0f129b09d1cd.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/3699-dcc0946dd0709216.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/4463-777e71000be29fc4.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/6532-baf1818fbc89e6c1.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/6567-2488118bb39a9d99.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-c580ee38f5442bef.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-dd72d2f3375064cf.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-26974ca695994804.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-df603787c041cd8a.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-72011b08ef047531.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-3b17a6d28cdde471.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-c31fec2be1160dbe.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a60003fce7dfb93.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-ebb4a57934e4fa52.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-ff24167e21f2f0cf.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-be9eab29e8ed712b.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-e9c1789f6d5a0429.js +0 -1
- mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/kiWhqtXdRSgsbVPwfDLY4/_buildManifest.js +0 -1
- {mage-ai-0.8.26 → mage-ai-0.8.27}/LICENSE +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/MANIFEST.in +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/README.md +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/api_context.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/logging.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/middleware.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/monitors/BaseMonitor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/monitors/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/oauth_scope.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/operations/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/operations/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/operations/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/AutocompleteItemPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/BackfillPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/BasePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/BlockPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/BlockRunPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/ClusterPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/DataProviderPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/EventRulePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/ExtensionOptionPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/FileContentPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/FilePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/FileVersionPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/GitBranchPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/IntegrationDestinationPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/IntegrationSourcePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/IntegrationSourceStreamPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/KernelPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/LogPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/MonitorStatPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/OutputPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/PipelinePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/PipelineRunPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/PipelineSchedulePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/ProjectPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/SecretPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/SessionPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/SyncPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/UserPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/VariablePolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/WidgetPolicy.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/policies/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/AutocompleteItemPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/BackfillPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/BasePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/BlockPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/BlockRunPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/ClusterPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/DataProviderPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/EventRulePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/ExtensionOptionPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/FileContentPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/FilePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/FileVersionPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/GitBranchPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/IntegrationDestinationPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/IntegrationSourcePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/IntegrationSourceStreamPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/KernelPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/LogPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/MonitorStatPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/OutputPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/PipelinePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/PipelineRunPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/PipelineSchedulePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/ProjectPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/SecretPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/SessionPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/SyncPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/UserPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/VariablePresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/WidgetPresenter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/mixins/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/presenters/mixins/users.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/AutocompleteItemResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/BackfillResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/BaseResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/BlockResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/BlockRunResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/ClusterResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/DataProviderResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/DatabaseResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/EventRuleResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/ExtensionOptionResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/FileContentResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/FileResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/FileVersionResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/GenericResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/GitBranchResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/IntegrationDestinationResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/IntegrationSourceResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/IntegrationSourceStreamResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/KernelResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/LogResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/MonitorStatResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/OutputResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/PipelineResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/PipelineRunResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/PipelineScheduleResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/ProjectResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/Resource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/SecretResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/SessionResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/SyncResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/UserResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/VariableResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/WidgetResource.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/mixins/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/shared/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/shared/collections.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/resources/shared/collective_loaders.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/result_set.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/api/views.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/authentication/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/authentication/ldap.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/authentication/oauth2.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/authentication/passwords.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/autocomplete/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/autocomplete/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cli/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cli/main.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cli/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/aws/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/aws/ecs_task_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/aws/emr_cluster_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/cluster_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/gcp/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/gcp/cloud_run_service_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/kubernetes/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/cluster_manager/kubernetes/workload_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/analysis/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/analysis/calculator.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/analysis/charts.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/analysis/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/clean_column_names.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/fix_syntax_errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/impute_values.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/reformat_values.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/remove_collinear_columns.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/remove_columns_with_high_empty_rate.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/remove_columns_with_single_value.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/remove_duplicate_rows.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/cleaning_rules/remove_outliers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/column_types/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/column_types/column_type_detector.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/column_types/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/data_cleaner.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/estimators/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/estimators/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/estimators/encoders.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/estimators/outlier_removal.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/pipelines/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/pipelines/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/shared/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/shared/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/statistics/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/statistics/calculator.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/action_code.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/column.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/custom_action.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/dependency_resolution.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/helpers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/row.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/shared.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/spark/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/spark/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/spark/transformers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/addition.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/constant.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/date_trunc.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/difference.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/distance_between.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/divide.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/formatted_date.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/if_else.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/multiply.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/string_replace.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/string_split.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/udf/substring.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_cleaner/transformer_actions/variable_replacer.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/destinations/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/destinations/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/logger/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/logger/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/sources/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/sources/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/utils/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/utils/parsers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_integrations/utils/scheduler.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/decorators.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/block_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/ecs_block_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/executor_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/gcp_cloud_run_block_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/k8s_block_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/pipeline_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/pyspark_block_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/pyspark_pipeline_executor.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/git/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/gcs_logger_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/logger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/logger_manager_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/logging/s3_logger_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/dbt/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/dbt/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/extension/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/extension/block.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/extension/great_expectations.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/extension/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/integration/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/r/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/r/templates/data_exporter.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/r/templates/data_loader.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/r/templates/transformer.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/bigquery.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/mssql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/mysql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/postgres.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/redshift.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/snowflake.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/trino.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/sql/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/block/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/file.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/pipeline.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/pipelines/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/pipelines/integration_pipeline.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/pipelines/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/widget/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/widget/charts.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/widget/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/models/widget/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/preferences.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/shared/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/shared/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/shared/stream.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/shared/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/storage/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/storage/base_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/storage/local_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/storage/s3_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/storage/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/sync/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/sync/base_sync.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/sync/git_sync.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/callbacks/default.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/custom/python/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/azure_blob_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/bigquery.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/file.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/google_cloud_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/mysql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/postgres.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/pyspark/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/pyspark/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/r/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/redshift.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/snowflake.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/streaming/kafka.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/streaming/kinesis.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_exporters/streaming/opensearch.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/api.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/azure_blob_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/bigquery.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/file.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/google_cloud_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/mysql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/postgres.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/pyspark/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/pyspark/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/r/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/redshift.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/snowflake.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/streaming/azure_event_hub.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/streaming/kafka.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/streaming/kinesis.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/data_loaders/streaming/rabbitmq.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/extensions/great_expectations/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/pipeline/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/pipeline/metadata.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/pipeline_execution/emr_bootstrap.sh +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/pipeline_execution/spark_script.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/charts/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/custom/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/data_exporters/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/data_exporters/export_titanic_clean.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/data_loaders/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/data_loaders/load_titanic.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/dbt/profiles.yml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/extensions/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/io_config.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/metadata.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/pipelines/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/pipelines/example_pipeline/metadata.yaml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/requirements.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/scratchpads/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/transformers/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/transformers/fill_in_missing_values.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/repo/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/sensors/default.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/template.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/testable.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/data_warehouse_transformer.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/default.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/default_pyspark.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/default_streaming.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/r/default.r +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/suggestion_fmt.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/action.jinja +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/average.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/clean_column_name.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/count_distinct.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/diff.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/first.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/fix_syntax_errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/impute.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/last.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/max.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/median.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/min.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/normalize.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/reformat.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/remove_outliers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/select.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_down.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/shift_up.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/standardize.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/column/sum.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/drop_duplicate.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/filter.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/remove.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/transformers/transformer_actions/row/sort.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/templates/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/utils/block/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/utils/block/convert_content.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/variable_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/errors/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/errors/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/extensions/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/extensions/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/extensions/great_expectations/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/extensions/great_expectations/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/azure_blob_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/bigquery.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/export_utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/file.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/google_cloud_storage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/io_config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/mssql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/mysql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/redshift.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/snowflake.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/sql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/trino.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/io/utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/airflow.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/backfills/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/backfills/service.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/alembic.ini +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/database_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/README.md +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/env.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/script.py.mako +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/053ee2c10d85_add_completed_at.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/067326f43bc3_add_variables_to_pipelinerun.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/1d8e65aeefdd_add_settings_to_pipeline_schedule.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/1f9353eddbc6_add_secrets_table.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/2266370f589b_add_indexes_to_pipeline_run.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/26305e46df52_create_backfills_table.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/3fafd217efa7_add_event_matcher_model.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/52ab80005742_add_variables_to_pipeline_schedule.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/5cd59ec4cf1d_add_passed_sla_to_pipeline_run.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/643b6e65e814_add_unique_indexes_on_authentication_.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/6aecc9bc451c_update_schedule_type_enum.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/7ac6fed06918_add_token_column_to_pipeline_schedule_.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/847ea6602d6f_add_upstream_failed_to_block_run_status.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/84de4cdd6126_add_sla_to_pipeline_schedule.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/8971d4cd5b39_add_event_variables_and_metadata_to_.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/97ff9f55a3c0_create_users_oauth2_applications_and_.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/b01be687e537_add_started_at_to_block_run.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/c07a23ff782b_add_initial_tables.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/migrations/versions/ec5df57a1c60_add_metrics_to_block_runs.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/models.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/db/process.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/execution_process_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/job_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/metrics/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/metrics/pipeline_run.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/monitor/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/monitor/monitor_stats.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/notification/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/notification/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/notification/sender.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/pipeline_scheduler.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/celery_queue.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/process_queue.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/queue.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/queue/queue_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/run_status_checker.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/triggers/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/triggers/event_trigger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/triggers/loop_time_trigger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/triggers/time_trigger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/orchestration/utils/resources.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/sample_datasets/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/sample_datasets/product_purchases.csv +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/sample_datasets/salary_survey.csv +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/sample_datasets/titanic_survival.csv +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/sample_datasets/user_emails.csv +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/active_kernel.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/blocks.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/clusters.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/errors.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/events.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/integration_sources.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/projects.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/triggers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/api/v1.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/app.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/client/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/client/mage.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/data/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/data/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/data/models.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/docs_server.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/execution_manager.py +0 -0
- {mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/kiWhqtXdRSgsbVPwfDLY4 → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/WbTBCvyjQQ9UFFLZOU1E5}/_middlewareManifest.js +0 -0
- {mage-ai-0.8.26/mage_ai/server/frontend_dist/_next/static/kiWhqtXdRSgsbVPwfDLY4 → mage-ai-0.8.27/mage_ai/server/frontend_dist/_next/static/WbTBCvyjQQ9UFFLZOU1E5}/_ssgManifest.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/1150.1378afaa474df64a.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/1240.0819f45820d22263.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/1286-a62050b3f897c6be.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/1450.d383f64c169d4278.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/1774-aa51ef1da7217ff9.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2083-78a438dbdc57d1e4.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2125-0b537dc53fe71b18.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2481.0454a0e25dc7e027.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2508.724531e7f9cf5f36.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2524-6aeb9419acf5d1b4.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2545.8371b39c898ae92b.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/261.0a24b4ece1d29aa1.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/266.e301071d22592682.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/2714-1e79e9f2e998b544.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/29107295-989a0767a635d9d5.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3453.992f4b1667e9882c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3467.38cd0654ba6f788f.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3835.df296b4e4078e985.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3850-6395783d820def1c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3873.4b3eace753998412.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/3898.880191695bb05845.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4042.5e16d36209052351.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4092.536ee541241f4538.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4388.04098706f32e69e7.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/440.3ab77942f659ea0c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4450.79f14f763d55c63e.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4454.13a2404adecaa39e.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4495-4f0340aa82e0c623.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4538-347283088b83c6bf.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4776.753ad29fa0a29a4a.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4804-01a10103ebe26ca8.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/4883.a5bb0edbf8f3cc8f.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5008.29c2662ecc2b04c7.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5104.1edcf4437c471dd4.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5164.857023e800905b6f.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5477-b439f211b6146a11.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5729.0f2748e9e6dab951.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5824.628653557e904674.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5872-1767c45ee6690ae5.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/5896-10a676bcc86978cc.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6042.c59010de9e699437.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6085-692d2f784c0504f2.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6115.0c85e507543394ea.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6116.871a682ddf535aca.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6434.10380ee0968636ba.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6443.7b6d2b4e51018184.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6507.d3a17777d2c294e6.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/6958.8f39c585d36737a7.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/7011-81dd8269c4806d26.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/72fdc299.2d5ec188af5d0049.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/739.3d24945544b37e52.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/7400-a48b270726b9eef5.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/792.010ca00d79b2112f.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/7947.77be4bec4d47774e.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/7951.fee8b6c27c9ef777.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8018.968bf87c390e3312.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8097.b0345f30a7390c1d.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8256.290ceb269b1ffe26.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/826.75268ee34f93393a.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8277.5003e1d94bb85156.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8762.dff300f86bef8573.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8789-4f858e520d46973b.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8807.a68c69c8fe0a8c01.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8849.db0d50b4d84b09a6.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8901.21d26d5a1ee473fe.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/8920.5700e380a2999098.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9258.6c6ef544c701a011.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9307.d4baf7aebbcef1f0.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9361.a0820e3069f5ef74.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9363.6b811b4c86277e07.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9437.a3c32f45cf9ef69b.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9565-28e1c30511c95c2d.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9566.f8bd24768ed14ecb.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9633.40e5056ca1e2b22a.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9785.5ff26cb26d84d6a1.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9832-f97919376d52e3bf.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9855.c4394a68322be9f8.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/9927.e82a3e1e21990d77.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/bd1a647f.6050372acaa5cc3c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/framework-7c365855dab1bf41.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/main-bb0dd5375146d7fd.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/_error-235304e5badb19eb.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/index-e34a68d2f6fe16f2.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]-ca9457e1a6bced4b.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-f1844beb127841f3.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-997acba85f777259.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-91fbb84976467947.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/settings-d594a66a568306da.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-c99e74aa506a6cfd.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/pages/test-85cf18ae78ff535c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/polyfills-5cd94c89d3acac5f.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/chunks/webpack-bc5e4eb2c1ff587c.js +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/_next/static/css/d1e8e64d0b07af2f.css +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/favicon.ico +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Bold.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Light.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Medium.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Regular.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-Retina.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Fira_Code/ttf/FiraCode-SemiBold.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/LICENSE.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Black.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BlackItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Bold.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-BoldItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Italic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Light.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-LightItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Medium.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Regular.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-Thin.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto/Roboto-ThinItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/LICENSE.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/README.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/RobotoMono-Italic-VariableFont_wght.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/RobotoMono-VariableFont_wght.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Bold.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-BoldItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLight.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ExtraLightItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Italic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Light.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-LightItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Medium.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-MediumItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Regular.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBold.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-SemiBoldItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-Thin.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/fonts/Roboto_Mono/static/RobotoMono-ThinItalic.ttf +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/backfill.jpg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/banner-shape-purple-peach.jpg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/dashboard-api-key.webp +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/extensions/great_expectations/logo.png +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/extra.jpg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/monitor.jpg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/run B.jpg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/images/sessions/abstract.png +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/frontend_dist/vercel.svg +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/kernel_output_parser.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/kernels.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/scheduler_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/subscriber.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/utils/frontend_renderer.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/utils/output_display.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/server/websocket_server.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/client.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/exceptions.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/airbyte/server.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/ecs/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/ecs/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/ecs/ecs.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/emr.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/emr_basics.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/launcher.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/emr/resource_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/events/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/events/events.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/s3/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/s3/s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/secrets_manager/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/aws/secrets_manager/secrets_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/datadog/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/dbt/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/dbt/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/dbt/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/dbt/dbt.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/email/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/email/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/email/email.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/gcp/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/gcp/cloud_run/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/gcp/cloud_run/cloud_run.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/gcp/cloud_run/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/hightouch/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/hightouch/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/hightouch/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/hightouch/hightouch.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/k8s/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/k8s/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/k8s/job_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/metaplane/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/metaplane/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/metaplane/metaplane.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/slack/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/slack/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/slack/slack.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/stitch/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/stitch/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/stitch/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/stitch/stitch.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/teams/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/teams/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/teams/teams.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/tracking/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/services/tracking/metrics.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/settings/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/array.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/code.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/conversions.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/custom_types.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/dates.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/environments.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/hash.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/http_client.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/io.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/logger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/multi.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/parsers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/retry.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/strings.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/shared/urls.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/kafka.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/kinesis.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/opensearch.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sinks/sink_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/azure_event_hub.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/kafka.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/kinesis.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/rabbitmq.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/streaming/sources/source_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/operations/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/operations/base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/operations/test_operations.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/operations/test_sessions.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/api/operations/test_users.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/base_test.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_clean_column_names.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_fix_syntax_error.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_impute_values.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_reformat_values.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_collinear_columns.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_columns_with_high_empty_rate.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_columns_with_single_value.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_duplicate_rows.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/cleaning_rules/test_remove_outliers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/statistics/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/statistics/test_calculator.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/test_column_type_detector.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/shared.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_base.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_column.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_custom_actions.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_helpers.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_row.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_cleaner/transformer_actions/test_variable_replacer.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/block/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/block/test_sql.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/test_block.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/test_pipeline.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/models/test_variable.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/test_templates.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/data_preparation/test_variable_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/io/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/io/test_config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/io/test_export_utils.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/db/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/db/test_models.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/notification/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/notification/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/notification/test_config.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/notification/test_sender.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/queue/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/queue/test_process_queue.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/test_execution_process_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/test_job_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/test_pipeline_scheduler.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/triggers/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/triggers/test_event_trigger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/orchestration/triggers/test_loop_time_trigger.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/aws/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/aws/s3/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/aws/s3/test_s3.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/datadog/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/datadog/test_datadog.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/k8s/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/services/k8s/test_job_manager.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/shared/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/shared/test_io.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/shared/test_retry.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sinks/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sinks/test_kinesis.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sinks/test_opensearch.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sinks/test_sink_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/test_azure_event_hub.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/test_kafka.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/test_kinesis.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/test_rabbitmq.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/streaming/sources/test_source_factory.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/tests/test_shared.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/utils/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/utils/code.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/utils/logger/__init__.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/utils/logger/constants.py +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai.egg-info/dependency_links.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai.egg-info/entry_points.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai.egg-info/requires.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai.egg-info/top_level.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/pyproject.toml +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/requirements.txt +0 -0
- {mage-ai-0.8.26 → mage-ai-0.8.27}/setup.cfg +0 -0
{mage-ai-0.8.26 → mage-ai-0.8.27}/mage_ai/data_preparation/executors/streaming_pipeline_executor.py
RENAMED
|
@@ -3,6 +3,7 @@ from mage_ai.data_preparation.executors.pipeline_executor import PipelineExecuto
|
|
|
3
3
|
from mage_ai.data_preparation.models.constants import BlockType
|
|
4
4
|
from mage_ai.data_preparation.models.pipeline import Pipeline
|
|
5
5
|
from mage_ai.data_preparation.shared.stream import StreamToLogger
|
|
6
|
+
from mage_ai.shared.hash import merge_dict
|
|
6
7
|
from typing import Callable, Dict, List, Union
|
|
7
8
|
import os
|
|
8
9
|
import yaml
|
|
@@ -83,7 +84,7 @@ class StreamingPipelineExecutor(PipelineExecutor):
|
|
|
83
84
|
if not build_block_output_stdout:
|
|
84
85
|
self.logger.exception(
|
|
85
86
|
f'Failed to execute streaming pipeline {self.pipeline.uuid}',
|
|
86
|
-
error=e,
|
|
87
|
+
**merge_dict(dict(error=e), tags),
|
|
87
88
|
)
|
|
88
89
|
raise e
|
|
89
90
|
|
|
@@ -7,6 +7,8 @@ import io
|
|
|
7
7
|
import logging
|
|
8
8
|
import os
|
|
9
9
|
|
|
10
|
+
MAX_LOG_FILE_SIZE = 5 * 1024 * 1024
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
class LoggerManager:
|
|
12
14
|
def __init__(
|
|
@@ -50,7 +52,11 @@ class LoggerManager:
|
|
|
50
52
|
handler = self.create_stream_handler()
|
|
51
53
|
else:
|
|
52
54
|
log_filepath = self.get_log_filepath(create_dir=True)
|
|
53
|
-
handler = logging.
|
|
55
|
+
handler = logging.handlers.RotatingFileHandler(
|
|
56
|
+
log_filepath,
|
|
57
|
+
backupCount=10,
|
|
58
|
+
maxBytes=MAX_LOG_FILE_SIZE,
|
|
59
|
+
)
|
|
54
60
|
|
|
55
61
|
handler.setLevel(self.log_level)
|
|
56
62
|
handler.setFormatter(self.formatter)
|
|
@@ -4,6 +4,7 @@ from inspect import Parameter, signature
|
|
|
4
4
|
from logging import Logger
|
|
5
5
|
from mage_ai.data_cleaner.shared.utils import (
|
|
6
6
|
is_geo_dataframe,
|
|
7
|
+
is_spark_dataframe,
|
|
7
8
|
)
|
|
8
9
|
from mage_ai.data_preparation.models.block.extension.utils import handle_run_tests
|
|
9
10
|
from mage_ai.data_preparation.models.block.utils import (
|
|
@@ -50,7 +51,6 @@ import functools
|
|
|
50
51
|
import json
|
|
51
52
|
import os
|
|
52
53
|
import pandas as pd
|
|
53
|
-
import re
|
|
54
54
|
import simplejson
|
|
55
55
|
import sys
|
|
56
56
|
import time
|
|
@@ -252,6 +252,10 @@ class Block:
|
|
|
252
252
|
self.dynamic_block_uuid = None
|
|
253
253
|
self.dynamic_upstream_block_uuids = None
|
|
254
254
|
|
|
255
|
+
# Spark session
|
|
256
|
+
self.spark = None
|
|
257
|
+
self.spark_init = False
|
|
258
|
+
|
|
255
259
|
@property
|
|
256
260
|
def uuid(self):
|
|
257
261
|
return self.dynamic_block_uuid or self._uuid
|
|
@@ -348,34 +352,22 @@ class Block:
|
|
|
348
352
|
@property
|
|
349
353
|
def full_table_name(self) -> str:
|
|
350
354
|
from mage_ai.data_preparation.models.block.sql.utils.shared import (
|
|
351
|
-
|
|
355
|
+
extract_create_statement_table_name,
|
|
356
|
+
extract_insert_statement_table_names,
|
|
352
357
|
)
|
|
353
358
|
|
|
354
359
|
if not self.content:
|
|
355
360
|
return None
|
|
356
361
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
r'\(',
|
|
361
|
-
)
|
|
362
|
-
|
|
363
|
-
if not statement_partial:
|
|
364
|
-
matches = re.findall(
|
|
365
|
-
r'insert(?: overwrite)*(?: into)*[\s]+([\w.]+)',
|
|
366
|
-
self.content,
|
|
367
|
-
re.IGNORECASE,
|
|
368
|
-
)
|
|
369
|
-
if len(matches) >= 1:
|
|
370
|
-
return matches[len(matches) - 1]
|
|
371
|
-
else:
|
|
372
|
-
return None
|
|
362
|
+
table_name = extract_create_statement_table_name(self.content)
|
|
363
|
+
if table_name:
|
|
364
|
+
return table_name
|
|
373
365
|
|
|
374
|
-
|
|
366
|
+
matches = extract_insert_statement_table_names(self.content)
|
|
367
|
+
if len(matches) == 0:
|
|
375
368
|
return None
|
|
376
369
|
|
|
377
|
-
|
|
378
|
-
return parts[-1]
|
|
370
|
+
return matches[len(matches) - 1]
|
|
379
371
|
|
|
380
372
|
@classmethod
|
|
381
373
|
def after_create(self, block: 'Block', **kwargs):
|
|
@@ -1053,7 +1045,6 @@ class Block:
|
|
|
1053
1045
|
block_uuid,
|
|
1054
1046
|
partition=execution_partition,
|
|
1055
1047
|
)
|
|
1056
|
-
|
|
1057
1048
|
if not include_print_outputs:
|
|
1058
1049
|
all_variables = self.output_variables(execution_partition=execution_partition)
|
|
1059
1050
|
|
|
@@ -1063,6 +1054,7 @@ class Block:
|
|
|
1063
1054
|
block_uuid,
|
|
1064
1055
|
v,
|
|
1065
1056
|
partition=execution_partition,
|
|
1057
|
+
spark=self.__get_spark_session(),
|
|
1066
1058
|
)
|
|
1067
1059
|
|
|
1068
1060
|
if variable_type is not None and variable_object.variable_type != variable_type:
|
|
@@ -1071,6 +1063,7 @@ class Block:
|
|
|
1071
1063
|
data = variable_object.read_data(
|
|
1072
1064
|
sample=True,
|
|
1073
1065
|
sample_count=sample_count,
|
|
1066
|
+
spark=self.__get_spark_session(),
|
|
1074
1067
|
)
|
|
1075
1068
|
if type(data) is pd.DataFrame:
|
|
1076
1069
|
try:
|
|
@@ -1130,6 +1123,19 @@ df = get_variable('{self.pipeline.uuid}', '{self.uuid}', 'df')
|
|
|
1130
1123
|
type=DataType.TEXT,
|
|
1131
1124
|
variable_uuid=v,
|
|
1132
1125
|
)
|
|
1126
|
+
elif is_spark_dataframe(data):
|
|
1127
|
+
df = data.toPandas()
|
|
1128
|
+
columns_to_display = df.columns.tolist()[:DATAFRAME_ANALYSIS_MAX_COLUMNS]
|
|
1129
|
+
data = dict(
|
|
1130
|
+
sample_data=dict(
|
|
1131
|
+
columns=columns_to_display,
|
|
1132
|
+
rows=json.loads(df[columns_to_display].to_json(orient='split'))['data']
|
|
1133
|
+
),
|
|
1134
|
+
type=DataType.TABLE,
|
|
1135
|
+
variable_uuid=v,
|
|
1136
|
+
)
|
|
1137
|
+
data_products.append(data)
|
|
1138
|
+
continue
|
|
1133
1139
|
outputs.append(data)
|
|
1134
1140
|
return outputs + data_products
|
|
1135
1141
|
|
|
@@ -1166,6 +1172,7 @@ df = get_variable('{self.pipeline.uuid}', '{self.uuid}', 'df')
|
|
|
1166
1172
|
block_uuid,
|
|
1167
1173
|
v,
|
|
1168
1174
|
partition=execution_partition,
|
|
1175
|
+
spark=self.__get_spark_session(),
|
|
1169
1176
|
)
|
|
1170
1177
|
|
|
1171
1178
|
if variable_type is not None and variable_object.variable_type != variable_type:
|
|
@@ -1174,6 +1181,7 @@ df = get_variable('{self.pipeline.uuid}', '{self.uuid}', 'df')
|
|
|
1174
1181
|
data = await variable_object.read_data_async(
|
|
1175
1182
|
sample=True,
|
|
1176
1183
|
sample_count=sample_count,
|
|
1184
|
+
spark=self.__get_spark_session(),
|
|
1177
1185
|
)
|
|
1178
1186
|
if type(data) is pd.DataFrame:
|
|
1179
1187
|
try:
|
|
@@ -1233,6 +1241,19 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
|
|
|
1233
1241
|
type=DataType.TEXT,
|
|
1234
1242
|
variable_uuid=v,
|
|
1235
1243
|
)
|
|
1244
|
+
elif is_spark_dataframe(data):
|
|
1245
|
+
df = data.toPandas()
|
|
1246
|
+
columns_to_display = df.columns.tolist()[:DATAFRAME_ANALYSIS_MAX_COLUMNS]
|
|
1247
|
+
data = dict(
|
|
1248
|
+
sample_data=dict(
|
|
1249
|
+
columns=columns_to_display,
|
|
1250
|
+
rows=json.loads(df[columns_to_display].to_json(orient='split'))['data']
|
|
1251
|
+
),
|
|
1252
|
+
type=DataType.TABLE,
|
|
1253
|
+
variable_uuid=v,
|
|
1254
|
+
)
|
|
1255
|
+
data_products.append(data)
|
|
1256
|
+
continue
|
|
1236
1257
|
outputs.append(data)
|
|
1237
1258
|
return outputs + data_products
|
|
1238
1259
|
|
|
@@ -1663,14 +1684,23 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
|
|
|
1663
1684
|
is_spark_env()):
|
|
1664
1685
|
global_vars = global_vars or dict()
|
|
1665
1686
|
if not global_vars.get('spark'):
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
global_vars['spark'] =
|
|
1669
|
-
os.getenv('SPARK_MASTER_HOST', 'local')).getOrCreate()
|
|
1670
|
-
except Exception:
|
|
1671
|
-
pass
|
|
1687
|
+
spark = self.__get_spark_session()
|
|
1688
|
+
if spark is not None:
|
|
1689
|
+
global_vars['spark'] = spark
|
|
1672
1690
|
return global_vars
|
|
1673
1691
|
|
|
1692
|
+
def __get_spark_session(self):
|
|
1693
|
+
if self.spark_init:
|
|
1694
|
+
return self.spark
|
|
1695
|
+
try:
|
|
1696
|
+
from pyspark.sql import SparkSession
|
|
1697
|
+
self.spark = SparkSession.builder.master(
|
|
1698
|
+
os.getenv('SPARK_MASTER_HOST', 'local')).getOrCreate()
|
|
1699
|
+
except Exception:
|
|
1700
|
+
self.spark = None
|
|
1701
|
+
self.spark_init = True
|
|
1702
|
+
return self.spark
|
|
1703
|
+
|
|
1674
1704
|
def __store_variables_prepare(
|
|
1675
1705
|
self,
|
|
1676
1706
|
variable_mapping: Dict,
|
|
@@ -1722,7 +1752,8 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
|
|
|
1722
1752
|
dynamic_block_uuid,
|
|
1723
1753
|
)
|
|
1724
1754
|
for uuid, data in variables_data['variable_mapping'].items():
|
|
1725
|
-
if spark is not None and type
|
|
1755
|
+
if spark is not None and self.pipeline.type == PipelineType.PYSPARK \
|
|
1756
|
+
and type(data) is pd.DataFrame:
|
|
1726
1757
|
data = spark.createDataFrame(data)
|
|
1727
1758
|
self.pipeline.variable_manager.add_variable(
|
|
1728
1759
|
self.pipeline.uuid,
|
|
@@ -9,6 +9,7 @@ from mage_ai.data_preparation.models.block.sql import (
|
|
|
9
9
|
trino,
|
|
10
10
|
)
|
|
11
11
|
from mage_ai.data_preparation.models.block.sql.utils.shared import (
|
|
12
|
+
has_create_or_insert_statement,
|
|
12
13
|
interpolate_vars,
|
|
13
14
|
)
|
|
14
15
|
from mage_ai.data_preparation.models.constants import BlockType
|
|
@@ -389,11 +390,15 @@ def split_query_string(query_string: str) -> List[str]:
|
|
|
389
390
|
arr = []
|
|
390
391
|
for query in queries:
|
|
391
392
|
query = query.strip()
|
|
393
|
+
if not query:
|
|
394
|
+
continue
|
|
395
|
+
|
|
396
|
+
lines = query.split('\n')
|
|
397
|
+
query = '\n'.join(list(filter(lambda x: not x.startswith('--'), lines)))
|
|
398
|
+
query = query.strip()
|
|
399
|
+
query = re.sub(MAGE_SEMI_COLON, ';', query)
|
|
400
|
+
|
|
392
401
|
if query:
|
|
393
|
-
lines = query.split('\n')
|
|
394
|
-
query = '\n'.join(list(filter(lambda x: not x.startswith('--'), lines)))
|
|
395
|
-
query = query.strip()
|
|
396
|
-
query = re.sub(MAGE_SEMI_COLON, ';', query)
|
|
397
402
|
arr.append(query)
|
|
398
403
|
|
|
399
404
|
return arr
|
|
@@ -409,11 +414,23 @@ def execute_raw_sql(
|
|
|
409
414
|
queries = []
|
|
410
415
|
fetch_query_at_indexes = []
|
|
411
416
|
|
|
412
|
-
|
|
413
|
-
queries.append(query)
|
|
414
|
-
fetch_query_at_indexes.append(False)
|
|
417
|
+
has_create_or_insert = has_create_or_insert_statement(query_string)
|
|
415
418
|
|
|
416
|
-
|
|
419
|
+
for query in split_query_string(query_string):
|
|
420
|
+
if has_create_or_insert:
|
|
421
|
+
queries.append(query)
|
|
422
|
+
fetch_query_at_indexes.append(False)
|
|
423
|
+
else:
|
|
424
|
+
if should_query:
|
|
425
|
+
query = f"""SELECT *
|
|
426
|
+
FROM (
|
|
427
|
+
{query}
|
|
428
|
+
) AS {block.table_name}__limit
|
|
429
|
+
LIMIT 1000"""
|
|
430
|
+
queries.append(query)
|
|
431
|
+
fetch_query_at_indexes.append(True)
|
|
432
|
+
|
|
433
|
+
if should_query and has_create_or_insert:
|
|
417
434
|
queries.append(f'SELECT * FROM {block.full_table_name} LIMIT 1000')
|
|
418
435
|
fetch_query_at_indexes.append(block.full_table_name)
|
|
419
436
|
|
|
@@ -47,23 +47,33 @@ def interpolate_input(block, query, replace_func=None):
|
|
|
47
47
|
for idx, upstream_block in enumerate(block.upstream_blocks):
|
|
48
48
|
matcher1 = '{} df_{} {}'.format('{{', idx + 1, '}}')
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
is_sql = BlockLanguage.SQL == upstream_block.language
|
|
51
|
+
if is_sql:
|
|
51
52
|
configuration = upstream_block.configuration
|
|
52
53
|
else:
|
|
53
54
|
configuration = block.configuration
|
|
55
|
+
use_raw_sql = configuration.get('use_raw_sql')
|
|
54
56
|
|
|
55
57
|
database = configuration.get('data_provider_database', '')
|
|
56
58
|
schema = configuration.get('data_provider_schema', '')
|
|
57
59
|
|
|
60
|
+
replace_with = __replace_func(database, schema, upstream_block.table_name)
|
|
61
|
+
upstream_block_content = upstream_block.content
|
|
62
|
+
if is_sql and use_raw_sql and not has_create_or_insert_statement(upstream_block_content):
|
|
63
|
+
upstream_query = interpolate_input(upstream_block, upstream_block_content)
|
|
64
|
+
replace_with = f"""(
|
|
65
|
+
{upstream_query}
|
|
66
|
+
) AS {upstream_block.table_name}"""
|
|
67
|
+
|
|
58
68
|
query = re.sub(
|
|
59
69
|
'{}[ ]*df_{}[ ]*{}'.format(r'\{\{', idx + 1, r'\}\}'),
|
|
60
|
-
|
|
70
|
+
replace_with,
|
|
61
71
|
query,
|
|
62
72
|
)
|
|
63
73
|
|
|
64
74
|
query = query.replace(
|
|
65
75
|
f'{matcher1}',
|
|
66
|
-
|
|
76
|
+
replace_with,
|
|
67
77
|
)
|
|
68
78
|
|
|
69
79
|
return query
|
|
@@ -170,3 +180,39 @@ def extract_and_replace_text_between_strings(
|
|
|
170
180
|
new_text = text[0:max(start_idx - 1, 0)] + replace_string + text[end_idx + 1:]
|
|
171
181
|
|
|
172
182
|
return extracted_text, new_text
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def remove_comments(text: str) -> str:
|
|
186
|
+
lines = text.split('\n')
|
|
187
|
+
return '\n'.join(line for line in lines if not line.startswith('--'))
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def extract_create_statement_table_name(text: str) -> str:
|
|
191
|
+
statement_partial, _ = extract_and_replace_text_between_strings(
|
|
192
|
+
remove_comments(text),
|
|
193
|
+
r'create table(?: if not exists)*',
|
|
194
|
+
r'\(',
|
|
195
|
+
)
|
|
196
|
+
if not statement_partial:
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
parts = statement_partial[:len(statement_partial) - 1].strip().split(' ')
|
|
200
|
+
return parts[-1]
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def extract_insert_statement_table_names(text: str) -> List[str]:
|
|
204
|
+
matches = re.findall(
|
|
205
|
+
r'insert(?: overwrite)*(?: into)*[\s]+([\w.]+)',
|
|
206
|
+
remove_comments(text),
|
|
207
|
+
re.IGNORECASE,
|
|
208
|
+
)
|
|
209
|
+
return matches
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def has_create_or_insert_statement(text: str) -> bool:
|
|
213
|
+
table_name = extract_create_statement_table_name(text)
|
|
214
|
+
if table_name:
|
|
215
|
+
return True
|
|
216
|
+
|
|
217
|
+
matches = extract_insert_statement_table_names(text)
|
|
218
|
+
return len(matches) >= 1
|
|
@@ -175,6 +175,8 @@ class Variable:
|
|
|
175
175
|
"""
|
|
176
176
|
if self.variable_type == VariableType.DATAFRAME:
|
|
177
177
|
return self.__read_parquet(sample=sample, sample_count=sample_count)
|
|
178
|
+
elif self.variable_type == VariableType.SPARK_DATAFRAME:
|
|
179
|
+
return self.__read_spark_parquet(sample=sample, sample_count=sample_count, spark=spark)
|
|
178
180
|
elif self.variable_type == VariableType.DATAFRAME_ANALYSIS:
|
|
179
181
|
return await self.__read_dataframe_analysis_async(
|
|
180
182
|
dataframe_analysis_keys=dataframe_analysis_keys,
|
|
@@ -367,7 +369,7 @@ class Variable:
|
|
|
367
369
|
def __read_spark_parquet(self, sample: bool = False, sample_count: int = None, spark=None):
|
|
368
370
|
if spark is None:
|
|
369
371
|
return None
|
|
370
|
-
|
|
372
|
+
df = (
|
|
371
373
|
spark.read
|
|
372
374
|
.format('csv')
|
|
373
375
|
.option('header', 'true')
|
|
@@ -375,6 +377,9 @@ class Variable:
|
|
|
375
377
|
.option('delimiter', ',')
|
|
376
378
|
.load(self.variable_path)
|
|
377
379
|
)
|
|
380
|
+
if sample and sample_count:
|
|
381
|
+
df = df.limit(sample_count)
|
|
382
|
+
return df
|
|
378
383
|
|
|
379
384
|
def __write_geo_dataframe(self, data) -> None:
|
|
380
385
|
os.makedirs(self.variable_path, exist_ok=True)
|
|
@@ -114,12 +114,15 @@ def init_repo(repo_path: str) -> None:
|
|
|
114
114
|
if os.path.exists(repo_path):
|
|
115
115
|
raise FileExistsError(f'Repository {repo_path} already exists')
|
|
116
116
|
|
|
117
|
-
os.makedirs(
|
|
117
|
+
os.makedirs(
|
|
118
|
+
os.getenv(MAGE_DATA_DIR_ENV_VAR) or DEFAULT_MAGE_DATA_DIR,
|
|
119
|
+
exist_ok=True,
|
|
120
|
+
)
|
|
118
121
|
copy_template_directory('repo', repo_path)
|
|
119
122
|
|
|
120
123
|
|
|
121
124
|
def get_data_dir() -> str:
|
|
122
|
-
return os.getenv(MAGE_DATA_DIR_ENV_VAR
|
|
125
|
+
return os.getenv(MAGE_DATA_DIR_ENV_VAR) or DEFAULT_MAGE_DATA_DIR
|
|
123
126
|
|
|
124
127
|
|
|
125
128
|
def get_repo_name() -> str:
|
|
@@ -66,6 +66,9 @@ def get_secret_value(name: str) -> str:
|
|
|
66
66
|
from mage_ai.orchestration.db.models import Secret
|
|
67
67
|
fernet = Fernet(get_encryption_key())
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
try:
|
|
70
|
+
secret = Secret.query.filter(Secret.name == name).one_or_none()
|
|
71
|
+
if secret:
|
|
72
|
+
return fernet.decrypt(secret.value.encode('utf-8')).decode('utf-8')
|
|
73
|
+
except Exception:
|
|
74
|
+
print(f'WARNING: Could not find secret value for secret {name}')
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from mage_ai.data_preparation.repo_manager import get_repo_path
|
|
2
|
+
from mage_ai.io.bigquery import BigQuery
|
|
3
|
+
from mage_ai.io.config import ConfigFileLoader
|
|
4
|
+
from os import path
|
|
5
|
+
|
|
6
|
+
if 'sensor' not in globals():
|
|
7
|
+
from mage_ai.data_preparation.decorators import sensor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@sensor
|
|
11
|
+
def query_bigquery_and_check_condition(**kwargs) -> bool:
|
|
12
|
+
"""
|
|
13
|
+
Template code for checking the results of a BigQuery query.
|
|
14
|
+
Specify your configuration settings in 'io_config.yaml'.
|
|
15
|
+
|
|
16
|
+
Return: True if the sensor should complete, False if it should
|
|
17
|
+
keep waiting
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
21
|
+
config_profile = 'default'
|
|
22
|
+
|
|
23
|
+
query = 'Your BigQuery query' # Specify your SQL query here
|
|
24
|
+
|
|
25
|
+
loader = BigQuery.with_config(ConfigFileLoader(config_path, config_profile))
|
|
26
|
+
df = loader.load(query)
|
|
27
|
+
|
|
28
|
+
# Add your checks here
|
|
29
|
+
if df.empty:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
return True
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from mage_ai.data_preparation.repo_manager import get_repo_path
|
|
2
|
+
from mage_ai.io.config import ConfigFileLoader
|
|
3
|
+
from mage_ai.io.mysql import MySQL
|
|
4
|
+
from os import path
|
|
5
|
+
|
|
6
|
+
if 'sensor' not in globals():
|
|
7
|
+
from mage_ai.data_preparation.decorators import sensor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@sensor
|
|
11
|
+
def query_mysql_and_check_condition(**kwargs) -> bool:
|
|
12
|
+
"""
|
|
13
|
+
Template code for checking the results of a MySQL query.
|
|
14
|
+
Specify your configuration settings in 'io_config.yaml'.
|
|
15
|
+
|
|
16
|
+
Return: True if the sensor should complete, False if it should
|
|
17
|
+
keep waiting
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
21
|
+
config_profile = 'default'
|
|
22
|
+
|
|
23
|
+
query = 'Your MySQL query' # Specify your SQL query here
|
|
24
|
+
|
|
25
|
+
with MySQL.with_config(
|
|
26
|
+
ConfigFileLoader(config_path, config_profile)) as loader:
|
|
27
|
+
df = loader.load(query)
|
|
28
|
+
|
|
29
|
+
# Add your checks here
|
|
30
|
+
if df.empty:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
return True
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from mage_ai.data_preparation.repo_manager import get_repo_path
|
|
2
|
+
from mage_ai.io.config import ConfigFileLoader
|
|
3
|
+
from mage_ai.io.postgres import Postgres
|
|
4
|
+
from os import path
|
|
5
|
+
|
|
6
|
+
if 'sensor' not in globals():
|
|
7
|
+
from mage_ai.data_preparation.decorators import sensor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@sensor
|
|
11
|
+
def query_postgres_and_check_condition(**kwargs) -> bool:
|
|
12
|
+
"""
|
|
13
|
+
Template code for checking the results of a Postgres query.
|
|
14
|
+
Specify your configuration settings in 'io_config.yaml'.
|
|
15
|
+
|
|
16
|
+
Return: True if the sensor should complete, False if it should
|
|
17
|
+
keep waiting
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
21
|
+
config_profile = 'default'
|
|
22
|
+
|
|
23
|
+
query = 'Your Postgres query' # Specify your SQL query here
|
|
24
|
+
|
|
25
|
+
with Postgres.with_config(
|
|
26
|
+
ConfigFileLoader(config_path, config_profile)) as loader:
|
|
27
|
+
df = loader.load(query)
|
|
28
|
+
|
|
29
|
+
# Add your checks here
|
|
30
|
+
if df.empty:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
return True
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from mage_ai.data_preparation.repo_manager import get_repo_path
|
|
2
|
+
from mage_ai.io.config import ConfigFileLoader
|
|
3
|
+
from mage_ai.io.redshift import Redshift
|
|
4
|
+
from os import path
|
|
5
|
+
|
|
6
|
+
if 'sensor' not in globals():
|
|
7
|
+
from mage_ai.data_preparation.decorators import sensor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@sensor
|
|
11
|
+
def query_redshift_and_check_condition(**kwargs) -> bool:
|
|
12
|
+
"""
|
|
13
|
+
Template code for checking the results of a Redshift query.
|
|
14
|
+
Specify your configuration settings in 'io_config.yaml'.
|
|
15
|
+
|
|
16
|
+
Return: True if the sensor should complete, False if it should
|
|
17
|
+
keep waiting
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
21
|
+
config_profile = 'default'
|
|
22
|
+
|
|
23
|
+
query = 'Your Redshift query' # Specify your SQL query here
|
|
24
|
+
|
|
25
|
+
with Redshift.with_config(
|
|
26
|
+
ConfigFileLoader(config_path, config_profile)) as loader:
|
|
27
|
+
df = loader.load(query)
|
|
28
|
+
|
|
29
|
+
# Add your checks here
|
|
30
|
+
if df.empty:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
return True
|
|
@@ -3,9 +3,6 @@ from mage_ai.io.config import ConfigFileLoader
|
|
|
3
3
|
from mage_ai.io.s3 import S3
|
|
4
4
|
from os import path
|
|
5
5
|
|
|
6
|
-
import time
|
|
7
|
-
|
|
8
|
-
|
|
9
6
|
if 'sensor' not in globals():
|
|
10
7
|
from mage_ai.data_preparation.decorators import sensor
|
|
11
8
|
|
|
@@ -13,15 +10,22 @@ if 'sensor' not in globals():
|
|
|
13
10
|
@sensor
|
|
14
11
|
def check_condition(**kwargs) -> bool:
|
|
15
12
|
"""
|
|
16
|
-
Template code for checking if a
|
|
13
|
+
Template code for checking if a file or folder exists in a S3 bucket
|
|
14
|
+
|
|
15
|
+
You will also need to fill out the following AWS related fields
|
|
16
|
+
in `io_config.yaml`:
|
|
17
|
+
- AWS_ACCESS_KEY_ID
|
|
18
|
+
- AWS_SECRET_ACCESS_KEY
|
|
19
|
+
- AWS_REGION
|
|
17
20
|
"""
|
|
18
21
|
|
|
19
22
|
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
20
23
|
config_profile = 'default'
|
|
21
24
|
|
|
22
25
|
bucket_name = 'your_bucket_name'
|
|
23
|
-
|
|
26
|
+
s3_path = 'path/to/folder/or/file'
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
config_file_loader = ConfigFileLoader(config_path, config_profile)
|
|
29
|
+
return S3.with_config(config_file_loader).exists(
|
|
30
|
+
bucket_name, s3_path
|
|
27
31
|
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from mage_ai.data_preparation.repo_manager import get_repo_path
|
|
2
|
+
from mage_ai.io.config import ConfigFileLoader
|
|
3
|
+
from mage_ai.io.snowflake import Snowflake
|
|
4
|
+
from os import path
|
|
5
|
+
|
|
6
|
+
if 'sensor' not in globals():
|
|
7
|
+
from mage_ai.data_preparation.decorators import sensor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@sensor
|
|
11
|
+
def query_snowflake_and_check_condition(**kwargs) -> bool:
|
|
12
|
+
"""
|
|
13
|
+
Template code for checking the results of a Snowflake query.
|
|
14
|
+
Specify your configuration settings in 'io_config.yaml'.
|
|
15
|
+
|
|
16
|
+
Return: True if the sensor should complete, False if it should
|
|
17
|
+
keep waiting
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
config_path = path.join(get_repo_path(), 'io_config.yaml')
|
|
21
|
+
config_profile = 'default'
|
|
22
|
+
|
|
23
|
+
query = 'Your Snowflake query' # Specify your SQL query here
|
|
24
|
+
|
|
25
|
+
with Snowflake.with_config(
|
|
26
|
+
ConfigFileLoader(config_path, config_profile)) as loader:
|
|
27
|
+
df = loader.load(query)
|
|
28
|
+
|
|
29
|
+
# Add your checks here
|
|
30
|
+
if df.empty:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
return True
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from mage_ai.io.config import BaseConfigLoader, ConfigKey
|
|
2
2
|
from mage_ai.io.export_utils import BadConversionError, PandasTypes
|
|
3
3
|
from mage_ai.io.sql import BaseSQL
|
|
4
|
+
from mage_ai.shared.utils import is_port_in_use
|
|
4
5
|
from pandas import DataFrame, Series
|
|
5
6
|
from psycopg2 import connect, _psycopg
|
|
6
7
|
from sshtunnel import SSHTunnelForwarder
|
|
@@ -87,10 +88,21 @@ class Postgres(BaseSQL):
|
|
|
87
88
|
ssh_setting['ssh_pkey'] = self.settings['ssh_pkey']
|
|
88
89
|
else:
|
|
89
90
|
ssh_setting['ssh_password'] = self.settings['ssh_password']
|
|
91
|
+
|
|
92
|
+
# Find an available local port
|
|
93
|
+
local_port = port
|
|
94
|
+
max_local_port = local_port + 100
|
|
95
|
+
while is_port_in_use(local_port):
|
|
96
|
+
if local_port > max_local_port:
|
|
97
|
+
raise Exception(
|
|
98
|
+
'Unable to find an open port, please clear your running processes '
|
|
99
|
+
'if possible.'
|
|
100
|
+
)
|
|
101
|
+
local_port += 1
|
|
90
102
|
self.ssh_tunnel = SSHTunnelForwarder(
|
|
91
103
|
(self.settings['ssh_host'], self.settings['ssh_port']),
|
|
92
104
|
remote_bind_address=(host, port),
|
|
93
|
-
local_bind_address=('',
|
|
105
|
+
local_bind_address=('', local_port),
|
|
94
106
|
**ssh_setting,
|
|
95
107
|
)
|
|
96
108
|
self.ssh_tunnel.start()
|