mage-ai 0.9.74__py3-none-any.whl → 0.9.79__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mage_ai/ai/llm_pipeline_wizard.py +6 -4
- mage_ai/ai/openai_client.py +7 -5
- mage_ai/api/policies/PipelineSchedulePolicy.py +1 -0
- mage_ai/api/presenters/PipelineSchedulePresenter.py +11 -2
- mage_ai/api/resources/GitFileResource.py +8 -0
- mage_ai/api/resources/PipelineScheduleResource.py +20 -14
- mage_ai/api/resources/PipelineTriggerResource.py +3 -1
- mage_ai/api/resources/SessionResource.py +2 -2
- mage_ai/api/resources/SyncResource.py +1 -1
- mage_ai/api/resources/UserResource.py +1 -1
- mage_ai/cli/main.py +8 -1
- mage_ai/data_cleaner/analysis/charts.py +1 -1
- mage_ai/data_cleaner/cleaning_rules/reformat_values.py +1 -1
- mage_ai/data_integrations/destinations/constants.py +3 -0
- mage_ai/data_integrations/sources/constants.py +2 -0
- mage_ai/data_preparation/executors/block_executor.py +8 -3
- mage_ai/data_preparation/executors/pipeline_executor.py +35 -19
- mage_ai/data_preparation/git/utils.py +2 -2
- mage_ai/data_preparation/logging/logger_manager.py +31 -2
- mage_ai/data_preparation/models/block/__init__.py +33 -27
- mage_ai/data_preparation/models/block/dbt/dbt_adapter.py +20 -8
- mage_ai/data_preparation/models/block/dynamic/constants.py +0 -1
- mage_ai/data_preparation/models/block/dynamic/counter.py +1 -3
- mage_ai/data_preparation/models/block/outputs.py +7 -1
- mage_ai/data_preparation/models/block/r/__init__.py +16 -5
- mage_ai/data_preparation/models/block/sql/__init__.py +2 -0
- mage_ai/data_preparation/models/block/sql/mssql.py +8 -0
- mage_ai/data_preparation/models/block/sql/utils/shared.py +6 -2
- mage_ai/data_preparation/models/constants.py +4 -1
- mage_ai/data_preparation/models/pipeline.py +11 -2
- mage_ai/data_preparation/models/project/__init__.py +3 -1
- mage_ai/data_preparation/models/triggers/__init__.py +1 -1
- mage_ai/data_preparation/storage/local_storage.py +4 -1
- mage_ai/data_preparation/templates/constants.py +7 -0
- mage_ai/data_preparation/templates/data_exporters/streaming/elasticsearch.yaml +3 -0
- mage_ai/data_preparation/templates/data_loaders/airtable.py +28 -0
- mage_ai/data_preparation/templates/data_loaders/streaming/nats.yaml +6 -3
- mage_ai/data_preparation/templates/repo/io_config.yaml +2 -0
- mage_ai/io/airtable.py +104 -0
- mage_ai/io/base.py +30 -1
- mage_ai/io/bigquery.py +36 -0
- mage_ai/io/config.py +6 -0
- mage_ai/io/mssql.py +21 -9
- mage_ai/io/mysql.py +6 -1
- mage_ai/io/oracledb.py +2 -4
- mage_ai/io/postgres.py +41 -19
- mage_ai/io/qdrant.py +1 -1
- mage_ai/io/redshift.py +13 -0
- mage_ai/io/sql.py +1 -0
- mage_ai/io/utils.py +18 -0
- mage_ai/orchestration/db/__init__.py +23 -3
- mage_ai/orchestration/db/migrations/versions/39d36f1dab73_create_genericjob.py +47 -0
- mage_ai/orchestration/db/models/oauth.py +2 -1
- mage_ai/orchestration/db/models/schedules.py +108 -6
- mage_ai/orchestration/db/models/schedules_project_platform.py +1 -1
- mage_ai/orchestration/db/models/secrets.py +11 -1
- mage_ai/orchestration/job_manager.py +19 -0
- mage_ai/orchestration/metrics/pipeline_run.py +1 -1
- mage_ai/orchestration/notification/sender.py +2 -2
- mage_ai/orchestration/pipeline_scheduler_original.py +150 -6
- mage_ai/orchestration/pipeline_scheduler_project_platform.py +4 -5
- mage_ai/orchestration/queue/config.py +11 -1
- mage_ai/orchestration/queue/process_queue.py +4 -0
- mage_ai/orchestration/utils/distributed_lock.py +8 -1
- mage_ai/orchestration/utils/resources.py +56 -2
- mage_ai/sample_datasets/salary_survey.csv +52 -52
- mage_ai/server/api/base.py +41 -0
- mage_ai/server/api/constants.py +1 -0
- mage_ai/server/api/triggers.py +9 -0
- mage_ai/server/constants.py +1 -1
- mage_ai/server/frontend_dist/404.html +3 -3
- mage_ai/server/frontend_dist/_next/static/TUo4RceCdMufBTBTq8CAq/_buildManifest.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/{3763-39a5174f6a3924db.js → 3763-aabe2703076636b0.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-b697b35dfc4e6e26.js +2 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{overview-1aad7093c6d39257.js → overview-aae747f487e08d51.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-5ae8efe9e0530212.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-776b2e5b0b6ceba8.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
- mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
- mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
- mage_ai/server/frontend_dist/block-layout.html +3 -3
- mage_ai/server/frontend_dist/compute.html +6 -6
- mage_ai/server/frontend_dist/files.html +6 -6
- mage_ai/server/frontend_dist/global-data-products/[...slug].html +6 -6
- mage_ai/server/frontend_dist/global-data-products.html +6 -6
- mage_ai/server/frontend_dist/global-hooks/[...slug].html +6 -6
- mage_ai/server/frontend_dist/global-hooks.html +6 -6
- mage_ai/server/frontend_dist/index.html +3 -3
- mage_ai/server/frontend_dist/manage/files.html +6 -6
- mage_ai/server/frontend_dist/manage/overview.html +6 -6
- mage_ai/server/frontend_dist/manage/pipeline-runs.html +6 -6
- mage_ai/server/frontend_dist/manage/settings.html +6 -6
- mage_ai/server/frontend_dist/manage/users/[user].html +6 -6
- mage_ai/server/frontend_dist/manage/users/new.html +6 -6
- mage_ai/server/frontend_dist/manage/users.html +6 -6
- mage_ai/server/frontend_dist/manage.html +6 -6
- mage_ai/server/frontend_dist/oauth.html +5 -5
- mage_ai/server/frontend_dist/overview.html +6 -6
- mage_ai/server/frontend_dist/pipeline-runs.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +3 -3
- mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +6 -6
- mage_ai/server/frontend_dist/pipelines/[pipeline].html +3 -3
- mage_ai/server/frontend_dist/pipelines.html +6 -6
- mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +6 -6
- mage_ai/server/frontend_dist/platform/global-hooks.html +6 -6
- mage_ai/server/frontend_dist/settings/account/profile.html +6 -6
- mage_ai/server/frontend_dist/settings/platform/preferences.html +6 -6
- mage_ai/server/frontend_dist/settings/platform/settings.html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/permissions.html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/preferences.html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/roles.html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/sync-data.html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +6 -6
- mage_ai/server/frontend_dist/settings/workspace/users.html +6 -6
- mage_ai/server/frontend_dist/settings.html +3 -3
- mage_ai/server/frontend_dist/sign-in.html +7 -7
- mage_ai/server/frontend_dist/templates/[...slug].html +6 -6
- mage_ai/server/frontend_dist/templates.html +6 -6
- mage_ai/server/frontend_dist/terminal.html +6 -6
- mage_ai/server/frontend_dist/test.html +3 -3
- mage_ai/server/frontend_dist/triggers.html +6 -6
- mage_ai/server/frontend_dist/v2/canvas.html +2 -2
- mage_ai/server/frontend_dist/v2.html +2 -2
- mage_ai/server/frontend_dist/version-control.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/404.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/_next/static/2QL-FT4lFR0a9bDZ7lNd9/_buildManifest.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{3763-39a5174f6a3924db.js → 3763-aabe2703076636b0.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist_base_path_template/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-f205accb03b9ff43.js +2 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist_base_path_template/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist_base_path_template/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{overview-1aad7093c6d39257.js → overview-aae747f487e08d51.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-5ae8efe9e0530212.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-776b2e5b0b6ceba8.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist_base_path_template/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
- mage_ai/server/{frontend_dist/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist_base_path_template/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-12ad70eb5c31aa92.js → webpack-5f4be622608d9267.js} +1 -1
- mage_ai/server/frontend_dist_base_path_template/block-layout.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/compute.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/files.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/global-data-products.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/global-hooks.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/index.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/manage/files.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/overview.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/pipeline-runs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/settings.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage/users.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/manage.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/oauth.html +5 -5
- mage_ai/server/frontend_dist_base_path_template/overview.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +3 -3
- mage_ai/server/frontend_dist_base_path_template/pipelines.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/settings.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/sign-in.html +7 -7
- mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +6 -6
- mage_ai/server/frontend_dist_base_path_template/templates.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/terminal.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/test.html +3 -3
- mage_ai/server/frontend_dist_base_path_template/triggers.html +6 -6
- mage_ai/server/frontend_dist_base_path_template/v2/canvas.html +2 -2
- mage_ai/server/frontend_dist_base_path_template/v2.html +2 -2
- mage_ai/server/frontend_dist_base_path_template/version-control.html +6 -6
- mage_ai/server/scheduler_manager.py +2 -0
- mage_ai/server/server.py +13 -0
- mage_ai/server/terminal_server.py +3 -0
- mage_ai/server/utils/output_display.py +5 -3
- mage_ai/services/aws/events/events.py +2 -2
- mage_ai/services/gcp/cloud_run/cloud_run.py +1 -1
- mage_ai/services/teams/config.py +13 -2
- mage_ai/services/teams/teams.py +13 -11
- mage_ai/settings/server.py +12 -1
- mage_ai/shared/constants.py +3 -1
- mage_ai/shared/croniter.py +1398 -0
- mage_ai/shared/enum.py +2 -5
- mage_ai/shared/environments.py +27 -3
- mage_ai/streaming/sinks/elasticsearch.py +15 -5
- mage_ai/streaming/sinks/kafka.py +21 -3
- mage_ai/streaming/sources/kafka.py +64 -7
- mage_ai/streaming/sources/kafka_oauth.py +182 -0
- mage_ai/tests/api/endpoints/test_blocks.py +1 -101
- mage_ai/tests/api/endpoints/test_configuration_options.py +1 -48
- mage_ai/tests/api/endpoints/test_configuration_options_project_platform.py +68 -0
- mage_ai/tests/api/endpoints/test_custom_designs.py +1 -106
- mage_ai/tests/api/endpoints/test_custom_designs_project_platform.py +132 -0
- mage_ai/tests/api/endpoints/test_dbt_blocks.py +111 -0
- mage_ai/tests/api/endpoints/test_file_contents.py +0 -48
- mage_ai/tests/api/endpoints/test_file_contents_with_project_platform.py +66 -0
- mage_ai/tests/api/endpoints/test_pipelines.py +0 -134
- mage_ai/tests/api/endpoints/test_pipelines_with_project_platform.py +143 -0
- mage_ai/tests/data_preparation/executors/test_block_executor.py +3 -3
- mage_ai/tests/data_preparation/logging/test_logger_manager.py +24 -5
- mage_ai/tests/data_preparation/models/block/dynamic/test_counter.py +1 -3
- mage_ai/tests/data_preparation/models/block/hook/test_hook_block.py +3 -3
- mage_ai/tests/data_preparation/models/test_block.py +7 -0
- mage_ai/tests/data_preparation/models/test_pipeline.py +55 -0
- mage_ai/tests/data_preparation/models/test_variable.py +2 -0
- mage_ai/tests/data_preparation/test_repo_manager.py +0 -63
- mage_ai/tests/data_preparation/test_repo_manager_project_platform.py +67 -0
- mage_ai/tests/data_preparation/test_variable_manager.py +0 -51
- mage_ai/tests/data_preparation/test_variable_manager_project_platform.py +41 -0
- mage_ai/tests/io/create_table/test_postgresql.py +28 -0
- mage_ai/tests/orchestration/db/models/test_schedules.py +1 -1
- mage_ai/tests/orchestration/notification/test_config.py +3 -3
- mage_ai/tests/orchestration/notification/test_sender.py +5 -1
- mage_ai/tests/orchestration/utils/__init__.py +0 -0
- mage_ai/tests/orchestration/utils/test_resources.py +235 -0
- mage_ai/tests/shared/test_croniter.py +2541 -0
- mage_ai/tests/streaming/sinks/test_kafka.py +130 -0
- mage_ai/tests/streaming/sources/test_kafka.py +125 -3
- mage_ai/tests/streaming/sources/test_kafka_oauth.py +208 -0
- mage_ai/tests/streaming/sources/test_kafka_raw_value.py +105 -0
- mage_ai/usage_statistics/logger.py +99 -15
- mage_ai-0.9.79.dist-info/METADATA +358 -0
- {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/RECORD +377 -359
- {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/WHEEL +1 -1
- mage_ai/server/frontend_dist/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-5bdff745074fb350.js +0 -2
- mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-a5e9d77ed5b50205.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-cd49372ae1702963.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-5212c01a9dc558da.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
- mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
- mage_ai/server/frontend_dist/_next/static/pLWT6Sqd09xYpufCVIqnz/_buildManifest.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/JQewSAObpbhO0wrdAM6Ng/_buildManifest.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-90de19bc03f1484b.js +0 -2
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-a5e9d77ed5b50205.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-cd49372ae1702963.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-5212c01a9dc558da.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
- mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
- mage_ai-0.9.74.dist-info/METADATA +0 -544
- /mage_ai/server/frontend_dist/_next/static/{pLWT6Sqd09xYpufCVIqnz → TUo4RceCdMufBTBTq8CAq}/_ssgManifest.js +0 -0
- /mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-5bdff745074fb350.js.LICENSE.txt → _app-b697b35dfc4e6e26.js.LICENSE.txt} +0 -0
- /mage_ai/server/frontend_dist_base_path_template/_next/static/{JQewSAObpbhO0wrdAM6Ng → 2QL-FT4lFR0a9bDZ7lNd9}/_ssgManifest.js +0 -0
- /mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-90de19bc03f1484b.js.LICENSE.txt → _app-f205accb03b9ff43.js.LICENSE.txt} +0 -0
- {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/entry_points.txt +0 -0
- {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info/licenses}/LICENSE +0 -0
- {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/top_level.txt +0 -0
|
@@ -156,16 +156,18 @@ TEMPLATE_CLASSIFICATION_FUNCTION = [
|
|
|
156
156
|
"type": "string",
|
|
157
157
|
"description": "Programming language of the code block. "
|
|
158
158
|
f"Default value is {BlockLanguage.__name__}__python.",
|
|
159
|
-
"enum": [
|
|
160
|
-
|
|
159
|
+
"enum": [
|
|
160
|
+
f"{BlockLanguage.__name__}__{type.name.lower()}"
|
|
161
|
+
for type in BlockLanguage]
|
|
161
162
|
},
|
|
162
163
|
PipelineType.__name__: {
|
|
163
164
|
"type": "string",
|
|
164
165
|
"description": "Type of pipeline to build. Default value is "
|
|
165
166
|
f"{PipelineType.__name__}__python if pipeline type "
|
|
166
167
|
"is not mentioned in the description.",
|
|
167
|
-
"enum": [
|
|
168
|
-
|
|
168
|
+
"enum": [
|
|
169
|
+
f"{PipelineType.__name__}__{type.name.lower()}"
|
|
170
|
+
for type in PipelineType]
|
|
169
171
|
},
|
|
170
172
|
ActionType.__name__: {
|
|
171
173
|
"type": "string",
|
mage_ai/ai/openai_client.py
CHANGED
|
@@ -42,16 +42,18 @@ tools = [
|
|
|
42
42
|
"type": "string",
|
|
43
43
|
"description": "Programming language of the code block. "
|
|
44
44
|
f"Default value is {BlockLanguage.__name__}__python.",
|
|
45
|
-
"enum": [
|
|
46
|
-
|
|
45
|
+
"enum": [
|
|
46
|
+
f"{BlockLanguage.__name__}__{type.name.lower()}"
|
|
47
|
+
for type in BlockLanguage]
|
|
47
48
|
},
|
|
48
49
|
PipelineType.__name__: {
|
|
49
50
|
"type": "string",
|
|
50
51
|
"description": "Type of pipeline to build. Default value is "
|
|
51
52
|
f"{PipelineType.__name__}__python if pipeline type "
|
|
52
53
|
"is not mentioned in the description.",
|
|
53
|
-
"enum": [
|
|
54
|
-
|
|
54
|
+
"enum": [
|
|
55
|
+
f"{PipelineType.__name__}__{type.name.lower()}"
|
|
56
|
+
for type in PipelineType]
|
|
55
57
|
},
|
|
56
58
|
ActionType.__name__: {
|
|
57
59
|
"type": "string",
|
|
@@ -85,7 +87,7 @@ class OpenAIClient(AIClient):
|
|
|
85
87
|
open_ai_config.openai_api_key or os.getenv('OPENAI_API_KEY')
|
|
86
88
|
openai.api_key = openai_api_key
|
|
87
89
|
self.llm = OpenAI(openai_api_key=openai_api_key, temperature=0)
|
|
88
|
-
self.openai_client = OpenAILib()
|
|
90
|
+
self.openai_client = OpenAILib(api_key=openai_api_key)
|
|
89
91
|
|
|
90
92
|
def __chat_completion_request(self, messages):
|
|
91
93
|
try:
|
|
@@ -100,6 +100,7 @@ PipelineSchedulePolicy.allow_read(PipelineSchedulePresenter.default_attributes +
|
|
|
100
100
|
PipelineSchedulePolicy.allow_read(PipelineSchedulePresenter.default_attributes + [
|
|
101
101
|
'event_matchers',
|
|
102
102
|
'next_pipeline_run_date',
|
|
103
|
+
'rotate_token',
|
|
103
104
|
'tags',
|
|
104
105
|
], scopes=[
|
|
105
106
|
OauthScope.CLIENT_PRIVATE,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from mage_ai.api.operations import constants
|
|
2
2
|
from mage_ai.api.presenters.BasePresenter import BasePresenter
|
|
3
|
+
from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class PipelineSchedulePresenter(BasePresenter):
|
|
@@ -32,8 +33,6 @@ class PipelineSchedulePresenter(BasePresenter):
|
|
|
32
33
|
])
|
|
33
34
|
data['tags'] = sorted([tag.name for tag in self.get_tag_associations])
|
|
34
35
|
data['next_pipeline_run_date'] = self.model.next_execution_date()
|
|
35
|
-
|
|
36
|
-
return data
|
|
37
36
|
elif 'with_runtime_average' == display_format:
|
|
38
37
|
data = self.model.to_dict()
|
|
39
38
|
data['runtime_average'] = self.model.runtime_average()
|
|
@@ -47,6 +46,16 @@ class PipelineSchedulePresenter(BasePresenter):
|
|
|
47
46
|
else:
|
|
48
47
|
data = self.model.to_dict()
|
|
49
48
|
|
|
49
|
+
if display_format == constants.UPDATE:
|
|
50
|
+
rotate_token = kwargs.get(
|
|
51
|
+
'payload', dict(),
|
|
52
|
+
).get(
|
|
53
|
+
'pipeline_schedule', dict(),
|
|
54
|
+
).get('rotate_token')
|
|
55
|
+
else:
|
|
56
|
+
rotate_token = False
|
|
57
|
+
if HIDE_API_TRIGGER_TOKEN and not rotate_token:
|
|
58
|
+
data['token'] = '[API_TOKEN_PLACEHOLDER]'
|
|
50
59
|
return data
|
|
51
60
|
|
|
52
61
|
|
|
@@ -32,6 +32,14 @@ class GitFileResource(GenericResource):
|
|
|
32
32
|
pass
|
|
33
33
|
|
|
34
34
|
file_path_absolute = os.path.join(git_manager.repo_path, file_path)
|
|
35
|
+
|
|
36
|
+
# Prevent path traversal by resolving the absolute path location
|
|
37
|
+
# and checking if it's within the repo
|
|
38
|
+
if not os.path.abspath(file_path_absolute).startswith(
|
|
39
|
+
os.path.abspath(git_manager.repo_path)
|
|
40
|
+
):
|
|
41
|
+
raise Exception("Access denied: Attempted path traversal")
|
|
42
|
+
|
|
35
43
|
file = File.from_path(file_path_absolute)
|
|
36
44
|
if not file.exists():
|
|
37
45
|
file = File.from_path(file_path_absolute, '')
|
|
@@ -29,7 +29,8 @@ from mage_ai.orchestration.db.models.tags import (
|
|
|
29
29
|
)
|
|
30
30
|
from mage_ai.settings.platform import project_platform_activated
|
|
31
31
|
from mage_ai.settings.repo import get_repo_path
|
|
32
|
-
from mage_ai.
|
|
32
|
+
from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
|
|
33
|
+
from mage_ai.shared.hash import ignore_keys, merge_dict
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
class PipelineScheduleResource(DatabaseResource):
|
|
@@ -157,17 +158,15 @@ class PipelineScheduleResource(DatabaseResource):
|
|
|
157
158
|
),
|
|
158
159
|
func.sum(
|
|
159
160
|
case(
|
|
160
|
-
|
|
161
|
-
(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
)
|
|
170
|
-
],
|
|
161
|
+
(
|
|
162
|
+
PipelineRun.status.in_(
|
|
163
|
+
[
|
|
164
|
+
PipelineRun.PipelineRunStatus.INITIAL,
|
|
165
|
+
PipelineRun.PipelineRunStatus.RUNNING,
|
|
166
|
+
]
|
|
167
|
+
),
|
|
168
|
+
1,
|
|
169
|
+
),
|
|
171
170
|
else_=0,
|
|
172
171
|
)
|
|
173
172
|
).label('in_progress_runs_count'),
|
|
@@ -282,6 +281,7 @@ class PipelineScheduleResource(DatabaseResource):
|
|
|
282
281
|
|
|
283
282
|
@safe_db_query
|
|
284
283
|
def update(self, payload, **kwargs):
|
|
284
|
+
# Update associated event matchers
|
|
285
285
|
arr = payload.pop('event_matchers', None)
|
|
286
286
|
event_matchers = []
|
|
287
287
|
if arr is not None:
|
|
@@ -320,6 +320,7 @@ class PipelineScheduleResource(DatabaseResource):
|
|
|
320
320
|
]
|
|
321
321
|
em.update(pipeline_schedules=ps)
|
|
322
322
|
|
|
323
|
+
# Update associated tags
|
|
323
324
|
tag_names = payload.pop('tags', None)
|
|
324
325
|
if tag_names is not None:
|
|
325
326
|
# 1. Fetch all tag associations
|
|
@@ -408,7 +409,11 @@ class PipelineScheduleResource(DatabaseResource):
|
|
|
408
409
|
|
|
409
410
|
old_name = self.model.name
|
|
410
411
|
|
|
411
|
-
|
|
412
|
+
# Rotate token
|
|
413
|
+
if payload.get('rotate_token'):
|
|
414
|
+
payload['token'] = uuid.uuid4().hex
|
|
415
|
+
|
|
416
|
+
resource = super().update(ignore_keys(payload, ['rotate_token']))
|
|
412
417
|
updated_model = resource.model
|
|
413
418
|
|
|
414
419
|
repo_path = get_repo_path(user=self.current_user)
|
|
@@ -424,9 +429,10 @@ class PipelineScheduleResource(DatabaseResource):
|
|
|
424
429
|
sla=updated_model.sla,
|
|
425
430
|
start_time=updated_model.start_time,
|
|
426
431
|
status=updated_model.status,
|
|
427
|
-
token=updated_model.token,
|
|
428
432
|
variables=updated_model.variables,
|
|
429
433
|
)
|
|
434
|
+
if not HIDE_API_TRIGGER_TOKEN:
|
|
435
|
+
trigger.token = updated_model.token
|
|
430
436
|
|
|
431
437
|
update_only_if_exists = (
|
|
432
438
|
not pipeline.should_save_trigger_in_code_automatically()
|
|
@@ -8,6 +8,7 @@ from mage_ai.data_preparation.models.triggers import (
|
|
|
8
8
|
from mage_ai.orchestration.db import safe_db_query
|
|
9
9
|
from mage_ai.orchestration.db.models.schedules import PipelineSchedule
|
|
10
10
|
from mage_ai.settings.repo import get_repo_path
|
|
11
|
+
from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class PipelineTriggerResource(GenericResource):
|
|
@@ -50,9 +51,10 @@ class PipelineTriggerResource(GenericResource):
|
|
|
50
51
|
sla=pipeline_schedule.sla,
|
|
51
52
|
start_time=pipeline_schedule.start_time,
|
|
52
53
|
status=pipeline_schedule.status,
|
|
53
|
-
token=pipeline_schedule.token,
|
|
54
54
|
variables=pipeline_schedule.variables,
|
|
55
55
|
)
|
|
56
|
+
if not HIDE_API_TRIGGER_TOKEN:
|
|
57
|
+
trigger.token = pipeline_schedule.token
|
|
56
58
|
else:
|
|
57
59
|
trigger = Trigger(**payload)
|
|
58
60
|
|
|
@@ -6,7 +6,7 @@ from mage_ai.authentication.ldap import new_ldap_connection
|
|
|
6
6
|
from mage_ai.authentication.oauth2 import encode_token, generate_access_token
|
|
7
7
|
from mage_ai.authentication.passwords import verify_password
|
|
8
8
|
from mage_ai.authentication.providers.constants import NAME_TO_PROVIDER
|
|
9
|
-
from mage_ai.orchestration.db import safe_db_query
|
|
9
|
+
from mage_ai.orchestration.db import safe_db_query, safe_db_query_async
|
|
10
10
|
from mage_ai.orchestration.db.models.oauth import Role, User
|
|
11
11
|
from mage_ai.settings import (
|
|
12
12
|
AUTHENTICATION_MODE,
|
|
@@ -20,7 +20,7 @@ from mage_ai.usage_statistics.logger import UsageStatisticLogger
|
|
|
20
20
|
|
|
21
21
|
class SessionResource(BaseResource):
|
|
22
22
|
@classmethod
|
|
23
|
-
@
|
|
23
|
+
@safe_db_query_async
|
|
24
24
|
async def create(self, payload, _, **kwargs):
|
|
25
25
|
email = payload.get('email')
|
|
26
26
|
password = payload.get('password')
|
|
@@ -163,7 +163,7 @@ class SyncResource(GenericResource):
|
|
|
163
163
|
access_token = user_payload.pop('access_token', None)
|
|
164
164
|
if access_token:
|
|
165
165
|
secret_name = get_access_token_secret_name(user=user)
|
|
166
|
-
secret = Secret.
|
|
166
|
+
secret = Secret.repo_query.filter(Secret.name == secret_name).one_or_none()
|
|
167
167
|
if secret:
|
|
168
168
|
secret.delete()
|
|
169
169
|
create_secret(secret_name, access_token, repo_name=repo_name)
|
mage_ai/cli/main.py
CHANGED
|
@@ -194,7 +194,11 @@ def run(
|
|
|
194
194
|
from mage_ai.orchestration.db.models.schedules import PipelineRun
|
|
195
195
|
from mage_ai.orchestration.utils.git import log_git_sync, run_git_sync
|
|
196
196
|
from mage_ai.server.logger import Logger
|
|
197
|
-
from mage_ai.settings import
|
|
197
|
+
from mage_ai.settings import (
|
|
198
|
+
SENTRY_DSN,
|
|
199
|
+
SENTRY_SERVER_NAME,
|
|
200
|
+
SENTRY_TRACES_SAMPLE_RATE,
|
|
201
|
+
)
|
|
198
202
|
from mage_ai.shared.hash import merge_dict
|
|
199
203
|
|
|
200
204
|
logger = Logger().new_server_logger(__name__)
|
|
@@ -204,7 +208,10 @@ def run(
|
|
|
204
208
|
sentry_sdk.init(
|
|
205
209
|
sentry_dsn,
|
|
206
210
|
traces_sample_rate=SENTRY_TRACES_SAMPLE_RATE,
|
|
211
|
+
server_name=SENTRY_SERVER_NAME,
|
|
207
212
|
)
|
|
213
|
+
import atexit
|
|
214
|
+
atexit.register(lambda: sentry_sdk.flush(timeout=5))
|
|
208
215
|
(enable_new_relic, application) = initialize_new_relic()
|
|
209
216
|
|
|
210
217
|
with (
|
|
@@ -312,7 +312,7 @@ def build_overview_data(
|
|
|
312
312
|
increment(f"{DD_KEY}.build_overview_time_series.succeeded", tags)
|
|
313
313
|
|
|
314
314
|
"""
|
|
315
|
-
Build sample data for scatter plot. Sample data
|
|
315
|
+
Build sample data for scatter plot. Sample data consists of two parts:
|
|
316
316
|
1. Numeric features
|
|
317
317
|
2. Low cardinality categorical features
|
|
318
318
|
"""
|
|
@@ -224,7 +224,7 @@ class ReformatDateSubRule(ReformatValuesSubRule):
|
|
|
224
224
|
1. If column is not of dtype category or text, no suggestion
|
|
225
225
|
2. If column does not contain string types, no suggestion
|
|
226
226
|
3. Try use Pandas datetime parse to convert from string to datetime.
|
|
227
|
-
If more than DATE_MATCHES_LB entries are
|
|
227
|
+
If more than DATE_MATCHES_LB entries are successfully converted, suggest
|
|
228
228
|
conversion to datetime type
|
|
229
229
|
"""
|
|
230
230
|
dtype = self.column_types[column]
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
DESTINATIONS = [
|
|
2
|
+
dict(name='Airtable'),
|
|
2
3
|
dict(name='Amazon S3'),
|
|
3
4
|
dict(name='BigQuery'),
|
|
4
5
|
dict(name='Clickhouse'),
|
|
5
6
|
dict(name='Delta Lake Azure'),
|
|
6
7
|
dict(name='Delta Lake S3'),
|
|
8
|
+
dict(name='Doris'),
|
|
7
9
|
dict(name='Elasticsearch'),
|
|
8
10
|
dict(name='Google Cloud Storage'),
|
|
9
11
|
dict(name='Kafka'),
|
|
@@ -20,5 +22,6 @@ DESTINATIONS = [
|
|
|
20
22
|
dict(name='Redshift'),
|
|
21
23
|
dict(name='Salesforce'),
|
|
22
24
|
dict(name='Snowflake'),
|
|
25
|
+
dict(name='Teradata'),
|
|
23
26
|
dict(name='Trino'),
|
|
24
27
|
]
|
|
@@ -3,6 +3,7 @@ from mage_ai.shared.hash import index_by
|
|
|
3
3
|
|
|
4
4
|
SQL_SOURCES = [
|
|
5
5
|
dict(name='BigQuery'),
|
|
6
|
+
dict(name='Doris'),
|
|
6
7
|
dict(
|
|
7
8
|
name='Microsoft SQL Server',
|
|
8
9
|
uuid='mssql',
|
|
@@ -53,6 +54,7 @@ SOURCES = sorted([
|
|
|
53
54
|
dict(name='Sftp'),
|
|
54
55
|
dict(name='Stripe'),
|
|
55
56
|
dict(name='Tableau'),
|
|
57
|
+
dict(name='Teradata'),
|
|
56
58
|
dict(name='Twitter Ads'),
|
|
57
59
|
dict(name='Zendesk'),
|
|
58
60
|
] + SQL_SOURCES, key=lambda x: x['name'])
|
|
@@ -693,7 +693,7 @@ class BlockExecutor:
|
|
|
693
693
|
),
|
|
694
694
|
tags=tags,
|
|
695
695
|
)
|
|
696
|
-
self.
|
|
696
|
+
self.execute_callback(
|
|
697
697
|
'on_failure',
|
|
698
698
|
block_run_id=block_run_id,
|
|
699
699
|
callback_kwargs=dict(__error=error, retry=self.retry_metadata),
|
|
@@ -748,7 +748,7 @@ class BlockExecutor:
|
|
|
748
748
|
# success callback because this isn’t the last data integration block that needs
|
|
749
749
|
# to run.
|
|
750
750
|
if not data_integration_metadata or is_original_block:
|
|
751
|
-
self.
|
|
751
|
+
self.execute_callback(
|
|
752
752
|
'on_success',
|
|
753
753
|
block_run_id=block_run_id,
|
|
754
754
|
callback_kwargs=dict(retry=self.retry_metadata),
|
|
@@ -1253,7 +1253,7 @@ class BlockExecutor:
|
|
|
1253
1253
|
|
|
1254
1254
|
return result
|
|
1255
1255
|
|
|
1256
|
-
def
|
|
1256
|
+
def execute_callback(
|
|
1257
1257
|
self,
|
|
1258
1258
|
callback: str,
|
|
1259
1259
|
global_vars: Dict,
|
|
@@ -1275,6 +1275,11 @@ class BlockExecutor:
|
|
|
1275
1275
|
dynamic_block_index: Index of the dynamic block.
|
|
1276
1276
|
dynamic_upstream_block_uuids: List of UUIDs of the dynamic upstream blocks.
|
|
1277
1277
|
"""
|
|
1278
|
+
if logging_tags is None:
|
|
1279
|
+
logging_tags = self.build_tags(
|
|
1280
|
+
block_run_id=block_run_id,
|
|
1281
|
+
pipeline_run_id=pipeline_run.id if pipeline_run is not None else None,
|
|
1282
|
+
)
|
|
1278
1283
|
upstream_block_uuids_override = []
|
|
1279
1284
|
if is_dynamic_block_child(self.block):
|
|
1280
1285
|
if not self.block_run and block_run_id:
|
|
@@ -10,10 +10,13 @@ from mage_ai.data_preparation.logging.logger import DictLogger
|
|
|
10
10
|
from mage_ai.data_preparation.logging.logger_manager_factory import LoggerManagerFactory
|
|
11
11
|
from mage_ai.data_preparation.models.pipeline import Pipeline
|
|
12
12
|
from mage_ai.orchestration.db.models.schedules import BlockRun, PipelineRun
|
|
13
|
+
from mage_ai.server.logger import Logger
|
|
13
14
|
from mage_ai.shared.hash import merge_dict
|
|
14
15
|
from mage_ai.usage_statistics.constants import EventNameType, EventObjectType
|
|
15
16
|
from mage_ai.usage_statistics.logger import UsageStatisticLogger
|
|
16
17
|
|
|
18
|
+
logger = Logger().new_server_logger(__name__)
|
|
19
|
+
|
|
17
20
|
|
|
18
21
|
class PipelineExecutor:
|
|
19
22
|
def __init__(self, pipeline: Pipeline, execution_partition: str = None):
|
|
@@ -53,25 +56,38 @@ class PipelineExecutor:
|
|
|
53
56
|
update_status (bool): Whether to update the execution status.
|
|
54
57
|
**kwargs: Additional keyword arguments.
|
|
55
58
|
"""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
59
|
+
# Create the async task to execute
|
|
60
|
+
async def _execute_task():
|
|
61
|
+
if pipeline_run_id is None:
|
|
62
|
+
# Execute the pipeline without block runs
|
|
63
|
+
await self.pipeline.execute(
|
|
64
|
+
analyze_outputs=analyze_outputs,
|
|
65
|
+
global_vars=global_vars,
|
|
66
|
+
run_sensors=run_sensors,
|
|
67
|
+
run_tests=run_tests,
|
|
68
|
+
update_status=update_status,
|
|
69
|
+
)
|
|
70
|
+
else:
|
|
71
|
+
# Supported pipeline types: Standard batch pipeline
|
|
72
|
+
pipeline_run = PipelineRun.query.get(pipeline_run_id)
|
|
73
|
+
if pipeline_run.status != PipelineRun.PipelineRunStatus.RUNNING:
|
|
74
|
+
return
|
|
75
|
+
await self.__run_blocks(
|
|
76
|
+
pipeline_run,
|
|
77
|
+
allow_blocks_to_fail=allow_blocks_to_fail,
|
|
78
|
+
global_vars=global_vars,
|
|
79
|
+
)
|
|
80
|
+
# Execute the task based on current context
|
|
81
|
+
try:
|
|
82
|
+
loop = asyncio.get_running_loop()
|
|
83
|
+
logger.info(f'[PipelineExecutor] Found running loop {loop}')
|
|
84
|
+
# We're in an async context, use create_task
|
|
85
|
+
task = asyncio.create_task(_execute_task())
|
|
86
|
+
loop.run_until_complete(task)
|
|
87
|
+
except RuntimeError:
|
|
88
|
+
# No running loop, safe to use asyncio.run
|
|
89
|
+
logger.info('[PipelineExecutor] No running loop, using asyncio.run')
|
|
90
|
+
asyncio.run(_execute_task())
|
|
75
91
|
|
|
76
92
|
self.logger_manager.output_logs_to_destination()
|
|
77
93
|
|
|
@@ -215,7 +215,7 @@ def check_connection(git, remote_url: str) -> None:
|
|
|
215
215
|
|
|
216
216
|
|
|
217
217
|
async def check_connection_async(git, remote_name: str) -> None:
|
|
218
|
-
proc = git.ls_remote(remote_name, as_process=True)
|
|
218
|
+
proc = git.ls_remote(remote_name, 'HEAD', as_process=True)
|
|
219
219
|
|
|
220
220
|
await poll_process_with_timeout(
|
|
221
221
|
proc,
|
|
@@ -228,7 +228,7 @@ async def check_connection_async(git, remote_name: str) -> None:
|
|
|
228
228
|
|
|
229
229
|
|
|
230
230
|
async def validate_authentication_for_remote_url(git, remote_url: str) -> None:
|
|
231
|
-
proc = git.ls_remote(remote_url, as_process=True)
|
|
231
|
+
proc = git.ls_remote(remote_url, 'HEAD', as_process=True)
|
|
232
232
|
|
|
233
233
|
await poll_process_with_timeout(
|
|
234
234
|
proc,
|
|
@@ -3,6 +3,7 @@ import io
|
|
|
3
3
|
import logging
|
|
4
4
|
import logging.handlers
|
|
5
5
|
import os
|
|
6
|
+
import traceback
|
|
6
7
|
from datetime import datetime
|
|
7
8
|
from typing import Callable, Dict, List
|
|
8
9
|
|
|
@@ -107,6 +108,18 @@ class LoggerManager:
|
|
|
107
108
|
|
|
108
109
|
self.storage = LocalStorage()
|
|
109
110
|
|
|
111
|
+
def __del__(self):
|
|
112
|
+
"""
|
|
113
|
+
Close the log file if the logger uses the file handler.
|
|
114
|
+
"""
|
|
115
|
+
for handler in list(self.logger.handlers):
|
|
116
|
+
try:
|
|
117
|
+
if isinstance(handler, (logging.FileHandler, logging.handlers.RotatingFileHandler)):
|
|
118
|
+
self.logger.removeHandler(handler)
|
|
119
|
+
handler.close()
|
|
120
|
+
except Exception:
|
|
121
|
+
traceback.print_exc()
|
|
122
|
+
|
|
110
123
|
def create_stream_handler(self):
|
|
111
124
|
"""
|
|
112
125
|
Create a stream handler to output logs to a stream (e.g., in-memory buffer).
|
|
@@ -139,15 +152,31 @@ class LoggerManager:
|
|
|
139
152
|
str_to_timedelta(log_retention_period)).strftime(
|
|
140
153
|
format='%Y%m%dT%H%M%S')
|
|
141
154
|
|
|
155
|
+
from mage_ai.data_preparation.models.constants import PipelineType
|
|
156
|
+
from mage_ai.data_preparation.models.pipeline import Pipeline
|
|
142
157
|
if self.pipeline_uuid is None:
|
|
143
|
-
from mage_ai.data_preparation.models.pipeline import Pipeline
|
|
144
|
-
|
|
145
158
|
pipeline_uuids = Pipeline.get_all_pipelines(self.repo_path)
|
|
146
159
|
else:
|
|
147
160
|
pipeline_uuids = [self.pipeline_uuid]
|
|
148
161
|
|
|
149
162
|
for pipeline_uuid in pipeline_uuids:
|
|
150
163
|
print(f'Removing old logs from pipeline {pipeline_uuid}')
|
|
164
|
+
# Skip cleaning up logs for streaming pipelines
|
|
165
|
+
skip_clean_up_logs = False
|
|
166
|
+
try:
|
|
167
|
+
p = Pipeline.get(pipeline_uuid)
|
|
168
|
+
if p.type == PipelineType.STREAMING:
|
|
169
|
+
print(f'Pipeline {pipeline_uuid} is a Streaming pipeline. '
|
|
170
|
+
'Skip cleaning up logs.')
|
|
171
|
+
skip_clean_up_logs = True
|
|
172
|
+
except Exception as e:
|
|
173
|
+
print(f'Fail to load pipeline {pipeline_uuid} due to error {e}. '
|
|
174
|
+
'Skip cleaning up logs.')
|
|
175
|
+
skip_clean_up_logs = True
|
|
176
|
+
|
|
177
|
+
if skip_clean_up_logs:
|
|
178
|
+
continue
|
|
179
|
+
|
|
151
180
|
pipeline_log_path = self.get_log_filepath_prefix(pipeline_uuid=pipeline_uuid)
|
|
152
181
|
dirs = self.storage.listdir(pipeline_log_path)
|
|
153
182
|
for dirname in dirs:
|
|
@@ -878,7 +878,7 @@ class Block(
|
|
|
878
878
|
relative_path: bool = False,
|
|
879
879
|
) -> str:
|
|
880
880
|
file_extension = BLOCK_LANGUAGE_TO_FILE_EXTENSION[language]
|
|
881
|
-
block_directory = block_type
|
|
881
|
+
block_directory = f'{block_type}s' if block_type != BlockType.CUSTOM else block_type
|
|
882
882
|
|
|
883
883
|
parts = []
|
|
884
884
|
if not relative_path:
|
|
@@ -1010,7 +1010,7 @@ class Block(
|
|
|
1010
1010
|
self,
|
|
1011
1011
|
content: str,
|
|
1012
1012
|
) -> str:
|
|
1013
|
-
return '@
|
|
1013
|
+
return f'@{self.type}\n{content}'
|
|
1014
1014
|
|
|
1015
1015
|
@classmethod
|
|
1016
1016
|
def after_create(cls, block: 'Block', **kwargs) -> None:
|
|
@@ -1199,7 +1199,7 @@ class Block(
|
|
|
1199
1199
|
|
|
1200
1200
|
@classmethod
|
|
1201
1201
|
def file_directory_name(self, block_type: BlockType) -> str:
|
|
1202
|
-
return block_type
|
|
1202
|
+
return f'{block_type}s' if block_type != BlockType.CUSTOM else block_type
|
|
1203
1203
|
|
|
1204
1204
|
@classmethod
|
|
1205
1205
|
def block_type_from_path(
|
|
@@ -1218,7 +1218,7 @@ class Block(
|
|
|
1218
1218
|
for block_type in BlockType:
|
|
1219
1219
|
if BlockType.CUSTOM == block_type and dir_name == block_type:
|
|
1220
1220
|
return BlockType.CUSTOM
|
|
1221
|
-
elif dir_name == block_type
|
|
1221
|
+
elif dir_name == f'{block_type}s':
|
|
1222
1222
|
return block_type
|
|
1223
1223
|
|
|
1224
1224
|
@classmethod
|
|
@@ -3941,7 +3941,6 @@ class Block(
|
|
|
3941
3941
|
for v in b.output_variables(execution_partition=execution_partition):
|
|
3942
3942
|
objs.append(
|
|
3943
3943
|
self.get_variable_object(
|
|
3944
|
-
self.pipeline_uuid,
|
|
3945
3944
|
b.uuid,
|
|
3946
3945
|
v,
|
|
3947
3946
|
partition=execution_partition,
|
|
@@ -4465,29 +4464,36 @@ class CallbackBlock(AddonBlock):
|
|
|
4465
4464
|
elif 'on_success' == callback:
|
|
4466
4465
|
callback_functions_legacy = success_functions
|
|
4467
4466
|
callback_status = CallbackStatus.SUCCESS
|
|
4467
|
+
elif 'on_cancelled' == callback:
|
|
4468
|
+
callback_functions_legacy = []
|
|
4469
|
+
callback_status = CallbackStatus.CANCELLED
|
|
4468
4470
|
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4480
|
-
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4490
|
-
|
|
4471
|
+
if callback_status in [CallbackStatus.FAILURE, CallbackStatus.SUCCESS]:
|
|
4472
|
+
# Fetch input variables
|
|
4473
|
+
input_vars, kwargs_vars, upstream_block_uuids = self.fetch_input_variables(
|
|
4474
|
+
None,
|
|
4475
|
+
dynamic_block_index=dynamic_block_index,
|
|
4476
|
+
dynamic_block_indexes=dynamic_block_indexes,
|
|
4477
|
+
dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
|
|
4478
|
+
execution_partition=execution_partition,
|
|
4479
|
+
from_notebook=from_notebook,
|
|
4480
|
+
global_vars=global_vars,
|
|
4481
|
+
metadata=metadata,
|
|
4482
|
+
upstream_block_uuids=[parent_block.uuid] if parent_block else None,
|
|
4483
|
+
upstream_block_uuids_override=upstream_block_uuids_override,
|
|
4484
|
+
)
|
|
4485
|
+
# Copied logic from the method self.execute_block
|
|
4486
|
+
outputs_from_input_vars = {}
|
|
4487
|
+
upstream_block_uuids_length = len(upstream_block_uuids)
|
|
4488
|
+
for idx, input_var in enumerate(input_vars):
|
|
4489
|
+
if idx < upstream_block_uuids_length:
|
|
4490
|
+
upstream_block_uuid = upstream_block_uuids[idx]
|
|
4491
|
+
outputs_from_input_vars[upstream_block_uuid] = input_var
|
|
4492
|
+
outputs_from_input_vars[f'df_{idx + 1}'] = input_var
|
|
4493
|
+
else:
|
|
4494
|
+
input_vars = []
|
|
4495
|
+
kwargs_vars = []
|
|
4496
|
+
upstream_block_uuids = []
|
|
4491
4497
|
|
|
4492
4498
|
global_vars_copy = global_vars.copy()
|
|
4493
4499
|
for kwargs_var in kwargs_vars:
|