From 36a986d36a43d99d809657ef274ecc33ea3bd47a Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Fri, 14 Mar 2025 12:36:32 +0100 Subject: [PATCH] Move airflow sources to airflow-core package This is continuation of the separation of the Airflow codebase into separate distributions. This one splits airflow into two of them: * apache-airflow - becomes an empty, meta no-code distribution that only has dependencies to apache-airflow-core and task-sdk distributions and it has preinstalled provider distributions added in standard "wheel" distribution. All "extras" lead either to "apache-airflow-core" extras or to providers - the dependencies and optional dependencies are calculated differently depending on "editable" or "standard" mode - in editable mode, just provider dependencies are installed for preinstalled providers in standard mode - those preinstalled providers are dependencies. * the apache-airflow-core distribution contains all airflow core sources (previously in apache-airflow) and it has no provider extras. Thanks to that apache-airflow distribution does not have any dynamically calculated dependencies. * the apache-airflow-core distribution hs "hatch_build_airflow_core.py" build hooks that add custom build target and implement custom cleanup in order to implement compiling assets as part of the build. * During the move, the following changes were applied for consistency: * packages when used in context of distribution packages have been renamed to "distributions" - including all documentations and commands in breeze to void confusion with import packages (see https://packaging.python.org/en/latest/discussions/distribution-package-vs-import-package/) * all tests in `airflow-core` follow now the same convention where tests are in `unit`, `system` and `integration` package. no extra package has been as second level, because all the provider tests have "" there, so we just have to avoid naming airflow unit."" with the same name as provider. * all tooling in CI/DEV have been updated to follow the new structure. We should always build to packages now when we are building them using `breeze`. --- .dockerignore | 13 +- .github/CODEOWNERS | 2 +- .github/ISSUE_TEMPLATE/airflow_bug_report.yml | 2 +- .../airflow_doc_issue_report.yml | 2 +- .../airflow_helmchart_bug_report.yml | 2 +- .../airflow_providers_bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/SECURITY.md | 2 +- .github/actions/breeze/action.yml | 4 +- .github/boring-cyborg.yml | 109 ++-- .../workflows/additional-ci-image-checks.yml | 2 +- .../workflows/additional-prod-image-tests.yml | 6 +- .github/workflows/basic-tests.yml | 21 +- .github/workflows/ci-image-checks.yml | 2 +- .github/workflows/ci.yml | 6 +- .github/workflows/generate-constraints.yml | 8 +- .../workflows/integration-system-tests.yml | 2 +- .github/workflows/prod-image-build.yml | 36 +- .github/workflows/prod-image-extra-checks.yml | 8 +- .github/workflows/push-image-cache.yml | 4 +- .github/workflows/release_dockerhub_image.yml | 8 +- .github/workflows/task-sdk-tests.yml | 2 +- ...ovider-packages.yml => test-providers.yml} | 64 +- .gitignore | 11 +- .pre-commit-config.yaml | 207 ++++--- .rat-excludes | 6 +- COMMITTERS.rst | 2 +- Dockerfile | 91 +-- Dockerfile.ci | 22 +- INSTALL | 27 +- LICENSE | 51 -- PROVIDERS.rst | 2 +- README.md | 18 +- .../3rd-party-licenses}/LICENSE-bootstrap.txt | 0 .../LICENSE-bootstrap3-typeahead.txt | 0 .../3rd-party-licenses}/LICENSE-d3-shape.txt | 0 .../3rd-party-licenses}/LICENSE-d3-tip.txt | 0 .../3rd-party-licenses}/LICENSE-d3js.txt | 0 .../3rd-party-licenses}/LICENSE-dagre-d3.txt | 0 .../LICENSE-datatables.txt | 0 .../LICENSE-elasticmock.txt | 0 ...ENSE-eonasdan-bootstrap-datetimepicker.txt | 0 .../LICENSE-flask-kerberos.txt | 0 .../3rd-party-licenses}/LICENSE-hue.txt | 0 .../3rd-party-licenses}/LICENSE-jqclock.txt | 0 .../3rd-party-licenses}/LICENSE-jquery.txt | 0 .../3rd-party-licenses}/LICENSE-moment.txt | 0 .../3rd-party-licenses}/LICENSE-normalize.txt | 0 .../LICENSE-pytest-capture-warnings.txt | 0 .../LICENSE-reproducible.txt | 0 airflow-core/LICENSE | 252 ++++++++ NOTICE => airflow-core/NOTICE | 0 airflow-core/README.md | 21 + .../docs}/.gitignore | 0 .../cluster-policies.rst | 10 +- .../dag-serialization.rst | 0 .../dagfile-processing.rst | 0 .../administration-and-deployment/index.rst | 0 .../kubernetes.rst | 0 .../administration-and-deployment/lineage.rst | 0 .../listeners.rst | 12 +- .../advanced-logging-configuration.rst | 0 .../logging-monitoring/callbacks.rst | 0 .../logging-monitoring/check-health.rst | 0 .../logging-monitoring/errors.rst | 0 .../logging-monitoring/index.rst | 0 .../logging-architecture.rst | 0 .../logging-monitoring/logging-tasks.rst | 0 .../logging-monitoring/metrics.rst | 0 .../logging-monitoring/traces.rst | 0 .../tracking-user-activity.rst | 0 .../modules_management.rst | 0 .../administration-and-deployment/plugins.rst | 0 .../administration-and-deployment/pools.rst | 0 .../priority-weight.rst | 4 +- .../production-deployment.rst | 0 .../scheduler.rst | 0 .../web-stack.rst | 0 .../authoring-and-scheduling/connections.rst | 0 .../docs}/authoring-and-scheduling/cron.rst | 0 .../authoring-and-scheduling/datasets.rst | 0 .../authoring-and-scheduling/deferring.rst | 0 .../dynamic-task-mapping.rst | 4 +- .../event-scheduling.rst | 0 .../docs}/authoring-and-scheduling/index.rst | 0 .../authoring-and-scheduling/serializers.rst | 0 .../authoring-and-scheduling/timetable.rst | 0 .../authoring-and-scheduling/timezone.rst | 0 .../docs}/best-practices.rst | 0 .../docs}/cli-and-env-variables-ref.rst | 0 .../docs}/configurations-ref.rst | 2 +- .../core-concepts/auth-manager/index.rst | 0 .../core-concepts/auth-manager/simple.rst | 0 .../docs}/core-concepts/backfill.rst | 0 .../docs}/core-concepts/dag-run.rst | 0 .../docs}/core-concepts/dags.rst | 6 +- .../docs}/core-concepts/debug.rst | 0 .../docs}/core-concepts/executor/index.rst | 0 .../docs}/core-concepts/executor/local.rst | 0 .../core-concepts/executor/sequential.rst | 0 .../docs}/core-concepts/index.rst | 0 .../docs}/core-concepts/objectstorage.rst | 0 .../docs}/core-concepts/operators.rst | 2 +- .../docs}/core-concepts/overview.rst | 0 .../docs}/core-concepts/params.rst | 8 +- .../docs}/core-concepts/sensors.rst | 0 .../docs}/core-concepts/taskflow.rst | 0 .../docs}/core-concepts/tasks.rst | 0 .../docs}/core-concepts/variables.rst | 0 .../docs}/core-concepts/xcoms.rst | 0 .../docs}/database-erd-ref.rst | 0 .../docs}/empty_plugin/README.md | 0 .../docs}/empty_plugin/empty_plugin.py | 0 .../templates/empty_plugin/index.html | 0 .../docs}/extra-packages-ref.rst | 2 +- .../docs}/faq.rst | 0 .../docs}/howto/add-dag-tags.rst | 0 .../docs}/howto/add-owner-links.rst | 0 .../docs}/howto/connection.rst | 4 +- .../docs}/howto/create-custom-decorator.rst | 4 +- .../docs}/howto/custom-operator.rst | 0 .../docs}/howto/custom-view-plugin.rst | 0 .../docs}/howto/customize-ui.rst | 0 .../docs}/howto/define-extra-link.rst | 0 .../docs}/howto/docker-compose/airflow.sh | 0 .../howto/docker-compose/docker-compose.yaml | 2 +- .../docs}/howto/docker-compose/index.rst | 0 .../docs}/howto/dynamic-dag-generation.rst | 0 .../docs}/howto/email-config.rst | 0 .../docs}/howto/export-more-env-vars.rst | 0 .../docs}/howto/index.rst | 0 .../docs}/howto/listener-plugin.rst | 4 +- .../docs}/howto/notifications.rst | 0 .../docs}/howto/operator/index.rst | 0 .../docs}/howto/run-behind-proxy.rst | 0 .../docs}/howto/run-with-systemd.rst | 0 .../docs}/howto/set-config.rst | 0 .../docs}/howto/set-up-database.rst | 2 +- .../docs}/howto/setup-and-teardown.rst | 0 .../docs}/howto/timetable.rst | 6 +- .../docs}/howto/upgrading-from-1-10/index.rst | 8 +- .../upgrading-from-1-10/upgrade-check.rst | 0 .../docs}/howto/usage-cli.rst | 0 .../docs}/howto/variable.rst | 0 .../docs}/img/add-dag-tags.png | Bin .../img/add_container_python_interpreter.png | Bin airflow-core/docs/img/airflow_erd.sha256 | 1 + .../docs}/img/airflow_erd.svg | 0 .../docs}/img/apache.jpg | Bin .../docs}/img/arch-diag-logging.png | Bin .../docs}/img/asset-scheduled-dags.png | Bin .../docs}/img/assets.png | Bin .../docs}/img/audit_log.png | Bin .../img/aws-web-identity-federation-gcp.png | Bin .../docs}/img/basic-dag.png | Bin .../docs}/img/branch_note.png | Bin .../docs}/img/branch_with_trigger.png | Bin .../docs}/img/branch_without_trigger.png | Bin .../docs}/img/calendar.png | Bin .../default_instance_name_configuration.png | Bin .../example_instance_name_configuration.png | Bin .../img/change-ui-colors/dags-page-new.png | Bin .../img/change-ui-colors/dags-page-old.png | Bin .../img/change-ui-colors/graph-view-new.png | Bin .../img/change-ui-colors/graph-view-old.png | Bin .../img/change-ui-colors/tree-view-new.png | Bin .../img/change-ui-colors/tree-view-old.png | Bin .../docs}/img/cli_completion.gif | Bin .../docs}/img/cluster_activity.png | Bin .../docs}/img/code.png | Bin .../docs}/img/connection_create.png | Bin .../docs}/img/connection_edit.png | Bin .../docs}/img/dag_doc.png | Bin .../docs}/img/dag_file_processing_diagram.png | Bin .../docs}/img/dag_serialization.png | Bin .../docs}/img/dags.png | Bin .../docs}/img/demo_graph_view.png | Bin .../docs}/img/demo_grid_view.png | Bin ...m_auth_manager_airflow_architecture.md5sum | 0 ...gram_auth_manager_airflow_architecture.png | Bin ...agram_auth_manager_airflow_architecture.py | 0 .../diagram_basic_airflow_architecture.md5sum | 0 .../diagram_basic_airflow_architecture.png | Bin .../img/diagram_basic_airflow_architecture.py | 0 ..._dag_processor_airflow_architecture.md5sum | 0 ...ram_dag_processor_airflow_architecture.png | Bin ...gram_dag_processor_airflow_architecture.py | 0 ...am_distributed_airflow_architecture.md5sum | 0 ...agram_distributed_airflow_architecture.png | Bin ...iagram_distributed_airflow_architecture.py | 0 ..._fab_auth_manager_airflow_architecture.png | Bin ...ram_multi_team_airflow_architecture.md5sum | 0 ...iagram_multi_team_airflow_architecture.png | Bin ...diagram_multi_team_airflow_architecture.py | 0 .../diagram_multitenant_architecture.md5sum | 0 .../docs}/img/diagram_task_lifecycle.md5sum | 0 .../docs}/img/diagram_task_lifecycle.png | Bin .../docs}/img/diagram_task_lifecycle.py | 0 .../docs}/img/docker-compose-pycharm.png | Bin .../docs}/img/duration.png | Bin .../docs}/img/edge_label_example.png | Bin .../docs}/img/email_connection.png | Bin .../docs}/img/example_passing_conf.png | Bin .../docs}/img/gantt.png | Bin .../docs}/img/graph.png | Bin .../docs}/img/grid.png | Bin .../docs}/img/grid_instance_details.png | Bin .../docs}/img/grid_mapped_task.png | Bin .../docs}/img/grid_run_details.png | Bin .../docs}/img/grid_task_details.png | Bin .../docs}/img/grid_task_group.png | Bin .../docs}/img/howto-owner-links.gif | Bin .../docs}/img/landing_times.png | Bin .../docs}/img/latest_only_with_trigger.png | Bin .../logos/airflow_64x64_emoji_transparent.png | Bin .../docs}/img/logos/airflow_dark_bg.png | Bin .../docs}/img/logos/airflow_transparent.png | Bin .../docs}/img/logos/airflow_white_bg.png | Bin .../logos/github_repository_social_image.png | Bin .../docs}/img/logos/wordmark_1.png | Bin .../docs}/img/logos/wordmark_1.svg | 0 .../docs}/img/logos/wordmark_2.png | Bin .../docs}/img/logos/wordmark_2.svg | 0 .../docs}/img/mapping-simple-graph.png | Bin .../docs}/img/mapping-simple-grid.png | Bin .../docs}/img/operator_extra_link.png | Bin .../img/run_task_on_celery_executor.puml | 0 .../docs}/img/run_types.png | Bin .../docs}/img/setup-teardown-complex.png | Bin .../docs}/img/setup-teardown-group.png | Bin .../docs}/img/setup-teardown-nesting.png | Bin .../docs}/img/setup-teardown-parallel.png | Bin .../docs}/img/setup-teardown-scope.png | Bin .../docs}/img/setup-teardown-setup-group.png | Bin .../docs}/img/setup-teardown-simple.png | Bin .../docs}/img/task_doc.png | Bin .../docs}/img/task_group.gif | Bin .../docs}/img/task_instance_history.png | Bin .../docs}/img/task_instance_history_log.png | Bin .../docs/img/task_lifecycle_diagram.png | Bin 0 -> 32164 bytes .../img/template_field_renderer_path.png | Bin .../docs}/img/trigger-dag-tutorial-form-1.png | Bin .../docs}/img/trigger-dag-tutorial-form-2.png | Bin .../docs}/img/trigger-dag-tutorial-form-3.png | Bin .../docs}/img/trigger-dag-tutorial-form-4.png | Bin .../docs}/img/tutorial-pipeline-1.png | Bin .../docs}/img/tutorial-pipeline-2.png | Bin .../docs}/img/ui-alert-message.png | Bin .../docs}/img/ui-timezone-chooser.png | Bin .../docs}/img/usage_cli_export.png | Bin .../docs}/img/usage_cli_imgcat.png | Bin .../docs}/img/variable_hidden.png | Bin .../docs}/img/watcher.png | Bin .../docs}/index.rst | 7 - .../docs}/installation/dependencies.rst | 18 +- .../docs}/installation/index.rst | 0 .../installation/installing-from-pypi.rst | 2 +- .../installation/installing-from-sources.rst | 8 +- .../docs}/installation/prerequisites.rst | 0 .../installation/setting-up-the-database.rst | 0 .../docs}/installation/supported-versions.rst | 0 .../docs}/installation/upgrading.rst | 0 .../docs}/integration.rst | 0 .../docs}/license.rst | 0 .../docs}/migrations-ref.rst | 0 .../docs}/operators-and-hooks-ref.rst | 0 .../docs}/privacy_notice.rst | 0 .../docs}/project.rst | 0 .../docs}/public-airflow-interface.rst | 6 +- .../docs}/redirects.txt | 0 .../docs}/release-process.rst | 4 +- .../docs}/release_notes.rst | 0 .../docs}/security/api.rst | 0 .../docs}/security/audit_logs.rst | 0 .../docs}/security/flower.rst | 0 .../docs}/security/index.rst | 0 .../docs}/security/kerberos.rst | 0 .../security/releasing_security_patches.rst | 0 .../docs}/security/sbom.rst | 0 .../docs}/security/secrets/fernet.rst | 0 .../docs}/security/secrets/index.rst | 0 .../secrets/mask-sensitive-values.rst | 0 .../secrets/secrets-backend/index.rst | 0 .../local-filesystem-secrets-backend.rst | 0 .../docs}/security/security_model.rst | 0 .../docs}/security/webserver.rst | 0 .../docs}/security/workload.rst | 0 .../docs}/stable-rest-api-ref.rst | 0 .../docs}/start.rst | 0 .../docs}/static/exampleinclude.css | 0 .../docs}/static/gh-jira-links.js | 0 .../docs}/static/redirects.js | 0 .../docs}/templates-ref.rst | 0 .../docs}/templates/footer.html | 0 .../docs}/troubleshooting.rst | 0 .../docs}/tutorial/fundamentals.rst | 16 +- .../docs}/tutorial/index.rst | 0 .../docs}/tutorial/objectstorage.rst | 8 +- .../docs}/tutorial/pipeline.rst | 4 +- .../docs}/tutorial/pipeline_example.csv | 2 +- .../docs}/tutorial/taskflow.rst | 30 +- .../docs}/ui.rst | 0 airflow-core/hatch_build_airflow_core.py | 120 ++++ airflow-core/pyproject.toml | 307 ++++++++++ .../src/airflow}/METRICS.md | 0 .../src/airflow}/__init__.py | 0 .../src/airflow}/__main__.py | 0 .../src/airflow}/_vendor/README.md | 0 .../src/airflow}/_vendor/__init__.py | 0 .../src/airflow}/_vendor/vendor.md | 0 .../src/airflow}/alembic.ini | 0 .../src/airflow/api}/__init__.py | 0 .../src/airflow}/api/client/__init__.py | 0 .../src/airflow}/api/client/local_client.py | 0 .../src/airflow}/api/common/__init__.py | 0 .../src/airflow}/api/common/airflow_health.py | 0 .../src/airflow}/api/common/delete_dag.py | 0 .../src/airflow}/api/common/mark_tasks.py | 0 .../src/airflow}/api/common/trigger_dag.py | 0 .../src/airflow/api_fastapi}/__init__.py | 0 .../src/airflow}/api_fastapi/app.py | 0 .../src/airflow}/api_fastapi/auth/__init__.py | 0 .../api_fastapi/auth/managers/__init__.py | 0 .../auth/managers/base_auth_manager.py | 0 .../auth/managers/models/__init__.py | 0 .../auth/managers/models/base_user.py | 0 .../auth/managers/models/batch_apis.py | 0 .../auth/managers/models/resource_details.py | 0 .../auth/managers/simple/__init__.py | 0 .../managers/simple/datamodels/__init__.py | 0 .../auth/managers/simple/datamodels/login.py | 0 .../auth/managers/simple/openapi/__init__.py | 0 .../managers/simple/openapi/v1-generated.yaml | 0 .../auth/managers/simple/routes/__init__.py | 0 .../auth/managers/simple/routes/login.py | 0 .../managers/simple/services}/__init__.py | 0 .../auth/managers/simple/services/login.py | 0 .../managers/simple/simple_auth_manager.py | 0 .../auth/managers/simple/ui/dev/index.html | 0 .../auth/managers/simple/ui/index.html | 0 .../simple/ui/openapi-gen/queries/common.ts | 0 .../simple/ui/openapi-gen/queries/index.ts | 0 .../ui/openapi-gen/queries/infiniteQueries.ts | 0 .../simple/ui/openapi-gen/queries/prefetch.ts | 0 .../simple/ui/openapi-gen/queries/queries.ts | 0 .../simple/ui/openapi-gen/queries/suspense.ts | 0 .../ui/openapi-gen/requests/core/ApiError.ts | 0 .../requests/core/ApiRequestOptions.ts | 0 .../ui/openapi-gen/requests/core/ApiResult.ts | 0 .../requests/core/CancelablePromise.ts | 0 .../ui/openapi-gen/requests/core/OpenAPI.ts | 0 .../ui/openapi-gen/requests/core/request.ts | 0 .../simple/ui/openapi-gen/requests/index.ts | 0 .../ui/openapi-gen/requests/schemas.gen.ts | 0 .../ui/openapi-gen/requests/services.gen.ts | 0 .../ui/openapi-gen/requests/types.gen.ts | 0 .../auth/managers/simple/ui/package-lock.json | 0 .../auth/managers/simple/ui/package.json | 0 .../auth/managers/simple/ui/pnpm-lock.yaml | 0 .../simple/ui/src/login/Login.test.tsx | 0 .../managers/simple/ui/src/login/Login.tsx | 0 .../simple/ui/src/login/LoginForm.tsx | 0 .../auth/managers/simple/ui/src/main.tsx | 0 .../simple/ui/src/queries/useCreateToken.ts | 0 .../managers/simple/ui/src/queryClient.ts | 0 .../auth/managers/simple/ui/src/router.tsx | 0 .../managers/simple/ui/src/test-utils.tsx | 0 .../auth/managers/simple/ui/tests-setup.ts | 0 .../auth/managers/simple/ui/vite.config.ts | 0 .../api_fastapi/auth/managers/simple/user.py | 0 .../src/airflow}/api_fastapi/auth/tokens.py | 0 .../airflow/api_fastapi/common}/__init__.py | 0 .../api_fastapi/common/db}/__init__.py | 0 .../airflow}/api_fastapi/common/db/common.py | 0 .../api_fastapi/common/db/dag_runs.py | 0 .../airflow}/api_fastapi/common/db/dags.py | 0 .../airflow}/api_fastapi/common/exceptions.py | 0 .../airflow}/api_fastapi/common/headers.py | 0 .../airflow}/api_fastapi/common/parameters.py | 0 .../src/airflow}/api_fastapi/common/router.py | 0 .../src/airflow}/api_fastapi/common/types.py | 0 .../airflow/api_fastapi/core_api}/__init__.py | 0 .../src/airflow}/api_fastapi/core_api/app.py | 0 .../src/airflow}/api_fastapi/core_api/base.py | 0 .../core_api/datamodels}/__init__.py | 0 .../api_fastapi/core_api/datamodels/assets.py | 0 .../core_api/datamodels/backfills.py | 0 .../api_fastapi/core_api/datamodels/common.py | 0 .../api_fastapi/core_api/datamodels/config.py | 0 .../core_api/datamodels/connections.py | 0 .../core_api/datamodels/dag_report.py | 0 .../core_api/datamodels/dag_run.py | 0 .../core_api/datamodels/dag_sources.py | 0 .../core_api/datamodels/dag_stats.py | 0 .../core_api/datamodels/dag_tags.py | 0 .../core_api/datamodels/dag_versions.py | 0 .../core_api/datamodels/dag_warning.py | 0 .../api_fastapi/core_api/datamodels/dags.py | 0 .../core_api/datamodels/event_logs.py | 0 .../core_api/datamodels/extra_links.py | 0 .../core_api/datamodels/import_error.py | 0 .../api_fastapi/core_api/datamodels/job.py | 0 .../api_fastapi/core_api/datamodels/log.py | 0 .../core_api/datamodels/monitor.py | 0 .../core_api/datamodels/plugins.py | 0 .../api_fastapi/core_api/datamodels/pools.py | 0 .../core_api/datamodels/providers.py | 0 .../core_api/datamodels/task_instances.py | 0 .../api_fastapi/core_api/datamodels/tasks.py | 0 .../core_api/datamodels/trigger.py | 0 .../core_api/datamodels/ui}/__init__.py | 0 .../core_api/datamodels/ui/auth.py | 0 .../core_api/datamodels/ui/common.py | 0 .../core_api/datamodels/ui/config.py | 0 .../core_api/datamodels/ui/dags.py | 0 .../core_api/datamodels/ui/dashboard.py | 0 .../core_api/datamodels/ui/grid.py | 0 .../core_api/datamodels/ui/structure.py | 0 .../core_api/datamodels/variables.py | 0 .../core_api/datamodels/version.py | 0 .../api_fastapi/core_api/datamodels/xcom.py | 0 .../api_fastapi/core_api/init_dagbag.py | 0 .../api_fastapi/core_api/middleware.py | 0 .../api_fastapi/core_api/openapi}/__init__.py | 0 .../core_api/openapi/exceptions.py | 0 .../core_api/openapi/v1-generated.yaml | 0 .../api_fastapi/core_api/routes}/__init__.py | 0 .../core_api/routes/public/__init__.py | 0 .../core_api/routes/public/assets.py | 0 .../core_api/routes/public/auth.py | 0 .../core_api/routes/public/backfills.py | 0 .../core_api/routes/public/config.py | 0 .../core_api/routes/public/connections.py | 0 .../core_api/routes/public/dag_parsing.py | 0 .../core_api/routes/public/dag_report.py | 0 .../core_api/routes/public/dag_run.py | 0 .../core_api/routes/public/dag_sources.py | 0 .../core_api/routes/public/dag_stats.py | 0 .../core_api/routes/public/dag_tags.py | 0 .../core_api/routes/public/dag_versions.py | 0 .../core_api/routes/public/dag_warning.py | 0 .../core_api/routes/public/dags.py | 0 .../core_api/routes/public/event_logs.py | 0 .../core_api/routes/public/extra_links.py | 0 .../core_api/routes/public/import_error.py | 0 .../api_fastapi/core_api/routes/public/job.py | 0 .../api_fastapi/core_api/routes/public/log.py | 0 .../core_api/routes/public/monitor.py | 0 .../core_api/routes/public/plugins.py | 0 .../core_api/routes/public/pools.py | 0 .../core_api/routes/public/providers.py | 0 .../core_api/routes/public/task_instances.py | 0 .../core_api/routes/public/tasks.py | 0 .../core_api/routes/public/variables.py | 0 .../core_api/routes/public/version.py | 0 .../core_api/routes/public/xcom.py | 0 .../core_api/routes/ui/__init__.py | 0 .../api_fastapi/core_api/routes/ui/assets.py | 0 .../api_fastapi/core_api/routes/ui/auth.py | 0 .../core_api/routes/ui/backfills.py | 0 .../api_fastapi/core_api/routes/ui/config.py | 0 .../core_api/routes/ui/connections.py | 0 .../api_fastapi/core_api/routes/ui/dags.py | 0 .../core_api/routes/ui/dashboard.py | 0 .../core_api/routes/ui/dependencies.py | 0 .../api_fastapi/core_api/routes/ui/grid.py | 0 .../core_api/routes/ui/structure.py | 0 .../airflow}/api_fastapi/core_api/security.py | 0 .../core_api/services}/__init__.py | 0 .../core_api/services/public}/__init__.py | 0 .../core_api/services/public/common.py | 0 .../core_api/services/public/connections.py | 0 .../core_api/services/public/pools.py | 0 .../core_api/services/public/variables.py | 0 .../core_api/services/ui}/__init__.py | 0 .../core_api/services/ui/connections.py | 0 .../core_api/services/ui/dependencies.py | 0 .../api_fastapi/core_api/services/ui/grid.py | 0 .../core_api/services/ui/structure.py | 0 .../api_fastapi/execution_api}/__init__.py | 0 .../airflow}/api_fastapi/execution_api/app.py | 0 .../execution_api/datamodels}/__init__.py | 0 .../execution_api/datamodels/asset.py | 0 .../execution_api/datamodels/asset_event.py | 0 .../execution_api/datamodels/connection.py | 0 .../execution_api/datamodels/dagrun.py | 0 .../execution_api/datamodels/taskinstance.py | 0 .../execution_api/datamodels/token.py | 0 .../execution_api/datamodels/variable.py | 0 .../execution_api/datamodels/xcom.py | 0 .../api_fastapi/execution_api/deps.py | 0 .../execution_api/routes/__init__.py | 0 .../execution_api/routes/asset_events.py | 0 .../execution_api/routes/assets.py | 0 .../execution_api/routes/connections.py | 0 .../execution_api/routes/dag_runs.py | 0 .../execution_api/routes/health.py | 0 .../execution_api/routes/task_instances.py | 0 .../execution_api/routes/variables.py | 0 .../api_fastapi/execution_api/routes/xcoms.py | 0 .../airflow}/api_fastapi/gunicorn_config.py | 0 .../airflow/api_fastapi/logging}/__init__.py | 0 .../api_fastapi/logging/decorators.py | 0 .../src/airflow}/api_fastapi/main.py | 0 .../src/airflow/assets}/__init__.py | 0 .../src/airflow}/assets/evaluation.py | 0 .../src/airflow}/assets/manager.py | 0 .../src/airflow/callbacks}/__init__.py | 0 .../airflow}/callbacks/base_callback_sink.py | 0 .../airflow}/callbacks/callback_requests.py | 0 .../callbacks/database_callback_sink.py | 0 .../airflow}/callbacks/pipe_callback_sink.py | 0 .../src/airflow}/cli/__init__.py | 0 .../src/airflow/cli/api}/__init__.py | 0 .../airflow/cli/api/datamodels}/__init__.py | 0 .../src/airflow}/cli/cli_config.py | 0 .../src/airflow}/cli/cli_parser.py | 0 .../src/airflow}/cli/commands/__init__.py | 0 .../airflow}/cli/commands/legacy_commands.py | 0 .../cli/commands/local_commands}/__init__.py | 0 .../local_commands/api_server_command.py | 0 .../local_commands/cheat_sheet_command.py | 0 .../commands/local_commands/daemon_utils.py | 0 .../local_commands/dag_processor_command.py | 0 .../cli/commands/local_commands/db_command.py | 0 .../commands/local_commands/info_command.py | 0 .../local_commands/kerberos_command.py | 0 .../local_commands/plugins_command.py | 0 .../rotate_fernet_key_command.py | 0 .../local_commands/scheduler_command.py | 0 .../local_commands/standalone_command.py | 0 .../local_commands/triggerer_command.py | 0 .../cli/commands/remote_commands}/__init__.py | 0 .../commands/remote_commands/asset_command.py | 0 .../remote_commands/backfill_command.py | 0 .../remote_commands/config_command.py | 0 .../remote_commands/connection_command.py | 0 .../commands/remote_commands/dag_command.py | 0 .../commands/remote_commands/jobs_command.py | 0 .../commands/remote_commands/pool_command.py | 0 .../remote_commands/provider_command.py | 0 .../commands/remote_commands/task_command.py | 0 .../remote_commands/variable_command.py | 0 .../remote_commands/version_command.py | 0 .../src/airflow}/cli/simple_table.py | 0 .../src/airflow}/cli/utils.py | 0 .../src/airflow}/config_templates/__init__.py | 0 .../airflow_local_settings.py | 0 .../src/airflow}/config_templates/config.yml | 0 .../config_templates/config.yml.schema.json | 0 .../config_templates/default_airflow.cfg | 0 .../default_webserver_config.py | 0 .../provider_config_fallback_defaults.cfg | 0 .../airflow}/config_templates/unit_tests.cfg | 0 .../src/airflow}/configuration.py | 4 +- ...stomized_form_field_behaviours.schema.json | 0 .../src/airflow/dag_processing}/__init__.py | 0 .../dag_processing/bundles}/__init__.py | 0 .../airflow}/dag_processing/bundles/base.py | 0 .../airflow}/dag_processing/bundles/git.py | 0 .../airflow}/dag_processing/bundles/local.py | 0 .../dag_processing/bundles/manager.py | 0 .../dag_processing/bundles/provider.yaml | 0 .../src/airflow}/dag_processing/collection.py | 0 .../src/airflow}/dag_processing/manager.py | 0 .../src/airflow}/dag_processing/processor.py | 0 .../src/airflow}/datasets/__init__.py | 0 .../src/airflow}/datasets/metadata.py | 0 .../src/airflow}/decorators/__init__.py | 0 .../src/airflow}/decorators/__init__.pyi | 0 .../src/airflow}/decorators/base.py | 0 .../src/airflow}/decorators/bash.py | 0 .../decorators/branch_external_python.py | 0 .../src/airflow}/decorators/branch_python.py | 0 .../airflow}/decorators/branch_virtualenv.py | 0 .../src/airflow}/decorators/condition.py | 0 .../airflow}/decorators/external_python.py | 0 .../src/airflow}/decorators/python.py | 0 .../airflow}/decorators/python_virtualenv.py | 0 .../src/airflow}/decorators/sensor.py | 0 .../src/airflow}/decorators/setup_teardown.py | 0 .../src/airflow}/decorators/short_circuit.py | 0 .../src/airflow}/decorators/task_group.py | 0 .../src/airflow}/example_dags/__init__.py | 0 .../example_dags/example_asset_alias.py | 0 .../example_asset_alias_with_no_taskflow.py | 0 .../example_dags/example_asset_decorator.py | 0 .../example_asset_with_watchers.py | 0 .../airflow}/example_dags/example_assets.py | 0 .../example_dags/example_bash_decorator.py | 0 .../example_dags/example_bash_operator.py | 0 .../example_branch_datetime_operator.py | 0 .../example_branch_day_of_week_operator.py | 0 .../example_dags/example_branch_labels.py | 0 .../example_dags/example_branch_operator.py | 0 .../example_branch_operator_decorator.py | 0 .../example_branch_python_dop_operator_3.py | 0 .../airflow}/example_dags/example_complex.py | 0 .../example_dags/example_custom_weight.py | 0 .../example_dags/example_dag_decorator.py | 0 .../example_dags/example_display_name.py | 0 .../example_dynamic_task_mapping.py | 0 ...task_mapping_with_no_taskflow_operators.py | 0 .../example_external_task_marker_dag.py | 0 .../example_dags/example_inlet_event_extra.py | 0 .../example_kubernetes_executor.py | 0 .../example_dags/example_latest_only.py | 0 .../example_latest_only_with_trigger.py | 0 .../example_local_kubernetes_executor.py | 0 .../example_dags/example_nested_branch_dag.py | 0 .../example_outlet_event_extra.py | 0 .../example_dags/example_params_trigger_ui.py | 0 .../example_params_ui_tutorial.py | 0 ...example_passing_params_via_test_command.py | 0 .../example_dags/example_python_decorator.py | 0 .../example_dags/example_python_operator.py | 0 .../example_dags/example_sensor_decorator.py | 0 .../airflow}/example_dags/example_sensors.py | 0 .../example_dags/example_setup_teardown.py | 0 .../example_setup_teardown_taskflow.py | 0 .../example_short_circuit_decorator.py | 0 .../example_short_circuit_operator.py | 0 .../example_dags/example_simplest_dag.py | 0 .../airflow}/example_dags/example_skip_dag.py | 0 .../example_dags/example_task_group.py | 0 .../example_task_group_decorator.py | 0 .../example_time_delta_sensor_async.py | 0 .../example_trigger_controller_dag.py | 0 .../example_trigger_target_dag.py | 0 .../example_dags/example_workday_timetable.py | 0 .../src/airflow}/example_dags/example_xcom.py | 0 .../airflow}/example_dags/example_xcomargs.py | 0 .../airflow}/example_dags/libs/__init__.py | 0 .../src/airflow}/example_dags/libs/helper.py | 0 .../airflow/example_dags/plugins}/__init__.py | 0 .../decreasing_priority_weight_strategy.py | 0 .../example_dags/plugins/event_listener.py | 0 .../example_dags/plugins/listener_plugin.py | 0 .../airflow}/example_dags/plugins/workday.py | 0 .../src/airflow}/example_dags/sql/sample.sql | 0 .../sql/tutorial_taskflow_template.sql | 0 .../src/airflow}/example_dags/tutorial.py | 0 .../src/airflow}/example_dags/tutorial_dag.py | 0 .../example_dags/tutorial_objectstorage.py | 0 .../example_dags/tutorial_taskflow_api.py | 0 .../tutorial_taskflow_api_virtualenv.py | 0 .../tutorial_taskflow_templates.py | 0 .../src/airflow}/exceptions.py | 0 .../src/airflow/executors}/__init__.py | 0 .../src/airflow}/executors/base_executor.py | 0 .../src/airflow}/executors/debug_executor.py | 0 .../airflow}/executors/executor_constants.py | 0 .../src/airflow}/executors/executor_loader.py | 0 .../src/airflow}/executors/executor_utils.py | 0 .../src/airflow}/executors/local_executor.py | 0 .../airflow}/executors/sequential_executor.py | 0 .../src/airflow}/executors/workloads.py | 0 .../src/airflow}/hooks/README.md | 2 +- .../src/airflow}/hooks/__init__.py | 0 .../src/airflow}/hooks/base.py | 0 .../src/airflow}/io/__init__.py | 0 .../src/airflow}/io/path.py | 0 .../src/airflow}/io/store/__init__.py | 0 .../src/airflow}/io/typedef.py | 0 .../src/airflow/io/utils}/__init__.py | 0 .../src/airflow}/io/utils/stat.py | 0 .../src/airflow}/jobs/JOB_LIFECYCLE.md | 0 .../src/airflow}/jobs/__init__.py | 0 .../src/airflow}/jobs/base_job_runner.py | 0 .../airflow}/jobs/dag_processor_job_runner.py | 0 .../src/airflow}/jobs/job.py | 0 .../src/airflow}/jobs/scheduler_job_runner.py | 0 .../src/airflow}/jobs/triggerer_job_runner.py | 0 .../src/airflow}/lineage/__init__.py | 0 .../src/airflow}/lineage/backend.py | 0 .../src/airflow}/lineage/hook.py | 0 .../src/airflow}/listeners/__init__.py | 0 .../src/airflow}/listeners/listener.py | 0 .../src/airflow/listeners/spec}/__init__.py | 0 .../src/airflow}/listeners/spec/asset.py | 0 .../src/airflow}/listeners/spec/dagrun.py | 0 .../airflow}/listeners/spec/importerrors.py | 0 .../src/airflow}/listeners/spec/lifecycle.py | 0 .../airflow}/listeners/spec/taskinstance.py | 0 .../src/airflow}/logging_config.py | 0 .../src/airflow}/macros/__init__.py | 0 .../src/airflow/metrics}/__init__.py | 0 .../src/airflow}/metrics/base_stats_logger.py | 0 .../src/airflow}/metrics/datadog_logger.py | 0 .../src/airflow}/metrics/otel_logger.py | 0 .../src/airflow}/metrics/protocols.py | 0 .../src/airflow}/metrics/statsd_logger.py | 0 .../src/airflow}/metrics/validators.py | 0 .../src/airflow}/migrations/__init__.py | 0 .../src/airflow}/migrations/db_types.py | 0 .../src/airflow}/migrations/db_types.pyi | 0 .../src/airflow}/migrations/env.py | 0 .../src/airflow}/migrations/script.py.mako | 0 .../src/airflow}/migrations/utils.py | 0 ..._2_7_0_add_index_to_task_instance_table.py | 0 ...2_2_7_0_add_custom_operator_name_column.py | 0 ...7_0_add_include_deferred_column_to_pool.py | 0 .../0004_2_8_0_add_clear_number_to_dag_run.py | 0 ...d_owner_display_name_to_audit_log_table.py | 0 ...8_0_make_connection_login_password_text.py | 0 ...2_8_0_add_processor_subdir_import_error.py | 0 .../0008_2_8_1_refactor_dag_run_indexes.py | 0 ..._add_rendered_map_index_to_taskinstance.py | 0 ..._log_table_and_change_event_name_length.py | 0 ..._9_0_add_dataset_expression_in_dagmodel.py | 0 ..._adding_adding_max_failure_runs_column_.py | 0 ...0_make_xcom_value_to_longblob_for_mysql.py | 0 ..._9_0_add_display_name_for_dag_and_task_.py | 0 .../0015_2_9_0_update_trigger_kwargs_type.py | 0 ..._2_remove_idx_last_scheduling_decision_.py | 0 ...istency_between_ORM_and_migration_files.py | 0 ..._on_dag_id_column_in_referencing_tables.py | 0 ...019_2_10_0_add_new_executor_field_to_db.py | 0 ...0_added_dagpriorityparsingrequest_table.py | 0 .../0021_2_10_0_add_task_instance_history.py | 0 .../versions/0022_2_10_0_add_dataset_alias.py | 0 ...0023_2_10_0_dataset_alias_dataset_event.py | 0 ...0024_2_10_0_add_try_number_to_audit_log.py | 0 .../0025_2_10_0_dataset_alias_dataset.py | 0 ..._0_dag_schedule_dataset_alias_reference.py | 0 ...schedule_dataset_alias_reference_naming.py | 0 .../0028_3_0_0_drop_ab_user_id_foreign_key.py | 0 .../versions/0029_3_0_0_remove_is_subdag.py | 0 ..._rename_schedule_interval_to_timetable_.py | 0 ..._3_0_0_add_triggered_by_field_to_dagrun.py | 0 ...ution_date_to_logical_date_and_nullable.py | 0 .../0033_3_0_0_add_tables_for_backfill.py | 0 .../0034_3_0_0_remove_redundant_index.py | 0 .../0035_3_0_0_update_user_id_type.py | 0 ...6_3_0_0_add_name_field_to_dataset_model.py | 0 ...037_3_0_0_add_backfill_to_dag_run_model.py | 0 .../versions/0038_3_0_0_add_asset_active.py | 0 ..._0_tweak_assetaliasmodel_to_match_asset.py | 0 ..._add_exception_reason_and_logical_date_.py | 0 .../0041_3_0_0_rename_dataset_as_asset.py | 0 ..._add_uuid_primary_key_to_task_instance_.py | 0 ...0043_3_0_0_remove_scheduler_lock_column.py | 0 .../0044_3_0_0__drop_task_fail_table.py | 0 ..._0_add_last_heartbeat_at_directly_to_ti.py | 0 .../versions/0046_3_0_0_drop_dag_pickling.py | 0 .../versions/0047_3_0_0_add_dag_versioning.py | 0 .../0048_3_0_0_add_trigger_asset_reference.py | 0 ...0_0_remove_pickled_data_from_xcom_table.py | 0 .../versions/0050_3_0_0_add_dagbundlemodel.py | 0 ...instance_trigger_timeout_to_utcdatetime.py | 0 .../0052_3_0_0_add_deadline_alerts_table.py | 0 .../0053_3_0_0_remove_processor_subdir.py | 0 .../0054_3_0_0_add_asset_reference_models.py | 0 ...0_remove_pickled_data_from_dagrun_table.py | 0 .../0056_3_0_0_add_relative_fileloc_column.py | 0 ..._add_new_task_instance_field_scheduled_.py | 0 .../0058_3_0_0_add_dagrun_run_after.py | 0 ...059_3_0_0_remove_external_trigger_field.py | 0 .../0060_3_0_0_add_try_id_to_ti_and_tih.py | 0 ..._0_0_use_ti_id_as_primary_key_to_TINote.py | 0 .../0062_3_0_0_remove_dag_default_view.py | 0 ...3_0_0_use_ti_id_as_fk_to_taskreschedule.py | 0 .../airflow}/migrations/versions/__init__.py | 0 .../src/airflow}/models/__init__.py | 0 .../src/airflow}/models/abstractoperator.py | 0 .../src/airflow}/models/asset.py | 0 .../src/airflow}/models/backfill.py | 0 .../src/airflow}/models/base.py | 0 .../src/airflow}/models/baseoperator.py | 0 .../src/airflow}/models/connection.py | 0 .../src/airflow}/models/crypto.py | 0 .../src/airflow}/models/dag.py | 0 .../src/airflow}/models/dag_version.py | 0 .../src/airflow}/models/dagbag.py | 0 .../src/airflow}/models/dagbundle.py | 8 +- .../src/airflow}/models/dagcode.py | 0 .../src/airflow}/models/dagrun.py | 0 .../src/airflow}/models/dagwarning.py | 0 .../airflow}/models/db_callback_request.py | 0 .../src/airflow}/models/deadline.py | 0 .../src/airflow}/models/errors.py | 0 .../src/airflow}/models/expandinput.py | 0 .../src/airflow}/models/log.py | 0 .../src/airflow}/models/mappedoperator.py | 0 .../src/airflow}/models/operator.py | 0 .../src/airflow}/models/param.py | 0 .../src/airflow}/models/pool.py | 0 .../src/airflow}/models/renderedtifields.py | 0 .../src/airflow}/models/serialized_dag.py | 0 .../src/airflow}/models/skipmixin.py | 0 .../src/airflow}/models/taskinstance.py | 0 .../airflow}/models/taskinstancehistory.py | 0 .../src/airflow}/models/taskinstancekey.py | 0 .../src/airflow}/models/tasklog.py | 0 .../src/airflow}/models/taskmap.py | 0 .../src/airflow}/models/taskmixin.py | 0 .../src/airflow}/models/taskreschedule.py | 0 .../src/airflow}/models/trigger.py | 0 .../src/airflow}/models/variable.py | 0 .../src/airflow}/models/xcom.py | 0 .../src/airflow}/models/xcom_arg.py | 0 .../src/airflow/notifications}/__init__.py | 0 .../airflow}/notifications/basenotifier.py | 0 .../src/airflow}/operators/__init__.py | 0 .../src/airflow}/plugins_manager.py | 0 .../src/airflow}/policies.py | 0 .../src/airflow}/provider.yaml.schema.json | 0 .../src/airflow}/provider_info.schema.json | 0 .../src/airflow}/providers_manager.py | 2 +- .../src/airflow}/py.typed | 0 .../src/airflow}/secrets/__init__.py | 0 .../src/airflow}/secrets/base_secrets.py | 0 .../src/airflow}/secrets/cache.py | 0 .../airflow}/secrets/environment_variables.py | 0 .../src/airflow}/secrets/local_filesystem.py | 0 .../src/airflow}/secrets/metastore.py | 0 .../src/airflow}/security/__init__.py | 0 .../src/airflow}/security/kerberos.py | 0 .../src/airflow}/security/permissions.py | 0 .../src/airflow}/security/utils.py | 0 .../src/airflow}/sensors/README.md | 0 .../src/airflow}/sensors/__init__.py | 0 .../src/airflow}/sensors/base.py | 0 .../src/airflow}/sentry.py | 0 .../src/airflow}/serialization/__init__.py | 0 .../airflow}/serialization/dag_dependency.py | 0 .../src/airflow}/serialization/enums.py | 0 .../src/airflow}/serialization/helpers.py | 0 .../src/airflow}/serialization/json_schema.py | 0 .../src/airflow}/serialization/schema.json | 0 .../src/airflow}/serialization/serde.py | 0 .../serialization/serialized_objects.py | 0 .../serialization/serializers/__init__.py | 0 .../serialization/serializers/bignum.py | 0 .../serialization/serializers/builtin.py | 0 .../serialization/serializers/datetime.py | 0 .../serialization/serializers/deltalake.py | 0 .../serialization/serializers/iceberg.py | 0 .../serialization/serializers/kubernetes.py | 0 .../serialization/serializers/numpy.py | 0 .../serialization/serializers/pandas.py | 0 .../serialization/serializers/timezone.py | 0 .../src/airflow}/settings.py | 0 .../src/airflow}/stats.py | 0 .../src/airflow}/task/__init__.py | 0 .../src/airflow}/task/priority_strategy.py | 0 .../src/airflow}/ti_deps/__init__.py | 0 .../src/airflow}/ti_deps/dep_context.py | 0 .../src/airflow}/ti_deps/dependencies_deps.py | 0 .../airflow}/ti_deps/dependencies_states.py | 0 .../src/airflow}/ti_deps/deps/__init__.py | 0 .../src/airflow}/ti_deps/deps/base_ti_dep.py | 0 .../deps/dag_ti_slots_available_dep.py | 0 .../airflow}/ti_deps/deps/dag_unpaused_dep.py | 0 .../ti_deps/deps/dagrun_exists_dep.py | 0 .../deps/exec_date_after_start_date_dep.py | 0 .../ti_deps/deps/mapped_task_expanded.py | 0 .../ti_deps/deps/mapped_task_upstream_dep.py | 0 .../ti_deps/deps/not_in_retry_period_dep.py | 0 .../deps/not_previously_skipped_dep.py | 0 .../ti_deps/deps/pool_slots_available_dep.py | 0 .../airflow}/ti_deps/deps/prev_dagrun_dep.py | 0 .../ti_deps/deps/ready_to_reschedule.py | 0 .../ti_deps/deps/runnable_exec_date_dep.py | 0 .../ti_deps/deps/task_concurrency_dep.py | 0 .../ti_deps/deps/task_not_running_dep.py | 0 .../airflow}/ti_deps/deps/trigger_rule_dep.py | 0 .../airflow}/ti_deps/deps/valid_state_dep.py | 0 .../src/airflow/timetables}/__init__.py | 0 .../src/airflow}/timetables/_cron.py | 0 .../src/airflow}/timetables/_delta.py | 0 .../src/airflow}/timetables/assets.py | 0 .../src/airflow}/timetables/base.py | 0 .../src/airflow}/timetables/events.py | 0 .../src/airflow}/timetables/interval.py | 0 .../src/airflow}/timetables/simple.py | 0 .../src/airflow}/timetables/trigger.py | 0 .../src/airflow}/traces/__init__.py | 0 .../src/airflow}/traces/otel_tracer.py | 0 .../src/airflow}/traces/tracer.py | 0 .../src/airflow}/traces/utils.py | 0 .../src/airflow}/triggers/__init__.py | 0 .../src/airflow}/triggers/base.py | 0 .../src/airflow}/triggers/testing.py | 0 .../src/airflow}/typing_compat.py | 0 .../src/airflow}/ui/.env.example | 0 .../src/airflow}/ui/.prettierignore | 0 .../src/airflow}/ui/.prettierrc | 0 .../src/airflow}/ui/CONTRIBUTING.md | 0 .../src/airflow}/ui/README.md | 0 .../src/airflow}/ui/dev/index.html | 0 .../src/airflow}/ui/eslint.config.js | 0 .../src/airflow}/ui/index.html | 0 .../airflow}/ui/openapi-gen/queries/common.ts | 0 .../airflow}/ui/openapi-gen/queries/index.ts | 0 .../ui/openapi-gen/queries/infiniteQueries.ts | 0 .../ui/openapi-gen/queries/prefetch.ts | 0 .../ui/openapi-gen/queries/queries.ts | 0 .../ui/openapi-gen/queries/suspense.ts | 0 .../ui/openapi-gen/requests/core/ApiError.ts | 0 .../requests/core/ApiRequestOptions.ts | 0 .../ui/openapi-gen/requests/core/ApiResult.ts | 0 .../requests/core/CancelablePromise.ts | 0 .../ui/openapi-gen/requests/core/OpenAPI.ts | 0 .../ui/openapi-gen/requests/core/request.ts | 0 .../airflow}/ui/openapi-gen/requests/index.ts | 0 .../ui/openapi-gen/requests/schemas.gen.ts | 0 .../ui/openapi-gen/requests/services.gen.ts | 0 .../ui/openapi-gen/requests/types.gen.ts | 0 .../src/airflow}/ui/package.json | 0 .../src/airflow}/ui/pnpm-lock.yaml | 0 .../src/airflow}/ui/public/pin_32.png | Bin .../src/airflow}/ui/rules/core.js | 0 .../src/airflow}/ui/rules/levels.js | 0 .../src/airflow}/ui/rules/off.js | 0 .../src/airflow}/ui/rules/perfectionist.js | 0 .../src/airflow}/ui/rules/plugin-patch.d.ts | 0 .../src/airflow}/ui/rules/prettier.js | 0 .../src/airflow}/ui/rules/react.js | 0 .../src/airflow}/ui/rules/stylistic.js | 0 .../src/airflow}/ui/rules/typescript.js | 0 .../src/airflow}/ui/rules/unicorn.js | 0 .../src/airflow}/ui/src/assets/AirflowPin.tsx | 0 .../src/airflow}/ui/src/assets/DagIcon.tsx | 0 .../src/airflow}/ui/src/assets/TaskIcon.tsx | 0 .../ActionAccordion/ActionAccordion.tsx | 0 .../components/ActionAccordion/columns.tsx | 0 .../src/components/ActionAccordion/index.tsx | 0 .../AssetExpression/AndGateNode.tsx | 0 .../AssetExpression/AssetExpression.tsx | 0 .../components/AssetExpression/AssetNode.tsx | 0 .../components/AssetExpression/OrGateNode.tsx | 0 .../src/components/AssetExpression/index.ts | 0 .../src/components/AssetExpression/types.ts | 0 .../ui/src/components/Assets/AssetEvent.tsx | 0 .../ui/src/components/Assets/AssetEvents.tsx | 0 .../src/components/Banner/BackfillBanner.tsx | 0 .../ui/src/components/Banner/index.tsx | 0 .../ui/src/components/BreadcrumbStats.tsx | 0 .../components/Clear/Run/ClearRunButton.tsx | 0 .../components/Clear/Run/ClearRunDialog.tsx | 0 .../ui/src/components/Clear/Run/index.tsx | 0 .../TaskInstance/ClearTaskInstanceButton.tsx | 0 .../TaskInstance/ClearTaskInstanceDialog.tsx | 0 .../components/Clear/TaskInstance/index.tsx | 0 .../ui/src/components/Clear/columns.tsx | 0 .../ui/src/components/Clear/index.tsx | 0 .../ui/src/components/ConfirmationModal.tsx | 0 .../ui/src/components/DagActions/ParseDag.tsx | 0 .../DagActions/RunBackfillButton.tsx | 0 .../components/DagActions/RunBackfillForm.tsx | 0 .../DagActions/RunBackfillModal.tsx | 0 .../airflow}/ui/src/components/DagRunInfo.tsx | 0 .../ui/src/components/DagVersionDetails.tsx | 0 .../ui/src/components/DagVersionSelect.tsx | 0 .../ui/src/components/DataTable/CardList.tsx | 0 .../components/DataTable/DataTable.test.tsx | 0 .../ui/src/components/DataTable/DataTable.tsx | 0 .../ui/src/components/DataTable/TableList.tsx | 0 .../DataTable/ToggleTableDisplay.tsx | 0 .../ui/src/components/DataTable/index.ts | 0 .../components/DataTable/searchParams.test.ts | 0 .../src/components/DataTable/searchParams.ts | 0 .../ui/src/components/DataTable/skeleton.tsx | 0 .../ui/src/components/DataTable/types.ts | 0 .../components/DataTable/useRowSelection.ts | 0 .../components/DataTable/useTableUrlState.ts | 0 .../src/components/DisplayMarkdownButton.tsx | 0 .../ui/src/components/DurationChart.tsx | 0 .../src/components/EditableMarkdownButton.tsx | 0 .../airflow}/ui/src/components/ErrorAlert.tsx | 0 .../FlexibleForm/FieldAdvancedArray.tsx | 0 .../src/components/FlexibleForm/FieldBool.tsx | 0 .../components/FlexibleForm/FieldDateTime.tsx | 0 .../components/FlexibleForm/FieldDropdown.tsx | 0 .../FlexibleForm/FieldMultiSelect.tsx | 0 .../FlexibleForm/FieldMultilineText.tsx | 0 .../components/FlexibleForm/FieldNumber.tsx | 0 .../components/FlexibleForm/FieldObject.tsx | 0 .../src/components/FlexibleForm/FieldRow.tsx | 0 .../components/FlexibleForm/FieldSelector.tsx | 0 .../components/FlexibleForm/FieldString.tsx | 0 .../FlexibleForm/FieldStringArray.tsx | 0 .../components/FlexibleForm/FlexibleForm.tsx | 0 .../components/FlexibleForm/HiddenInput.tsx | 0 .../ui/src/components/FlexibleForm/Row.tsx | 0 .../ui/src/components/FlexibleForm/index.tsx | 0 .../ui/src/components/Graph/AliasNode.tsx | 0 .../components/Graph/AssetConditionNode.tsx | 0 .../ui/src/components/Graph/AssetNode.tsx | 0 .../ui/src/components/Graph/DagNode.tsx | 0 .../airflow}/ui/src/components/Graph/Edge.tsx | 0 .../ui/src/components/Graph/JoinNode.tsx | 0 .../ui/src/components/Graph/NodeWrapper.tsx | 0 .../ui/src/components/Graph/TaskLink.tsx | 0 .../ui/src/components/Graph/TaskNode.tsx | 0 .../ui/src/components/Graph/reactflowUtils.ts | 0 .../ui/src/components/Graph/useGraphLayout.ts | 0 .../airflow}/ui/src/components/HeaderCard.tsx | 0 .../airflow}/ui/src/components/JsonEditor.tsx | 0 .../ui/src/components/LimitedItemsList.tsx | 0 .../components/MarkAs/Run/MarkRunAsButton.tsx | 0 .../components/MarkAs/Run/MarkRunAsDialog.tsx | 0 .../ui/src/components/MarkAs/Run/index.tsx | 0 .../TaskInstance/MarkTaskInstanceAsButton.tsx | 0 .../TaskInstance/MarkTaskInstanceAsDialog.tsx | 0 .../components/MarkAs/TaskInstance/index.tsx | 0 .../ui/src/components/MarkAs/index.tsx | 0 .../ui/src/components/MarkAs/utils.ts | 0 .../ui/src/components/QuickFilterButton.tsx | 0 .../ui/src/components/ReactMarkdown.tsx | 0 .../ui/src/components/RenderedJsonField.tsx | 0 .../ui/src/components/RunTypeIcon.tsx | 0 .../ui/src/components/SearchBar.test.tsx | 0 .../airflow}/ui/src/components/SearchBar.tsx | 0 .../src/components/SearchDags/SearchDags.tsx | 0 .../SearchDags/SearchDagsButton.tsx | 0 .../SearchDagsDropdownIndicator.tsx | 0 .../ui/src/components/SearchDags/index.ts | 0 .../src/airflow}/ui/src/components/Stat.tsx | 0 .../airflow}/ui/src/components/StateBadge.tsx | 0 .../airflow}/ui/src/components/StateIcon.tsx | 0 .../ui/src/components/TaskInstanceTooltip.tsx | 0 .../airflow}/ui/src/components/TaskName.tsx | 0 .../ui/src/components/TaskTrySelect.tsx | 0 .../airflow}/ui/src/components/Time.test.tsx | 0 .../src/airflow}/ui/src/components/Time.tsx | 0 .../ui/src/components/TimeRangeSelector.tsx | 0 .../ui/src/components/TogglePause.tsx | 0 .../ui/src/components/TrendCountButton.tsx | 0 .../ui/src/components/TrendCountChart.tsx | 0 .../TriggerDag/EditableMarkdown.tsx | 0 .../TriggerDag/TriggerDAGButton.tsx | 0 .../components/TriggerDag/TriggerDAGForm.tsx | 0 .../components/TriggerDag/TriggerDAGModal.tsx | 0 .../ui/src/components/TruncatedText.tsx | 0 .../components/ui/Accordion/ItemContent.tsx | 0 .../components/ui/Accordion/ItemTrigger.tsx | 0 .../ui/src/components/ui/Accordion/index.tsx | 0 .../components/ui/ActionBar/BarContent.tsx | 0 .../components/ui/ActionBar/CloseTrigger.tsx | 0 .../ui/src/components/ui/ActionBar/index.ts | 0 .../ui/src/components/ui/ActionButton.tsx | 0 .../airflow}/ui/src/components/ui/Alert.tsx | 0 .../ui/src/components/ui/Breadcrumb/Root.tsx | 0 .../ui/src/components/ui/Breadcrumb/index.ts | 0 .../airflow}/ui/src/components/ui/Button.tsx | 0 .../ui/src/components/ui/Checkbox.tsx | 0 .../ui/src/components/ui/Clipboard.tsx | 0 .../ui/src/components/ui/CloseButton.tsx | 0 .../src/components/ui/Dialog/CloseTrigger.tsx | 0 .../ui/src/components/ui/Dialog/Content.tsx | 0 .../ui/src/components/ui/Dialog/index.ts | 0 .../src/components/ui/FileUpload/Dropzone.tsx | 0 .../components/ui/FileUpload/FileInput.tsx | 0 .../ui/src/components/ui/FileUpload/Item.tsx | 0 .../ui/src/components/ui/FileUpload/List.tsx | 0 .../ui/src/components/ui/FileUpload/Root.tsx | 0 .../ui/src/components/ui/FileUpload/index.ts | 0 .../ui/src/components/ui/InputGroup.tsx | 0 .../airflow}/ui/src/components/ui/Menu.tsx | 0 .../ui/src/components/ui/NumberInput.tsx | 0 .../src/components/ui/Pagination/Ellipsis.tsx | 0 .../ui/src/components/ui/Pagination/Item.tsx | 0 .../ui/src/components/ui/Pagination/Items.tsx | 0 .../components/ui/Pagination/NextTrigger.tsx | 0 .../src/components/ui/Pagination/PageText.tsx | 0 .../components/ui/Pagination/PrevTrigger.tsx | 0 .../ui/src/components/ui/Pagination/Root.tsx | 0 .../src/components/ui/Pagination/context.ts | 0 .../ui/src/components/ui/Pagination/index.ts | 0 .../ui/src/components/ui/Popover/Arrow.tsx | 0 .../components/ui/Popover/CloseTrigger.tsx | 0 .../ui/src/components/ui/Popover/Content.tsx | 0 .../ui/src/components/ui/Popover/index.tsx | 0 .../ui/src/components/ui/ProgressBar.tsx | 0 .../ui/src/components/ui/RadioCard.tsx | 0 .../ui/src/components/ui/SegmentedControl.tsx | 0 .../ui/src/components/ui/Select/Content.tsx | 0 .../ui/src/components/ui/Select/Item.tsx | 0 .../ui/src/components/ui/Select/ItemGroup.tsx | 0 .../ui/src/components/ui/Select/Root.tsx | 0 .../ui/src/components/ui/Select/Trigger.tsx | 0 .../ui/src/components/ui/Select/ValueText.tsx | 0 .../ui/src/components/ui/Select/index.ts | 0 .../airflow}/ui/src/components/ui/Switch.tsx | 0 .../src/airflow}/ui/src/components/ui/Tag.tsx | 0 .../airflow}/ui/src/components/ui/Toaster.tsx | 0 .../airflow}/ui/src/components/ui/Tooltip.tsx | 0 .../airflow}/ui/src/components/ui/index.ts | 0 .../src/constants/reprocessBehaviourParams.ts | 0 .../airflow}/ui/src/constants/searchParams.ts | 0 .../airflow}/ui/src/constants/sortParams.ts | 0 .../airflow}/ui/src/constants/stateOptions.ts | 0 .../context/colorMode/ColorModeProvider.tsx | 0 .../ui/src/context/colorMode/index.ts | 0 .../ui/src/context/colorMode/useColorMode.tsx | 0 .../context/openGroups/OpenGroupsProvider.tsx | 0 .../ui/src/context/openGroups/index.ts | 0 .../src/context/openGroups/useOpenGroups.ts | 0 .../src/context/timezone/TimezoneProvider.tsx | 0 .../airflow}/ui/src/context/timezone/index.ts | 0 .../ui/src/context/timezone/useTimezone.ts | 0 .../ui/src/hooks/useSelectedVersion.ts | 0 .../airflow}/ui/src/layouts/BaseLayout.tsx | 0 .../airflow}/ui/src/layouts/DagsLayout.tsx | 0 .../ui/src/layouts/Details/DagBreadcrumb.tsx | 0 .../ui/src/layouts/Details/DagRunSelect.tsx | 0 .../ui/src/layouts/Details/DetailsLayout.tsx | 0 .../ui/src/layouts/Details/Gantt/Gantt.tsx | 0 .../ui/src/layouts/Details/Gantt/index.ts | 0 .../ui/src/layouts/Details/Graph/Graph.tsx | 0 .../ui/src/layouts/Details/Graph/index.ts | 0 .../ui/src/layouts/Details/Grid/Bar.tsx | 0 .../src/layouts/Details/Grid/DurationAxis.tsx | 0 .../src/layouts/Details/Grid/DurationTick.tsx | 0 .../ui/src/layouts/Details/Grid/Grid.tsx | 0 .../src/layouts/Details/Grid/GridButton.tsx | 0 .../ui/src/layouts/Details/Grid/GridTI.tsx | 0 .../Details/Grid/TaskInstancesColumn.tsx | 0 .../ui/src/layouts/Details/Grid/TaskNames.tsx | 0 .../ui/src/layouts/Details/Grid/index.ts | 0 .../ui/src/layouts/Details/Grid/utils.ts | 0 .../ui/src/layouts/Details/NavTabs.tsx | 0 .../ui/src/layouts/Details/PanelButtons.tsx | 0 .../ui/src/layouts/Details/ToggleGroups.tsx | 0 .../ui/src/layouts/Nav/AdminButton.tsx | 0 .../ui/src/layouts/Nav/BrowseButton.tsx | 0 .../ui/src/layouts/Nav/DocsButton.tsx | 0 .../ui/src/layouts/Nav/LogoutModal.tsx | 0 .../src/airflow}/ui/src/layouts/Nav/Nav.tsx | 0 .../airflow}/ui/src/layouts/Nav/NavButton.tsx | 0 .../ui/src/layouts/Nav/PluginMenus.tsx | 0 .../ui/src/layouts/Nav/SecurityButton.tsx | 0 .../ui/src/layouts/Nav/TimezoneModal.tsx | 0 .../ui/src/layouts/Nav/TimezoneSelector.tsx | 0 .../ui/src/layouts/Nav/UserSettingsButton.tsx | 0 .../src/airflow}/ui/src/layouts/Nav/index.ts | 0 .../src/airflow}/ui/src/main.tsx | 0 .../airflow}/ui/src/mocks/handlers/config.ts | 0 .../src/airflow}/ui/src/mocks/handlers/dag.ts | 0 .../airflow}/ui/src/mocks/handlers/dags.ts | 0 .../airflow}/ui/src/mocks/handlers/index.ts | 0 .../src/airflow}/ui/src/mocks/handlers/log.ts | 0 .../src/airflow}/ui/src/pages/Asset/Asset.tsx | 0 .../ui/src/pages/Asset/AssetGraph.tsx | 0 .../ui/src/pages/Asset/CreateAssetEvent.tsx | 0 .../src/pages/Asset/CreateAssetEventModal.tsx | 0 .../airflow}/ui/src/pages/Asset/Header.tsx | 0 .../src/airflow}/ui/src/pages/Asset/index.ts | 0 .../ui/src/pages/AssetsList/AssetsList.tsx | 0 .../pages/AssetsList/DependencyPopover.tsx | 0 .../airflow}/ui/src/pages/AssetsList/index.ts | 0 .../pages/Connections/AddConnectionButton.tsx | 0 .../src/pages/Connections/ConnectionForm.tsx | 0 .../ui/src/pages/Connections/Connections.tsx | 0 .../Connections/DeleteConnectionButton.tsx | 0 .../ui/src/pages/Connections/index.ts | 0 .../ui/src/pages/Dag/Backfills/Backfills.tsx | 0 .../ui/src/pages/Dag/Backfills/index.ts | 0 .../airflow}/ui/src/pages/Dag/Code/Code.tsx | 0 .../airflow}/ui/src/pages/Dag/Code/index.ts | 0 .../src/airflow}/ui/src/pages/Dag/Dag.tsx | 0 .../ui/src/pages/Dag/DagHeader.test.tsx | 0 .../src/airflow}/ui/src/pages/Dag/Details.tsx | 0 .../src/airflow}/ui/src/pages/Dag/Header.tsx | 0 .../ui/src/pages/Dag/Overview/FailedLogs.tsx | 0 .../ui/src/pages/Dag/Overview/Overview.tsx | 0 .../src/pages/Dag/Overview/TaskLogPreview.tsx | 0 .../ui/src/pages/Dag/Overview/index.ts | 0 .../ui/src/pages/Dag/Tasks/TaskCard.tsx | 0 .../ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx | 0 .../airflow}/ui/src/pages/Dag/Tasks/Tasks.tsx | 0 .../airflow}/ui/src/pages/Dag/Tasks/index.ts | 0 .../src/airflow}/ui/src/pages/Dag/index.ts | 0 .../src/airflow}/ui/src/pages/DagRuns.tsx | 0 .../ui/src/pages/DagsList/AssetSchedule.tsx | 0 .../ui/src/pages/DagsList/DagCard.test.tsx | 0 .../ui/src/pages/DagsList/DagCard.tsx | 0 .../ui/src/pages/DagsList/DagTags.tsx | 0 .../ui/src/pages/DagsList/DagsFilters.tsx | 0 .../ui/src/pages/DagsList/DagsList.test.tsx | 0 .../ui/src/pages/DagsList/DagsList.tsx | 0 .../ui/src/pages/DagsList/RecentRuns.tsx | 0 .../ui/src/pages/DagsList/Schedule.tsx | 0 .../ui/src/pages/DagsList/SortSelect.tsx | 0 .../airflow}/ui/src/pages/DagsList/index.ts | 0 .../ui/src/pages/Dashboard/Dashboard.tsx | 0 .../ui/src/pages/Dashboard/Health/Health.tsx | 0 .../pages/Dashboard/Health/HealthBadge.tsx | 0 .../pages/Dashboard/Health/HealthSection.tsx | 0 .../ui/src/pages/Dashboard/Health/index.ts | 0 .../HistoricalMetrics/DagRunMetrics.tsx | 0 .../HistoricalMetrics/HistoricalMetrics.tsx | 0 .../HistoricalMetrics/MetricSection.tsx | 0 .../MetricSectionSkeleton.tsx | 0 .../HistoricalMetrics/TaskInstanceMetrics.tsx | 0 .../Dashboard/HistoricalMetrics/index.ts | 0 .../pages/Dashboard/Stats/DAGImportErrors.tsx | 0 .../Dashboard/Stats/DAGImportErrorsModal.tsx | 0 .../pages/Dashboard/Stats/DagFilterButton.tsx | 0 .../ui/src/pages/Dashboard/Stats/Stats.tsx | 0 .../ui/src/pages/Dashboard/Stats/index.ts | 0 .../airflow}/ui/src/pages/Dashboard/index.ts | 0 .../src/airflow}/ui/src/pages/Error.tsx | 0 .../airflow}/ui/src/pages/Events/Events.tsx | 0 .../airflow}/ui/src/pages/Events/index.tsx | 0 .../src/pages/MappedTaskInstance/Header.tsx | 0 .../MappedTaskInstance/MappedTaskInstance.tsx | 0 .../ui/src/pages/MappedTaskInstance/index.ts | 0 .../src/airflow}/ui/src/pages/Plugins.tsx | 0 .../ui/src/pages/Pools/AddPoolButton.tsx | 0 .../ui/src/pages/Pools/DeletePoolButton.tsx | 0 .../ui/src/pages/Pools/EditPoolButton.tsx | 0 .../airflow}/ui/src/pages/Pools/PoolBar.tsx | 0 .../airflow}/ui/src/pages/Pools/PoolForm.tsx | 0 .../src/airflow}/ui/src/pages/Pools/Pools.tsx | 0 .../src/airflow}/ui/src/pages/Pools/index.tsx | 0 .../src/airflow}/ui/src/pages/Providers.tsx | 0 .../src/airflow}/ui/src/pages/Run/Details.tsx | 0 .../src/airflow}/ui/src/pages/Run/Header.tsx | 0 .../src/airflow}/ui/src/pages/Run/Run.tsx | 0 .../src/airflow}/ui/src/pages/Run/index.ts | 0 .../src/airflow}/ui/src/pages/Security.tsx | 0 .../src/airflow}/ui/src/pages/Task/Header.tsx | 0 .../ui/src/pages/Task/Overview/Overview.tsx | 0 .../ui/src/pages/Task/Overview/index.ts | 0 .../src/airflow}/ui/src/pages/Task/Task.tsx | 0 .../src/airflow}/ui/src/pages/Task/index.ts | 0 .../src/pages/TaskInstance/BlockingDeps.tsx | 0 .../ui/src/pages/TaskInstance/Details.tsx | 0 .../ui/src/pages/TaskInstance/ExtraLinks.tsx | 0 .../ui/src/pages/TaskInstance/Header.tsx | 0 .../src/pages/TaskInstance/Logs/Logs.test.tsx | 0 .../ui/src/pages/TaskInstance/Logs/Logs.tsx | 0 .../TaskInstance/Logs/TaskLogContent.tsx | 0 .../pages/TaskInstance/Logs/TaskLogHeader.tsx | 0 .../ui/src/pages/TaskInstance/Logs/index.ts | 0 .../pages/TaskInstance/RenderedTemplates.tsx | 0 .../src/pages/TaskInstance/TaskInstance.tsx | 0 .../src/pages/TaskInstance/TriggererInfo.tsx | 0 .../ui/src/pages/TaskInstance/index.ts | 0 .../src/pages/TaskInstances/TaskInstances.tsx | 0 .../TaskInstances/TaskInstancesFilter.tsx | 0 .../ui/src/pages/TaskInstances/index.ts | 0 .../pages/Variables/DeleteVariablesButton.tsx | 0 .../pages/Variables/ImportVariablesButton.tsx | 0 .../pages/Variables/ImportVariablesForm.tsx | 0 .../ManageVariable/AddVariableButton.tsx | 0 .../ManageVariable/DeleteVariableButton.tsx | 0 .../ManageVariable/EditVariableButton.tsx | 0 .../Variables/ManageVariable/VariableForm.tsx | 0 .../ui/src/pages/Variables/Variables.tsx | 0 .../airflow}/ui/src/pages/Variables/index.tsx | 0 .../src/airflow}/ui/src/pages/XCom/XCom.tsx | 0 .../airflow}/ui/src/pages/XCom/XComEntry.tsx | 0 .../src/airflow}/ui/src/pages/XCom/index.ts | 0 .../ui/src/queries/useAddConnection.ts | 0 .../src/airflow}/ui/src/queries/useAddPool.ts | 0 .../airflow}/ui/src/queries/useAddVariable.ts | 0 .../ui/src/queries/useBulkDeleteVariables.ts | 0 .../ui/src/queries/useClearDagRunDryRun.ts | 0 .../airflow}/ui/src/queries/useClearRun.ts | 0 .../ui/src/queries/useClearTaskInstances.ts | 0 .../queries/useClearTaskInstancesDryRun.ts | 0 .../src/airflow}/ui/src/queries/useConfig.tsx | 0 .../ui/src/queries/useConnectionTypeMeta.ts | 0 .../ui/src/queries/useCreateBackfill.ts | 0 .../ui/src/queries/useCreateBackfillDryRun.ts | 0 .../airflow}/ui/src/queries/useDagParams.ts | 0 .../airflow}/ui/src/queries/useDagParsing.ts | 0 .../src/airflow}/ui/src/queries/useDags.tsx | 0 .../ui/src/queries/useDeleteConnection.ts | 0 .../airflow}/ui/src/queries/useDeletePool.ts | 0 .../ui/src/queries/useDeleteVariable.ts | 0 .../airflow}/ui/src/queries/useEditPool.ts | 0 .../ui/src/queries/useEditVariable.ts | 0 .../src/airflow}/ui/src/queries/useGrid.ts | 0 .../ui/src/queries/useImportVariables.ts | 0 .../src/airflow}/ui/src/queries/useLogs.tsx | 0 .../airflow}/ui/src/queries/useParamStore.ts | 0 .../airflow}/ui/src/queries/usePatchDagRun.ts | 0 .../ui/src/queries/usePatchTaskInstance.ts | 0 .../src/queries/usePatchTaskInstanceDryRun.ts | 0 .../airflow}/ui/src/queries/useTogglePause.ts | 0 .../src/airflow}/ui/src/queries/useTrigger.ts | 0 .../src/airflow}/ui/src/queryClient.ts | 0 .../src/airflow}/ui/src/router.tsx | 0 .../src/airflow}/ui/src/theme.ts | 0 .../src/airflow}/ui/src/utils/AppWrapper.tsx | 0 .../ui/src/utils/ChakraWrapper.test.tsx | 0 .../airflow}/ui/src/utils/ChakraWrapper.tsx | 0 .../ui/src/utils/RouterWrapper.test.tsx | 0 .../airflow}/ui/src/utils/RouterWrapper.tsx | 0 .../src/airflow}/ui/src/utils/TrimText.tsx | 0 .../src/airflow}/ui/src/utils/Wrapper.tsx | 0 .../ui/src/utils/advancedSelectStyles.ts | 0 .../src/airflow}/ui/src/utils/capitalize.ts | 0 .../airflow}/ui/src/utils/datetime_utils.ts | 0 .../src/airflow}/ui/src/utils/downloadJson.ts | 0 .../src/airflow}/ui/src/utils/getMetaKey.ts | 0 .../src/airflow}/ui/src/utils/index.ts | 0 .../src/airflow}/ui/src/utils/links.ts | 0 .../src/airflow}/ui/src/utils/logs.ts | 0 .../src/airflow}/ui/src/utils/option.ts | 0 .../airflow}/ui/src/utils/pluralize.test.ts | 0 .../src/airflow}/ui/src/utils/pluralize.ts | 0 .../src/airflow}/ui/src/utils/query.ts | 0 .../ui/src/utils/tokenHandler.test.ts | 0 .../src/airflow}/ui/src/utils/tokenHandler.ts | 0 .../src/airflow}/ui/src/utils/trimTextFn.ts | 0 .../ui/src/utils/useContainerWidth.ts | 0 .../src/airflow}/ui/src/vite-env.d.ts | 0 .../src/airflow}/ui/testsSetup.ts | 0 .../src/airflow}/ui/tsconfig.app.json | 0 .../src/airflow}/ui/tsconfig.dev.json | 0 .../src/airflow}/ui/tsconfig.json | 0 .../src/airflow}/ui/tsconfig.node.json | 0 .../src/airflow}/ui/vite.config.ts | 0 .../src/airflow}/utils/__init__.py | 0 .../src/airflow}/utils/api_migration.py | 0 .../src/airflow}/utils/cli.py | 0 .../src/airflow}/utils/cli_action_loggers.py | 0 .../src/airflow}/utils/code_utils.py | 0 .../src/airflow}/utils/configuration.py | 8 +- .../src/airflow}/utils/context.py | 0 .../src/airflow}/utils/dag_cycle_tester.py | 0 .../src/airflow}/utils/dag_edges.py | 0 .../src/airflow}/utils/dag_parsing_context.py | 0 .../src/airflow}/utils/dates.py | 0 .../src/airflow}/utils/db.py | 3 +- .../src/airflow}/utils/db_cleanup.py | 0 .../src/airflow}/utils/db_manager.py | 0 .../src/airflow}/utils/decorators.py | 0 .../src/airflow}/utils/deprecation_tools.py | 0 .../src/airflow}/utils/docs.py | 0 .../src/airflow}/utils/dot_renderer.py | 0 .../src/airflow}/utils/edgemodifier.py | 0 .../src/airflow}/utils/email.py | 0 .../src/airflow}/utils/entry_points.py | 0 .../src/airflow}/utils/event_scheduler.py | 0 .../src/airflow}/utils/file.py | 0 .../src/airflow}/utils/hashlib_wrapper.py | 0 .../src/airflow}/utils/helpers.py | 4 +- .../src/airflow}/utils/json.py | 0 .../src/airflow}/utils/log/__init__.py | 0 .../src/airflow}/utils/log/action_logger.py | 0 .../src/airflow}/utils/log/colored_log.py | 0 .../utils/log/file_processor_handler.py | 0 .../airflow}/utils/log/file_task_handler.py | 0 .../src/airflow}/utils/log/json_formatter.py | 0 .../src/airflow}/utils/log/log_reader.py | 0 .../src/airflow}/utils/log/logging_mixin.py | 0 .../utils/log/non_caching_file_handler.py | 0 .../log/task_handler_with_custom_formatter.py | 0 .../src/airflow}/utils/log/timezone_aware.py | 0 .../src/airflow}/utils/mixins.py | 0 .../src/airflow}/utils/module_loading.py | 0 .../src/airflow}/utils/net.py | 0 .../src/airflow}/utils/operator_helpers.py | 0 .../src/airflow}/utils/operator_resources.py | 0 .../src/airflow}/utils/orm_event_handlers.py | 0 .../src/airflow}/utils/platform.py | 0 .../src/airflow}/utils/process_utils.py | 0 .../utils/providers_configuration_loader.py | 0 .../src/airflow}/utils/retries.py | 0 .../src/airflow}/utils/scheduler_health.py | 0 .../src/airflow}/utils/serve_logs.py | 0 .../src/airflow}/utils/session.py | 0 .../src/airflow}/utils/setup_teardown.py | 0 .../src/airflow}/utils/singleton.py | 0 .../src/airflow}/utils/sqlalchemy.py | 0 .../src/airflow}/utils/state.py | 0 .../src/airflow}/utils/strings.py | 0 .../src/airflow}/utils/task_group.py | 0 .../airflow}/utils/task_instance_session.py | 0 .../src/airflow}/utils/timeout.py | 0 .../src/airflow}/utils/timezone.py | 0 .../src/airflow}/utils/trigger_rule.py | 0 .../src/airflow}/utils/types.py | 0 .../src/airflow}/utils/warnings.py | 0 .../src/airflow}/utils/weight_rule.py | 0 .../src/airflow}/utils/xcom.py | 0 .../src/airflow}/utils/yaml.py | 1 + .../src/airflow}/version.py | 0 {tests => airflow-core/tests}/conftest.py | 11 +- .../tests}/deprecations_ignore.yml | 0 .../tests/integration}/__init__.py | 7 +- .../tests/integration/cli}/__init__.py | 0 .../integration/cli/commands}/__init__.py | 0 .../cli/commands/test_celery_command.py | 0 .../tests/integration/executors}/__init__.py | 0 .../executors/test_celery_executor.py | 0 .../tests/integration/security}/__init__.py | 0 .../integration/security/test_kerberos.py | 0 .../tests/system/__init__.py | 19 +- .../tests}/system/conftest.py | 0 .../tests/system/core}/__init__.py | 0 .../example_external_task_child_deferrable.py | 0 ...example_external_task_parent_deferrable.py | 0 .../tests}/system/example_empty.py | 0 airflow-core/tests/unit/__init__.py | 17 + .../tests/unit/always}/__init__.py | 0 .../tests/unit}/always/test_connection.py | 8 +- .../tests/unit}/always/test_example_dags.py | 22 +- .../tests/unit}/always/test_pandas.py | 0 .../unit}/always/test_project_structure.py | 29 +- .../unit}/always/test_providers_manager.py | 5 +- .../tests/unit}/always/test_secrets.py | 0 .../unit}/always/test_secrets_backends.py | 0 .../always/test_secrets_local_filesystem.py | 0 .../tests/unit/api}/__init__.py | 0 .../tests/unit/api}/common/__init__.py | 0 .../unit}/api/common/test_airflow_health.py | 0 .../tests/unit}/api/common/test_mark_tasks.py | 0 .../tests/unit/api_fastapi}/__init__.py | 0 .../tests/unit/api_fastapi/auth}/__init__.py | 0 .../api_fastapi/auth/managers}/__init__.py | 0 .../auth/managers/simple}/__init__.py | 0 .../auth/managers/simple/conftest.py | 0 .../auth/managers/simple/routes}/__init__.py | 0 .../auth/managers/simple/routes/test_login.py | 0 .../managers/simple/services}/__init__.py | 0 .../managers/simple/services/test_login.py | 0 .../simple/test_simple_auth_manager.py | 0 .../auth/managers/simple/test_user.py | 0 .../auth/managers/test_base_auth_manager.py | 0 .../unit}/api_fastapi/auth/test_tokens.py | 0 .../unit/api_fastapi/common}/__init__.py | 0 .../api_fastapi/common/test_exceptions.py | 0 .../tests/unit}/api_fastapi/conftest.py | 1 - .../unit/api_fastapi/core_api}/__init__.py | 0 .../api_fastapi/core_api/routes}/__init__.py | 0 .../core_api/routes/public}/__init__.py | 0 .../core_api/routes/public/test_assets.py | 0 .../core_api/routes/public/test_auth.py | 0 .../core_api/routes/public/test_backfills.py | 0 .../core_api/routes/public/test_config.py | 0 .../routes/public/test_connections.py | 0 .../routes/public/test_dag_parsing.py | 18 +- .../core_api/routes/public/test_dag_report.py | 0 .../core_api/routes/public/test_dag_run.py | 2 +- .../routes/public/test_dag_sources.py | 6 +- .../core_api/routes/public/test_dag_stats.py | 0 .../core_api/routes/public/test_dag_tags.py | 0 .../routes/public/test_dag_versions.py | 0 .../routes/public/test_dag_warning.py | 0 .../core_api/routes/public/test_dags.py | 0 .../core_api/routes/public/test_event_logs.py | 0 .../routes/public/test_extra_links.py | 0 .../routes/public/test_import_error.py | 0 .../core_api/routes/public/test_job.py | 0 .../core_api/routes/public/test_log.py | 0 .../core_api/routes/public/test_monitor.py | 0 .../core_api/routes/public/test_plugins.py | 0 .../core_api/routes/public/test_pools.py | 0 .../core_api/routes/public/test_providers.py | 0 .../routes/public/test_task_instances.py | 1 - .../core_api/routes/public/test_tasks.py | 0 .../core_api/routes/public/test_variables.py | 0 .../core_api/routes/public/test_version.py | 0 .../core_api/routes/public/test_xcom.py | 2 +- .../core_api/routes/test_routes.py | 2 - .../core_api/routes/ui}/__init__.py | 0 .../core_api/routes/ui/test_assets.py | 0 .../core_api/routes/ui/test_auth.py | 0 .../core_api/routes/ui/test_backfills.py | 0 .../core_api/routes/ui/test_config.py | 1 - .../core_api/routes/ui/test_connections.py | 0 .../core_api/routes/ui/test_dags.py | 2 +- .../core_api/routes/ui/test_dashboard.py | 0 .../core_api/routes/ui/test_dependencies.py | 0 .../core_api/routes/ui/test_grid.py | 0 .../core_api/routes/ui/test_structure.py | 0 .../api_fastapi/core_api/test_security.py | 0 .../api_fastapi/execution_api}/__init__.py | 0 .../api_fastapi/execution_api/conftest.py | 0 .../execution_api/routes}/__init__.py | 0 .../execution_api/routes/test_asset_events.py | 0 .../execution_api/routes/test_assets.py | 0 .../execution_api/routes/test_connections.py | 0 .../execution_api/routes/test_dag_runs.py | 0 .../execution_api/routes/test_health.py | 0 .../routes/test_task_instances.py | 6 - .../execution_api/routes/test_variables.py | 0 .../execution_api/routes/test_xcoms.py | 0 .../api_fastapi/execution_api/test_app.py | 1 - .../tests/unit}/api_fastapi/test_app.py | 0 .../tests/unit/assets}/__init__.py | 0 .../tests/unit}/assets/test_evaluation.py | 0 .../tests/unit}/assets/test_manager.py | 2 +- .../tests/unit/callbacks}/__init__.py | 0 .../unit}/callbacks/test_callback_requests.py | 0 .../tests/unit/charts}/__init__.py | 0 .../tests/unit}/charts/conftest.py | 0 .../unit}/charts/helm_template_generator.py | 2 +- .../tests/unit}/charts/log_groomer.py | 2 +- .../tests/unit}/cli/__init__.py | 0 .../tests/unit/cli/api}/__init__.py | 0 .../tests/unit}/cli/commands/__init__.py | 0 .../unit}/cli/commands/_common_cli_classes.py | 0 .../cli/commands/local_commands}/__init__.py | 0 .../local_commands/test_api_server_command.py | 2 +- .../test_cheat_sheet_command.py | 0 .../test_dag_processor_command.py | 0 .../local_commands/test_db_command.py | 1 - .../local_commands/test_info_command.py | 0 .../local_commands/test_kerberos_command.py | 0 .../local_commands/test_plugins_command.py | 20 +- .../test_rotate_fernet_key_command.py | 0 .../local_commands/test_scheduler_command.py | 0 .../local_commands/test_standalone_command.py | 0 .../local_commands/test_triggerer_command.py | 0 .../cli/commands/remote_commands}/__init__.py | 0 .../remote_commands/test_asset_command.py | 0 .../remote_commands/test_backfill_command.py | 0 .../remote_commands/test_config_command.py | 0 .../test_connection_command.py | 4 +- .../remote_commands/test_dag_command.py | 3 +- .../remote_commands/test_jobs_command.py | 0 .../remote_commands/test_pool_command.py | 0 .../remote_commands/test_task_command.py | 3 +- .../remote_commands/test_variable_command.py | 0 .../remote_commands/test_version_command.py | 0 .../cli/commands/test_legacy_commands.py | 0 .../tests/unit}/cli/conftest.py | 0 .../tests/unit}/cli/test_cli_parser.py | 14 +- .../tests/unit}/cluster_policies/__init__.py | 0 .../tests/unit/config_templates}/__init__.py | 0 .../unit}/config_templates/deprecated.cfg | 0 .../unit}/config_templates/deprecated_cmd.cfg | 0 .../config_templates/deprecated_secret.cfg | 0 .../tests/unit}/config_templates/empty.cfg | 0 .../unit}/config_templates/requirements.txt | 0 .../tests/unit/core}/__init__.py | 0 .../tests/unit}/core/test_airflow_module.py | 0 .../tests/unit}/core/test_configuration.py | 13 +- .../tests/unit}/core/test_core.py | 0 .../unit}/core/test_example_dags_system.py | 0 .../tests/unit}/core/test_exceptions.py | 0 .../unit}/core/test_impersonation_tests.py | 0 .../tests/unit}/core/test_logging_config.py | 0 .../tests/unit}/core/test_otel_logger.py | 0 .../tests/unit}/core/test_otel_tracer.py | 0 .../tests/unit}/core/test_policies.py | 0 .../tests/unit}/core/test_sentry.py | 8 +- .../tests/unit}/core/test_settings.py | 0 .../unit}/core/test_sqlalchemy_config.py | 2 +- .../tests/unit}/core/test_stats.py | 8 +- .../tests/unit/dag_processing}/__init__.py | 0 .../unit/dag_processing/bundles}/__init__.py | 0 .../unit}/dag_processing/bundles/test_base.py | 1 - .../bundles/test_dag_bundle_manager.py | 3 +- .../unit}/dag_processing/bundles/test_git.py | 0 .../dag_processing/bundles/test_local.py | 0 .../unit}/dag_processing/test_collection.py | 3 +- .../unit}/dag_processing/test_manager.py | 6 +- .../unit}/dag_processing/test_processor.py | 0 .../tests/unit}/dags/.airflowignore | 0 .../tests/unit}/dags/.airflowignore_glob | 0 .../tests/unit}/dags/.gitignore | 0 .../tests/unit}/dags/README.md | 0 .../tests/unit/dags}/__init__.py | 0 .../tests/unit}/dags/no_dags.py | 0 .../tests/unit}/dags/subdir1/.airflowignore | 0 .../tests/unit/dags/subdir1}/__init__.py | 0 .../unit}/dags/subdir1/test_ignore_this.py | 0 .../unit}/dags/subdir2/.airflowignore_glob | 0 .../tests/unit/dags/subdir2}/__init__.py | 0 .../unit/dags/subdir2/subdir3}/__init__.py | 0 .../dags/subdir2/subdir3/test_nested_dag.py | 0 .../dags/subdir2/test_dont_ignore_this.py | 0 .../tests/unit}/dags/test_assets.py | 0 ...test_backfill_with_upstream_failed_task.py | 0 .../unit}/dags/test_cli_triggered_dags.py | 0 .../dags/test_dag_for_db_queries_counter.py | 0 .../unit}/dags/test_dag_parsing_context.py | 0 .../tests/unit}/dags/test_dag_warnings.py | 0 .../tests/unit}/dags/test_dag_with_no_tags.py | 0 .../unit}/dags/test_dag_xcom_openlineage.py | 0 .../unit}/dags/test_dagrun_fast_follow.py | 0 .../unit}/dags/test_default_impersonation.py | 0 .../tests/unit}/dags/test_double_trigger.py | 0 .../unit}/dags/test_example_bash_operator.py | 0 ...st_external_task_sensor_check_existense.py | 2 +- .../tests/unit}/dags/test_failing.py | 0 .../unit}/dags/test_future_start_date.py | 0 .../unit}/dags/test_heartbeat_failed_fast.py | 0 .../tests/unit}/dags/test_impersonation.py | 0 .../tests/unit}/dags/test_imports.py | 10 +- .../tests/unit}/dags/test_invalid_cron.py | 0 .../tests/unit}/dags/test_invalid_dup_task.py | 0 .../tests/unit}/dags/test_invalid_param.py | 0 .../tests/unit}/dags/test_invalid_param2.py | 2 +- .../tests/unit}/dags/test_invalid_param3.py | 2 +- .../tests/unit}/dags/test_invalid_param4.py | 2 +- .../tests/unit}/dags/test_latest_runs.py | 0 .../tests/unit}/dags/test_logging_in_dag.py | 3 +- .../tests/unit}/dags/test_mapped_classic.py | 0 .../tests/unit}/dags/test_mapped_taskflow.py | 0 .../tests/unit}/dags/test_mark_state.py | 0 .../tests/unit}/dags/test_miscellaneous.py | 0 .../tests/unit}/dags/test_missing_owner.py | 0 .../tests/unit}/dags/test_multiple_dags.py | 0 .../tests/unit}/dags/test_no_impersonation.py | 0 .../unit}/dags/test_on_failure_callback.py | 0 .../tests/unit}/dags/test_on_kill.py | 0 .../tests/unit}/dags/test_only_empty_tasks.py | 0 .../unit}/dags/test_openlineage_execution.py | 0 .../tests/unit}/dags/test_parsing_context.py | 0 .../tests/unit}/dags/test_scheduler_dags.py | 0 .../tests/unit}/dags/test_sensor.py | 0 .../unit}/dags/test_task_view_type_check.py | 0 .../tests/unit}/dags/test_valid_param.py | 2 +- .../tests/unit}/dags/test_valid_param2.py | 2 +- .../unit}/dags/test_with_non_default_owner.py | 0 .../dags/test_zip/file_no_airflow_dag.py | 0 .../tests/unit}/dags/test_zip/test_zip.py | 0 .../test_zip/test_zip_module}/__init__.py | 0 .../dags/test_zip/test_zip_module/test.py | 0 .../tests/unit}/dags_corrupted/README.md | 0 .../tests/unit/dags_corrupted}/__init__.py | 0 .../test_impersonation_custom.py | 0 .../dags_corrupted/test_nonstring_owner.py | 0 .../unit/dags_with_system_exit}/__init__.py | 0 .../dags_with_system_exit/a_system_exit.py | 0 .../b_test_scheduler_dags.py | 0 .../dags_with_system_exit/c_system_exit.py | 0 .../tests/unit/datasets}/__init__.py | 0 .../tests/unit}/datasets/test_dataset.py | 0 .../tests/unit/decorators}/__init__.py | 0 .../tests/unit}/decorators/test_bash.py | 9 - .../decorators/test_branch_external_python.py | 0 .../unit}/decorators/test_branch_python.py | 0 .../decorators/test_branch_virtualenv.py | 0 .../tests/unit}/decorators/test_condition.py | 0 .../unit}/decorators/test_external_python.py | 0 .../tests/unit}/decorators/test_mapped.py | 2 +- .../decorators/test_python_virtualenv.py | 0 .../tests/unit}/decorators/test_sensor.py | 0 .../unit}/decorators/test_setup_teardown.py | 0 .../unit}/decorators/test_short_circuit.py | 0 .../tests/unit}/decorators/test_task_group.py | 0 .../tests/unit}/executors/.gitignore | 0 .../tests/unit}/executors/__init__.py | 0 .../unit}/executors/test_base_executor.py | 0 .../unit}/executors/test_debug_executor.py | 0 .../unit}/executors/test_executor_loader.py | 46 +- .../unit}/executors/test_executor_utils.py | 0 .../unit}/executors/test_local_executor.py | 0 .../executors/test_sequential_executor.py | 0 .../tests/unit}/hooks/__init__.py | 0 .../tests/unit}/hooks/test_base.py | 0 .../tests/unit/io}/__init__.py | 0 .../tests/unit}/io/test_path.py | 0 .../tests/unit}/io/test_wrapper.py | 0 .../tests/unit}/jobs/__init__.py | 0 .../tests/unit}/jobs/test_base_job.py | 4 +- .../tests/unit}/jobs/test_scheduler_job.py | 33 +- .../tests/unit}/jobs/test_triggerer_job.py | 0 .../tests/unit}/lineage/__init__.py | 0 .../tests/unit}/lineage/test_hook.py | 0 .../tests/unit}/lineage/test_lineage.py | 2 +- .../tests/unit}/listeners/__init__.py | 0 .../tests/unit}/listeners/asset_listener.py | 0 .../tests/unit}/listeners/class_listener.py | 0 .../listeners/dag_import_error_listener.py | 0 .../tests/unit}/listeners/dag_listener.py | 0 .../tests/unit}/listeners/empty_listener.py | 0 .../unit}/listeners/file_write_listener.py | 0 .../tests/unit}/listeners/full_listener.py | 0 .../unit}/listeners/lifecycle_listener.py | 0 .../tests/unit}/listeners/partial_listener.py | 0 .../tests/unit}/listeners/slow_listener.py | 0 .../unit}/listeners/test_asset_listener.py | 2 +- .../tests/unit}/listeners/test_listeners.py | 4 +- .../unit}/listeners/throwing_listener.py | 0 .../unit}/listeners/very_slow_listener.py | 0 .../tests/unit}/listeners/xcom_listener.py | 0 .../tests/unit}/macros/__init__.py | 0 .../tests/unit}/models/__init__.py | 0 .../tests/unit}/models/test_asset.py | 0 .../tests/unit}/models/test_backfill.py | 0 .../tests/unit}/models/test_base.py | 0 .../tests/unit}/models/test_baseoperator.py | 3 +- .../tests/unit}/models/test_cleartasks.py | 11 +- .../tests/unit}/models/test_connection.py | 0 .../tests/unit}/models/test_dag.py | 17 +- .../tests/unit}/models/test_dag_version.py | 0 .../tests/unit}/models/test_dagbag.py | 14 +- .../tests/unit}/models/test_dagcode.py | 1 - .../tests/unit}/models/test_dagrun.py | 8 +- .../tests/unit}/models/test_dagwarning.py | 1 - .../tests/unit}/models/test_deadline.py | 0 .../tests/unit}/models/test_mappedoperator.py | 5 +- .../tests/unit}/models/test_pool.py | 0 .../unit}/models/test_renderedtifields.py | 0 .../tests/unit}/models/test_serialized_dag.py | 1 - .../tests/unit}/models/test_taskinstance.py | 15 +- .../tests/unit}/models/test_taskmap.py | 0 .../tests/unit}/models/test_timestamp.py | 0 .../tests/unit}/models/test_trigger.py | 2 +- .../tests/unit}/models/test_variable.py | 1 - .../tests/unit}/models/test_xcom.py | 2 +- .../tests/unit}/models/test_xcom_arg.py | 0 .../tests/unit/notifications}/__init__.py | 0 .../unit}/notifications/test_basenotifier.py | 0 .../unit}/notifications/test_notifier.txt | 0 .../tests/unit}/plugins/__init__.py | 0 .../unit}/plugins/priority_weight_strategy.py | 2 +- .../tests/unit}/plugins/test_plugin.py | 4 +- .../tests/unit}/plugins/test_plugin_ignore.py | 0 .../unit}/plugins/test_plugins_manager.py | 7 +- .../tests/unit/secrets}/__init__.py | 0 .../tests/unit}/secrets/test_cache.py | 0 .../tests/unit}/security/__init__.py | 0 .../tests/unit}/security/test_kerberos.py | 0 .../tests/unit}/sensors/__init__.py | 0 .../tests/unit}/sensors/test_base.py | 1 - .../sensors/test_external_task_sensor.py | 2 +- .../tests/unit}/sensors/test_filesystem.py | 0 .../tests/unit}/serialization/__init__.py | 0 .../serialization/serializers/__init__.py | 0 .../serializers/test_serializers.py | 0 .../serialization/test_dag_serialization.py | 53 +- .../tests/unit}/serialization/test_serde.py | 41 +- .../serialization/test_serialized_objects.py | 15 +- .../tests/unit/task}/__init__.py | 0 .../tests/unit}/task/conftest.py | 0 .../tests/unit/testconfig}/__init__.py | 0 .../tests/unit/testconfig/conf}/__init__.py | 1 - .../unit}/testconfig/conf/core-with-trash.xml | 0 .../unit}/testconfig/conf/emr-core-site.xml | 0 .../unit}/testconfig/conf/ha-core-site.xml | 0 .../testconfig/conf/ha-noport-hdfs-site.xml | 0 .../conf/ha-noport-trash-hdfs-site.xml | 0 .../testconfig/conf/ha-port-hdfs-site.xml | 0 .../testconfig/conf/non-ha-port-core-site.xml | 0 .../tests/unit/ti_deps}/__init__.py | 0 .../tests/unit/ti_deps/contexts}/__init__.py | 0 .../tests/unit/ti_deps/deps}/__init__.py | 0 .../tests/unit}/ti_deps/deps/fake_models.py | 0 .../deps/test_dag_ti_slots_available_dep.py | 0 .../ti_deps/deps/test_dag_unpaused_dep.py | 0 .../ti_deps/deps/test_dagrun_exists_dep.py | 0 .../deps/test_mapped_task_upstream_dep.py | 0 .../deps/test_not_in_retry_period_dep.py | 0 .../deps/test_not_previously_skipped_dep.py | 0 .../deps/test_pool_slots_available_dep.py | 0 .../ti_deps/deps/test_prev_dagrun_dep.py | 0 .../deps/test_ready_to_reschedule_dep.py | 0 .../deps/test_runnable_exec_date_dep.py | 0 .../ti_deps/deps/test_task_concurrency.py | 0 .../ti_deps/deps/test_task_not_running_dep.py | 0 .../ti_deps/deps/test_trigger_rule_dep.py | 1 - .../ti_deps/deps/test_valid_state_dep.py | 0 .../tests/unit/timetables/__init__.py | 16 + .../unit}/timetables/test_assets_timetable.py | 0 .../timetables/test_continuous_timetable.py | 0 .../unit}/timetables/test_events_timetable.py | 0 .../timetables/test_interval_timetable.py | 6 +- .../timetables/test_trigger_timetable.py | 0 .../timetables/test_workday_timetable.py | 6 +- .../tests/unit/utils}/__init__.py | 0 .../tests/unit/utils/log}/__init__.py | 0 .../tests/unit}/utils/log/test_colored_log.py | 0 .../utils/log/test_file_processor_handler.py | 0 .../unit}/utils/log/test_json_formatter.py | 0 .../tests/unit}/utils/log/test_log_reader.py | 3 +- .../tests/unit}/utils/test_cli_util.py | 0 .../tests/unit}/utils/test_config.py | 0 .../tests/unit}/utils/test_dag_cycle.py | 2 +- .../tests/unit}/utils/test_db.py | 2 +- .../tests/unit}/utils/test_db_cleanup.py | 6 +- .../tests/unit}/utils/test_db_manager.py | 0 .../tests/unit}/utils/test_decorators.py | 0 .../tests/unit}/utils/test_docs.py | 0 .../tests/unit}/utils/test_dot_renderer.py | 0 .../tests/unit}/utils/test_edgemodifier.py | 0 .../tests/unit}/utils/test_email.py | 4 +- .../tests/unit}/utils/test_entry_points.py | 0 .../tests/unit}/utils/test_event_scheduler.py | 0 .../tests/unit}/utils/test_file.py | 4 +- .../tests/unit}/utils/test_helpers.py | 1 - .../tests/unit}/utils/test_json.py | 0 .../tests/unit}/utils/test_log_handlers.py | 1 - .../tests/unit}/utils/test_logging_mixin.py | 4 +- .../tests/unit}/utils/test_module_loading.py | 0 .../tests/unit}/utils/test_net.py | 8 +- .../unit}/utils/test_operator_helpers.py | 0 .../unit}/utils/test_operator_resources.py | 0 .../unit}/utils/test_orm_event_handlers.py | 3 +- ...preexisting_python_virtualenv_decorator.py | 0 .../tests/unit}/utils/test_process_utils.py | 0 .../tests/unit}/utils/test_retries.py | 1 - .../unit}/utils/test_scheduler_health.py | 0 .../tests/unit}/utils/test_serve_logs.py | 0 .../tests/unit}/utils/test_session.py | 0 .../tests/unit}/utils/test_singleton.py | 0 .../tests/unit}/utils/test_sqlalchemy.py | 1 - .../tests/unit}/utils/test_state.py | 2 +- .../tests/unit}/utils/test_task_group.py | 9 +- ...test_task_handler_with_custom_formatter.py | 0 .../tests/unit}/utils/test_timezone.py | 0 .../tests/unit}/utils/test_trigger_rule.py | 0 .../tests/unit}/utils/test_types.py | 0 .../tests/unit}/utils/test_warnings.py | 0 .../tests/unit}/utils/test_weight_rule.py | 0 clients/README.md | 4 +- contributing-docs/07_local_virtualenv.rst | 93 ++- contributing-docs/08_static_code_checks.rst | 2 +- contributing-docs/09_testing.rst | 4 +- contributing-docs/10_working_with_git.rst | 2 +- ...ages.rst => 11_provider_distributions.rst} | 167 ++---- .../12_airflow_dependencies_and_extras.rst | 4 +- contributing-docs/README.rst | 4 +- contributing-docs/testing/helm_unit_tests.rst | 2 +- .../testing/python_client_tests.rst | 2 +- contributing-docs/testing/system_tests.rst | 4 +- .../testing/testing_packages.rst | 66 +- contributing-docs/testing/unit_tests.rst | 20 +- ...S.md => PROVIDER_DISTRIBUTIONS_DETAILS.md} | 30 +- dev/README.md | 25 +- dev/README_RELEASE_AIRFLOW.md | 14 +- ...ACKAGES.md => README_RELEASE_PROVIDERS.md} | 104 ++-- dev/README_RELEASE_PYTHON_CLIENT.md | 8 +- dev/airflow-github | 1 - dev/breeze/README.md | 2 +- dev/breeze/doc/02_customizing.rst | 2 +- dev/breeze/doc/05_test_commands.rst | 4 +- .../doc/09_release_management_tasks.rst | 86 +-- dev/breeze/doc/10_advanced_breeze_topics.rst | 2 +- dev/breeze/doc/ci/02_images.md | 4 +- dev/breeze/doc/ci/05_workflows.md | 70 +-- .../doc/images/output-commands-hash.txt | 8 +- dev/breeze/doc/images/output_build-docs.svg | 4 +- dev/breeze/doc/images/output_build-docs.txt | 2 +- .../doc/images/output_prod-image_build.svg | 74 +-- .../doc/images/output_prod-image_build.txt | 2 +- .../doc/images/output_release-management.svg | 22 +- .../doc/images/output_release-management.txt | 2 +- ...elease-management_generate-constraints.svg | 2 +- ...elease-management_generate-constraints.txt | 2 +- ...ement_generate-issue-content-providers.txt | 2 +- ...agement_install-provider-distributions.svg | 320 ++++++++++ ...agement_install-provider-distributions.txt | 1 + ...e-management_install-provider-packages.svg | 320 ---------- ...e-management_install-provider-packages.txt | 1 - ...nagement_prepare-airflow-distributions.svg | 124 ++++ ...nagement_prepare-airflow-distributions.txt | 1 + ...ase-management_prepare-airflow-package.svg | 124 ---- ...ase-management_prepare-airflow-package.txt | 1 - ...agement_prepare-provider-distributions.svg | 240 ++++++++ ...agement_prepare-provider-distributions.txt | 1 + ...agement_prepare-provider-documentation.txt | 2 +- ...e-management_prepare-provider-packages.svg | 240 -------- ...e-management_prepare-provider-packages.txt | 1 - ...lease-management_prepare-python-client.svg | 2 +- ...lease-management_prepare-python-client.txt | 2 +- ...agement_prepare-task-sdk-distributions.svg | 124 ++++ ...agement_prepare-task-sdk-distributions.txt | 1 + ...se-management_prepare-task-sdk-package.svg | 124 ---- ...se-management_prepare-task-sdk-package.txt | 1 - ...output_release-management_publish-docs.svg | 2 +- ...output_release-management_publish-docs.txt | 2 +- ...release-management_release-prod-images.svg | 2 +- ...release-management_release-prod-images.txt | 2 +- ...nagement_verify-provider-distributions.svg | 336 +++++++++++ ...nagement_verify-provider-distributions.txt | 1 + ...se-management_verify-provider-packages.svg | 332 ----------- ...se-management_verify-provider-packages.txt | 1 - ...utput_setup_check-all-params-in-groups.svg | 10 +- ...utput_setup_check-all-params-in-groups.txt | 2 +- ...output_setup_regenerate-command-images.svg | 58 +- ...output_setup_regenerate-command-images.txt | 2 +- dev/breeze/doc/images/output_shell.svg | 80 +-- dev/breeze/doc/images/output_shell.txt | 2 +- .../doc/images/output_start-airflow.svg | 148 ++--- .../doc/images/output_start-airflow.txt | 2 +- .../doc/images/output_testing_core-tests.svg | 28 +- .../doc/images/output_testing_core-tests.txt | 2 +- .../images/output_testing_providers-tests.svg | 50 +- .../images/output_testing_providers-tests.txt | 2 +- dev/breeze/pyproject.toml | 2 +- dev/breeze/src/airflow_breeze/breeze.py | 4 +- .../airflow_breeze/commands/ci_commands.py | 8 +- .../commands/ci_image_commands.py | 20 +- .../airflow_breeze/commands/common_options.py | 16 +- .../common_package_installation_options.py | 10 +- .../commands/developer_commands.py | 61 +- .../commands/developer_commands_config.py | 10 +- .../commands/kubernetes_commands.py | 2 +- .../airflow_breeze/commands/main_command.py | 10 +- .../commands/minor_release_command.py | 4 +- .../commands/production_image_commands.py | 42 +- .../production_image_commands_config.py | 4 +- .../commands/release_candidate_command.py | 38 +- .../commands/release_command.py | 6 +- .../commands/release_management_commands.py | 564 +++++++++--------- .../release_management_commands_config.py | 42 +- .../airflow_breeze/commands/sbom_commands.py | 12 +- .../airflow_breeze/commands/setup_commands.py | 32 +- .../commands/testing_commands.py | 28 +- .../commands/testing_commands_config.py | 4 +- .../src/airflow_breeze/global_constants.py | 22 +- .../airflow_breeze/params/build_ci_params.py | 4 +- .../params/build_prod_params.py | 14 +- .../src/airflow_breeze/params/shell_params.py | 44 +- ..._packages.py => provider_distributions.py} | 46 +- .../provider_documentation.py | 143 +++-- .../provider_issue_TEMPLATE.md.jinja2 | 4 +- .../PROVIDER_INDEX_TEMPLATE.rst.jinja2 | 4 +- .../PROVIDER_README_TEMPLATE.rst.jinja2 | 2 +- .../utils/add_back_references.py | 2 +- .../src/airflow_breeze/utils/black_utils.py | 4 +- dev/breeze/src/airflow_breeze/utils/cache.py | 12 +- dev/breeze/src/airflow_breeze/utils/cdxgen.py | 16 +- .../utils/docker_command_utils.py | 23 +- .../airflow_breeze/utils/docs_publisher.py | 4 +- dev/breeze/src/airflow_breeze/utils/github.py | 6 +- .../airflow_breeze/utils/kubernetes_utils.py | 22 +- .../utils/mark_image_as_refreshed.py | 4 +- .../airflow_breeze/utils/md5_build_check.py | 15 +- .../src/airflow_breeze/utils/packages.py | 84 +-- .../src/airflow_breeze/utils/path_utils.py | 166 +++--- .../utils/provider_dependencies.py | 4 +- .../utils/publish_docs_helpers.py | 6 +- .../src/airflow_breeze/utils/reproducible.py | 16 +- .../src/airflow_breeze/utils/run_tests.py | 72 +-- .../src/airflow_breeze/utils/run_utils.py | 18 +- .../airflow_breeze/utils/selective_checks.py | 112 ++-- .../src/airflow_breeze/utils/versions.py | 4 +- .../airflow_breeze/utils/virtualenv_utils.py | 6 +- .../src/airflow_breeze/utils/visuals.py | 10 +- .../tests/test_find_airflow_directory.py | 8 +- dev/breeze/tests/test_packages.py | 34 +- .../tests/test_pytest_args_for_test_types.py | 93 +-- dev/breeze/tests/test_selective_checks.py | 75 +-- dev/check_files.py | 15 +- dev/refresh_images.sh | 10 +- dev/templates/vote_email.j2 | 6 +- devel-common/pyproject.toml | 2 - devel-common/src/tests_common/__init__.py | 2 +- .../src/tests_common/pytest_plugin.py | 56 +- .../src/tests_common/test_utils/asserts.py | 3 +- .../test_utils/azure_system_helpers.py | 1 + .../src/tests_common/test_utils/db.py | 3 +- .../test_utils/gcp_system_helpers.py | 13 +- .../src/tests_common/test_utils/mapping.py | 3 +- .../tests_common/test_utils/mock_operators.py | 1 + .../src/tests_common/test_utils/paths.py | 24 +- .../test_utils/perf/perf_kit/__init__.py | 24 +- .../tests_common/test_utils/system_tests.py | 3 +- .../test_utils/system_tests_class.py | 1 + .../tests_common/test_utils/version_compat.py | 3 +- docker-context-files/.README.md | 2 +- .../test_docker_compose_quick_start.py | 2 +- docs/.gitignore | 1 + docs/README.rst | 6 +- .../howto/create-custom-providers.rst | 10 +- docs/apache-airflow-providers/index.rst | 18 +- .../apache-airflow-providers/packages-ref.rst | 2 +- docs/apache-airflow/img/airflow_erd.sha256 | 1 - docs/build_docs.py | 21 +- docs/conf.py | 73 ++- docs/docker-stack/build-arg-ref.rst | 98 +-- docs/docker-stack/build.rst | 8 +- docs/docker-stack/changelog.rst | 1 + .../restricted/restricted_environments.sh | 2 +- docs/exts/docs_build/code_utils.py | 9 +- docs/exts/docs_build/docs_builder.py | 66 +- docs/exts/docs_build/fetch_inventories.py | 4 +- docs/exts/docs_build/lint_checks.py | 2 +- docs/exts/exampleinclude.py | 3 + .../includes/providers-configurations-ref.rst | 2 +- docs/exts/provider_yaml_utils.py | 2 +- docs/exts/redirects.py | 2 +- docs/spelling_wordlist.txt | 1 + generated/PYPI_README.md | 4 +- generated/provider_dependencies.json | 5 +- hatch_build.py | 339 ++--------- helm_tests/airflow_aux/test_airflow_common.py | 2 +- helm_tests/airflow_aux/test_annotations.py | 2 +- .../airflow_aux/test_basic_helm_chart.py | 2 +- .../test_celery_kubernetes_executor.py | 2 +- helm_tests/airflow_aux/test_cleanup_pods.py | 2 +- helm_tests/airflow_aux/test_configmap.py | 2 +- .../airflow_aux/test_container_lifecycle.py | 2 +- .../airflow_aux/test_create_user_job.py | 2 +- .../airflow_aux/test_extra_env_env_from.py | 2 +- .../test_logs_persistent_volume_claim.py | 2 +- .../airflow_aux/test_migrate_database_job.py | 2 +- .../airflow_aux/test_pod_launcher_role.py | 2 +- .../airflow_aux/test_pod_template_file.py | 2 +- helm_tests/airflow_aux/test_remote_logging.py | 2 +- helm_tests/airflow_core/test_api_server.py | 2 +- helm_tests/airflow_core/test_dag_processor.py | 4 +- helm_tests/airflow_core/test_env.py | 2 +- helm_tests/airflow_core/test_pdb_scheduler.py | 2 +- helm_tests/airflow_core/test_scheduler.py | 4 +- helm_tests/airflow_core/test_triggerer.py | 4 +- helm_tests/airflow_core/test_worker.py | 4 +- .../test_dags_persistent_volume_claim.py | 2 +- helm_tests/other/test_flower.py | 2 +- helm_tests/other/test_git_ssh_key_secret.py | 2 +- helm_tests/other/test_git_sync_scheduler.py | 2 +- helm_tests/other/test_git_sync_triggerer.py | 2 +- helm_tests/other/test_git_sync_webserver.py | 2 +- helm_tests/other/test_git_sync_worker.py | 2 +- helm_tests/other/test_hpa.py | 2 +- helm_tests/other/test_keda.py | 2 +- helm_tests/other/test_limit_ranges.py | 2 +- helm_tests/other/test_pdb_pgbouncer.py | 2 +- helm_tests/other/test_pgbouncer.py | 2 +- helm_tests/other/test_redis.py | 2 +- helm_tests/other/test_resource_quota.py | 2 +- helm_tests/other/test_statsd.py | 2 +- .../security/test_elasticsearch_secret.py | 2 +- .../security/test_extra_configmaps_secrets.py | 2 +- helm_tests/security/test_kerberos.py | 2 +- .../test_metadata_connection_secret.py | 2 +- helm_tests/security/test_opensearch_secret.py | 2 +- helm_tests/security/test_rbac.py | 2 +- .../security/test_rbac_pod_log_reader.py | 2 +- .../test_result_backend_connection_secret.py | 2 +- helm_tests/security/test_scc_rolebinding.py | 2 +- helm_tests/security/test_security_context.py | 2 +- helm_tests/webserver/test_hpa_webserver.py | 2 +- helm_tests/webserver/test_ingress_flower.py | 2 +- helm_tests/webserver/test_ingress_web.py | 2 +- helm_tests/webserver/test_pdb_webserver.py | 2 +- helm_tests/webserver/test_webserver.py | 2 +- providers/MANAGING_PROVIDERS_LIFECYCLE.rst | 2 +- providers/airbyte/docs/changelog.rst | 2 +- providers/airbyte/docs/index.rst | 2 +- providers/alibaba/docs/changelog.rst | 2 +- providers/alibaba/docs/index.rst | 2 +- .../cloud/hooks/test_analyticdb_spark.py | 1 + .../unit/alibaba/cloud/hooks/test_oss.py | 1 + providers/amazon/README.rst | 2 +- providers/amazon/docs/changelog.rst | 2 +- providers/amazon/docs/index.rst | 4 +- providers/amazon/pyproject.toml | 1 + .../providers/amazon/get_provider_info.py | 1 + .../system/amazon/aws/example_appflow.py | 1 + .../system/amazon/aws/example_appflow_run.py | 1 + .../tests/system/amazon/aws/example_athena.py | 1 + .../amazon/aws/example_azure_blob_to_s3.py | 1 + .../tests/system/amazon/aws/example_batch.py | 1 + .../system/amazon/aws/example_bedrock.py | 1 + .../example_bedrock_retrieve_and_generate.py | 1 + .../amazon/aws/example_cloudformation.py | 1 + .../system/amazon/aws/example_comprehend.py | 1 + .../example_comprehend_document_classifier.py | 1 + .../system/amazon/aws/example_datasync.py | 1 + .../tests/system/amazon/aws/example_dms.py | 1 + .../amazon/aws/example_dms_serverless.py | 1 + .../system/amazon/aws/example_dynamodb.py | 1 + .../amazon/aws/example_dynamodb_to_s3.py | 1 + .../tests/system/amazon/aws/example_ec2.py | 1 + .../tests/system/amazon/aws/example_ecs.py | 1 + .../system/amazon/aws/example_ecs_fargate.py | 1 + .../amazon/aws/example_eks_templated.py | 1 + .../example_eks_with_fargate_in_one_step.py | 1 + .../aws/example_eks_with_fargate_profile.py | 1 + .../example_eks_with_nodegroup_in_one_step.py | 1 + .../amazon/aws/example_eks_with_nodegroups.py | 1 + .../tests/system/amazon/aws/example_emr.py | 1 + .../system/amazon/aws/example_emr_eks.py | 1 + .../aws/example_emr_notebook_execution.py | 1 + .../amazon/aws/example_emr_serverless.py | 1 + .../system/amazon/aws/example_eventbridge.py | 1 + .../system/amazon/aws/example_ftp_to_s3.py | 1 + .../system/amazon/aws/example_gcs_to_s3.py | 1 + .../amazon/aws/example_glacier_to_gcs.py | 1 + .../tests/system/amazon/aws/example_glue.py | 1 + .../amazon/aws/example_glue_data_quality.py | 1 + ...e_glue_data_quality_with_recommendation.py | 1 + .../amazon/aws/example_glue_databrew.py | 1 + .../aws/example_google_api_sheets_to_s3.py | 1 + .../aws/example_google_api_youtube_to_s3.py | 1 + .../amazon/aws/example_hive_to_dynamodb.py | 1 + .../system/amazon/aws/example_http_to_s3.py | 1 + .../aws/example_imap_attachment_to_s3.py | 1 + .../amazon/aws/example_kinesis_analytics.py | 1 + .../tests/system/amazon/aws/example_lambda.py | 1 + .../system/amazon/aws/example_local_to_s3.py | 1 + .../system/amazon/aws/example_mongo_to_s3.py | 1 + .../tests/system/amazon/aws/example_mwaa.py | 1 + .../system/amazon/aws/example_neptune.py | 1 + .../system/amazon/aws/example_quicksight.py | 1 + .../system/amazon/aws/example_rds_event.py | 1 + .../system/amazon/aws/example_rds_export.py | 1 + .../system/amazon/aws/example_rds_instance.py | 1 + .../system/amazon/aws/example_rds_snapshot.py | 1 + .../system/amazon/aws/example_redshift.py | 1 + .../aws/example_redshift_s3_transfers.py | 1 + .../tests/system/amazon/aws/example_s3.py | 1 + .../amazon/aws/example_s3_to_dynamodb.py | 1 + .../system/amazon/aws/example_s3_to_ftp.py | 1 + .../system/amazon/aws/example_s3_to_sftp.py | 1 + .../system/amazon/aws/example_s3_to_sql.py | 2 +- .../system/amazon/aws/example_sagemaker.py | 1 + .../amazon/aws/example_sagemaker_endpoint.py | 1 + .../amazon/aws/example_sagemaker_notebook.py | 1 + .../amazon/aws/example_sagemaker_pipeline.py | 1 + .../aws/example_sagemaker_unified_studio.py | 2 +- .../amazon/aws/example_salesforce_to_s3.py | 1 + .../system/amazon/aws/example_sftp_to_s3.py | 1 + .../tests/system/amazon/aws/example_sns.py | 1 + .../system/amazon/aws/example_sql_to_s3.py | 1 + .../tests/system/amazon/aws/example_sqs.py | 1 + .../amazon/aws/example_step_functions.py | 1 + .../amazon/aws/tests/test_aws_auth_manager.py | 2 +- .../tests/unit/amazon/aws/hooks/test_eks.py | 1 + .../unit/amazon/aws/links/test_athena.py | 1 + .../tests/unit/amazon/aws/links/test_batch.py | 1 + .../unit/amazon/aws/links/test_comprehend.py | 1 + .../unit/amazon/aws/links/test_datasync.py | 1 + .../tests/unit/amazon/aws/links/test_ec2.py | 1 + .../tests/unit/amazon/aws/links/test_emr.py | 1 + .../tests/unit/amazon/aws/links/test_glue.py | 1 + .../tests/unit/amazon/aws/links/test_logs.py | 1 + .../unit/amazon/aws/links/test_sagemaker.py | 1 + .../links/test_sagemaker_unified_studio.py | 1 + .../amazon/aws/links/test_step_function.py | 1 + .../unit/amazon/aws/operators/test_athena.py | 2 +- .../unit/amazon/aws/operators/test_bedrock.py | 1 + .../aws/operators/test_cloud_formation.py | 1 + .../amazon/aws/operators/test_comprehend.py | 1 + .../amazon/aws/operators/test_datasync.py | 2 +- .../unit/amazon/aws/operators/test_dms.py | 2 +- .../unit/amazon/aws/operators/test_ec2.py | 1 + .../unit/amazon/aws/operators/test_ecs.py | 1 + .../unit/amazon/aws/operators/test_eks.py | 1 + .../aws/operators/test_emr_add_steps.py | 2 +- .../aws/operators/test_emr_containers.py | 1 + .../aws/operators/test_emr_create_job_flow.py | 4 +- .../aws/operators/test_emr_modify_cluster.py | 1 + .../operators/test_emr_notebook_execution.py | 1 + .../aws/operators/test_emr_serverless.py | 1 + .../operators/test_emr_terminate_job_flow.py | 1 + .../amazon/aws/operators/test_eventbridge.py | 1 + .../unit/amazon/aws/operators/test_glacier.py | 1 + .../unit/amazon/aws/operators/test_glue.py | 1 + .../amazon/aws/operators/test_glue_crawler.py | 1 + .../aws/operators/test_glue_databrew.py | 1 + .../aws/operators/test_kinesis_analytics.py | 1 + .../aws/operators/test_lambda_function.py | 1 + .../unit/amazon/aws/operators/test_mwaa.py | 1 + .../unit/amazon/aws/operators/test_neptune.py | 1 + .../amazon/aws/operators/test_quicksight.py | 1 + .../unit/amazon/aws/operators/test_rds.py | 1 + .../aws/operators/test_redshift_cluster.py | 1 + .../aws/operators/test_redshift_data.py | 1 + .../unit/amazon/aws/operators/test_s3.py | 1 + .../aws/operators/test_sagemaker_base.py | 2 +- .../aws/operators/test_sagemaker_endpoint.py | 1 + .../test_sagemaker_endpoint_config.py | 1 + .../aws/operators/test_sagemaker_model.py | 1 + .../aws/operators/test_sagemaker_notebook.py | 1 + .../aws/operators/test_sagemaker_pipeline.py | 1 + .../operators/test_sagemaker_processing.py | 1 + .../aws/operators/test_sagemaker_training.py | 1 + .../aws/operators/test_sagemaker_transform.py | 1 + .../aws/operators/test_sagemaker_tuning.py | 1 + .../unit/amazon/aws/operators/test_sns.py | 1 + .../unit/amazon/aws/operators/test_sqs.py | 1 + .../aws/operators/test_step_function.py | 1 + .../amazon/aws/system/utils/test_helpers.py | 1 + .../unit/amazon/aws/triggers/test_bedrock.py | 1 + .../amazon/aws/triggers/test_comprehend.py | 1 + .../unit/amazon/aws/triggers/test_dms.py | 1 + .../unit/amazon/aws/triggers/test_glue.py | 1 + .../amazon/aws/triggers/test_glue_crawler.py | 1 + .../aws/triggers/test_kinesis_analytics.py | 1 + .../unit/amazon/aws/triggers/test_mwaa.py | 1 + .../triggers/test_opensearch_serverless.py | 1 + .../tests/unit/amazon/aws/waiters/test_eks.py | 1 + providers/apache/beam/README.rst | 2 +- providers/apache/beam/docs/changelog.rst | 2 +- providers/apache/beam/docs/index.rst | 4 +- .../airflow/providers/apache/beam/README.md | 4 +- .../tests/system/apache/beam/example_beam.py | 1 + .../apache/beam/example_beam_java_flink.py | 1 + .../apache/beam/example_beam_java_spark.py | 1 + .../tests/system/apache/beam/example_go.py | 1 + .../system/apache/beam/example_go_dataflow.py | 1 + .../apache/beam/example_java_dataflow.py | 1 + .../system/apache/beam/example_python.py | 1 + .../apache/beam/example_python_async.py | 1 + .../apache/beam/example_python_dataflow.py | 1 + providers/apache/cassandra/docs/changelog.rst | 2 +- providers/apache/cassandra/docs/index.rst | 2 +- providers/apache/drill/README.rst | 2 +- providers/apache/drill/docs/changelog.rst | 2 +- providers/apache/drill/docs/index.rst | 4 +- providers/apache/druid/README.rst | 2 +- providers/apache/druid/docs/changelog.rst | 2 +- providers/apache/druid/docs/index.rst | 4 +- providers/apache/flink/README.rst | 2 +- providers/apache/flink/docs/changelog.rst | 2 +- providers/apache/flink/docs/index.rst | 4 +- providers/apache/hdfs/docs/changelog.rst | 2 +- providers/apache/hdfs/docs/index.rst | 2 +- providers/apache/hive/README.rst | 2 +- providers/apache/hive/docs/changelog.rst | 2 +- providers/apache/hive/docs/index.rst | 4 +- .../tests/unit/apache/hive/hooks/test_hive.py | 6 +- .../unit/apache/hive/operators/test_hive.py | 1 + .../apache/hive/operators/test_hive_stats.py | 1 + .../hive/sensors/test_hive_partition.py | 1 + .../hive/sensors/test_metastore_partition.py | 1 + .../hive/sensors/test_named_hive_partition.py | 1 + .../hive/transfers/test_hive_to_mysql.py | 1 + .../hive/transfers/test_hive_to_samba.py | 1 + providers/apache/iceberg/docs/index.rst | 2 +- providers/apache/impala/README.rst | 2 +- providers/apache/impala/docs/changelog.rst | 2 +- providers/apache/impala/docs/index.rst | 4 +- providers/apache/kafka/README.rst | 2 +- providers/apache/kafka/docs/changelog.rst | 2 +- providers/apache/kafka/docs/index.rst | 4 +- providers/apache/kylin/docs/changelog.rst | 2 +- providers/apache/kylin/docs/index.rst | 2 +- providers/apache/livy/README.rst | 2 +- providers/apache/livy/docs/changelog.rst | 2 +- providers/apache/livy/docs/index.rst | 4 +- providers/apache/pig/docs/changelog.rst | 2 +- providers/apache/pig/docs/index.rst | 2 +- providers/apache/pinot/README.rst | 2 +- providers/apache/pinot/docs/changelog.rst | 2 +- providers/apache/pinot/docs/index.rst | 4 +- providers/apache/spark/README.rst | 2 +- providers/apache/spark/docs/changelog.rst | 2 +- providers/apache/spark/docs/index.rst | 4 +- providers/apprise/docs/changelog.rst | 2 +- providers/apprise/docs/index.rst | 2 +- .../providers/apprise/hooks/__init__.py | 5 +- .../apprise/notifications/__init__.py | 5 +- providers/arangodb/docs/changelog.rst | 2 +- providers/arangodb/docs/index.rst | 2 +- providers/asana/docs/changelog.rst | 2 +- providers/asana/docs/index.rst | 2 +- providers/atlassian/jira/docs/changelog.rst | 2 +- providers/atlassian/jira/docs/index.rst | 2 +- providers/celery/README.rst | 2 +- providers/celery/docs/changelog.rst | 2 +- providers/celery/docs/index.rst | 4 +- providers/cloudant/docs/changelog.rst | 2 +- providers/cloudant/docs/index.rst | 2 +- providers/cncf/kubernetes/docs/changelog.rst | 2 +- providers/cncf/kubernetes/docs/index.rst | 2 +- .../kubernetes/docs/kubernetes_executor.rst | 4 +- .../cncf/kubernetes/operators/test_pod.py | 3 + .../cncf/kubernetes/utils/test_pod_manager.py | 1 + providers/cohere/docs/changelog.rst | 2 +- providers/cohere/docs/index.rst | 2 +- .../providers/cohere/hooks/__init__.py | 5 +- providers/common/compat/README.rst | 2 +- providers/common/compat/docs/index.rst | 4 +- providers/common/io/README.rst | 2 +- providers/common/io/docs/changelog.rst | 2 +- providers/common/io/docs/index.rst | 4 +- providers/common/messaging/README.rst | 2 +- providers/common/messaging/docs/index.rst | 4 +- .../example_message_queue_trigger.py | 8 +- providers/common/sql/README.rst | 2 +- providers/common/sql/docs/changelog.rst | 2 +- providers/common/sql/docs/index.rst | 4 +- providers/databricks/README.rst | 2 +- providers/databricks/docs/changelog.rst | 2 +- providers/databricks/docs/index.rst | 4 +- providers/datadog/docs/changelog.rst | 2 +- providers/datadog/docs/index.rst | 2 +- providers/dbt/cloud/README.rst | 2 +- providers/dbt/cloud/docs/changelog.rst | 2 +- providers/dbt/cloud/docs/index.rst | 4 +- providers/dingding/README.rst | 2 +- providers/dingding/docs/changelog.rst | 2 +- providers/dingding/docs/index.rst | 4 +- providers/discord/README.rst | 2 +- providers/discord/docs/changelog.rst | 2 +- providers/discord/docs/index.rst | 4 +- providers/docker/README.rst | 2 +- providers/docker/docs/changelog.rst | 2 +- providers/docker/docs/index.rst | 4 +- providers/edge/README.rst | 2 +- providers/edge/docs/edge_executor.rst | 2 +- providers/edge/docs/index.rst | 4 +- providers/edge/docs/install_on_windows.rst | 2 +- .../edge/example_dags/win_notepad.py | 2 +- .../providers/edge/example_dags/win_test.py | 4 +- .../providers/edge/executors/edge_executor.py | 2 +- providers/elasticsearch/README.rst | 2 +- providers/elasticsearch/docs/changelog.rst | 2 +- providers/elasticsearch/docs/index.rst | 4 +- .../elasticsearch/log/test_es_task_handler.py | 8 +- providers/exasol/README.rst | 2 +- providers/exasol/docs/changelog.rst | 2 +- providers/exasol/docs/index.rst | 4 +- providers/fab/README.rst | 2 +- providers/fab/docs/index.rst | 4 +- .../auth_manager/api_endpoints/test_auth.py | 7 +- .../test_role_and_permission_endpoint.py | 4 +- .../api_endpoints/test_user_endpoint.py | 6 +- .../tests/unit/fab/auth_manager/conftest.py | 2 +- .../test_role_and_permission_schema.py | 1 + .../auth_manager/schemas/test_user_schema.py | 2 +- .../fab/auth_manager/test_fab_auth_manager.py | 2 +- .../unit/fab/auth_manager/test_security.py | 10 +- .../auth_manager/views/test_permissions.py | 4 +- .../fab/auth_manager/views/test_roles_list.py | 4 +- .../unit/fab/auth_manager/views/test_user.py | 4 +- .../fab/auth_manager/views/test_user_edit.py | 4 +- .../fab/auth_manager/views/test_user_stats.py | 4 +- .../fab/tests/unit/{ => fab}/decorators.py | 0 .../fab/tests/unit/fab/www/views/conftest.py | 6 +- .../www/views/test_views_custom_user_views.py | 4 +- providers/facebook/docs/changelog.rst | 2 +- providers/facebook/docs/index.rst | 2 +- providers/ftp/README.rst | 2 +- providers/ftp/docs/changelog.rst | 2 +- providers/ftp/docs/index.rst | 4 +- providers/github/docs/changelog.rst | 2 +- providers/github/docs/index.rst | 2 +- providers/google/README.rst | 2 +- providers/google/docs/changelog.rst | 2 +- providers/google/docs/index.rst | 4 +- .../tests/system/google/ads/example_ads.py | 1 + .../azure/example_azure_fileshare_to_gcs.py | 1 + .../cloud/bigquery/example_bigquery_dts.py | 1 + .../cloud/bigquery/example_bigquery_jobs.py | 1 + .../bigquery/example_bigquery_operations.py | 1 + .../bigquery/example_bigquery_queries.py | 1 + .../example_bigquery_queries_async.py | 1 + .../cloud/bigquery/example_bigquery_tables.py | 1 + .../cloud/bigquery/example_bigquery_to_gcs.py | 1 + .../bigquery/example_bigquery_transfer.py | 1 + .../google/cloud/bigtable/example_bigtable.py | 1 + .../cloud/cloud_batch/example_cloud_batch.py | 1 + .../cloud/cloud_build/example_cloud_build.py | 1 + .../example_cloud_build_trigger.py | 1 + .../cloud_functions/example_functions.py | 1 + .../example_cloud_memorystore_redis.py | 1 + .../cloud/cloud_sql/example_cloud_sql.py | 1 + .../cloud_sql/example_cloud_sql_query.py | 1 + .../cloud_sql/example_cloud_sql_query_iam.py | 1 + .../cloud_sql/example_cloud_sql_query_ssl.py | 1 + .../google/cloud/compute/example_compute.py | 1 + .../cloud/compute/example_compute_igm.py | 1 + .../cloud/compute/example_compute_ssh.py | 1 + .../compute/example_compute_ssh_os_login.py | 1 + .../compute/example_compute_ssh_parallel.py | 1 + .../example_dlp_deidentify_content.py | 1 + .../example_dlp_info_types.py | 1 + .../example_dlp_inspect_template.py | 1 + .../data_loss_prevention/example_dlp_job.py | 1 + .../example_dlp_job_trigger.py | 1 + .../dataflow/example_dataflow_template.py | 1 + .../cloud/dataflow/example_dataflow_yaml.py | 1 + .../google/cloud/dataform/example_dataform.py | 1 + .../cloud/datafusion/example_datafusion.py | 1 + .../google/cloud/dataplex/example_dataplex.py | 1 + .../dataplex/example_dataplex_catalog.py | 1 + .../cloud/dataplex/example_dataplex_dp.py | 1 + .../cloud/dataplex/example_dataplex_dq.py | 1 + .../google/cloud/dataprep/example_dataprep.py | 1 + .../cloud/dataproc/example_dataproc_batch.py | 1 + .../example_dataproc_batch_deferrable.py | 1 + .../example_dataproc_batch_persistent.py | 1 + ...cluster_create_existing_stopped_cluster.py | 1 + .../example_dataproc_cluster_deferrable.py | 1 + .../example_dataproc_cluster_diagnose.py | 1 + .../example_dataproc_cluster_generator.py | 1 + .../example_dataproc_cluster_start_stop.py | 1 + .../example_dataproc_cluster_update.py | 1 + .../cloud/dataproc/example_dataproc_flink.py | 1 + .../cloud/dataproc/example_dataproc_gke.py | 1 + .../cloud/dataproc/example_dataproc_hadoop.py | 1 + .../cloud/dataproc/example_dataproc_hive.py | 1 + .../cloud/dataproc/example_dataproc_pig.py | 1 + .../cloud/dataproc/example_dataproc_presto.py | 1 + .../dataproc/example_dataproc_pyspark.py | 1 + .../cloud/dataproc/example_dataproc_spark.py | 1 + .../dataproc/example_dataproc_spark_async.py | 1 + .../example_dataproc_spark_deferrable.py | 1 + .../dataproc/example_dataproc_spark_sql.py | 1 + .../cloud/dataproc/example_dataproc_sparkr.py | 1 + .../cloud/dataproc/example_dataproc_trino.py | 1 + .../dataproc/example_dataproc_workflow.py | 1 + .../example_dataproc_workflow_deferrable.py | 1 + .../example_dataproc_metastore.py | 1 + .../example_dataproc_metastore_backup.py | 1 + ...ataproc_metastore_hive_partition_sensor.py | 1 + .../datastore/example_datastore_commit.py | 1 + .../datastore/example_datastore_query.py | 1 + .../datastore/example_datastore_rollback.py | 1 + .../google/cloud/gcs/example_gcs_acl.py | 1 + .../cloud/gcs/example_gcs_copy_delete.py | 1 + .../google/cloud/gcs/example_gcs_sensor.py | 1 + .../cloud/gcs/example_gcs_to_bigquery.py | 1 + .../gcs/example_gcs_to_bigquery_async.py | 1 + .../google/cloud/gcs/example_gcs_to_gcs.py | 1 + .../google/cloud/gcs/example_gcs_to_gdrive.py | 1 + .../google/cloud/gcs/example_gcs_to_sftp.py | 1 + .../google/cloud/gcs/example_gcs_transform.py | 1 + .../gcs/example_gcs_transform_timespan.py | 1 + .../cloud/gcs/example_gcs_upload_download.py | 1 + .../google/cloud/gcs/example_gdrive_to_gcs.py | 1 + .../google/cloud/gcs/example_mssql_to_gcs.py | 1 + .../google/cloud/gcs/example_mysql_to_gcs.py | 1 + .../google/cloud/gcs/example_oracle_to_gcs.py | 1 + .../google/cloud/gcs/example_presto_to_gcs.py | 1 + .../google/cloud/gcs/example_s3_to_gcs.py | 1 + .../cloud/gcs/example_salesforce_to_gcs.py | 1 + .../google/cloud/gcs/example_sftp_to_gcs.py | 1 + .../google/cloud/gcs/example_trino_to_gcs.py | 1 + .../example_kubernetes_engine.py | 1 + .../example_kubernetes_engine_async.py | 1 + .../life_sciences/example_life_sciences.py | 1 + .../google/cloud/spanner/example_spanner.py | 1 + .../speech_to_text/example_speech_to_text.py | 1 + .../cloud/stackdriver/example_stackdriver.py | 1 + ...mple_cloud_storage_transfer_service_aws.py | 1 + .../text_to_speech/example_text_to_speech.py | 1 + .../transfers/example_facebook_ads_to_gcs.py | 1 + .../cloud/transfers/example_gcs_to_sftp.py | 1 + .../transfers/example_gdrive_to_local.py | 1 + .../example_datacatalog_entries.py | 1 + .../example_datacatalog_search_catalog.py | 1 + .../example_datacatalog_tag_templates.py | 1 + .../datacatalog/example_datacatalog_tags.py | 1 + .../example_campaign_manager.py | 1 + .../example_display_video.py | 10 +- .../google/ads/transfers/test_ads_to_gcs.py | 1 + .../unit/google/cloud/hooks/test_automl.py | 1 + .../google/cloud/hooks/test_bigquery_dts.py | 1 + .../cloud/hooks/test_bigquery_system.py | 2 +- .../unit/google/cloud/hooks/test_bigtable.py | 1 + .../google/cloud/hooks/test_cloud_batch.py | 1 + .../google/cloud/hooks/test_cloud_build.py | 1 + .../cloud/hooks/test_cloud_memorystore.py | 1 + .../unit/google/cloud/hooks/test_cloud_run.py | 1 + .../unit/google/cloud/hooks/test_cloud_sql.py | 1 + .../test_cloud_storage_transfer_service.py | 1 + ...st_cloud_storage_transfer_service_async.py | 1 + .../unit/google/cloud/hooks/test_compute.py | 1 + .../google/cloud/hooks/test_datacatalog.py | 1 + .../unit/google/cloud/hooks/test_dataform.py | 1 + .../google/cloud/hooks/test_datafusion.py | 1 + .../unit/google/cloud/hooks/test_dataplex.py | 1 + .../cloud/hooks/test_dataproc_metastore.py | 1 + .../tests/unit/google/cloud/hooks/test_dlp.py | 1 + .../unit/google/cloud/hooks/test_functions.py | 1 + .../tests/unit/google/cloud/hooks/test_gcs.py | 2 +- .../google/cloud/hooks/test_kms_system.py | 2 +- .../cloud/hooks/test_kubernetes_engine.py | 1 + .../google/cloud/hooks/test_life_sciences.py | 1 + .../google/cloud/hooks/test_managed_kafka.py | 1 + .../unit/google/cloud/hooks/test_mlengine.py | 1 + .../cloud/hooks/test_natural_language.py | 1 + .../unit/google/cloud/hooks/test_os_login.py | 1 + .../google/cloud/hooks/test_secret_manager.py | 1 + .../unit/google/cloud/hooks/test_spanner.py | 1 + .../google/cloud/hooks/test_speech_to_text.py | 1 + .../unit/google/cloud/hooks/test_tasks.py | 1 + .../google/cloud/hooks/test_text_to_speech.py | 1 + .../unit/google/cloud/hooks/test_translate.py | 1 + .../cloud/hooks/test_video_intelligence.py | 1 + .../unit/google/cloud/hooks/test_vision.py | 1 + .../cloud/hooks/vertex_ai/test_auto_ml.py | 1 + .../vertex_ai/test_batch_prediction_job.py | 1 + .../cloud/hooks/vertex_ai/test_custom_job.py | 1 + .../cloud/hooks/vertex_ai/test_dataset.py | 1 + .../hooks/vertex_ai/test_endpoint_service.py | 1 + .../hooks/vertex_ai/test_feature_store.py | 1 + .../hooks/vertex_ai/test_generative_model.py | 1 + .../test_hyperparameter_tuning_job.py | 1 + .../hooks/vertex_ai/test_model_service.py | 1 + .../hooks/vertex_ai/test_pipeline_job.py | 1 + .../vertex_ai/test_prediction_service.py | 1 + .../cloud/log/test_gcs_task_handler_system.py | 2 +- .../test_stackdriver_task_handler_system.py | 2 +- .../cloud/operators/test_datastore_system.py | 3 +- .../secrets/test_secret_manager_system.py | 3 +- .../google/cloud/triggers/test_vertex_ai.py | 1 + .../google/common/hooks/test_base_google.py | 1 + .../google/firebase/hooks/test_firestore.py | 1 + .../hooks/test_analytics_admin.py | 1 + .../hooks/test_campaign_manager.py | 1 + .../hooks/test_display_video.py | 1 + .../hooks/test_search_ads.py | 1 + .../unit/google/suite/hooks/test_calendar.py | 1 + .../unit/google/suite/hooks/test_drive.py | 1 + .../unit/google/suite/hooks/test_sheets.py | 1 + providers/grpc/docs/changelog.rst | 2 +- providers/grpc/docs/index.rst | 2 +- providers/hashicorp/README.rst | 2 +- providers/hashicorp/docs/changelog.rst | 2 +- providers/hashicorp/docs/index.rst | 4 +- providers/http/docs/changelog.rst | 2 +- providers/http/docs/index.rst | 2 +- providers/imap/docs/changelog.rst | 2 +- providers/imap/docs/index.rst | 2 +- providers/influxdb/docs/changelog.rst | 2 +- providers/influxdb/docs/index.rst | 2 +- providers/jdbc/README.rst | 2 +- providers/jdbc/docs/changelog.rst | 2 +- providers/jdbc/docs/index.rst | 4 +- providers/jenkins/docs/changelog.rst | 2 +- providers/jenkins/docs/index.rst | 2 +- providers/microsoft/azure/README.rst | 2 +- providers/microsoft/azure/docs/changelog.rst | 2 +- providers/microsoft/azure/docs/index.rst | 4 +- .../microsoft/azure/example_s3_to_wasb.py | 1 + .../azure/tests/unit/microsoft/azure/base.py | 1 + .../microsoft/azure/hooks/test_msgraph.py | 6 +- .../microsoft/azure/operators/test_msgraph.py | 4 +- .../microsoft/azure/operators/test_powerbi.py | 4 +- .../microsoft/azure/sensors/test_msgraph.py | 4 +- .../microsoft/azure/triggers/test_msgraph.py | 6 +- .../microsoft/azure/triggers/test_powerbi.py | 1 + providers/microsoft/mssql/README.rst | 2 +- providers/microsoft/mssql/docs/changelog.rst | 2 +- providers/microsoft/mssql/docs/index.rst | 4 +- providers/microsoft/psrp/docs/changelog.rst | 2 +- providers/microsoft/psrp/docs/index.rst | 2 +- providers/microsoft/winrm/docs/changelog.rst | 2 +- providers/microsoft/winrm/docs/index.rst | 2 +- providers/mongo/docs/changelog.rst | 2 +- providers/mongo/docs/index.rst | 2 +- providers/mysql/README.rst | 2 +- providers/mysql/docs/changelog.rst | 2 +- providers/mysql/docs/index.rst | 4 +- providers/neo4j/docs/changelog.rst | 2 +- providers/neo4j/docs/index.rst | 2 +- providers/odbc/README.rst | 2 +- providers/odbc/docs/changelog.rst | 2 +- providers/odbc/docs/index.rst | 4 +- providers/openai/docs/changelog.rst | 2 +- providers/openai/docs/index.rst | 2 +- providers/openfaas/docs/changelog.rst | 2 +- providers/openfaas/docs/index.rst | 2 +- providers/openlineage/README.rst | 2 +- providers/openlineage/docs/changelog.rst | 2 +- providers/openlineage/docs/index.rst | 4 +- .../tests/system/openlineage/conftest.py | 1 + .../system/openlineage/example_openlineage.py | 1 + .../example_openlineage_mapped_sensor.py | 1 + .../tests/unit/openlineage/test_conf.py | 4 +- .../unit/openlineage/utils/test_utils.py | 4 +- providers/opensearch/docs/changelog.rst | 2 +- providers/opensearch/docs/index.rst | 2 +- .../opensearch/log/test_os_task_handler.py | 7 +- providers/opsgenie/docs/changelog.rst | 2 +- providers/opsgenie/docs/index.rst | 2 +- providers/oracle/README.rst | 2 +- providers/oracle/docs/changelog.rst | 2 +- providers/oracle/docs/index.rst | 4 +- providers/pagerduty/docs/changelog.rst | 2 +- providers/pagerduty/docs/index.rst | 2 +- providers/papermill/README.rst | 2 +- providers/papermill/docs/changelog.rst | 2 +- providers/papermill/docs/index.rst | 4 +- providers/pgvector/README.rst | 2 +- providers/pgvector/docs/changelog.rst | 2 +- providers/pgvector/docs/index.rst | 4 +- .../providers/pgvector/hooks/__init__.py | 5 +- .../providers/pgvector/operators/__init__.py | 5 +- providers/pinecone/docs/changelog.rst | 2 +- providers/pinecone/docs/index.rst | 2 +- providers/postgres/README.rst | 2 +- providers/postgres/docs/changelog.rst | 2 +- providers/postgres/docs/index.rst | 4 +- providers/presto/README.rst | 2 +- providers/presto/docs/changelog.rst | 2 +- providers/presto/docs/index.rst | 4 +- providers/qdrant/docs/index.rst | 2 +- providers/redis/docs/changelog.rst | 2 +- providers/redis/docs/index.rst | 2 +- providers/salesforce/docs/changelog.rst | 2 +- providers/salesforce/docs/index.rst | 2 +- providers/samba/README.rst | 2 +- providers/samba/docs/changelog.rst | 2 +- providers/samba/docs/index.rst | 4 +- .../system/samba/example_gcs_to_samba.py | 1 + providers/segment/docs/changelog.rst | 2 +- providers/segment/docs/index.rst | 2 +- providers/sendgrid/docs/changelog.rst | 2 +- providers/sendgrid/docs/index.rst | 2 +- providers/sftp/README.rst | 2 +- providers/sftp/docs/changelog.rst | 2 +- providers/sftp/docs/index.rst | 4 +- providers/singularity/docs/changelog.rst | 2 +- providers/singularity/docs/index.rst | 2 +- providers/slack/README.rst | 2 +- providers/slack/docs/changelog.rst | 2 +- providers/slack/docs/index.rst | 4 +- providers/smtp/docs/changelog.rst | 2 +- providers/smtp/docs/index.rst | 2 +- providers/snowflake/README.rst | 2 +- providers/snowflake/docs/changelog.rst | 2 +- providers/snowflake/docs/index.rst | 4 +- providers/sqlite/README.rst | 2 +- providers/sqlite/docs/changelog.rst | 2 +- providers/sqlite/docs/index.rst | 4 +- providers/ssh/docs/changelog.rst | 2 +- providers/ssh/docs/index.rst | 2 +- providers/standard/docs/index.rst | 2 +- providers/standard/docs/operators/bash.rst | 18 +- .../standard/docs/operators/datetime.rst | 8 +- providers/standard/docs/operators/python.rst | 40 +- providers/standard/docs/sensors/bash.rst | 2 +- providers/standard/docs/sensors/datetime.rst | 10 +- .../docs/sensors/external_task_sensor.rst | 8 +- providers/standard/docs/sensors/file.rst | 4 +- providers/standard/docs/sensors/python.rst | 4 +- .../unit/standard/decorators/test_python.py | 2 +- .../unit/standard/operators/test_python.py | 4 +- .../unit/standard/sensors/test_python.py | 1 + providers/tableau/docs/changelog.rst | 2 +- providers/tableau/docs/index.rst | 2 +- providers/telegram/docs/changelog.rst | 2 +- providers/telegram/docs/index.rst | 2 +- providers/teradata/README.rst | 2 +- providers/teradata/docs/index.rst | 4 +- providers/trino/README.rst | 2 +- providers/trino/docs/changelog.rst | 2 +- providers/trino/docs/index.rst | 4 +- providers/vertica/README.rst | 2 +- providers/vertica/docs/changelog.rst | 2 +- providers/vertica/docs/index.rst | 4 +- providers/weaviate/docs/changelog.rst | 2 +- providers/weaviate/docs/index.rst | 2 +- .../providers/weaviate/hooks/__init__.py | 7 +- .../providers/weaviate/operators/__init__.py | 5 +- providers/yandex/README.rst | 2 +- providers/yandex/docs/changelog.rst | 2 +- providers/yandex/docs/index.rst | 4 +- providers/yandex/pyproject.toml | 1 + .../providers/yandex/get_provider_info.py | 2 +- providers/ydb/README.rst | 2 +- providers/ydb/docs/index.rst | 4 +- providers/zendesk/docs/changelog.rst | 2 +- providers/zendesk/docs/index.rst | 2 +- pyproject.toml | 400 ++++++++----- ...ible_build.yaml => reproducible_build.yaml | 2 +- scripts/ci/docker-compose/devcontainer.env | 4 +- scripts/ci/docker-compose/local.yml | 13 +- .../providers-and-tests-sources.yml | 6 +- scripts/ci/docker-compose/remove-sources.yml | 2 +- scripts/ci/docker-compose/tests-sources.yml | 7 +- scripts/ci/kubernetes/k8s_requirements.txt | 2 +- .../check_airflow_bug_report_template.py | 8 +- ... check_base_operator_partial_arguments.py} | 21 +- .../ci/pre_commit/check_deferrable_default.py | 2 +- .../ci/pre_commit/check_extra_packages_ref.py | 2 +- .../pre_commit/check_imports_in_providers.py | 7 +- ...r.py => check_init_decorator_arguments.py} | 46 +- .../ci/pre_commit/check_integrations_list.py | 8 +- .../check_order_dockerfile_extras.py | 8 +- .../ci/pre_commit/check_pre_commit_hooks.py | 6 +- scripts/ci/pre_commit/check_provider_docs.py | 18 +- ...eck_providers_subpackages_all_have_init.py | 4 +- .../check_pyproject_toml_consistency.py | 7 - ...ads_map.py => check_revision_heads_map.py} | 21 +- .../check_system_tests_hidden_in_index.py | 12 +- ...heck_template_context_variable_in_sync.py} | 19 +- .../check_tests_in_right_folders.py | 25 +- .../pre_commit/check_ti_vs_tis_attributes.py | 8 +- .../ci/pre_commit/common_precommit_utils.py | 41 +- .../{lint_ui.py => compile_lint_ui.py} | 6 +- scripts/ci/pre_commit/compile_ui_assets.py | 11 +- .../ci/pre_commit/compile_ui_assets_dev.py | 11 +- scripts/ci/pre_commit/compile_www_assets.py | 96 --- .../ci/pre_commit/compile_www_assets_dev.py | 65 -- .../pre_commit/generate_airflow_diagrams.py | 8 +- .../generate_volumes_for_sources.py | 6 +- .../{json_schema.py => lint_json_schema.py} | 8 +- scripts/ci/pre_commit/mypy.py | 6 +- scripts/ci/pre_commit/mypy_folder.py | 13 +- scripts/ci/pre_commit/supported_versions.py | 2 +- .../pre_commit/update_breeze_config_hash.py | 9 +- .../pre_commit/update_chart_dependencies.py | 6 +- .../pre_commit/update_example_dags_paths.py | 11 +- .../update_installers_and_pre_commit.py | 25 +- .../update_providers_dependencies.py | 38 +- .../ci/pre_commit/update_source_date_epoch.py | 8 +- scripts/ci/pre_commit/update_versions.py | 4 +- scripts/ci/testing/run_unit_tests.sh | 2 +- scripts/cov/other_coverage.py | 100 ++-- scripts/docker/entrypoint_ci.sh | 14 +- ...age_specs.py => get_distribution_specs.py} | 0 scripts/docker/install_airflow.sh | 8 +- .../install_from_docker_context_files.sh | 73 ++- scripts/in_container/in_container_utils.py | 7 + .../install_airflow_and_providers.py | 208 ++++--- .../install_airflow_python_client.py | 35 +- .../install_development_dependencies.py | 11 +- scripts/in_container/remove_arm_packages.py | 5 +- .../in_container/run_generate_constraints.py | 126 ++-- .../in_container/run_migration_reference.py | 2 +- .../run_prepare_airflow_distributions.py | 152 +++++ .../run_prepare_airflow_packages.py | 138 ----- .../in_container/run_prepare_er_diagram.py | 8 +- .../run_provider_yaml_files_check.py | 55 +- scripts/in_container/verify_providers.py | 26 +- signal-desktop-keyring.gpg | Bin 0 -> 2223 bytes .../dev}/datamodel_code_formatter.py | 7 +- ..._models.py => generate_task_sdk_models.py} | 22 +- task-sdk/pyproject.toml | 4 +- task-sdk/src/airflow/__init__.py | 3 - 2713 files changed, 6438 insertions(+), 5661 deletions(-) rename .github/workflows/{test-provider-packages.yml => test-providers.yml} (82%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-bootstrap.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-bootstrap3-typeahead.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-d3-shape.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-d3-tip.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-d3js.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-dagre-d3.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-datatables.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-elasticmock.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-eonasdan-bootstrap-datetimepicker.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-flask-kerberos.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-hue.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-jqclock.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-jquery.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-moment.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-normalize.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-pytest-capture-warnings.txt (100%) rename {3rd-party-licenses => airflow-core/3rd-party-licenses}/LICENSE-reproducible.txt (100%) create mode 100644 airflow-core/LICENSE rename NOTICE => airflow-core/NOTICE (100%) create mode 100644 airflow-core/README.md rename {docs/apache-airflow => airflow-core/docs}/.gitignore (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/cluster-policies.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/dag-serialization.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/dagfile-processing.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/kubernetes.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/lineage.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/listeners.rst (93%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/callbacks.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/check-health.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/errors.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/logging-architecture.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/logging-tasks.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/metrics.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/traces.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/logging-monitoring/tracking-user-activity.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/modules_management.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/plugins.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/pools.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/priority-weight.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/production-deployment.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/scheduler.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/administration-and-deployment/web-stack.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/connections.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/cron.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/datasets.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/deferring.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/dynamic-task-mapping.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/event-scheduling.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/serializers.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/timetable.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/authoring-and-scheduling/timezone.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/best-practices.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/cli-and-env-variables-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/configurations-ref.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/auth-manager/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/auth-manager/simple.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/backfill.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/dag-run.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/dags.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/debug.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/executor/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/executor/local.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/executor/sequential.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/objectstorage.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/operators.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/overview.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/params.rst (97%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/sensors.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/taskflow.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/tasks.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/variables.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/core-concepts/xcoms.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/database-erd-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/empty_plugin/README.md (100%) rename {docs/apache-airflow => airflow-core/docs}/empty_plugin/empty_plugin.py (100%) rename {docs/apache-airflow => airflow-core/docs}/empty_plugin/templates/empty_plugin/index.html (100%) rename {docs/apache-airflow => airflow-core/docs}/extra-packages-ref.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/faq.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/add-dag-tags.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/add-owner-links.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/connection.rst (98%) rename {docs/apache-airflow => airflow-core/docs}/howto/create-custom-decorator.rst (97%) rename {docs/apache-airflow => airflow-core/docs}/howto/custom-operator.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/custom-view-plugin.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/customize-ui.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/define-extra-link.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/docker-compose/airflow.sh (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/docker-compose/docker-compose.yaml (99%) rename {docs/apache-airflow => airflow-core/docs}/howto/docker-compose/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/dynamic-dag-generation.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/email-config.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/export-more-env-vars.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/listener-plugin.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/howto/notifications.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/operator/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/run-behind-proxy.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/run-with-systemd.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/set-config.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/set-up-database.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/howto/setup-and-teardown.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/timetable.rst (98%) rename {docs/apache-airflow => airflow-core/docs}/howto/upgrading-from-1-10/index.rst (98%) rename {docs/apache-airflow => airflow-core/docs}/howto/upgrading-from-1-10/upgrade-check.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/usage-cli.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/howto/variable.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/img/add-dag-tags.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/add_container_python_interpreter.png (100%) create mode 100644 airflow-core/docs/img/airflow_erd.sha256 rename {docs/apache-airflow => airflow-core/docs}/img/airflow_erd.svg (100%) rename {docs/apache-airflow => airflow-core/docs}/img/apache.jpg (100%) rename {docs/apache-airflow => airflow-core/docs}/img/arch-diag-logging.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/asset-scheduled-dags.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/assets.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/audit_log.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/aws-web-identity-federation-gcp.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/basic-dag.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/branch_note.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/branch_with_trigger.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/branch_without_trigger.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/calendar.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-site-title/default_instance_name_configuration.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-site-title/example_instance_name_configuration.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/dags-page-new.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/dags-page-old.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/graph-view-new.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/graph-view-old.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/tree-view-new.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/change-ui-colors/tree-view-old.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/cli_completion.gif (100%) rename {docs/apache-airflow => airflow-core/docs}/img/cluster_activity.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/code.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/connection_create.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/connection_edit.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/dag_doc.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/dag_file_processing_diagram.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/dag_serialization.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/dags.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/demo_graph_view.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/demo_grid_view.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_auth_manager_airflow_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_auth_manager_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_auth_manager_airflow_architecture.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_basic_airflow_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_basic_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_basic_airflow_architecture.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_dag_processor_airflow_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_dag_processor_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_dag_processor_airflow_architecture.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_distributed_airflow_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_distributed_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_distributed_airflow_architecture.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_fab_auth_manager_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_multi_team_airflow_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_multi_team_airflow_architecture.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_multi_team_airflow_architecture.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_multitenant_architecture.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_task_lifecycle.md5sum (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_task_lifecycle.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/diagram_task_lifecycle.py (100%) rename {docs/apache-airflow => airflow-core/docs}/img/docker-compose-pycharm.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/duration.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/edge_label_example.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/email_connection.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/example_passing_conf.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/gantt.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/graph.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid_instance_details.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid_mapped_task.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid_run_details.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid_task_details.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/grid_task_group.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/howto-owner-links.gif (100%) rename {docs/apache-airflow => airflow-core/docs}/img/landing_times.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/latest_only_with_trigger.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/airflow_64x64_emoji_transparent.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/airflow_dark_bg.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/airflow_transparent.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/airflow_white_bg.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/github_repository_social_image.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/wordmark_1.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/wordmark_1.svg (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/wordmark_2.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/logos/wordmark_2.svg (100%) rename {docs/apache-airflow => airflow-core/docs}/img/mapping-simple-graph.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/mapping-simple-grid.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/operator_extra_link.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/run_task_on_celery_executor.puml (100%) rename {docs/apache-airflow => airflow-core/docs}/img/run_types.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-complex.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-group.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-nesting.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-parallel.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-scope.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-setup-group.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/setup-teardown-simple.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/task_doc.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/task_group.gif (100%) rename {docs/apache-airflow => airflow-core/docs}/img/task_instance_history.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/task_instance_history_log.png (100%) create mode 100644 airflow-core/docs/img/task_lifecycle_diagram.png rename {docs/apache-airflow => airflow-core/docs}/img/template_field_renderer_path.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/trigger-dag-tutorial-form-1.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/trigger-dag-tutorial-form-2.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/trigger-dag-tutorial-form-3.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/trigger-dag-tutorial-form-4.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/tutorial-pipeline-1.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/tutorial-pipeline-2.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/ui-alert-message.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/ui-timezone-chooser.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/usage_cli_export.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/usage_cli_imgcat.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/variable_hidden.png (100%) rename {docs/apache-airflow => airflow-core/docs}/img/watcher.png (100%) rename {docs/apache-airflow => airflow-core/docs}/index.rst (98%) rename {docs/apache-airflow => airflow-core/docs}/installation/dependencies.rst (86%) rename {docs/apache-airflow => airflow-core/docs}/installation/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/installation/installing-from-pypi.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/installation/installing-from-sources.rst (81%) rename {docs/apache-airflow => airflow-core/docs}/installation/prerequisites.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/installation/setting-up-the-database.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/installation/supported-versions.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/installation/upgrading.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/integration.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/license.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/migrations-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/operators-and-hooks-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/privacy_notice.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/project.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/public-airflow-interface.rst (98%) rename {docs/apache-airflow => airflow-core/docs}/redirects.txt (100%) rename {docs/apache-airflow => airflow-core/docs}/release-process.rst (96%) rename {docs/apache-airflow => airflow-core/docs}/release_notes.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/api.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/audit_logs.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/flower.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/kerberos.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/releasing_security_patches.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/sbom.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/secrets/fernet.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/secrets/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/secrets/mask-sensitive-values.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/secrets/secrets-backend/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/secrets/secrets-backend/local-filesystem-secrets-backend.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/security_model.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/webserver.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/security/workload.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/stable-rest-api-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/start.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/static/exampleinclude.css (100%) rename {docs/apache-airflow => airflow-core/docs}/static/gh-jira-links.js (100%) rename {docs/apache-airflow => airflow-core/docs}/static/redirects.js (100%) rename {docs/apache-airflow => airflow-core/docs}/templates-ref.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/templates/footer.html (100%) rename {docs/apache-airflow => airflow-core/docs}/troubleshooting.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/fundamentals.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/index.rst (100%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/objectstorage.rst (93%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/pipeline.rst (99%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/pipeline_example.csv (98%) rename {docs/apache-airflow => airflow-core/docs}/tutorial/taskflow.rst (95%) rename {docs/apache-airflow => airflow-core/docs}/ui.rst (100%) create mode 100644 airflow-core/hatch_build_airflow_core.py create mode 100644 airflow-core/pyproject.toml rename {airflow => airflow-core/src/airflow}/METRICS.md (100%) rename {airflow => airflow-core/src/airflow}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/__main__.py (100%) rename {airflow => airflow-core/src/airflow}/_vendor/README.md (100%) rename {airflow => airflow-core/src/airflow}/_vendor/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/_vendor/vendor.md (100%) rename {airflow => airflow-core/src/airflow}/alembic.ini (100%) rename {airflow/api_fastapi => airflow-core/src/airflow/api}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api/client/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api/client/local_client.py (100%) rename {airflow => airflow-core/src/airflow}/api/common/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api/common/airflow_health.py (100%) rename {airflow => airflow-core/src/airflow}/api/common/delete_dag.py (100%) rename {airflow => airflow-core/src/airflow}/api/common/mark_tasks.py (100%) rename {airflow => airflow-core/src/airflow}/api/common/trigger_dag.py (100%) rename {airflow/api_fastapi/auth/managers/simple/services => airflow-core/src/airflow/api_fastapi}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/app.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/base_auth_manager.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/models/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/models/base_user.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/models/batch_apis.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/models/resource_details.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/datamodels/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/datamodels/login.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/openapi/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/openapi/v1-generated.yaml (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/routes/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/routes/login.py (100%) rename {airflow/api_fastapi/common => airflow-core/src/airflow/api_fastapi/auth/managers/simple/services}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/services/login.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/simple_auth_manager.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/dev/index.html (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/index.html (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/common.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/index.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/infiniteQueries.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/prefetch.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/queries.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/suspense.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiError.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiRequestOptions.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiResult.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/CancelablePromise.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/OpenAPI.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/request.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/index.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/schemas.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/services.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/types.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/package-lock.json (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/package.json (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/pnpm-lock.yaml (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/login/Login.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/login/Login.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/main.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/queries/useCreateToken.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/queryClient.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/router.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/src/test-utils.tsx (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/tests-setup.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/ui/vite.config.ts (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/managers/simple/user.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/auth/tokens.py (100%) rename {airflow/api_fastapi/common/db => airflow-core/src/airflow/api_fastapi/common}/__init__.py (100%) rename {airflow/api_fastapi/core_api => airflow-core/src/airflow/api_fastapi/common/db}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/db/common.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/db/dag_runs.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/db/dags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/exceptions.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/headers.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/parameters.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/router.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/common/types.py (100%) rename {airflow/api_fastapi/core_api/datamodels => airflow-core/src/airflow/api_fastapi/core_api}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/app.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/base.py (100%) rename {airflow/api_fastapi/core_api/datamodels/ui => airflow-core/src/airflow/api_fastapi/core_api/datamodels}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/assets.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/backfills.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/common.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/config.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_report.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_run.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_sources.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_stats.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_tags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_versions.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dag_warning.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/dags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/event_logs.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/extra_links.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/import_error.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/job.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/log.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/monitor.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/plugins.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/pools.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/providers.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/task_instances.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/tasks.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/trigger.py (100%) rename {airflow/api_fastapi/core_api/openapi => airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/auth.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/common.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/config.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/dags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/dashboard.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/grid.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/ui/structure.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/variables.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/version.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/datamodels/xcom.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/init_dagbag.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/middleware.py (100%) rename {airflow/api_fastapi/core_api/routes => airflow-core/src/airflow/api_fastapi/core_api/openapi}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/openapi/exceptions.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/openapi/v1-generated.yaml (100%) rename {airflow/api_fastapi/core_api/services => airflow-core/src/airflow/api_fastapi/core_api/routes}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/assets.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/auth.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/backfills.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/config.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_parsing.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_report.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_run.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_sources.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_stats.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_tags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_versions.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dag_warning.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/dags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/event_logs.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/extra_links.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/import_error.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/job.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/log.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/monitor.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/plugins.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/pools.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/providers.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/task_instances.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/tasks.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/variables.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/version.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/public/xcom.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/assets.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/auth.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/backfills.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/config.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/dags.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/dashboard.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/dependencies.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/grid.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/routes/ui/structure.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/security.py (100%) rename {airflow/api_fastapi/core_api/services/public => airflow-core/src/airflow/api_fastapi/core_api/services}/__init__.py (100%) rename {airflow/api_fastapi/core_api/services/ui => airflow-core/src/airflow/api_fastapi/core_api/services/public}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/public/common.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/public/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/public/pools.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/public/variables.py (100%) rename {airflow/api_fastapi/execution_api => airflow-core/src/airflow/api_fastapi/core_api/services/ui}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/ui/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/ui/dependencies.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/ui/grid.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/core_api/services/ui/structure.py (100%) rename {airflow/api_fastapi/execution_api/datamodels => airflow-core/src/airflow/api_fastapi/execution_api}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/app.py (100%) rename {airflow/api_fastapi/logging => airflow-core/src/airflow/api_fastapi/execution_api/datamodels}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/asset.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/asset_event.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/connection.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/dagrun.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/taskinstance.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/token.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/variable.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/datamodels/xcom.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/deps.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/asset_events.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/assets.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/connections.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/dag_runs.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/health.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/task_instances.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/variables.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/execution_api/routes/xcoms.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/gunicorn_config.py (100%) rename {airflow/assets => airflow-core/src/airflow/api_fastapi/logging}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/logging/decorators.py (100%) rename {airflow => airflow-core/src/airflow}/api_fastapi/main.py (100%) rename {airflow/callbacks => airflow-core/src/airflow/assets}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/assets/evaluation.py (100%) rename {airflow => airflow-core/src/airflow}/assets/manager.py (100%) rename {airflow/cli/commands/local_commands => airflow-core/src/airflow/callbacks}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/callbacks/base_callback_sink.py (100%) rename {airflow => airflow-core/src/airflow}/callbacks/callback_requests.py (100%) rename {airflow => airflow-core/src/airflow}/callbacks/database_callback_sink.py (100%) rename {airflow => airflow-core/src/airflow}/callbacks/pipe_callback_sink.py (100%) rename {airflow => airflow-core/src/airflow}/cli/__init__.py (100%) rename {airflow/cli/commands/remote_commands => airflow-core/src/airflow/cli/api}/__init__.py (100%) rename {airflow/dag_processing => airflow-core/src/airflow/cli/api/datamodels}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/cli/cli_config.py (100%) rename {airflow => airflow-core/src/airflow}/cli/cli_parser.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/legacy_commands.py (100%) rename {airflow/dag_processing/bundles => airflow-core/src/airflow/cli/commands/local_commands}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/api_server_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/cheat_sheet_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/daemon_utils.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/dag_processor_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/db_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/info_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/kerberos_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/plugins_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/rotate_fernet_key_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/scheduler_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/standalone_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/local_commands/triggerer_command.py (100%) rename {airflow/example_dags/plugins => airflow-core/src/airflow/cli/commands/remote_commands}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/asset_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/backfill_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/config_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/connection_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/dag_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/jobs_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/pool_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/provider_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/task_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/variable_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/commands/remote_commands/version_command.py (100%) rename {airflow => airflow-core/src/airflow}/cli/simple_table.py (100%) rename {airflow => airflow-core/src/airflow}/cli/utils.py (100%) rename {airflow => airflow-core/src/airflow}/config_templates/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/config_templates/airflow_local_settings.py (100%) rename {airflow => airflow-core/src/airflow}/config_templates/config.yml (100%) rename {airflow => airflow-core/src/airflow}/config_templates/config.yml.schema.json (100%) rename {airflow => airflow-core/src/airflow}/config_templates/default_airflow.cfg (100%) rename {airflow => airflow-core/src/airflow}/config_templates/default_webserver_config.py (100%) rename {airflow => airflow-core/src/airflow}/config_templates/provider_config_fallback_defaults.cfg (100%) rename {airflow => airflow-core/src/airflow}/config_templates/unit_tests.cfg (100%) rename {airflow => airflow-core/src/airflow}/configuration.py (99%) rename {airflow => airflow-core/src/airflow}/customized_form_field_behaviours.schema.json (100%) rename {airflow/executors => airflow-core/src/airflow/dag_processing}/__init__.py (100%) rename {airflow/io/utils => airflow-core/src/airflow/dag_processing/bundles}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/bundles/base.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/bundles/git.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/bundles/local.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/bundles/manager.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/bundles/provider.yaml (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/collection.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/manager.py (100%) rename {airflow => airflow-core/src/airflow}/dag_processing/processor.py (100%) rename {airflow => airflow-core/src/airflow}/datasets/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/datasets/metadata.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/__init__.pyi (100%) rename {airflow => airflow-core/src/airflow}/decorators/base.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/bash.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/branch_external_python.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/branch_python.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/branch_virtualenv.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/condition.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/external_python.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/python.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/python_virtualenv.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/sensor.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/setup_teardown.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/short_circuit.py (100%) rename {airflow => airflow-core/src/airflow}/decorators/task_group.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_asset_alias.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_asset_alias_with_no_taskflow.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_asset_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_asset_with_watchers.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_assets.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_bash_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_bash_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_datetime_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_day_of_week_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_labels.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_operator_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_branch_python_dop_operator_3.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_complex.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_custom_weight.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_dag_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_display_name.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_dynamic_task_mapping.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_external_task_marker_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_inlet_event_extra.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_kubernetes_executor.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_latest_only.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_latest_only_with_trigger.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_local_kubernetes_executor.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_nested_branch_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_outlet_event_extra.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_params_trigger_ui.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_params_ui_tutorial.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_passing_params_via_test_command.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_python_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_python_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_sensor_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_sensors.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_setup_teardown.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_setup_teardown_taskflow.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_short_circuit_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_short_circuit_operator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_simplest_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_skip_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_task_group.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_task_group_decorator.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_time_delta_sensor_async.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_trigger_controller_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_trigger_target_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_workday_timetable.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_xcom.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/example_xcomargs.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/libs/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/libs/helper.py (100%) rename {airflow/listeners/spec => airflow-core/src/airflow/example_dags/plugins}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/plugins/decreasing_priority_weight_strategy.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/plugins/event_listener.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/plugins/listener_plugin.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/plugins/workday.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/sql/sample.sql (100%) rename {airflow => airflow-core/src/airflow}/example_dags/sql/tutorial_taskflow_template.sql (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial_dag.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial_objectstorage.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial_taskflow_api.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial_taskflow_api_virtualenv.py (100%) rename {airflow => airflow-core/src/airflow}/example_dags/tutorial_taskflow_templates.py (100%) rename {airflow => airflow-core/src/airflow}/exceptions.py (100%) rename {airflow/metrics => airflow-core/src/airflow/executors}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/executors/base_executor.py (100%) rename {airflow => airflow-core/src/airflow}/executors/debug_executor.py (100%) rename {airflow => airflow-core/src/airflow}/executors/executor_constants.py (100%) rename {airflow => airflow-core/src/airflow}/executors/executor_loader.py (100%) rename {airflow => airflow-core/src/airflow}/executors/executor_utils.py (100%) rename {airflow => airflow-core/src/airflow}/executors/local_executor.py (100%) rename {airflow => airflow-core/src/airflow}/executors/sequential_executor.py (100%) rename {airflow => airflow-core/src/airflow}/executors/workloads.py (100%) rename {airflow => airflow-core/src/airflow}/hooks/README.md (92%) rename {airflow => airflow-core/src/airflow}/hooks/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/hooks/base.py (100%) rename {airflow => airflow-core/src/airflow}/io/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/io/path.py (100%) rename {airflow => airflow-core/src/airflow}/io/store/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/io/typedef.py (100%) rename {airflow/notifications => airflow-core/src/airflow/io/utils}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/io/utils/stat.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/JOB_LIFECYCLE.md (100%) rename {airflow => airflow-core/src/airflow}/jobs/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/base_job_runner.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/dag_processor_job_runner.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/job.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/scheduler_job_runner.py (100%) rename {airflow => airflow-core/src/airflow}/jobs/triggerer_job_runner.py (100%) rename {airflow => airflow-core/src/airflow}/lineage/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/lineage/backend.py (100%) rename {airflow => airflow-core/src/airflow}/lineage/hook.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/listener.py (100%) rename {airflow/timetables => airflow-core/src/airflow/listeners/spec}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/spec/asset.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/spec/dagrun.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/spec/importerrors.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/spec/lifecycle.py (100%) rename {airflow => airflow-core/src/airflow}/listeners/spec/taskinstance.py (100%) rename {airflow => airflow-core/src/airflow}/logging_config.py (100%) rename {airflow => airflow-core/src/airflow}/macros/__init__.py (100%) rename {dev/provider_packages => airflow-core/src/airflow/metrics}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/base_stats_logger.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/datadog_logger.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/otel_logger.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/protocols.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/statsd_logger.py (100%) rename {airflow => airflow-core/src/airflow}/metrics/validators.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/db_types.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/db_types.pyi (100%) rename {airflow => airflow-core/src/airflow}/migrations/env.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/script.py.mako (100%) rename {airflow => airflow-core/src/airflow}/migrations/utils.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0001_2_7_0_add_index_to_task_instance_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0002_2_7_0_add_custom_operator_name_column.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0003_2_7_0_add_include_deferred_column_to_pool.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0004_2_8_0_add_clear_number_to_dag_run.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0005_2_8_0_add_owner_display_name_to_audit_log_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0006_2_8_0_make_connection_login_password_text.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0007_2_8_0_add_processor_subdir_import_error.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0008_2_8_1_refactor_dag_run_indexes.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0009_2_9_0_add_rendered_map_index_to_taskinstance.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0010_2_9_0_add_run_id_to_audit_log_table_and_change_event_name_length.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0011_2_9_0_add_dataset_expression_in_dagmodel.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0012_2_9_0_adding_adding_max_failure_runs_column_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0013_2_9_0_make_xcom_value_to_longblob_for_mysql.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0014_2_9_0_add_display_name_for_dag_and_task_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0015_2_9_0_update_trigger_kwargs_type.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0016_2_9_2_remove_idx_last_scheduling_decision_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0017_2_9_2_fix_inconsistency_between_ORM_and_migration_files.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0018_2_10_0_add_indexes_on_dag_id_column_in_referencing_tables.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0019_2_10_0_add_new_executor_field_to_db.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0020_2_10_0_added_dagpriorityparsingrequest_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0021_2_10_0_add_task_instance_history.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0022_2_10_0_add_dataset_alias.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0023_2_10_0_dataset_alias_dataset_event.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0024_2_10_0_add_try_number_to_audit_log.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0025_2_10_0_dataset_alias_dataset.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0026_2_10_0_dag_schedule_dataset_alias_reference.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0027_2_10_3_fix_dag_schedule_dataset_alias_reference_naming.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0028_3_0_0_drop_ab_user_id_foreign_key.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0029_3_0_0_remove_is_subdag.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0030_3_0_0_rename_schedule_interval_to_timetable_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0031_3_0_0_add_triggered_by_field_to_dagrun.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0032_3_0_0_rename_execution_date_to_logical_date_and_nullable.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0033_3_0_0_add_tables_for_backfill.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0034_3_0_0_remove_redundant_index.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0035_3_0_0_update_user_id_type.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0036_3_0_0_add_name_field_to_dataset_model.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0037_3_0_0_add_backfill_to_dag_run_model.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0038_3_0_0_add_asset_active.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0039_3_0_0_tweak_assetaliasmodel_to_match_asset.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0040_3_0_0_add_exception_reason_and_logical_date_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0041_3_0_0_rename_dataset_as_asset.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0043_3_0_0_remove_scheduler_lock_column.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0044_3_0_0__drop_task_fail_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0045_3_0_0_add_last_heartbeat_at_directly_to_ti.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0046_3_0_0_drop_dag_pickling.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0047_3_0_0_add_dag_versioning.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0048_3_0_0_add_trigger_asset_reference.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0049_3_0_0_remove_pickled_data_from_xcom_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0050_3_0_0_add_dagbundlemodel.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0051_3_0_0_update_task_instance_trigger_timeout_to_utcdatetime.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0052_3_0_0_add_deadline_alerts_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0053_3_0_0_remove_processor_subdir.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0054_3_0_0_add_asset_reference_models.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0055_3_0_0_remove_pickled_data_from_dagrun_table.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0056_3_0_0_add_relative_fileloc_column.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0057_3_0_0_add_new_task_instance_field_scheduled_.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0058_3_0_0_add_dagrun_run_after.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0059_3_0_0_remove_external_trigger_field.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0060_3_0_0_add_try_id_to_ti_and_tih.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0061_3_0_0_use_ti_id_as_primary_key_to_TINote.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0062_3_0_0_remove_dag_default_view.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/0063_3_0_0_use_ti_id_as_fk_to_taskreschedule.py (100%) rename {airflow => airflow-core/src/airflow}/migrations/versions/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/models/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/models/abstractoperator.py (100%) rename {airflow => airflow-core/src/airflow}/models/asset.py (100%) rename {airflow => airflow-core/src/airflow}/models/backfill.py (100%) rename {airflow => airflow-core/src/airflow}/models/base.py (100%) rename {airflow => airflow-core/src/airflow}/models/baseoperator.py (100%) rename {airflow => airflow-core/src/airflow}/models/connection.py (100%) rename {airflow => airflow-core/src/airflow}/models/crypto.py (100%) rename {airflow => airflow-core/src/airflow}/models/dag.py (100%) rename {airflow => airflow-core/src/airflow}/models/dag_version.py (100%) rename {airflow => airflow-core/src/airflow}/models/dagbag.py (100%) rename {airflow => airflow-core/src/airflow}/models/dagbundle.py (88%) rename {airflow => airflow-core/src/airflow}/models/dagcode.py (100%) rename {airflow => airflow-core/src/airflow}/models/dagrun.py (100%) rename {airflow => airflow-core/src/airflow}/models/dagwarning.py (100%) rename {airflow => airflow-core/src/airflow}/models/db_callback_request.py (100%) rename {airflow => airflow-core/src/airflow}/models/deadline.py (100%) rename {airflow => airflow-core/src/airflow}/models/errors.py (100%) rename {airflow => airflow-core/src/airflow}/models/expandinput.py (100%) rename {airflow => airflow-core/src/airflow}/models/log.py (100%) rename {airflow => airflow-core/src/airflow}/models/mappedoperator.py (100%) rename {airflow => airflow-core/src/airflow}/models/operator.py (100%) rename {airflow => airflow-core/src/airflow}/models/param.py (100%) rename {airflow => airflow-core/src/airflow}/models/pool.py (100%) rename {airflow => airflow-core/src/airflow}/models/renderedtifields.py (100%) rename {airflow => airflow-core/src/airflow}/models/serialized_dag.py (100%) rename {airflow => airflow-core/src/airflow}/models/skipmixin.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskinstance.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskinstancehistory.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskinstancekey.py (100%) rename {airflow => airflow-core/src/airflow}/models/tasklog.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskmap.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskmixin.py (100%) rename {airflow => airflow-core/src/airflow}/models/taskreschedule.py (100%) rename {airflow => airflow-core/src/airflow}/models/trigger.py (100%) rename {airflow => airflow-core/src/airflow}/models/variable.py (100%) rename {airflow => airflow-core/src/airflow}/models/xcom.py (100%) rename {airflow => airflow-core/src/airflow}/models/xcom_arg.py (100%) rename {tests/always => airflow-core/src/airflow/notifications}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/notifications/basenotifier.py (100%) rename {airflow => airflow-core/src/airflow}/operators/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/plugins_manager.py (100%) rename {airflow => airflow-core/src/airflow}/policies.py (100%) rename {airflow => airflow-core/src/airflow}/provider.yaml.schema.json (100%) rename {airflow => airflow-core/src/airflow}/provider_info.schema.json (100%) rename {airflow => airflow-core/src/airflow}/providers_manager.py (99%) rename {airflow => airflow-core/src/airflow}/py.typed (100%) rename {airflow => airflow-core/src/airflow}/secrets/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/secrets/base_secrets.py (100%) rename {airflow => airflow-core/src/airflow}/secrets/cache.py (100%) rename {airflow => airflow-core/src/airflow}/secrets/environment_variables.py (100%) rename {airflow => airflow-core/src/airflow}/secrets/local_filesystem.py (100%) rename {airflow => airflow-core/src/airflow}/secrets/metastore.py (100%) rename {airflow => airflow-core/src/airflow}/security/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/security/kerberos.py (100%) rename {airflow => airflow-core/src/airflow}/security/permissions.py (100%) rename {airflow => airflow-core/src/airflow}/security/utils.py (100%) rename {airflow => airflow-core/src/airflow}/sensors/README.md (100%) rename {airflow => airflow-core/src/airflow}/sensors/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/sensors/base.py (100%) rename {airflow => airflow-core/src/airflow}/sentry.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/dag_dependency.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/enums.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/helpers.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/json_schema.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/schema.json (100%) rename {airflow => airflow-core/src/airflow}/serialization/serde.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serialized_objects.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/bignum.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/builtin.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/datetime.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/deltalake.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/iceberg.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/kubernetes.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/numpy.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/pandas.py (100%) rename {airflow => airflow-core/src/airflow}/serialization/serializers/timezone.py (100%) rename {airflow => airflow-core/src/airflow}/settings.py (100%) rename {airflow => airflow-core/src/airflow}/stats.py (100%) rename {airflow => airflow-core/src/airflow}/task/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/task/priority_strategy.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/dep_context.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/dependencies_deps.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/dependencies_states.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/base_ti_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/dag_ti_slots_available_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/dag_unpaused_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/dagrun_exists_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/exec_date_after_start_date_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/mapped_task_expanded.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/mapped_task_upstream_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/not_in_retry_period_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/not_previously_skipped_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/pool_slots_available_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/prev_dagrun_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/ready_to_reschedule.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/runnable_exec_date_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/task_concurrency_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/task_not_running_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/trigger_rule_dep.py (100%) rename {airflow => airflow-core/src/airflow}/ti_deps/deps/valid_state_dep.py (100%) rename {tests/api => airflow-core/src/airflow/timetables}/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/_cron.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/_delta.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/assets.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/base.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/events.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/interval.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/simple.py (100%) rename {airflow => airflow-core/src/airflow}/timetables/trigger.py (100%) rename {airflow => airflow-core/src/airflow}/traces/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/traces/otel_tracer.py (100%) rename {airflow => airflow-core/src/airflow}/traces/tracer.py (100%) rename {airflow => airflow-core/src/airflow}/traces/utils.py (100%) rename {airflow => airflow-core/src/airflow}/triggers/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/triggers/base.py (100%) rename {airflow => airflow-core/src/airflow}/triggers/testing.py (100%) rename {airflow => airflow-core/src/airflow}/typing_compat.py (100%) rename {airflow => airflow-core/src/airflow}/ui/.env.example (100%) rename {airflow => airflow-core/src/airflow}/ui/.prettierignore (100%) rename {airflow => airflow-core/src/airflow}/ui/.prettierrc (100%) rename {airflow => airflow-core/src/airflow}/ui/CONTRIBUTING.md (100%) rename {airflow => airflow-core/src/airflow}/ui/README.md (100%) rename {airflow => airflow-core/src/airflow}/ui/dev/index.html (100%) rename {airflow => airflow-core/src/airflow}/ui/eslint.config.js (100%) rename {airflow => airflow-core/src/airflow}/ui/index.html (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/common.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/infiniteQueries.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/prefetch.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/queries.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/queries/suspense.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/ApiError.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/ApiRequestOptions.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/ApiResult.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/CancelablePromise.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/OpenAPI.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/core/request.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/schemas.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/services.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/openapi-gen/requests/types.gen.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/package.json (100%) rename {airflow => airflow-core/src/airflow}/ui/pnpm-lock.yaml (100%) rename {airflow => airflow-core/src/airflow}/ui/public/pin_32.png (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/core.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/levels.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/off.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/perfectionist.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/plugin-patch.d.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/prettier.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/react.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/stylistic.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/typescript.js (100%) rename {airflow => airflow-core/src/airflow}/ui/rules/unicorn.js (100%) rename {airflow => airflow-core/src/airflow}/ui/src/assets/AirflowPin.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/assets/DagIcon.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/assets/TaskIcon.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ActionAccordion/ActionAccordion.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ActionAccordion/columns.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ActionAccordion/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/AndGateNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/AssetExpression.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/AssetNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/OrGateNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/AssetExpression/types.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Assets/AssetEvent.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Assets/AssetEvents.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Banner/BackfillBanner.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Banner/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/BreadcrumbStats.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/Run/ClearRunButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/Run/ClearRunDialog.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/Run/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/TaskInstance/ClearTaskInstanceButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/TaskInstance/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/columns.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Clear/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ConfirmationModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagActions/ParseDag.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagActions/RunBackfillButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagActions/RunBackfillForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagActions/RunBackfillModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagRunInfo.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagVersionDetails.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DagVersionSelect.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/CardList.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/DataTable.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/DataTable.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/TableList.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/ToggleTableDisplay.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/searchParams.test.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/searchParams.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/skeleton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/types.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/useRowSelection.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DataTable/useTableUrlState.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DisplayMarkdownButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/DurationChart.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/EditableMarkdownButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ErrorAlert.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldAdvancedArray.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldBool.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldDateTime.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldDropdown.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldMultiSelect.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldMultilineText.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldNumber.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldObject.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldRow.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldSelector.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldString.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FieldStringArray.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/FlexibleForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/HiddenInput.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/Row.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/FlexibleForm/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/AliasNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/AssetConditionNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/AssetNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/DagNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/Edge.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/JoinNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/NodeWrapper.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/TaskLink.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/TaskNode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/reactflowUtils.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Graph/useGraphLayout.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/HeaderCard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/JsonEditor.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/LimitedItemsList.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/Run/MarkRunAsDialog.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/Run/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsDialog.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/TaskInstance/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/MarkAs/utils.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/QuickFilterButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ReactMarkdown.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/RenderedJsonField.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/RunTypeIcon.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchBar.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchBar.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchDags/SearchDags.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchDags/SearchDagsButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchDags/SearchDagsDropdownIndicator.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/SearchDags/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Stat.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/StateBadge.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/StateIcon.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TaskInstanceTooltip.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TaskName.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TaskTrySelect.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Time.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/Time.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TimeRangeSelector.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TogglePause.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TrendCountButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TrendCountChart.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TriggerDag/EditableMarkdown.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TriggerDag/TriggerDAGButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TriggerDag/TriggerDAGForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TriggerDag/TriggerDAGModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/TruncatedText.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Accordion/ItemContent.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Accordion/ItemTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Accordion/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/ActionBar/BarContent.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/ActionBar/CloseTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/ActionBar/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/ActionButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Alert.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Breadcrumb/Root.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Breadcrumb/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Button.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Checkbox.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Clipboard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/CloseButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Dialog/CloseTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Dialog/Content.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Dialog/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/Dropzone.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/FileInput.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/Item.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/List.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/Root.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/FileUpload/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/InputGroup.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Menu.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/NumberInput.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/Ellipsis.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/Item.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/Items.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/NextTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/PageText.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/PrevTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/Root.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/context.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Pagination/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Popover/Arrow.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Popover/CloseTrigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Popover/Content.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Popover/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/ProgressBar.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/RadioCard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/SegmentedControl.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/Content.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/Item.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/ItemGroup.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/Root.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/Trigger.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/ValueText.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Select/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Switch.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Tag.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Toaster.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/Tooltip.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/components/ui/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/constants/reprocessBehaviourParams.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/constants/searchParams.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/constants/sortParams.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/constants/stateOptions.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/colorMode/ColorModeProvider.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/colorMode/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/colorMode/useColorMode.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/openGroups/OpenGroupsProvider.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/openGroups/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/openGroups/useOpenGroups.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/timezone/TimezoneProvider.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/timezone/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/context/timezone/useTimezone.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/hooks/useSelectedVersion.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/BaseLayout.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/DagsLayout.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/DagBreadcrumb.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/DagRunSelect.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/DetailsLayout.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Gantt/Gantt.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Gantt/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Graph/Graph.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Graph/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/Bar.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/DurationAxis.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/DurationTick.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/Grid.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/GridButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/GridTI.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/TaskInstancesColumn.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/TaskNames.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/Grid/utils.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/NavTabs.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/PanelButtons.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Details/ToggleGroups.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/AdminButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/BrowseButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/DocsButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/LogoutModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/Nav.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/NavButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/PluginMenus.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/SecurityButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/TimezoneModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/TimezoneSelector.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/UserSettingsButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/layouts/Nav/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/main.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/mocks/handlers/config.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/mocks/handlers/dag.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/mocks/handlers/dags.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/mocks/handlers/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/mocks/handlers/log.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/Asset.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/AssetGraph.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/CreateAssetEvent.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/CreateAssetEventModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Asset/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/AssetsList/AssetsList.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/AssetsList/DependencyPopover.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/AssetsList/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Connections/AddConnectionButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Connections/ConnectionForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Connections/Connections.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Connections/DeleteConnectionButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Connections/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Backfills/Backfills.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Backfills/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Code/Code.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Code/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Dag.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/DagHeader.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Details.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Overview/FailedLogs.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Overview/Overview.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Overview/TaskLogPreview.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Overview/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Tasks/TaskCard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Tasks/Tasks.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/Tasks/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dag/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagRuns.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/AssetSchedule.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagCard.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagCard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagTags.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagsFilters.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagsList.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/DagsList.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/RecentRuns.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/Schedule.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/SortSelect.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/DagsList/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Dashboard.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Health/Health.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Health/HealthBadge.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Health/HealthSection.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Health/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/DagRunMetrics.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/HistoricalMetrics.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/MetricSection.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/MetricSectionSkeleton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/TaskInstanceMetrics.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/HistoricalMetrics/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Stats/DAGImportErrors.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Stats/DAGImportErrorsModal.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Stats/DagFilterButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Stats/Stats.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/Stats/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Dashboard/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Error.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Events/Events.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Events/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/MappedTaskInstance/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/MappedTaskInstance/MappedTaskInstance.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/MappedTaskInstance/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Plugins.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/AddPoolButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/DeletePoolButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/EditPoolButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/PoolBar.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/PoolForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/Pools.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Pools/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Providers.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Run/Details.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Run/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Run/Run.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Run/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Security.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Task/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Task/Overview/Overview.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Task/Overview/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Task/Task.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Task/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/BlockingDeps.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Details.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/ExtraLinks.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Header.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Logs/Logs.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Logs/Logs.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Logs/TaskLogContent.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/Logs/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/RenderedTemplates.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/TaskInstance.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/TriggererInfo.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstance/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstances/TaskInstances.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/TaskInstances/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/DeleteVariablesButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ImportVariablesButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ImportVariablesForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ManageVariable/AddVariableButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/ManageVariable/VariableForm.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/Variables.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/Variables/index.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/XCom/XCom.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/XCom/XComEntry.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/pages/XCom/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useAddConnection.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useAddPool.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useAddVariable.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useBulkDeleteVariables.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useClearDagRunDryRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useClearRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useClearTaskInstances.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useClearTaskInstancesDryRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useConfig.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useConnectionTypeMeta.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useCreateBackfill.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useCreateBackfillDryRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDagParams.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDagParsing.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDags.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDeleteConnection.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDeletePool.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useDeleteVariable.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useEditPool.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useEditVariable.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useGrid.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useImportVariables.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useLogs.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useParamStore.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/usePatchDagRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/usePatchTaskInstance.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/usePatchTaskInstanceDryRun.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useTogglePause.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queries/useTrigger.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/queryClient.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/router.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/theme.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/AppWrapper.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/ChakraWrapper.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/ChakraWrapper.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/RouterWrapper.test.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/RouterWrapper.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/TrimText.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/Wrapper.tsx (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/advancedSelectStyles.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/capitalize.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/datetime_utils.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/downloadJson.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/getMetaKey.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/index.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/links.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/logs.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/option.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/pluralize.test.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/pluralize.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/query.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/tokenHandler.test.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/tokenHandler.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/trimTextFn.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/utils/useContainerWidth.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/src/vite-env.d.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/testsSetup.ts (100%) rename {airflow => airflow-core/src/airflow}/ui/tsconfig.app.json (100%) rename {airflow => airflow-core/src/airflow}/ui/tsconfig.dev.json (100%) rename {airflow => airflow-core/src/airflow}/ui/tsconfig.json (100%) rename {airflow => airflow-core/src/airflow}/ui/tsconfig.node.json (100%) rename {airflow => airflow-core/src/airflow}/ui/vite.config.ts (100%) rename {airflow => airflow-core/src/airflow}/utils/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/utils/api_migration.py (100%) rename {airflow => airflow-core/src/airflow}/utils/cli.py (100%) rename {airflow => airflow-core/src/airflow}/utils/cli_action_loggers.py (100%) rename {airflow => airflow-core/src/airflow}/utils/code_utils.py (100%) rename {airflow => airflow-core/src/airflow}/utils/configuration.py (87%) rename {airflow => airflow-core/src/airflow}/utils/context.py (100%) rename {airflow => airflow-core/src/airflow}/utils/dag_cycle_tester.py (100%) rename {airflow => airflow-core/src/airflow}/utils/dag_edges.py (100%) rename {airflow => airflow-core/src/airflow}/utils/dag_parsing_context.py (100%) rename {airflow => airflow-core/src/airflow}/utils/dates.py (100%) rename {airflow => airflow-core/src/airflow}/utils/db.py (99%) rename {airflow => airflow-core/src/airflow}/utils/db_cleanup.py (100%) rename {airflow => airflow-core/src/airflow}/utils/db_manager.py (100%) rename {airflow => airflow-core/src/airflow}/utils/decorators.py (100%) rename {airflow => airflow-core/src/airflow}/utils/deprecation_tools.py (100%) rename {airflow => airflow-core/src/airflow}/utils/docs.py (100%) rename {airflow => airflow-core/src/airflow}/utils/dot_renderer.py (100%) rename {airflow => airflow-core/src/airflow}/utils/edgemodifier.py (100%) rename {airflow => airflow-core/src/airflow}/utils/email.py (100%) rename {airflow => airflow-core/src/airflow}/utils/entry_points.py (100%) rename {airflow => airflow-core/src/airflow}/utils/event_scheduler.py (100%) rename {airflow => airflow-core/src/airflow}/utils/file.py (100%) rename {airflow => airflow-core/src/airflow}/utils/hashlib_wrapper.py (100%) rename {airflow => airflow-core/src/airflow}/utils/helpers.py (98%) rename {airflow => airflow-core/src/airflow}/utils/json.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/__init__.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/action_logger.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/colored_log.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/file_processor_handler.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/file_task_handler.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/json_formatter.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/log_reader.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/logging_mixin.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/non_caching_file_handler.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/task_handler_with_custom_formatter.py (100%) rename {airflow => airflow-core/src/airflow}/utils/log/timezone_aware.py (100%) rename {airflow => airflow-core/src/airflow}/utils/mixins.py (100%) rename {airflow => airflow-core/src/airflow}/utils/module_loading.py (100%) rename {airflow => airflow-core/src/airflow}/utils/net.py (100%) rename {airflow => airflow-core/src/airflow}/utils/operator_helpers.py (100%) rename {airflow => airflow-core/src/airflow}/utils/operator_resources.py (100%) rename {airflow => airflow-core/src/airflow}/utils/orm_event_handlers.py (100%) rename {airflow => airflow-core/src/airflow}/utils/platform.py (100%) rename {airflow => airflow-core/src/airflow}/utils/process_utils.py (100%) rename {airflow => airflow-core/src/airflow}/utils/providers_configuration_loader.py (100%) rename {airflow => airflow-core/src/airflow}/utils/retries.py (100%) rename {airflow => airflow-core/src/airflow}/utils/scheduler_health.py (100%) rename {airflow => airflow-core/src/airflow}/utils/serve_logs.py (100%) rename {airflow => airflow-core/src/airflow}/utils/session.py (100%) rename {airflow => airflow-core/src/airflow}/utils/setup_teardown.py (100%) rename {airflow => airflow-core/src/airflow}/utils/singleton.py (100%) rename {airflow => airflow-core/src/airflow}/utils/sqlalchemy.py (100%) rename {airflow => airflow-core/src/airflow}/utils/state.py (100%) rename {airflow => airflow-core/src/airflow}/utils/strings.py (100%) rename {airflow => airflow-core/src/airflow}/utils/task_group.py (100%) rename {airflow => airflow-core/src/airflow}/utils/task_instance_session.py (100%) rename {airflow => airflow-core/src/airflow}/utils/timeout.py (100%) rename {airflow => airflow-core/src/airflow}/utils/timezone.py (100%) rename {airflow => airflow-core/src/airflow}/utils/trigger_rule.py (100%) rename {airflow => airflow-core/src/airflow}/utils/types.py (100%) rename {airflow => airflow-core/src/airflow}/utils/warnings.py (100%) rename {airflow => airflow-core/src/airflow}/utils/weight_rule.py (100%) rename {airflow => airflow-core/src/airflow}/utils/xcom.py (100%) rename {airflow => airflow-core/src/airflow}/utils/yaml.py (99%) rename {airflow => airflow-core/src/airflow}/version.py (100%) rename {tests => airflow-core/tests}/conftest.py (95%) rename {tests => airflow-core/tests}/deprecations_ignore.yml (100%) rename {tests => airflow-core/tests/integration}/__init__.py (88%) rename {tests/api/common => airflow-core/tests/integration/cli}/__init__.py (100%) rename {tests/api_fastapi => airflow-core/tests/integration/cli/commands}/__init__.py (100%) rename {tests => airflow-core/tests}/integration/cli/commands/test_celery_command.py (100%) rename {tests/api_fastapi/auth => airflow-core/tests/integration/executors}/__init__.py (100%) rename {tests => airflow-core/tests}/integration/executors/test_celery_executor.py (100%) rename {tests/api_fastapi/auth/managers => airflow-core/tests/integration/security}/__init__.py (100%) rename {tests => airflow-core/tests}/integration/security/test_kerberos.py (100%) rename scripts/ci/pre_commit/lint_www.py => airflow-core/tests/system/__init__.py (53%) mode change 100755 => 100644 rename {tests => airflow-core/tests}/system/conftest.py (100%) rename {tests/api_fastapi/auth/managers/simple => airflow-core/tests/system/core}/__init__.py (100%) rename {tests => airflow-core/tests}/system/core/example_external_task_child_deferrable.py (100%) rename {tests => airflow-core/tests}/system/core/example_external_task_parent_deferrable.py (100%) rename {tests => airflow-core/tests}/system/example_empty.py (100%) create mode 100644 airflow-core/tests/unit/__init__.py rename {tests/api_fastapi/auth/managers/simple/routes => airflow-core/tests/unit/always}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/always/test_connection.py (99%) rename {tests => airflow-core/tests/unit}/always/test_example_dags.py (91%) rename {tests => airflow-core/tests/unit}/always/test_pandas.py (100%) rename {tests => airflow-core/tests/unit}/always/test_project_structure.py (97%) rename {tests => airflow-core/tests/unit}/always/test_providers_manager.py (99%) rename {tests => airflow-core/tests/unit}/always/test_secrets.py (100%) rename {tests => airflow-core/tests/unit}/always/test_secrets_backends.py (100%) rename {tests => airflow-core/tests/unit}/always/test_secrets_local_filesystem.py (100%) rename {tests/api_fastapi/auth/managers/simple/services => airflow-core/tests/unit/api}/__init__.py (100%) rename {tests/api_fastapi => airflow-core/tests/unit/api}/common/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api/common/test_airflow_health.py (100%) rename {tests => airflow-core/tests/unit}/api/common/test_mark_tasks.py (100%) rename {tests/api_fastapi/core_api => airflow-core/tests/unit/api_fastapi}/__init__.py (100%) rename {tests/api_fastapi/core_api/routes => airflow-core/tests/unit/api_fastapi/auth}/__init__.py (100%) rename {tests/api_fastapi/core_api/routes/public => airflow-core/tests/unit/api_fastapi/auth/managers}/__init__.py (100%) rename {tests/api_fastapi/core_api/routes/ui => airflow-core/tests/unit/api_fastapi/auth/managers/simple}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/simple/conftest.py (100%) rename {tests/api_fastapi/execution_api => airflow-core/tests/unit/api_fastapi/auth/managers/simple/routes}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/simple/routes/test_login.py (100%) rename {tests/api_fastapi/execution_api/routes => airflow-core/tests/unit/api_fastapi/auth/managers/simple/services}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/simple/services/test_login.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/simple/test_simple_auth_manager.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/simple/test_user.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/managers/test_base_auth_manager.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/auth/test_tokens.py (100%) rename {tests/assets => airflow-core/tests/unit/api_fastapi/common}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/common/test_exceptions.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/conftest.py (99%) rename {tests/callbacks => airflow-core/tests/unit/api_fastapi/core_api}/__init__.py (100%) rename {tests/charts => airflow-core/tests/unit/api_fastapi/core_api/routes}/__init__.py (100%) rename {tests/cli/commands/local_commands => airflow-core/tests/unit/api_fastapi/core_api/routes/public}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_assets.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_auth.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_backfills.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_config.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_connections.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_parsing.py (88%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_report.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_run.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_sources.py (96%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_stats.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_tags.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_versions.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dag_warning.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_dags.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_event_logs.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_extra_links.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_import_error.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_job.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_log.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_monitor.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_plugins.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_pools.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_providers.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_task_instances.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_tasks.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_variables.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_version.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/public/test_xcom.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/test_routes.py (99%) rename {tests/cli/commands/remote_commands => airflow-core/tests/unit/api_fastapi/core_api/routes/ui}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_assets.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_auth.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_backfills.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_config.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_connections.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_dags.py (98%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_dashboard.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_dependencies.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_grid.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/routes/ui/test_structure.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/core_api/test_security.py (100%) rename {tests/config_templates => airflow-core/tests/unit/api_fastapi/execution_api}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/conftest.py (100%) rename {tests/core => airflow-core/tests/unit/api_fastapi/execution_api/routes}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_asset_events.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_assets.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_connections.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_dag_runs.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_health.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_task_instances.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_variables.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/routes/test_xcoms.py (100%) rename {tests => airflow-core/tests/unit}/api_fastapi/execution_api/test_app.py (99%) rename {tests => airflow-core/tests/unit}/api_fastapi/test_app.py (100%) rename {tests/dag_processing => airflow-core/tests/unit/assets}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/assets/test_evaluation.py (100%) rename {tests => airflow-core/tests/unit}/assets/test_manager.py (99%) rename {tests/dag_processing/bundles => airflow-core/tests/unit/callbacks}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/callbacks/test_callback_requests.py (100%) rename {tests/dags => airflow-core/tests/unit/charts}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/charts/conftest.py (100%) rename {tests => airflow-core/tests/unit}/charts/helm_template_generator.py (98%) rename {tests => airflow-core/tests/unit}/charts/log_groomer.py (99%) rename {tests => airflow-core/tests/unit}/cli/__init__.py (100%) rename {tests/dags/subdir1 => airflow-core/tests/unit/cli/api}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/__init__.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/_common_cli_classes.py (100%) rename {tests/dags/subdir2 => airflow-core/tests/unit/cli/commands/local_commands}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_api_server_command.py (98%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_cheat_sheet_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_dag_processor_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_db_command.py (99%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_info_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_kerberos_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_plugins_command.py (86%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_rotate_fernet_key_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_scheduler_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_standalone_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/local_commands/test_triggerer_command.py (100%) rename {tests/dags/subdir2/subdir3 => airflow-core/tests/unit/cli/commands/remote_commands}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_asset_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_backfill_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_config_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_connection_command.py (99%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_dag_command.py (99%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_jobs_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_pool_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_task_command.py (99%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_variable_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/remote_commands/test_version_command.py (100%) rename {tests => airflow-core/tests/unit}/cli/commands/test_legacy_commands.py (100%) rename {tests => airflow-core/tests/unit}/cli/conftest.py (100%) rename {tests => airflow-core/tests/unit}/cli/test_cli_parser.py (98%) rename {tests => airflow-core/tests/unit}/cluster_policies/__init__.py (100%) rename {tests/dags/test_zip/test_zip_module => airflow-core/tests/unit/config_templates}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/config_templates/deprecated.cfg (100%) rename {tests => airflow-core/tests/unit}/config_templates/deprecated_cmd.cfg (100%) rename {tests => airflow-core/tests/unit}/config_templates/deprecated_secret.cfg (100%) rename {tests => airflow-core/tests/unit}/config_templates/empty.cfg (100%) rename {tests => airflow-core/tests/unit}/config_templates/requirements.txt (100%) rename {tests/dags_corrupted => airflow-core/tests/unit/core}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/core/test_airflow_module.py (100%) rename {tests => airflow-core/tests/unit}/core/test_configuration.py (99%) rename {tests => airflow-core/tests/unit}/core/test_core.py (100%) rename {tests => airflow-core/tests/unit}/core/test_example_dags_system.py (100%) rename {tests => airflow-core/tests/unit}/core/test_exceptions.py (100%) rename {tests => airflow-core/tests/unit}/core/test_impersonation_tests.py (100%) rename {tests => airflow-core/tests/unit}/core/test_logging_config.py (100%) rename {tests => airflow-core/tests/unit}/core/test_otel_logger.py (100%) rename {tests => airflow-core/tests/unit}/core/test_otel_tracer.py (100%) rename {tests => airflow-core/tests/unit}/core/test_policies.py (100%) rename {tests => airflow-core/tests/unit}/core/test_sentry.py (94%) rename {tests => airflow-core/tests/unit}/core/test_settings.py (100%) rename {tests => airflow-core/tests/unit}/core/test_sqlalchemy_config.py (98%) rename {tests => airflow-core/tests/unit}/core/test_stats.py (98%) rename {tests/dags_with_system_exit => airflow-core/tests/unit/dag_processing}/__init__.py (100%) rename {tests/datasets => airflow-core/tests/unit/dag_processing/bundles}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dag_processing/bundles/test_base.py (99%) rename {tests => airflow-core/tests/unit}/dag_processing/bundles/test_dag_bundle_manager.py (98%) rename {tests => airflow-core/tests/unit}/dag_processing/bundles/test_git.py (100%) rename {tests => airflow-core/tests/unit}/dag_processing/bundles/test_local.py (100%) rename {tests => airflow-core/tests/unit}/dag_processing/test_collection.py (99%) rename {tests => airflow-core/tests/unit}/dag_processing/test_manager.py (99%) rename {tests => airflow-core/tests/unit}/dag_processing/test_processor.py (100%) rename {tests => airflow-core/tests/unit}/dags/.airflowignore (100%) rename {tests => airflow-core/tests/unit}/dags/.airflowignore_glob (100%) rename {tests => airflow-core/tests/unit}/dags/.gitignore (100%) rename {tests => airflow-core/tests/unit}/dags/README.md (100%) rename {tests/decorators => airflow-core/tests/unit/dags}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags/no_dags.py (100%) rename {tests => airflow-core/tests/unit}/dags/subdir1/.airflowignore (100%) rename {tests/integration => airflow-core/tests/unit/dags/subdir1}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags/subdir1/test_ignore_this.py (100%) rename {tests => airflow-core/tests/unit}/dags/subdir2/.airflowignore_glob (100%) rename {tests/integration/cli => airflow-core/tests/unit/dags/subdir2}/__init__.py (100%) rename {tests/integration/cli/commands => airflow-core/tests/unit/dags/subdir2/subdir3}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags/subdir2/subdir3/test_nested_dag.py (100%) rename {tests => airflow-core/tests/unit}/dags/subdir2/test_dont_ignore_this.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_assets.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_backfill_with_upstream_failed_task.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_cli_triggered_dags.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dag_for_db_queries_counter.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dag_parsing_context.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dag_warnings.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dag_with_no_tags.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dag_xcom_openlineage.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_dagrun_fast_follow.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_default_impersonation.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_double_trigger.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_example_bash_operator.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_external_task_sensor_check_existense.py (97%) rename {tests => airflow-core/tests/unit}/dags/test_failing.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_future_start_date.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_heartbeat_failed_fast.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_impersonation.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_imports.py (92%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_cron.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_dup_task.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_param.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_param2.py (97%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_param3.py (97%) rename {tests => airflow-core/tests/unit}/dags/test_invalid_param4.py (97%) rename {tests => airflow-core/tests/unit}/dags/test_latest_runs.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_logging_in_dag.py (97%) rename {tests => airflow-core/tests/unit}/dags/test_mapped_classic.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_mapped_taskflow.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_mark_state.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_miscellaneous.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_missing_owner.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_multiple_dags.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_no_impersonation.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_on_failure_callback.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_on_kill.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_only_empty_tasks.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_openlineage_execution.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_parsing_context.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_scheduler_dags.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_sensor.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_task_view_type_check.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_valid_param.py (98%) rename {tests => airflow-core/tests/unit}/dags/test_valid_param2.py (98%) rename {tests => airflow-core/tests/unit}/dags/test_with_non_default_owner.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_zip/file_no_airflow_dag.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_zip/test_zip.py (100%) rename {tests/integration/executors => airflow-core/tests/unit/dags/test_zip/test_zip_module}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags/test_zip/test_zip_module/test.py (100%) rename {tests => airflow-core/tests/unit}/dags_corrupted/README.md (100%) rename {tests/integration/security => airflow-core/tests/unit/dags_corrupted}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags_corrupted/test_impersonation_custom.py (100%) rename {tests => airflow-core/tests/unit}/dags_corrupted/test_nonstring_owner.py (100%) rename {tests/io => airflow-core/tests/unit/dags_with_system_exit}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/dags_with_system_exit/a_system_exit.py (100%) rename {tests => airflow-core/tests/unit}/dags_with_system_exit/b_test_scheduler_dags.py (100%) rename {tests => airflow-core/tests/unit}/dags_with_system_exit/c_system_exit.py (100%) rename {tests/notifications => airflow-core/tests/unit/datasets}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/datasets/test_dataset.py (100%) rename {tests/secrets => airflow-core/tests/unit/decorators}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_bash.py (99%) rename {tests => airflow-core/tests/unit}/decorators/test_branch_external_python.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_branch_python.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_branch_virtualenv.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_condition.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_external_python.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_mapped.py (98%) rename {tests => airflow-core/tests/unit}/decorators/test_python_virtualenv.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_sensor.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_setup_teardown.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_short_circuit.py (100%) rename {tests => airflow-core/tests/unit}/decorators/test_task_group.py (100%) rename {tests => airflow-core/tests/unit}/executors/.gitignore (100%) rename {tests => airflow-core/tests/unit}/executors/__init__.py (100%) rename {tests => airflow-core/tests/unit}/executors/test_base_executor.py (100%) rename {tests => airflow-core/tests/unit}/executors/test_debug_executor.py (100%) rename {tests => airflow-core/tests/unit}/executors/test_executor_loader.py (88%) rename {tests => airflow-core/tests/unit}/executors/test_executor_utils.py (100%) rename {tests => airflow-core/tests/unit}/executors/test_local_executor.py (100%) rename {tests => airflow-core/tests/unit}/executors/test_sequential_executor.py (100%) rename {tests => airflow-core/tests/unit}/hooks/__init__.py (100%) rename {tests => airflow-core/tests/unit}/hooks/test_base.py (100%) rename {tests/system/core => airflow-core/tests/unit/io}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/io/test_path.py (100%) rename {tests => airflow-core/tests/unit}/io/test_wrapper.py (100%) rename {tests => airflow-core/tests/unit}/jobs/__init__.py (100%) rename {tests => airflow-core/tests/unit}/jobs/test_base_job.py (98%) rename {tests => airflow-core/tests/unit}/jobs/test_scheduler_job.py (99%) rename {tests => airflow-core/tests/unit}/jobs/test_triggerer_job.py (100%) rename {tests => airflow-core/tests/unit}/lineage/__init__.py (100%) rename {tests => airflow-core/tests/unit}/lineage/test_hook.py (100%) rename {tests => airflow-core/tests/unit}/lineage/test_lineage.py (98%) rename {tests => airflow-core/tests/unit}/listeners/__init__.py (100%) rename {tests => airflow-core/tests/unit}/listeners/asset_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/class_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/dag_import_error_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/dag_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/empty_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/file_write_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/full_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/lifecycle_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/partial_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/slow_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/test_asset_listener.py (98%) rename {tests => airflow-core/tests/unit}/listeners/test_listeners.py (98%) rename {tests => airflow-core/tests/unit}/listeners/throwing_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/very_slow_listener.py (100%) rename {tests => airflow-core/tests/unit}/listeners/xcom_listener.py (100%) rename {tests => airflow-core/tests/unit}/macros/__init__.py (100%) rename {tests => airflow-core/tests/unit}/models/__init__.py (100%) rename {tests => airflow-core/tests/unit}/models/test_asset.py (100%) rename {tests => airflow-core/tests/unit}/models/test_backfill.py (100%) rename {tests => airflow-core/tests/unit}/models/test_base.py (100%) rename {tests => airflow-core/tests/unit}/models/test_baseoperator.py (99%) rename {tests => airflow-core/tests/unit}/models/test_cleartasks.py (99%) rename {tests => airflow-core/tests/unit}/models/test_connection.py (100%) rename {tests => airflow-core/tests/unit}/models/test_dag.py (99%) rename {tests => airflow-core/tests/unit}/models/test_dag_version.py (100%) rename {tests => airflow-core/tests/unit}/models/test_dagbag.py (99%) rename {tests => airflow-core/tests/unit}/models/test_dagcode.py (99%) rename {tests => airflow-core/tests/unit}/models/test_dagrun.py (99%) rename {tests => airflow-core/tests/unit}/models/test_dagwarning.py (99%) rename {tests => airflow-core/tests/unit}/models/test_deadline.py (100%) rename {tests => airflow-core/tests/unit}/models/test_mappedoperator.py (99%) rename {tests => airflow-core/tests/unit}/models/test_pool.py (100%) rename {tests => airflow-core/tests/unit}/models/test_renderedtifields.py (100%) rename {tests => airflow-core/tests/unit}/models/test_serialized_dag.py (99%) rename {tests => airflow-core/tests/unit}/models/test_taskinstance.py (99%) rename {tests => airflow-core/tests/unit}/models/test_taskmap.py (100%) rename {tests => airflow-core/tests/unit}/models/test_timestamp.py (100%) rename {tests => airflow-core/tests/unit}/models/test_trigger.py (99%) rename {tests => airflow-core/tests/unit}/models/test_variable.py (99%) rename {tests => airflow-core/tests/unit}/models/test_xcom.py (99%) rename {tests => airflow-core/tests/unit}/models/test_xcom_arg.py (100%) rename {tests/testconfig => airflow-core/tests/unit/notifications}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/notifications/test_basenotifier.py (100%) rename {tests => airflow-core/tests/unit}/notifications/test_notifier.txt (100%) rename {tests => airflow-core/tests/unit}/plugins/__init__.py (100%) rename {tests => airflow-core/tests/unit}/plugins/priority_weight_strategy.py (97%) rename {tests => airflow-core/tests/unit}/plugins/test_plugin.py (97%) rename {tests => airflow-core/tests/unit}/plugins/test_plugin_ignore.py (100%) rename {tests => airflow-core/tests/unit}/plugins/test_plugins_manager.py (98%) rename {tests/testconfig/conf => airflow-core/tests/unit/secrets}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/secrets/test_cache.py (100%) rename {tests => airflow-core/tests/unit}/security/__init__.py (100%) rename {tests => airflow-core/tests/unit}/security/test_kerberos.py (100%) rename {tests => airflow-core/tests/unit}/sensors/__init__.py (100%) rename {tests => airflow-core/tests/unit}/sensors/test_base.py (99%) rename {tests => airflow-core/tests/unit}/sensors/test_external_task_sensor.py (99%) rename {tests => airflow-core/tests/unit}/sensors/test_filesystem.py (100%) rename {tests => airflow-core/tests/unit}/serialization/__init__.py (100%) rename {tests => airflow-core/tests/unit}/serialization/serializers/__init__.py (100%) rename {tests => airflow-core/tests/unit}/serialization/serializers/test_serializers.py (100%) rename {tests => airflow-core/tests/unit}/serialization/test_dag_serialization.py (98%) rename {tests => airflow-core/tests/unit}/serialization/test_serde.py (91%) rename {tests => airflow-core/tests/unit}/serialization/test_serialized_objects.py (97%) rename {tests/system => airflow-core/tests/unit/task}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/task/conftest.py (100%) rename {tests/timetables => airflow-core/tests/unit/testconfig}/__init__.py (100%) rename {tests/utils/log => airflow-core/tests/unit/testconfig/conf}/__init__.py (99%) rename {tests => airflow-core/tests/unit}/testconfig/conf/core-with-trash.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/emr-core-site.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/ha-core-site.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/ha-noport-hdfs-site.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/ha-noport-trash-hdfs-site.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/ha-port-hdfs-site.xml (100%) rename {tests => airflow-core/tests/unit}/testconfig/conf/non-ha-port-core-site.xml (100%) rename {tests/task => airflow-core/tests/unit/ti_deps}/__init__.py (100%) rename {tests/ti_deps => airflow-core/tests/unit/ti_deps/contexts}/__init__.py (100%) rename {tests/ti_deps/contexts => airflow-core/tests/unit/ti_deps/deps}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/fake_models.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_dag_ti_slots_available_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_dag_unpaused_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_dagrun_exists_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_mapped_task_upstream_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_not_in_retry_period_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_not_previously_skipped_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_pool_slots_available_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_prev_dagrun_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_ready_to_reschedule_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_runnable_exec_date_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_task_concurrency.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_task_not_running_dep.py (100%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_trigger_rule_dep.py (99%) rename {tests => airflow-core/tests/unit}/ti_deps/deps/test_valid_state_dep.py (100%) create mode 100644 airflow-core/tests/unit/timetables/__init__.py rename {tests => airflow-core/tests/unit}/timetables/test_assets_timetable.py (100%) rename {tests => airflow-core/tests/unit}/timetables/test_continuous_timetable.py (100%) rename {tests => airflow-core/tests/unit}/timetables/test_events_timetable.py (100%) rename {tests => airflow-core/tests/unit}/timetables/test_interval_timetable.py (99%) rename {tests => airflow-core/tests/unit}/timetables/test_trigger_timetable.py (100%) rename {tests => airflow-core/tests/unit}/timetables/test_workday_timetable.py (97%) rename {tests/ti_deps/deps => airflow-core/tests/unit/utils}/__init__.py (100%) rename {tests/utils => airflow-core/tests/unit/utils/log}/__init__.py (100%) rename {tests => airflow-core/tests/unit}/utils/log/test_colored_log.py (100%) rename {tests => airflow-core/tests/unit}/utils/log/test_file_processor_handler.py (100%) rename {tests => airflow-core/tests/unit}/utils/log/test_json_formatter.py (100%) rename {tests => airflow-core/tests/unit}/utils/log/test_log_reader.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_cli_util.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_config.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_dag_cycle.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_db.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_db_cleanup.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_db_manager.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_decorators.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_docs.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_dot_renderer.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_edgemodifier.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_email.py (98%) rename {tests => airflow-core/tests/unit}/utils/test_entry_points.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_event_scheduler.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_file.py (98%) rename {tests => airflow-core/tests/unit}/utils/test_helpers.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_json.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_log_handlers.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_logging_mixin.py (97%) rename {tests => airflow-core/tests/unit}/utils/test_module_loading.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_net.py (85%) rename {tests => airflow-core/tests/unit}/utils/test_operator_helpers.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_operator_resources.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_orm_event_handlers.py (92%) rename {tests => airflow-core/tests/unit}/utils/test_preexisting_python_virtualenv_decorator.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_process_utils.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_retries.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_scheduler_health.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_serve_logs.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_session.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_singleton.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_sqlalchemy.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_state.py (98%) rename {tests => airflow-core/tests/unit}/utils/test_task_group.py (99%) rename {tests => airflow-core/tests/unit}/utils/test_task_handler_with_custom_formatter.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_timezone.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_trigger_rule.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_types.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_warnings.py (100%) rename {tests => airflow-core/tests/unit}/utils/test_weight_rule.py (100%) rename contributing-docs/{11_provider_packages.rst => 11_provider_distributions.rst} (71%) rename dev/{PROVIDER_PACKAGE_DETAILS.md => PROVIDER_DISTRIBUTIONS_DETAILS.md} (80%) rename dev/{README_RELEASE_PROVIDER_PACKAGES.md => README_RELEASE_PROVIDERS.md} (93%) create mode 100644 dev/breeze/doc/images/output_release-management_install-provider-distributions.svg create mode 100644 dev/breeze/doc/images/output_release-management_install-provider-distributions.txt delete mode 100644 dev/breeze/doc/images/output_release-management_install-provider-packages.svg delete mode 100644 dev/breeze/doc/images/output_release-management_install-provider-packages.txt create mode 100644 dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.svg create mode 100644 dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-airflow-package.txt create mode 100644 dev/breeze/doc/images/output_release-management_prepare-provider-distributions.svg create mode 100644 dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-provider-packages.svg delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-provider-packages.txt create mode 100644 dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.svg create mode 100644 dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.svg delete mode 100644 dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.txt create mode 100644 dev/breeze/doc/images/output_release-management_verify-provider-distributions.svg create mode 100644 dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt delete mode 100644 dev/breeze/doc/images/output_release-management_verify-provider-packages.svg delete mode 100644 dev/breeze/doc/images/output_release-management_verify-provider-packages.txt rename dev/breeze/src/airflow_breeze/prepare_providers/{provider_packages.py => provider_distributions.py} (88%) rename dev/provider_packages/publish_provider_documentation.sh => devel-common/src/tests_common/test_utils/paths.py (65%) mode change 100755 => 100644 delete mode 100644 docs/apache-airflow/img/airflow_erd.sha256 rename providers/fab/tests/unit/{ => fab}/decorators.py (100%) rename airflow/reproducible_build.yaml => reproducible_build.yaml (63%) rename scripts/ci/pre_commit/{base_operator_partial_arguments.py => check_base_operator_partial_arguments.py} (89%) rename scripts/ci/pre_commit/{sync_init_decorator.py => check_init_decorator_arguments.py} (82%) rename scripts/ci/pre_commit/{version_heads_map.py => check_revision_heads_map.py} (80%) rename scripts/ci/pre_commit/{template_context_key_sync.py => check_template_context_variable_in_sync.py} (92%) rename scripts/ci/pre_commit/{lint_ui.py => compile_lint_ui.py} (86%) delete mode 100755 scripts/ci/pre_commit/compile_www_assets.py delete mode 100755 scripts/ci/pre_commit/compile_www_assets_dev.py rename scripts/ci/pre_commit/{json_schema.py => lint_json_schema.py} (95%) rename scripts/docker/{get_package_specs.py => get_distribution_specs.py} (100%) create mode 100755 scripts/in_container/run_prepare_airflow_distributions.py delete mode 100755 scripts/in_container/run_prepare_airflow_packages.py create mode 100644 signal-desktop-keyring.gpg rename {dev => task-sdk/dev}/datamodel_code_formatter.py (97%) rename task-sdk/dev/{generate_models.py => generate_task_sdk_models.py} (83%) diff --git a/.dockerignore b/.dockerignore index 6bdedc9cbdb34..91e7dfea6d2d5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -27,7 +27,7 @@ ** # Allow only these directories -!airflow +!airflow-core !common !dags !dev @@ -75,19 +75,24 @@ !pyproject.toml !manifests !generated + +# Reproducible build configuration +!reproducible_build.yaml + # Now - ignore unnecessary files inside allowed directories # This goes after the allowed directories # Git version is dynamically generated -airflow/git_version +airflow-core/src/airflow/git_version # Exclude node/pmpme caches.. **/.pnpm-store **/node_modules # Exclude link to docs -airflow/ui/static/docs +airflow-core/src/airflow/ui/static/docs # Legacy www exclusions (just to exclude things in case you switch to old branches and generate assets) +# THey should not be in airflow-core as "www" never was there. airflow/www/static/docs airflow/www/static/dist airflow/www/node_modules @@ -123,7 +128,7 @@ docs/**/_api/** **/*.egg # But ensure UI dist files are included -!airflow/ui/dist +!airflow-core/src/airflow/ui/dist !providers/fab/src/airflow/providers/fab/www/dist # Exclude temporary vi files diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8e23addbe2100..b46d74318372b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -80,7 +80,7 @@ Dockerfile.ci @potiuk @ashb /dev/PROVIDER_PACKAGE_DETAILS.md @eladkal /dev/README.md @kaxil /dev/README_RELEASE_*.md @kaxil @pierrejeambrun -/dev/README_RELEASE_PROVIDER_PACKAGES.md @eladkal +/dev/README_RELEASE_PROVIDERS.md @eladkal ISSUE_TRIAGE_PROCESS.rst @eladkal # AIP-52 - Setup and Teardown diff --git a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml index f991b45d14e51..25fb14cba10e4 100644 --- a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml @@ -7,7 +7,7 @@ body: attributes: # yamllint disable rule:line-length value: " - + Thank you for finding the time to report the problem! We really appreciate the community's efforts to improve Airflow. diff --git a/.github/ISSUE_TEMPLATE/airflow_doc_issue_report.yml b/.github/ISSUE_TEMPLATE/airflow_doc_issue_report.yml index 6bfc7f33663a9..50e6c9ac1dfe8 100644 --- a/.github/ISSUE_TEMPLATE/airflow_doc_issue_report.yml +++ b/.github/ISSUE_TEMPLATE/airflow_doc_issue_report.yml @@ -7,7 +7,7 @@ body: attributes: # yamllint disable rule:line-length value: " - + Thank you for finding the time to report the problem! We really appreciate the community's efforts to improve Airflow. diff --git a/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml index 206e36518ab58..3d068a5396b7a 100644 --- a/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml @@ -7,7 +7,7 @@ body: attributes: # yamllint disable rule:line-length value: " - + Thank you for finding the time to report the problem! We really appreciate the community's efforts to improve Airflow. diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml index 8472ad681cce7..777d0976dfc81 100644 --- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml @@ -7,7 +7,7 @@ body: attributes: # yamllint disable rule:line-length value: " - + Thank you for finding the time to report a problem! We really appreciate the community's efforts to improve Airflow. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index c771b2a236c7c..402417c4088af 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -7,7 +7,7 @@ body: attributes: # yamllint disable rule:line-length value: " - + Thank you for finding the time to propose new feature! We really appreciate the community efforts to improve Airflow. diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 4bcbd30dcad19..267a2ddd13560 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -118,7 +118,7 @@ Team and how members of it are chosen can be found in the ### Does CVE in Airflow Providers impact Airflow core package ? -Airflow core package is released separately from provider packages. While Airflow comes with ``constraints`` +Airflow core package is released separately from provider distributions. While Airflow comes with ``constraints`` which describe which version of providers have been tested when the version of Airflow was released, the users of Airflow are advised to install providers independently of Airflow core when they want to apply security fixes found and released in providers. Therefore, the issues found and fixed in providers do diff --git a/.github/actions/breeze/action.yml b/.github/actions/breeze/action.yml index d7eaa1b088bee..39e87cd7d8b52 100644 --- a/.github/actions/breeze/action.yml +++ b/.github/actions/breeze/action.yml @@ -45,7 +45,7 @@ runs: shell: bash run: breeze ci free-space env: - AIRFLOW_SOURCES_ROOT: "${{ github.workspace }}" + AIRFLOW_ROOT_PATH: "${{ github.workspace }}" - name: "Get Python version" shell: bash run: > @@ -56,4 +56,4 @@ runs: shell: bash run: breeze setup config --no-cheatsheet --no-asciiart env: - AIRFLOW_SOURCES_ROOT: "${{ github.workspace }}" + AIRFLOW_ROOT_PATH: "${{ github.workspace }}" diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml index 40470aa6ae598..b7da63728ae54 100644 --- a/.github/boring-cyborg.yml +++ b/.github/boring-cyborg.yml @@ -301,11 +301,11 @@ labelPRBasedOnFilePath: - providers/zendesk/** area:API: - - airflow/api/**/* - - airflow/api_fastapi/**/* + - airflow-core/src/airflow/api/**/* + - airflow-core/src/airflow/api_fastapi/**/* - clients/**/* - - docs/apache-airflow/stable-rest-api-ref.rst - - tests/api_fastapi/**/* + - airflow-core/docs/stable-rest-api-ref.rst + - airflow-core/tests/unit/api_fastapi/**/* area:dev-tools: - scripts/**/* @@ -331,80 +331,79 @@ labelPRBasedOnFilePath: - docs/helm-chart/** area:UI: - - docs/apache-airflow/ui.rst - - airflow/ui/**/* + - airflow-core/docs/ui.rst + - airflow-core/src/airflow/ui/**/* area:CLI: - - airflow/cli/**/*.py - - tests/cli/**/*.py - - docs/apache-airflow/cli-and-env-variables-ref.rst - - docs/apache-airflow/howto/usage-cli.rst + - airflow-core/src/airflow/cli/**/*.py + - airflow-core/tests/unit/cli/**/*.py + - airflow-core/docs/cli-and-env-variables-ref.rst + - airflow-core/docs/howto/usage-cli.rst area:Lineage: - - airflow/lineage/**/* - - tests/lineage/**/* - - docs/apache-airflow/administration-and-deployment/lineage.rst + - airflow-core/src/airflow/lineage/**/* + - airflow-core/tests/unit/lineage/**/* + - airflow-core/docs/administration-and-deployment/lineage.rst area:Logging: - - airflow/utils/log/**/* - - docs/apache-airflow/administration-and-deployment/logging-monitoring/logging-*.rst - - tests/utils/log/**/* + - airflow-core/src/airflow/utils/log/**/* + - airflow-core/docs/administration-and-deployment/logging-monitoring/logging-*.rst + - airflow-core/tests/unit/utils/log/**/* - providers/**/log/* area:Plugins: - - airflow/cli/commands/local_commands/plugins_command.py - - airflow/plugins_manager.py - - tests/cli/commands/local_commands/test_plugins_command.py - - tests/plugins/**/* - - docs/apache-airflow/administration-and-deployment/plugins.rst + - airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py + - airflow-core/src/airflow/plugins_manager.py + - airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py + - airflow-core/tests/unit/plugins/**/* + - airflow-core/docs/administration-and-deployment/plugins.rst area:Scheduler: - - airflow/jobs/scheduler_job_runner.py - - docs/apache-airflow/administration-and-deployment/scheduler.rst - - tests/jobs/test_scheduler_job.py + - airflow-core/src/airflow/jobs/scheduler_job_runner.py + - airflow-core/docs/administration-and-deployment/scheduler.rst + - airflow-core/tests/unit/jobs/test_scheduler_job.py area:DAG-processing: - - airflow/dag_processing/**/* - - airflow/jobs/dag_processor_job_runner.py - - docs/apache-airflow/administration-and-deployment/dagfile-processing.rst - - tests/dag_processing/**/* + - airflow-core/src/airflow/dag_processing/**/* + - airflow-core/src/airflow/jobs/dag_processor_job_runner.py + - airflow-core/docs/administration-and-deployment/dagfile-processing.rst + - airflow-core/tests/unit/dag_processing/**/* area:Executors-core: - - airflow/executors/**/* - - docs/apache-airflow/core-concepts/executor/**/* - - tests/executors/**/* + - airflow-core/src/airflow/executors/**/* + - airflow-core/docs/core-concepts/executor/**/* + - airflow-core/tests/unit/executors/**/* area:Secrets: - - airflow/secrets/**/* - - tests/secrets/**/* + - airflow-core/src/airflow/secrets/**/* + - airflow-core/tests/unit/secrets/**/* - providers/**/secrets/* - - docs/apache-airflow/security/secrets/**/* + - airflow-core/docs/security/secrets/**/* area:Triggerer: - - airflow/cli/commands/local_commands/triggerer_command.py - - airflow/jobs/triggerer_job_runner.py - - airflow/models/trigger.py + - airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py + - airflow-core/src/airflow/jobs/triggerer_job_runner.py + - airflow-core/src/airflow/models/trigger.py - providers/standard/src/airflow/providers/standard/triggers/**/* - - tests/cli/commands/local_commands/test_triggerer_command.py - - tests/jobs/test_triggerer_job.py - - tests/models/test_trigger.py + - airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py + - airflow-core/tests/unit/jobs/test_triggerer_job.py + - airflow-core/tests/unit/models/test_trigger.py - providers/standard/tests/unit/standard/triggers/**/* area:Serialization: - - airflow/serialization/**/* - - airflow/models/serialized_dag.py - - tests/serialization/**/* - - tests/models/test_serialized_dag.py - - docs/apache-airflow/administration-and-deployment/dag-serialization.rst + - airflow-core/src/airflow/serialization/**/* + - airflow-core/src/airflow/models/serialized_dag.py + - airflow-core/tests/unit/serialization/**/* + - airflow-core/tests/unit/models/test_serialized_dag.py + - airflow-core/docs/administration-and-deployment/dag-serialization.rst area:core-operators: - - airflow/operators/**/* - - airflow/hooks/**/* - - airflow/sensors/**/* - - tests/hooks/**/* - - tests/sensors/**/* - - docs/apache-airflow/operators-and-hooks-ref.rst - - docs/apache-airflow/howto/operator/* + - airflow-core/src/airflow/hooks/**/* + - airflow-core/src/airflow/sensors/**/* + - airflow-core/tests/unit/hooks/**/* + - airflow-core/tests/unit/sensors/**/* + - airflow-core/docs/operators-and-hooks-ref.rst + - airflow-core/docs/howto/operator/* area:production-image: - Dockerfile @@ -412,13 +411,13 @@ labelPRBasedOnFilePath: - docker_tests/**/* area:system-tests: - - tests/system/**/* + - airflow-core/tests/system/**/* area:task-sdk: - task-sdk/**/* area:db-migrations: - - airflow/migrations/versions/* + - airflow-core/src/airflow/migrations/versions/* area:providers: - providers/**/* @@ -445,7 +444,7 @@ firstPRWelcomeComment: > - In case of a new feature add useful documentation (in docstrings or in `docs/` directory). Adding a new operator? Check this short - [guide](https://github.com/apache/airflow/blob/main/docs/apache-airflow/howto/custom-operator.rst) + [guide](https://github.com/apache/airflow/blob/main/airflow-core/docs/howto/custom-operator.rst) Consider adding an example DAG that shows how users should use it. - Consider using [Breeze environment](https://github.com/apache/airflow/blob/main/dev/breeze/doc/README.rst) diff --git a/.github/workflows/additional-ci-image-checks.yml b/.github/workflows/additional-ci-image-checks.yml index 5b797d9bf4056..e9529bd0d08d2 100644 --- a/.github/workflows/additional-ci-image-checks.yml +++ b/.github/workflows/additional-ci-image-checks.yml @@ -93,7 +93,7 @@ jobs: # changes or in case of Dockerfile changes. Failure in this step is not a problem (at most it will # delay cache refresh. It does not attempt to upgrade to newer dependencies. # We only push CI cache as PROD cache usually does not gain as much from fresh cache because - # it uses prepared airflow and provider packages that invalidate the cache anyway most of the time + # it uses prepared airflow and provider distributions that invalidate the cache anyway most of the time push-early-buildx-cache-to-github-registry: name: Push Early Image Cache uses: ./.github/workflows/push-image-cache.yml diff --git a/.github/workflows/additional-prod-image-tests.yml b/.github/workflows/additional-prod-image-tests.yml index 7b55121571471..00c3599b7fbe1 100644 --- a/.github/workflows/additional-prod-image-tests.yml +++ b/.github/workflows/additional-prod-image-tests.yml @@ -37,7 +37,7 @@ on: # yamllint disable-line rule:truthy required: true type: string chicken-egg-providers: - description: "Whether to build chicken-egg provider packages in the same run (true/false)" + description: "Whether to build chicken-egg provider distributions in the same run (true/false)" required: true type: string docker-cache: @@ -72,7 +72,7 @@ jobs: default-python-version: ${{ inputs.default-python-version }} branch: ${{ inputs.default-branch }} use-uv: "false" - build-provider-packages: ${{ inputs.default-branch == 'main' }} + build-provider-distributions: ${{ inputs.default-branch == 'main' }} upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }} chicken-egg-providers: ${{ inputs.chicken-egg-providers }} constraints-branch: ${{ inputs.constraints-branch }} @@ -89,7 +89,7 @@ jobs: default-python-version: ${{ inputs.default-python-version }} branch: ${{ inputs.default-branch }} use-uv: "false" - build-provider-packages: ${{ inputs.default-branch == 'main' }} + build-provider-distributions: ${{ inputs.default-branch == 'main' }} upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }} chicken-egg-providers: ${{ inputs.chicken-egg-providers }} constraints-branch: ${{ inputs.constraints-branch }} diff --git a/.github/workflows/basic-tests.yml b/.github/workflows/basic-tests.yml index 775c72f0523c3..c824798343536 100644 --- a/.github/workflows/basic-tests.yml +++ b/.github/workflows/basic-tests.yml @@ -109,21 +109,22 @@ jobs: with: node-version: 21 cache: 'pnpm' - cache-dependency-path: 'airflow/**/pnpm-lock.yaml' + cache-dependency-path: 'airflow-core/src/airflow/**/pnpm-lock.yaml' - name: "Restore eslint cache (ui)" uses: apache/infrastructure-actions/stash/restore@1c35b5ccf8fba5d4c3fdf25a045ca91aa0cbc468 with: - path: airflow/ui/node_modules/ - key: cache-ui-node-modules-v1-${{ runner.os }}-${{ hashFiles('airflow/ui/**/pnpm-lock.yaml') }} + path: airflow-core/src/airflow/ui/node_modules/ + # yamllint disable-line rule:line-length + key: cache-ui-node-modules-v1-${{ runner.os }}-${{ hashFiles('airflow-core/src/airflow/ui/**/pnpm-lock.yaml') }} id: restore-eslint-cache-ui - - run: cd airflow/ui && pnpm install --frozen-lockfile - - run: cd airflow/ui && pnpm test + - run: cd airflow-core/src/airflow/ui && pnpm install --frozen-lockfile + - run: cd airflow-core/src/airflow/ui && pnpm test env: FORCE_COLOR: 2 - name: "Save eslint cache (ui)" uses: apache/infrastructure-actions/stash/save@1c35b5ccf8fba5d4c3fdf25a045ca91aa0cbc468 with: - path: airflow/ui/node_modules/ + path: airflow-core/src/airflow/ui/node_modules/ key: cache-ui-node-modules-v1-${{ runner.os }}-${{ hashFiles('airflow/ui/**/pnpm-lock.yaml') }} if-no-files-found: 'error' retention-days: '2' @@ -131,19 +132,19 @@ jobs: - name: "Restore eslint cache (simple auth manager UI)" uses: apache/infrastructure-actions/stash/restore@1c35b5ccf8fba5d4c3fdf25a045ca91aa0cbc468 with: - path: airflow/api_fastapi/auth/managers/simple/ui/node_modules/ + path: airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/node_modules/ key: > cache-simple-am-ui-node-modules-v1- ${{ runner.os }}-${{ hashFiles('airflow/api_fastapi/auth/managers/simple/ui/**/pnpm-lock.yaml') }} id: restore-eslint-cache-simple-am-ui - - run: cd airflow/api_fastapi/auth/managers/simple/ui && pnpm install --frozen-lockfile - - run: cd airflow/api_fastapi/auth/managers/simple/ui && pnpm test + - run: cd airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui && pnpm install --frozen-lockfile + - run: cd airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui && pnpm test env: FORCE_COLOR: 2 - name: "Save eslint cache (ui)" uses: apache/infrastructure-actions/stash/save@1c35b5ccf8fba5d4c3fdf25a045ca91aa0cbc468 with: - path: airflow/api_fastapi/auth/managers/simple/ui/node_modules/ + path: airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/node_modules/ key: > cache-simple-am-ui-node-modules-v1- ${{ runner.os }}-${{ hashFiles('airflow/api_fastapi/auth/managers/simple/ui/**/pnpm-lock.yaml') }} diff --git a/.github/workflows/ci-image-checks.yml b/.github/workflows/ci-image-checks.yml index 9fcd29646fd5c..bb7c95425fd70 100644 --- a/.github/workflows/ci-image-checks.yml +++ b/.github/workflows/ci-image-checks.yml @@ -431,7 +431,7 @@ jobs: use-uv: ${{ inputs.use-uv }} - name: "Generate airflow python client" run: > - breeze release-management prepare-python-client --package-format both + breeze release-management prepare-python-client --distribution-format both --version-suffix-for-pypi dev0 --python-client-repo ./airflow-client-python - name: "Show diff" run: git diff --color HEAD diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c448b823d6db..578c3e77964e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -294,8 +294,8 @@ jobs: DOCS_AWS_SECRET_ACCESS_KEY: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }} providers: - name: "Provider packages tests" - uses: ./.github/workflows/test-provider-packages.yml + name: "provider distributions tests" + uses: ./.github/workflows/test-providers.yml needs: [build-info, build-ci-images] permissions: contents: read @@ -540,7 +540,7 @@ jobs: default-python-version: ${{ needs.build-info.outputs.default-python-version }} branch: ${{ needs.build-info.outputs.default-branch }} use-uv: ${{ needs.build-info.outputs.use-uv }} - build-provider-packages: ${{ needs.build-info.outputs.default-branch == 'main' }} + build-provider-distributions: ${{ needs.build-info.outputs.default-branch == 'main' }} upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }} chicken-egg-providers: ${{ needs.build-info.outputs.chicken-egg-providers }} constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }} diff --git a/.github/workflows/generate-constraints.yml b/.github/workflows/generate-constraints.yml index 214e3aad37af4..491b4db30f48f 100644 --- a/.github/workflows/generate-constraints.yml +++ b/.github/workflows/generate-constraints.yml @@ -98,16 +98,16 @@ jobs: # The no providers constraints are only needed when we want to update constraints (in canary builds) # They slow down the start of PROD image builds so we want to only run them when needed. if: inputs.generate-no-providers-constraints == 'true' - - name: "Prepare chicken-eggs provider packages" - # In case of provider packages which use latest dev0 version of providers, we should prepare them + - name: "Prepare chicken-eggs provider distributions" + # In case of provider distributions which use latest dev0 version of providers, we should prepare them # from the source code, not from the PyPI because they have apache-airflow>=X.Y.Z dependency # And when we prepare them from sources they will have apache-airflow>=X.Y.Z.dev0 shell: bash env: CHICKEN_EGG_PROVIDERS: ${{ inputs.chicken-egg-providers }} run: > - breeze release-management prepare-provider-packages --include-not-ready-providers - --package-format wheel --version-suffix-for-pypi dev0 + breeze release-management prepare-provider-distributions --include-not-ready-providers + --distribution-format wheel --version-suffix-for-pypi dev0 ${CHICKEN_EGG_PROVIDERS} if: inputs.chicken-egg-providers != '' - name: "PyPI constraints" diff --git a/.github/workflows/integration-system-tests.yml b/.github/workflows/integration-system-tests.yml index 2bf6cc12149a6..fc3159223e8fb 100644 --- a/.github/workflows/integration-system-tests.yml +++ b/.github/workflows/integration-system-tests.yml @@ -197,7 +197,7 @@ jobs: use-uv: ${{ inputs.use-uv }} - name: "System Tests" run: > - ./scripts/ci/testing/run_system_tests.sh tests/system/example_empty.py + ./scripts/ci/testing/run_system_tests.sh airflow-core/tests/system/example_empty.py - name: "Post Tests success" uses: ./.github/actions/post_tests_success with: diff --git a/.github/workflows/prod-image-build.yml b/.github/workflows/prod-image-build.yml index d942d55dffc6b..749330c0d358d 100644 --- a/.github/workflows/prod-image-build.yml +++ b/.github/workflows/prod-image-build.yml @@ -92,8 +92,8 @@ on: # yamllint disable-line rule:truthy description: "Branch used to construct constraints URL from." required: true type: string - build-provider-packages: - description: "Whether to build provider packages (true/false). If false providers are from PyPI" + build-provider-distributions: + description: "Whether to build provider distributions (true/false). If false providers are from PyPI" required: true type: string upgrade-to-newer-dependencies: @@ -120,7 +120,7 @@ permissions: contents: read jobs: build-prod-packages: - name: "Build Airflow and provider packages" + name: "Build Airflow and provider distributions" timeout-minutes: 10 runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }} if: inputs.prod-image-build == 'true' @@ -151,31 +151,31 @@ jobs: - name: "Prepare providers packages" shell: bash run: > - breeze release-management prepare-provider-packages - --package-list-file ./prod_image_installed_providers.txt - --package-format wheel --include-not-ready-providers + breeze release-management prepare-provider-distributions + --distributions-list-file ./prod_image_installed_providers.txt + --distribution-format wheel --include-not-ready-providers if: > inputs.upload-package-artifact == 'true' && - inputs.build-provider-packages == 'true' - - name: "Prepare chicken-eggs provider packages" + inputs.build-provider-distributions == 'true' + - name: "Prepare chicken-eggs provider distributions" shell: bash env: CHICKEN_EGG_PROVIDERS: ${{ inputs.chicken-egg-providers }} run: > - breeze release-management prepare-provider-packages - --package-format wheel ${CHICKEN_EGG_PROVIDERS} + breeze release-management prepare-provider-distributions + --distribution-format wheel ${CHICKEN_EGG_PROVIDERS} if: > inputs.upload-package-artifact == 'true' && inputs.chicken-egg-providers != '' - name: "Prepare airflow package" shell: bash run: > - breeze release-management prepare-airflow-package --package-format wheel + breeze release-management prepare-airflow-distributions --distribution-format wheel if: inputs.upload-package-artifact == 'true' - name: "Prepare task-sdk package" shell: bash run: > - breeze release-management prepare-task-sdk-package --package-format wheel + breeze release-management prepare-task-sdk-distributions --distribution-format wheel if: inputs.upload-package-artifact == 'true' - name: "Upload prepared packages as artifacts" uses: actions/upload-artifact@v4 @@ -251,9 +251,9 @@ jobs: breeze prod-image build --builder airflow_cache --commit-sha "${{ github.sha }}" - --install-packages-from-context + --install-distributions-from-context --airflow-constraints-mode constraints-source-providers - --use-constraints-for-context-packages + --use-constraints-for-context-distributions env: PUSH: ${{ inputs.push-image }} DOCKER_CACHE: ${{ inputs.docker-cache }} @@ -262,16 +262,16 @@ jobs: INSTALL_MYSQL_CLIENT_TYPE: ${{ inputs.install-mysql-client-type }} UPGRADE_TO_NEWER_DEPENDENCIES: ${{ inputs.upgrade-to-newer-dependencies }} INCLUDE_NOT_READY_PROVIDERS: "true" - if: inputs.build-provider-packages == 'true' + if: inputs.build-provider-distributions == 'true' - name: "Build PROD images with PyPi providers ${{ env.PYTHON_MAJOR_MINOR_VERSION }}" shell: bash run: > breeze prod-image build --builder airflow_cache --commit-sha "${{ github.sha }}" - --install-packages-from-context + --install-distributions-from-context --airflow-constraints-mode constraints - --use-constraints-for-context-packages + --use-constraints-for-context-distributions env: PUSH: ${{ inputs.push-image }} DOCKER_CACHE: ${{ inputs.docker-cache }} @@ -280,7 +280,7 @@ jobs: INSTALL_MYSQL_CLIENT_TYPE: ${{ inputs.install-mysql-client-type }} UPGRADE_TO_NEWER_DEPENDENCIES: ${{ inputs.upgrade-to-newer-dependencies }} INCLUDE_NOT_READY_PROVIDERS: "true" - if: inputs.build-provider-packages != 'true' + if: inputs.build-provider-distributions != 'true' - name: "Verify PROD image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}" run: breeze prod-image verify - name: "Export PROD docker image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}" diff --git a/.github/workflows/prod-image-extra-checks.yml b/.github/workflows/prod-image-extra-checks.yml index 56fa4b2b1a28d..0b208cb552059 100644 --- a/.github/workflows/prod-image-extra-checks.yml +++ b/.github/workflows/prod-image-extra-checks.yml @@ -40,8 +40,8 @@ on: # yamllint disable-line rule:truthy description: "Whether to use uv to build the image (true/false)" required: true type: string - build-provider-packages: - description: "Whether to build provider packages (true/false). If false providers are from PyPI" + build-provider-distributions: + description: "Whether to build provider distributions (true/false). If false providers are from PyPI" required: true type: string upgrade-to-newer-dependencies: @@ -82,7 +82,7 @@ jobs: # Always build images during the extra checks and never push them push-image: "false" use-uv: ${{ inputs.use-uv }} - build-provider-packages: ${{ inputs.build-provider-packages }} + build-provider-distributions: ${{ inputs.build-provider-distributions }} upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }} chicken-egg-providers: ${{ inputs.chicken-egg-providers }} constraints-branch: ${{ inputs.constraints-branch }} @@ -107,7 +107,7 @@ jobs: # Always build images during the extra checks and never push them push-image: "false" use-uv: "false" - build-provider-packages: ${{ inputs.build-provider-packages }} + build-provider-distributions: ${{ inputs.build-provider-distributions }} upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }} chicken-egg-providers: ${{ inputs.chicken-egg-providers }} constraints-branch: ${{ inputs.constraints-branch }} diff --git a/.github/workflows/push-image-cache.yml b/.github/workflows/push-image-cache.yml index 7698fc88e5388..cf8097cebd768 100644 --- a/.github/workflows/push-image-cache.yml +++ b/.github/workflows/push-image-cache.yml @@ -228,7 +228,7 @@ jobs: run: > breeze prod-image build --builder airflow_cache - --install-packages-from-context + --install-distributions-from-context --platform "${PLATFORM}" --airflow-constraints-mode constraints-source-providers if: inputs.push-latest-images == 'true' && inputs.platform == 'linux/amd64' @@ -240,7 +240,7 @@ jobs: breeze prod-image build --builder airflow_cache --prepare-buildx-cache - --install-packages-from-context + --install-distributions-from-context --platform "${PLATFORM}" --airflow-constraints-mode constraints-source-providers --push diff --git a/.github/workflows/release_dockerhub_image.yml b/.github/workflows/release_dockerhub_image.yml index 7b9adcf60dba5..90fde26f50be3 100644 --- a/.github/workflows/release_dockerhub_image.yml +++ b/.github/workflows/release_dockerhub_image.yml @@ -144,16 +144,16 @@ jobs: run: docker run --privileged --rm tonistiigi/binfmt --install all - name: "Create airflow_cache builder" run: docker buildx create --name airflow_cache - - name: "Prepare chicken-eggs provider packages" - # In case of provider packages which use latest dev0 version of providers, we should prepare them + - name: "Prepare chicken-eggs provider distributions" + # In case of provider distributions which use latest dev0 version of providers, we should prepare them # from the source code, not from the PyPI because they have apache-airflow>=X.Y.Z dependency # And when we prepare them from sources they will have apache-airflow>=X.Y.Z.dev0 shell: bash env: CHICKEN_EGG_PROVIDERS: ${{ needs.build-info.outputs.chicken-egg-providers }} run: > - breeze release-management prepare-provider-packages - --package-format wheel + breeze release-management prepare-provider-distributions + --distribution-format wheel --version-suffix-for-pypi dev0 ${CHICKEN_EGG_PROVIDERS} if: needs.build-info.outputs.chicken-egg-providers != '' - name: "Copy dist packages to docker-context files" diff --git a/.github/workflows/task-sdk-tests.yml b/.github/workflows/task-sdk-tests.yml index de4808e9867a2..abe3c494210ea 100644 --- a/.github/workflows/task-sdk-tests.yml +++ b/.github/workflows/task-sdk-tests.yml @@ -80,7 +80,7 @@ jobs: run: rm -fv ./dist/* - name: "Prepare Task SDK packages: wheel" run: > - breeze release-management prepare-task-sdk-package --package-format wheel + breeze release-management prepare-task-sdk-distributions --distribution-format wheel - name: "Verify wheel packages with twine" run: | uv tool uninstall twine || true diff --git a/.github/workflows/test-provider-packages.yml b/.github/workflows/test-providers.yml similarity index 82% rename from .github/workflows/test-provider-packages.yml rename to .github/workflows/test-providers.yml index 3f1b50e9a76e9..1f0eec1b9920e 100644 --- a/.github/workflows/test-provider-packages.yml +++ b/.github/workflows/test-providers.yml @@ -65,7 +65,7 @@ on: # yamllint disable-line rule:truthy permissions: contents: read jobs: - prepare-install-verify-provider-packages: + prepare-install-verify-provider-distributions: timeout-minutes: 80 name: "Providers ${{ matrix.package-format }} tests" runs-on: ${{ fromJSON(inputs.runs-on-as-json-default) }} @@ -101,18 +101,18 @@ jobs: breeze release-management prepare-provider-documentation --include-not-ready-providers --non-interactive --answer yes if: matrix.package-format == 'wheel' - - name: "Prepare provider packages: ${{ matrix.package-format }}" + - name: "Prepare provider distributions: ${{ matrix.package-format }}" run: > - breeze release-management prepare-provider-packages --include-not-ready-providers - --version-suffix-for-pypi dev0 --package-format ${{ matrix.package-format }} + breeze release-management prepare-provider-distributions --include-not-ready-providers + --version-suffix-for-pypi dev0 --distribution-format ${{ matrix.package-format }} - name: "Prepare airflow package: ${{ matrix.package-format }}" run: > - breeze release-management prepare-airflow-package --version-suffix-for-pypi dev0 - --package-format ${{ matrix.package-format }} + breeze release-management prepare-airflow-distributions --version-suffix-for-pypi dev0 + --distribution-format ${{ matrix.package-format }} - name: "Prepare task-sdk package: ${{ matrix.package-format }}" run: > - breeze release-management prepare-task-sdk-package --version-suffix-for-pypi dev0 - --package-format ${{ matrix.package-format }} + breeze release-management prepare-task-sdk-distributions --version-suffix-for-pypi dev0 + --distribution-format ${{ matrix.package-format }} - name: "Verify ${{ matrix.package-format }} packages with twine" run: | uv tool uninstall twine || true @@ -122,7 +122,7 @@ jobs: breeze release-management generate-issue-content-providers --only-available-in-dist --disable-progress if: matrix.package-format == 'wheel' - - name: Remove Python 3.9-incompatible provider packages + - name: Remove Python 3.9-incompatible provider distributions run: | echo "Removing Python 3.9-incompatible provider: cloudant" rm -vf dist/*cloudant* @@ -131,29 +131,27 @@ jobs: run: > breeze release-management generate-constraints --airflow-constraints-mode constraints-source-providers --answer yes - - name: "Install and verify wheel provider packages" + - name: "Install and verify wheel provider distributions" env: - PACKAGE_FORMAT: ${{ matrix.package-format }} - PYTHON_MAJOR_MINOR_VERSION: ${env.PYTHON_MAJOR_MINOR_VERSION} + DISTRIBUTION_FORMAT: ${{ matrix.package-format }} AIRFLOW_SKIP_CONSTRAINTS: "${{ inputs.upgrade-to-newer-dependencies }}" run: > - breeze release-management verify-provider-packages - --use-packages-from-dist - --package-format "${PACKAGE_FORMAT}" - --use-airflow-version "${PACKAGE_FORMAT}" + breeze release-management verify-provider-distributions + --use-distributions-from-dist + --distribution-format "${DISTRIBUTION_FORMAT}" + --use-airflow-version "${DISTRIBUTION_FORMAT}" --airflow-constraints-reference default --providers-constraints-location /files/constraints-${PYTHON_MAJOR_MINOR_VERSION}/constraints-source-providers-${PYTHON_MAJOR_MINOR_VERSION}.txt if: matrix.package-format == 'wheel' - - name: "Install all sdist provider packages and airflow" + - name: "Install all sdist provider distributions and airflow" env: - PACKAGE_FORMAT: ${{ matrix.package-format }} - PYTHON_MAJOR_MINOR_VERSION: ${{ env.PYTHON_MAJOR_MINOR_VERSION }} + DISTRIBUTION_FORMAT: ${{ matrix.package-format }} run: > - breeze release-management install-provider-packages - --use-packages-from-dist - --package-format "${PACKAGE_FORMAT}" - --use-airflow-version ${PACKAGE_FORMAT} + breeze release-management install-provider-distributions + --use-distributions-from-dist + --distribution-format "${DISTRIBUTION_FORMAT}" + --use-airflow-version ${DISTRIBUTION_FORMAT} --airflow-constraints-reference default --providers-constraints-location /files/constraints-${PYTHON_MAJOR_MINOR_VERSION}/constraints-source-providers-${PYTHON_MAJOR_MINOR_VERSION}.txt @@ -195,13 +193,13 @@ jobs: use-uv: ${{ inputs.use-uv }} - name: "Cleanup dist files" run: rm -fv ./dist/* - - name: "Prepare provider packages: wheel" + - name: "Prepare provider distributions: wheel" run: > - breeze release-management prepare-provider-packages --include-not-ready-providers - --package-format wheel + breeze release-management prepare-provider-distributions --include-not-ready-providers + --distribution-format wheel - name: > Remove incompatible Airflow - ${{ matrix.airflow-version }}:Python ${{ matrix.python-version }} provider packages + ${{ matrix.airflow-version }}:Python ${{ matrix.python-version }} provider distributions env: REMOVE_PROVIDERS: ${{ matrix.remove-providers }} run: | @@ -214,7 +212,7 @@ jobs: run: | pip download "apache-airflow==${{ matrix.airflow-version }}" -d dist --no-deps - name: > - Install and verify all provider packages and airflow on + Install and verify all provider distributions and airflow on Airflow ${{ matrix.airflow-version }}:Python ${{ matrix.python-version }} # We do not need to run import check if we run tests, the tests should cover all the import checks # automatically @@ -222,9 +220,9 @@ jobs: env: AIRFLOW_VERSION: "${{ matrix.airflow-version }}" run: > - breeze release-management verify-provider-packages - --use-packages-from-dist - --package-format wheel + breeze release-management verify-provider-distributions + --use-distributions-from-dist + --distribution-format wheel --use-airflow-version wheel --airflow-constraints-reference constraints-${AIRFLOW_VERSION} --providers-skip-constraints @@ -243,8 +241,8 @@ jobs: run: > breeze testing providers-tests --run-in-parallel --parallel-test-types "${PROVIDERS_TEST_TYPES}" - --use-packages-from-dist - --package-format wheel + --use-distributions-from-dist + --distribution-format wheel --use-airflow-version "${AIRFLOW_VERSION}" --airflow-constraints-reference constraints-${AIRFLOW_VERSION} --install-airflow-with-constraints diff --git a/.gitignore b/.gitignore index 6a81295045dac..f08cbc68d41c5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ secrets.py airflow.db # Airflow temporary artifacts +airflow-core/src/airflow/git_version +airflow-core/src/airflow/ui/coverage/ +# and legacy ones airflow/git_version airflow/ui/coverage/ logs/ @@ -170,6 +173,9 @@ pnpm-debug.log* .vscode/* !.vscode/extensions.json /.vite/ +# Exclude the ui .vite dir +airflow-core/src/airflow/ui/.vite/ +# And the legacy old files just in case airflow/ui/.vite/ .pnpm-store *.tsbuildinfo @@ -198,7 +204,7 @@ dmypy.json /.inputrc log.txt* -# Provider-related ignores +# Legacy Provider-related ignores /airflow/providers/__init__.py # Docker context files @@ -243,9 +249,6 @@ licenses/LICENSES-ui.txt # used to checkout target-branch in CI /target-airflow -# This directory used for generate provider packages before https://github.com/apache/airflow/pull/35617 -/provider_packages/ - # This directory used for store autogenerated images /images diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c00575414f128..84dbf7434392a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -35,7 +35,7 @@ repos: - id: doctoc name: Add TOC for Markdown and RST files files: - ^README\.md$|^UPDATING.*\.md$|^chart/UPDATING.*\.md$|^dev/.*\.md$|^dev/.*\.rst$|^.github/.*\.md|^tests/system/README.md$ + ^README\.md$|^UPDATING.*\.md$|^chart/UPDATING.*\.md$|^dev/.*\.md$|^dev/.*\.rst$|^.github/.*\.md|^airflow-core/tests/system/README.md$ args: - "--maxlevel" - "2" @@ -125,7 +125,7 @@ repos: - --fuzzy-match-generates-todo - id: insert-license name: Add license for all YAML files except Helm templates - exclude: ^\.github/.*$|^chart/templates/.*|.*/reproducible_build.yaml$|^.*/v1-generated.yaml$|^.*/pnpm-lock.yaml$ + exclude: ^\.github/.*$|^chart/templates/.*|.*reproducible_build.yaml$|^.*/v1-generated.yaml$|^.*/pnpm-lock.yaml$ types: [yaml] files: \.ya?ml$ args: @@ -202,7 +202,7 @@ repos: entry: ./scripts/ci/pre_commit/check_ti_vs_tis_attributes.py language: python additional_dependencies: ['rich>=12.4.4'] - files: ^airflow/models/taskinstance.py$|^airflow/models/taskinstancehistory.py$ + files: ^airflow-core/src/airflow/models/taskinstance.py$|^airflow-core/src/airflow/models/taskinstancehistory.py$ pass_filenames: false require_serial: true - id: check-deferrable-default @@ -239,7 +239,7 @@ repos: exclude: ^providers/ssh/docs/connections/ssh.rst$ - id: end-of-file-fixer name: Make sure that there is an empty line at the end - exclude: ^docs/apache-airflow/img/.*\.dot|^docs/apache-airflow/img/.*\.sha256|.*/dist/.*|LICENSES-ui.txt + exclude: ^airflow-core/docs/img/.*\.dot|^airflow-core/docs/img/.*\.sha256|.*/dist/.*|LICENSES-ui.txt - id: mixed-line-ending name: Detect if mixed line ending is used (\r vs. \r\n) - id: check-executables-have-shebangs @@ -248,7 +248,7 @@ repos: name: Check XML files with xmllint - id: trailing-whitespace name: Remove trailing whitespace at end of line - exclude: ^docs/apache-airflow/img/.*\.dot|^dev/breeze/doc/images/output.*$ + exclude: ^airflow-core/docs/img/.*\.dot|^dev/breeze/doc/images/output.*$ - id: fix-encoding-pragma name: Remove encoding header from Python files args: @@ -284,7 +284,7 @@ repos: .*/v1-generated\.yaml$| ^.*openapi.*\.yaml$| ^\.pre-commit-config\.yaml$| - ^.*/reproducible_build.yaml$| + ^.*reproducible_build.yaml$| ^.*pnpm-lock\.yaml$ - repo: https://github.com/ikamensh/flynt rev: '1.0.1' @@ -364,7 +364,7 @@ repos: args: [--fix] require_serial: true additional_dependencies: ["ruff==0.8.1"] - exclude: ^tests/dags/test_imports.py|^performance/tests/test_.*.py + exclude: ^airflow-core/tests/unit/dags/test_imports.py|^performance/tests/test_.*.py - id: ruff-format name: Run 'ruff format' description: "Run 'ruff format' for extremely fast Python formatting" @@ -374,7 +374,7 @@ repos: args: [] require_serial: true additional_dependencies: ["ruff==0.8.1"] - exclude: ^tests/dags/test_imports.py$ + exclude: ^airflow-core/tests/unit/dags/test_imports.py$ - id: replace-bad-characters name: Replace bad characters entry: ./scripts/ci/pre_commit/replace_bad_characters.py @@ -392,17 +392,17 @@ repos: - id: check-airflow-k8s-not-used name: Check airflow.kubernetes imports are not used language: python - files: ^airflow/.*\.py$ + files: ^airflow-core/src/airflow/.*\.py$ require_serial: true - exclude: ^airflow/kubernetes/ + exclude: ^airflow-core/src/airflow/kubernetes/ entry: ./scripts/ci/pre_commit/check_airflow_k8s_not_used.py additional_dependencies: ['rich>=12.4.4'] - id: check-common-compat-used-for-openlineage name: Check common.compat is used for OL deprecated classes language: python - files: ^airflow/.*\.py$ + files: ^airflow-core/src/airflow/.*\.py$ require_serial: true - exclude: ^airflow/openlineage/ + exclude: ^airflow-core/src/airflow/openlineage/ entry: ./scripts/ci/pre_commit/check_common_compat_used_for_openlineage.py additional_dependencies: ['rich>=12.4.4'] - id: check-airflow-providers-bug-report-template @@ -415,7 +415,7 @@ repos: - id: check-cncf-k8s-only-for-executors name: Check cncf.kubernetes imports used for executors only language: python - files: ^airflow/.*\.py$ + files: ^airflow-core/src/airflow/.*\.py$ require_serial: true exclude: ^providers/.*/src/airflow/providers/ entry: ./scripts/ci/pre_commit/check_cncf_k8s_used_for_k8s_executor_only.py @@ -435,7 +435,7 @@ repos: files: ^providers/.*/src/airflow/providers/.*/hooks/.*\.py$ additional_dependencies: ['rich>=12.4.4', 'pyyaml', 'packaging'] - id: update-providers-dependencies - name: Update dependencies for provider packages + name: Update dependencies for providers entry: ./scripts/ci/pre_commit/update_providers_dependencies.py language: python files: | @@ -449,7 +449,7 @@ repos: name: Checks setup extra packages description: Checks if all the extras defined in hatch_build.py are listed in extra-packages-ref.rst file language: python - files: ^docs/apache-airflow/extra-packages-ref\.rst$|^hatch_build.py + files: ^airflow-core/docs/extra-packages-ref\.rst$|^hatch_build.py pass_filenames: false entry: ./scripts/ci/pre_commit/check_extra_packages_ref.py additional_dependencies: ['rich>=12.4.4', 'hatchling==1.27.0', 'tabulate'] @@ -478,7 +478,7 @@ repos: name: Generate airflow diagrams entry: ./scripts/ci/pre_commit/generate_airflow_diagrams.py language: python - files: ^docs/.*/diagram_[^/]*\.py$ + files: ^airflow-core/docs/.*/diagram_[^/]*\.py$ pass_filenames: true additional_dependencies: ['rich>=12.4.4', "diagrams>=0.23.4"] - id: generate-volumes-for-sources @@ -493,27 +493,27 @@ repos: name: Updates supported versions in documentation entry: ./scripts/ci/pre_commit/supported_versions.py language: python - files: ^docs/apache-airflow/installation/supported-versions\.rst$|^scripts/ci/pre_commit/supported_versions\.py$|^README\.md$ + files: ^airflow-core/docs/installation/supported-versions\.rst$|^scripts/ci/pre_commit/supported_versions\.py$|^README\.md$ pass_filenames: false additional_dependencies: ['tabulate'] - id: check-revision-heads-map name: Check that the REVISION_HEADS_MAP is up-to-date language: python - entry: ./scripts/ci/pre_commit/version_heads_map.py + entry: ./scripts/ci/pre_commit/check_revision_heads_map.py pass_filenames: false files: > (?x) ^scripts/ci/pre_commit/version_heads_map\.py$| - ^airflow/migrations/versions/.*$|^airflow/migrations/versions| + ^airflow-core/src/airflow/migrations/versions/.*$|^airflow-core/src/airflow/migrations/versions| ^providers/fab/src/airflow/providers/fab/migrations/versions/.*$|^providers/fab/src/airflow/providers/fab/migrations/versions| - ^airflow/utils/db.py$| + ^airflow-core/src/airflow/utils/db.py$| ^providers/fab/src/airflow/providers/fab/auth_manager/models/db.py$ - additional_dependencies: ['packaging'] + additional_dependencies: ['packaging', 'rich>=12.4.4'] - id: update-version name: Update versions in docs entry: ./scripts/ci/pre_commit/update_versions.py language: python - files: ^docs|^airflow/__init__.py$ + files: ^docs|^airflow-core/src/airflow/__init__.py$ pass_filenames: false additional_dependencies: ['rich>=12.4.4'] - id: check-pydevd-left-in-code @@ -545,7 +545,7 @@ repos: description: The core example DAGs have no dependencies other than standard provider or core Airflow entry: "^\\s*from airflow\\.providers.(?!standard.)" pass_filenames: true - files: ^airflow/example_dags/.*\.py$ + files: ^airflow-core/src/airflow/example_dags/.*\.py$ - id: check-no-airflow-deprecation-in-providers language: pygrep name: Do not use DeprecationWarning in providers @@ -565,8 +565,8 @@ repos: language: python entry: ./scripts/ci/pre_commit/new_session_in_provide_session.py pass_filenames: true - files: ^airflow/.+\.py$ - exclude: ^airflow/serialization/pydantic/.* + files: ^airflow-core/src/airflow/.+\.py$ + exclude: ^airflow-core/src/airflow/serialization/pydantic/.* - id: check-for-inclusive-language language: pygrep name: Check for language that we do not accept as community @@ -586,11 +586,11 @@ repos: exclude: > (?x) ^clients/python/openapi_v1.yaml$| - ^airflow/ui/openapi-gen/| - ^airflow/cli/commands/local_commands/fastapi_api_command.py$| - ^airflow/config_templates/| - ^airflow/models/baseoperator.py$| - ^airflow/operators/__init__.py$| + ^airflow-core/src/airflow/ui/openapi-gen/| + ^airflow-core/src/airflow/cli/commands/local_commands/fastapi_api_command.py$| + ^airflow-core/src/airflow/config_templates/| + ^airflow-core/src/airflow/models/baseoperator.py$| + ^airflow-core/src/airflow/operators/__init__.py$| ^providers/common/sql/tests/provider_tests/common/sql/operators/test_sql_execute.py$| ^providers/amazon/src/airflow/providers/amazon/aws/hooks/emr.py$| ^providers/amazon/src/airflow/providers/amazon/aws/operators/emr.py$| @@ -610,22 +610,20 @@ repos: ^providers/google/src/airflow/providers/google/cloud/operators/mlengine.py$| ^providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py$| ^providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/hooks/winrm.py$| - ^docs/.*commits.rst$| - ^docs/apache-airflow-providers-apache-cassandra/connections/cassandra.rst$| + ^airflow-core/docs/.*commits.rst$| ^providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/operators/winrm.py$| ^providers/opsgenie/src/airflow/providers/opsgenie/hooks/opsgenie.py$| ^providers/redis/src/airflow/providers/redis/provider.yaml$| - ^airflow/serialization/serialized_objects.py$| - ^airflow/ui/pnpm-lock.yaml$| - ^airflow/utils/db.py$| - ^airflow/utils/trigger_rule.py$| + ^airflow-core/src/airflow/serialization/serialized_objects.py$| + ^airflow-core/src/airflow/ui/pnpm-lock.yaml$| + ^airflow-core/src/airflow/utils/db.py$| + ^airflow-core/src/airflow/utils/trigger_rule.py$| ^chart/values.schema.json$| ^dev/| ^docs/README.rst$| ^docs/apache-airflow-providers-amazon/secrets-backends/aws-ssm-parameter-store.rst$| ^providers/apache/kafka/docs/connections/kafka.rst$| ^providers/apache/hdfs/docs/connections.rst$| - ^docs/apache-airflow-providers-apache-kafka/connections/kafka.rst$| ^providers/apache/spark/docs/decorators/pyspark.rst$| ^providers/microsoft/azure/docs/connections/azure_cosmos.rst$| ^providers/fab/docs/auth-manager/webserver-authentication.rst$| @@ -637,7 +635,7 @@ repos: ^scripts/ci/pre_commit/vendor_k8s_json_schema.py$| ^scripts/ci/docker-compose/integration-keycloak.yml$| ^scripts/ci/docker-compose/keycloak/keycloak-entrypoint.sh$| - ^tests/| + ^airflow-core/tests/| ^providers/.*/tests/| ^.pre-commit-config\.yaml$| ^.*CHANGELOG\.(rst|txt)$| @@ -652,20 +650,23 @@ repos: - id: check-base-operator-partial-arguments name: Check BaseOperator and partial() arguments language: python - entry: ./scripts/ci/pre_commit/base_operator_partial_arguments.py + entry: ./scripts/ci/pre_commit/check_base_operator_partial_arguments.py pass_filenames: false - files: ^airflow/models/(?:base|mapped)operator\.py$ + files: ^airflow-core/src/airflow/models/(?:base|mapped)operator\.py$ + additional_dependencies: ['rich>=12.4.4'] - id: check-init-decorator-arguments name: Sync model __init__ and decorator arguments language: python - entry: ./scripts/ci/pre_commit/sync_init_decorator.py + entry: ./scripts/ci/pre_commit/check_init_decorator_arguments.py pass_filenames: false - files: ^airflow/models/dag\.py$|^airflow/(?:decorators|utils)/task_group\.py$ + files: ^airflow-core/src/airflow/models/dag\.py$|^airflow-core/src/airflow/(?:decorators|utils)/task_group\.py$ + additional_dependencies: ['rich>=12.4.4'] - id: check-template-context-variable-in-sync name: Sync template context variable refs language: python - entry: ./scripts/ci/pre_commit/template_context_key_sync.py - files: ^airflow/models/taskinstance\.py$|^task-sdk/src/airflow/sdk/definitions/context\.py$|^docs/apache-airflow/templates-ref\.rst$ + entry: ./scripts/ci/pre_commit/check_template_context_variable_in_sync.py + files: ^airflow-core/src/airflow/models/taskinstance\.py$|^task-sdk/src/airflow/sdk/definitions/context\.py$|^airflow-core/docs/templates-ref\.rst$ + additional_dependencies: ['rich>=12.4.4'] - id: check-base-operator-usage language: pygrep name: Check BaseOperator core imports @@ -675,11 +676,10 @@ repos: pass_filenames: true exclude: > (?x) - ^airflow/decorators/.*$| - ^airflow/hooks/.*$| - ^airflow/operators/.*$| - ^providers/.*$| - ^dev/provider_packages/.*$ + ^airflow-core/src/airflow/decorators/.*$| + ^airflow-core/src/airflow/hooks/.*$| + ^airflow-core/src/airflow/operators/.*$| + ^providers/.*$ - id: check-base-operator-usage language: pygrep name: Check BaseOperatorLink core imports @@ -689,12 +689,11 @@ repos: pass_filenames: true exclude: > (?x) - ^airflow/decorators/.*$| - ^airflow/hooks/.*$| - ^airflow/operators/.*$| + ^airflow-core/src/airflow/decorators/.*$| + ^airflow-core/src/airflow/hooks/.*$| + ^airflow-core/src/airflow/operators/.*$| ^providers/.*/src/airflow/providers/.*$| - ^providers/.*/src/airflow/providers/standard/sensors/.*$| - ^dev/provider_packages/.*$ + ^providers/.*/src/airflow/providers/standard/sensors/.*$ - id: check-base-operator-usage language: pygrep name: Check BaseOperator other imports @@ -719,13 +718,13 @@ repos: language: python entry: ./scripts/ci/pre_commit/decorator_operator_implements_custom_name.py pass_filenames: true - files: ^airflow/.*\.py$ + files: ^airflow-core/src/airflow/.*\.py$ - id: check-core-deprecation-classes language: pygrep name: Verify usage of Airflow deprecation classes in core entry: category=DeprecationWarning|category=PendingDeprecationWarning files: \.py$ - exclude: ^airflow/configuration\.py$|^providers/.*/src/airflow/providers/|^scripts/in_container/verify_providers\.py$|^(providers/.*/)?tests/.*$|^devel-common/ + exclude: ^airflow-core/src/airflow/configuration\.py$|airflow-core/tests/.*$|^providers/.*/src/airflow/providers/|^scripts/in_container/verify_providers\.py$|providers/.*/tests/.*$|^devel-common/ pass_filenames: true - id: check-provide-create-sessions-imports language: pygrep @@ -822,7 +821,7 @@ repos: language: node stages: ['manual'] types_or: [javascript, ts, tsx] - files: ^airflow/ui/|^airflow/api_fastapi/auth/managers/simple/ui/ + files: ^airflow-core/src/airflow/ui/|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/ entry: ./scripts/ci/pre_commit/compile_ui_assets.py pass_filenames: false additional_dependencies: ['pnpm@9.7.1'] @@ -839,7 +838,7 @@ repos: language: node stages: ['manual'] types_or: [javascript, ts, tsx] - files: ^airflow/ui/|^airflow/api_fastapi/auth/managers/simple/ui/ + files: ^airflow-core/src/airflow/ui/|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/ entry: ./scripts/ci/pre_commit/compile_ui_assets_dev.py pass_filenames: false additional_dependencies: ['pnpm@9.7.1'] @@ -876,6 +875,7 @@ repos: files: ^dev/breeze/pyproject\.toml$|^dev/breeze/README\.md$ pass_filenames: false require_serial: true + additional_dependencies: ['rich>=12.4.4'] - id: check-pyproject-toml-consistency name: Check consistency of Airflow's pyproject.toml language: python @@ -905,7 +905,7 @@ repos: name: Check if tests are in the right folders entry: ./scripts/ci/pre_commit/check_tests_in_right_folders.py language: python - files: ^tests/.*\.py + files: ^airflow-core/tests/.*\.py pass_filenames: true require_serial: true additional_dependencies: ['rich>=12.4.4'] @@ -913,7 +913,7 @@ repos: name: Check if system tests have required segments of code entry: ./scripts/ci/pre_commit/check_system_tests.py language: python - files: ^(providers/)?tests/system/.*/example_[^/]*\.py$ + files: ^.*/tests/system/.*/example_[^/]*\.py$ pass_filenames: true additional_dependencies: ['rich>=12.4.4'] - id: generate-pypi-readme @@ -932,7 +932,7 @@ repos: additional_dependencies: ['markdownlint-cli@0.38.0'] - id: lint-json-schema name: Lint JSON Schema files - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --spec-file - scripts/ci/pre_commit/draft7_schema.json @@ -940,10 +940,10 @@ repos: pass_filenames: true files: .*\.schema\.json$ require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: lint-json-schema name: Lint NodePort Service - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --spec-url - https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.20.2-standalone/service-v1.json @@ -951,10 +951,10 @@ repos: pass_filenames: true files: ^scripts/ci/kubernetes/nodeport\.yaml$ require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: lint-json-schema name: Lint Docker compose files - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --spec-url - https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json @@ -966,10 +966,10 @@ repos: ^scripts/ci/docker-compose/grafana/.| ^scripts/ci/docker-compose/.+-config\.ya?ml require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: lint-json-schema name: Lint chart/values.schema.json - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --spec-file - chart/values_schema.schema.json @@ -978,7 +978,7 @@ repos: pass_filenames: false files: ^chart/values\.schema\.json$|^chart/values_schema\.schema\.json$ require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: update-vendored-in-k8s-json-schema name: Vendor k8s definitions into values.schema.json entry: ./scripts/ci/pre_commit/vendor_k8s_json_schema.py @@ -987,7 +987,7 @@ repos: additional_dependencies: ['requests==2.32.3'] - id: lint-json-schema name: Lint chart/values.yaml - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --enforce-defaults - --spec-file @@ -997,18 +997,18 @@ repos: pass_filenames: false files: ^chart/values\.yaml$|^chart/values\.schema\.json$ require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: lint-json-schema name: Lint config_templates/config.yml - entry: ./scripts/ci/pre_commit/json_schema.py + entry: ./scripts/ci/pre_commit/lint_json_schema.py args: - --spec-file - - airflow/config_templates/config.yml.schema.json + - airflow-core/src/airflow/config_templates/config.yml.schema.json language: python pass_filenames: true - files: ^airflow/config_templates/config\.yml$ + files: ^airflow-core/src/airflow/config_templates/config\.yml$ require_serial: true - additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3'] + additional_dependencies: ['jsonschema>=3.2.0,<5.0', 'PyYAML==6.0.2', 'requests==2.32.3', "rich>=12.4.4"] - id: check-persist-credentials-disabled-in-github-workflows name: Check persistent creds in workflow files description: Check that workflow files have persist-credentials disabled @@ -1037,7 +1037,7 @@ repos: entry: ./scripts/ci/pre_commit/check_deprecations.py language: python pass_filenames: true - files: ^airflow/.*\.py$ + files: ^airflow-core/src/airflow/.*\.py$ additional_dependencies: ["rich>=12.4.4", "python-dateutil"] - id: lint-chart-schema name: Lint chart/values.schema.json file @@ -1104,7 +1104,7 @@ repos: entry: ./scripts/ci/pre_commit/update_example_dags_paths.py language: python pass_filenames: true - files: ^docs/.*example-dags\.rst$|^docs/.*index\.rst$ + files: ^airflow-core/docs/.*example-dags\.rst$|^docs/.*index\.rst$^airflow-core/docs/.*index\.rst$ additional_dependencies: ['rich>=12.4.4', 'pyyaml'] always_run: true - id: check-system-tests-tocs @@ -1127,19 +1127,19 @@ repos: language: python additional_dependencies: ['rich>=12.4.4'] pass_filenames: false - files: ^tests/.*\.py$ + files: ^airflow-core/tests/.*\.py$ - id: check-tests-unittest-testcase name: Unit tests do not inherit from unittest.TestCase description: Check that unit tests do not inherit from unittest.TestCase entry: ./scripts/ci/pre_commit/unittest_testcase.py language: python pass_filenames: true - files: ^tests/.*\.py$ + files: ^airflow-core/tests/.*\.py$ - id: check-provider-docs-valid name: Validate provider doc files entry: ./scripts/ci/pre_commit/check_provider_docs.py language: python - files: ^providers/.*/provider\.yaml|^docs/.* + files: ^providers/.*/provider\.yaml|^.*/docs/.* additional_dependencies: ['rich>=12.4.4', 'pyyaml', 'jinja2'] require_serial: true pass_filenames: false @@ -1152,7 +1152,7 @@ repos: types: [ python ] additional_dependencies: ['bandit==1.7.6'] require_serial: true - files: ^airflow/.* + files: ^airflow-core/src/airflow/.* exclude: airflow/example_dags/.* args: @@ -1169,7 +1169,7 @@ repos: types: [ python ] additional_dependencies: ['pylint==3.1.0'] require_serial: true - files: ^airflow/.* + files: ^airflow-core/src/airflow/.* exclude: airflow/example_dags/.* args: @@ -1199,17 +1199,17 @@ repos: \bab_user_role\b| \bab_register_user\b pass_filenames: true - files: ^airflow/migrations/versions/.*\.py$ + files: ^airflow-core/src/airflow/migrations/versions/.*\.py$ # These migrations contain FAB related changes but existed before moving FAB auth manager # to its own provider exclude: > (?ix)^( - airflow/migrations/versions/00.*\.py| - airflow/migrations/versions/0106.*\.py| - airflow/migrations/versions/0118.*\.py| - airflow/migrations/versions/0119.*\.py| - airflow/migrations/versions/0121.*\.py| - airflow/migrations/versions/0124.*\.py + airflow-core/src/airflow/migrations/versions/00.*\.py| + airflow-core/src/airflow/migrations/versions/0106.*\.py| + airflow-core/src/airflow/migrations/versions/0118.*\.py| + airflow-core/src/airflow/migrations/versions/0119.*\.py| + airflow-core/src/airflow/migrations/versions/0121.*\.py| + airflow-core/src/airflow/migrations/versions/0124.*\.py )$ ## ADD MOST PRE-COMMITS ABOVE THAT LINE # The below pre-commits are those requiring CI image to be built @@ -1242,7 +1242,6 @@ repos: dev| docs| performance/| - provider_packages| providers/| scripts| task-sdk/| @@ -1254,7 +1253,7 @@ repos: stages: ['manual'] name: Run mypy for airflow (manual) language: python - entry: ./scripts/ci/pre_commit/mypy_folder.py airflow + entry: ./scripts/ci/pre_commit/mypy_folder.py airflow-core/src/airflow pass_filenames: false files: ^.*\.py$ require_serial: true @@ -1262,7 +1261,7 @@ repos: - id: mypy-providers name: Run mypy for providers language: python - entry: ./scripts/ci/pre_commit/mypy.py --namespace-packages + entry: ./scripts/ci/pre_commit/mypy.py files: ^providers/.*\.py$ require_serial: true additional_dependencies: ['rich>=12.4.4'] @@ -1295,7 +1294,7 @@ repos: - id: mypy-task-sdk name: Run mypy for Task SDK language: python - entry: ./scripts/ci/pre_commit/mypy.py --namespace-packages + entry: ./scripts/ci/pre_commit/mypy.py files: ^task-sdk/src/airflow/sdk/.*\.py$|^task-sdk/tests//.*\.py$ require_serial: true additional_dependencies: ['rich>=12.4.4'] @@ -1329,8 +1328,8 @@ repos: language: python entry: ./scripts/ci/pre_commit/update_fastapi_api_spec.py pass_filenames: false - files: ^airflow/api_fastapi/.*\.py$|^airflow/api_fastapi/auth/managers/simple/.*\.py$|^providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$ - exclude: ^airflow/api_fastapi/execution_api/.* + files: ^airflow-core/src/airflow/api_fastapi/.*\.py$|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/.*\.py$|^providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$ + exclude: ^airflow-core/src/airflow/api_fastapi/execution_api/.* additional_dependencies: ['rich>=12.4.4'] - id: ts-compile-format-lint-ui name: Compile / format / lint UI @@ -1339,11 +1338,11 @@ repos: types_or: [javascript, ts, tsx, yaml, css, json] files: | (?x) - ^airflow/ui/|^airflow/api_fastapi/core_api/openapi/v1-generated\.yaml$ | - ^airflow/api_fastapi/auth/managers/simple/ui/ | - ^airflow/api_fastapi/auth/managers/simple/openapi/v1-generated\.yaml$ - entry: ./scripts/ci/pre_commit/lint_ui.py - additional_dependencies: ['pnpm@9.7.1'] + ^airflow-core/src/airflow/ui/|^airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated\.yaml$ | + ^airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/ | + ^airflow-core/src/airflow/api_fastapi/auth/managers/simple/openapi/v1-generated\.yaml$ + entry: ./scripts/ci/pre_commit/compile_lint_ui.py + additional_dependencies: [ 'pnpm@9.7.1' ] pass_filenames: false - id: check-provider-yaml-valid name: Validate provider.yaml files @@ -1365,14 +1364,14 @@ repos: language: python entry: ./scripts/ci/pre_commit/migration_reference.py pass_filenames: false - files: ^airflow/migrations/versions/.*\.py$|^docs/apache-airflow/migrations-ref\.rst$ + files: ^airflow-core/src/airflow/migrations/versions/.*\.py$|^airflow-core/docs/migrations-ref\.rst$ additional_dependencies: ['rich>=12.4.4'] - id: generate-tasksdk-datamodels name: Generate Datamodels for TaskSDK client language: python - entry: uv run -p 3.12 --no-progress --active --group codegen --project apache-airflow-task-sdk --directory task-sdk -s dev/generate_models.py + entry: uv run -p 3.12 --no-progress --active --group codegen --project apache-airflow-task-sdk --directory task-sdk -s dev/generate_task_sdk_models.py pass_filenames: false - files: ^airflow/api_fastapi/execution_api/.*\.py$ + files: ^airflow-core/src/airflow/api_fastapi/execution_api/.*\.py$ require_serial: true additional_dependencies: ['rich>=12.4.4'] - id: update-er-diagram @@ -1380,7 +1379,7 @@ repos: language: python entry: ./scripts/ci/pre_commit/update_er_diagram.py pass_filenames: false - files: ^airflow/migrations/versions/.*\.py$|^docs/apache-airflow/migrations-ref\.rst$ + files: ^airflow-core/src/airflow/migrations/versions/.*\.py$|^airflow-core/docs/migrations-ref\.rst$ additional_dependencies: ['rich>=12.4.4'] - id: check-default-configuration name: Check the default configuration @@ -1389,5 +1388,5 @@ repos: additional_dependencies: ['rich>=12.4.4'] require_serial: true pass_filenames: false - files: ^airflow/config_templates/config.yml + files: ^airflow-core/src/airflow/config_templates/config.yml ## ONLY ADD PRE-COMMITS HERE THAT REQUIRE CI IMAGE diff --git a/.rat-excludes b/.rat-excludes index 6bf86c76ba59d..2c730134a76a4 100644 --- a/.rat-excludes +++ b/.rat-excludes @@ -44,7 +44,6 @@ venv clients/* files/* dags/* -airflow.iml .gitmodules prod_image_installed_providers.txt airflow_pre_installed_providers.txt @@ -110,9 +109,6 @@ tmp # generated doc-only-changes.txt .latest-doc-only-change.txt -# generated provider_packages -provider_packages - # Chart ignored files chart/.gitignore chart/values.schema.json @@ -138,7 +134,7 @@ tests/* scripts/* images/* dev/* -chart/*.iml +.*\.iml out/* airflow-build-dockerfile* diff --git a/COMMITTERS.rst b/COMMITTERS.rst index b51f72a64652b..ef824f857814d 100644 --- a/COMMITTERS.rst +++ b/COMMITTERS.rst @@ -220,7 +220,7 @@ To be able to merge PRs, committers have to integrate their GitHub ID with Apach 6. After confirming that step 5 is done, open a PR to include your GitHub ID in: * ``dev/breeze/src/airflow_breeze/global_constants.py`` (COMMITTERS variable) - * name and GitHub ID in `project.rst `__. + * name and GitHub ID in `project.rst `__. * If you had been a collaborator role before getting committer, remove your GitHub ID from ``.asf.yaml``. 7. Raise a PR to `airflow-site `_ repository with the following additions: diff --git a/Dockerfile b/Dockerfile index c790b7eb2ebc0..eba923ff0a5c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -665,7 +665,7 @@ function install_airflow_and_providers_from_docker_context_files(){ exit 1 fi - # This is needed to get package names for local context packages + # This is needed to get distribution names for local context distributions ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} ${ADDITIONAL_PIP_INSTALL_FLAGS} --constraint ${HOME}/constraints.txt packaging if [[ -n ${AIRFLOW_EXTRAS=} ]]; then @@ -674,37 +674,52 @@ function install_airflow_and_providers_from_docker_context_files(){ AIRFLOW_EXTRAS_TO_INSTALL="" fi - # Find Apache Airflow package in docker-context files - readarray -t install_airflow_package < <(EXTRAS="${AIRFLOW_EXTRAS_TO_INSTALL}" \ - python /scripts/docker/get_package_specs.py /docker-context-files/apache?airflow?[0-9]*.{whl,tar.gz} 2>/dev/null || true) + # Find apache-airflow distribution in docker-context files + readarray -t install_airflow_distribution < <(EXTRAS="${AIRFLOW_EXTRAS_TO_INSTALL}" \ + python /scripts/docker/get_distribution_specs.py /docker-context-files/apache?airflow?[0-9]*.{whl,tar.gz} 2>/dev/null || true) echo - echo "${COLOR_BLUE}Found airflow packages in docker-context-files folder: ${install_airflow_package[*]}${COLOR_RESET}" + echo "${COLOR_BLUE}Found apache-airflow distributions in docker-context-files folder: ${install_airflow_distribution[*]}${COLOR_RESET}" echo - if [[ -z "${install_airflow_package[*]}" && ${AIRFLOW_VERSION=} != "" ]]; then - # When we install only provider packages from docker-context files, we need to still + if [[ -z "${install_airflow_distribution[*]}" && ${AIRFLOW_VERSION=} != "" ]]; then + # When we install only provider distributions from docker-context files, we need to still # install airflow from PyPI when AIRFLOW_VERSION is set. This handles the case where # pre-release dockerhub image of airflow is built, but we want to install some providers from # docker-context files - install_airflow_package=("apache-airflow[${AIRFLOW_EXTRAS}]==${AIRFLOW_VERSION}") + install_airflow_distribution=("apache-airflow[${AIRFLOW_EXTRAS}]==${AIRFLOW_VERSION}") fi - # Find Provider/TaskSDK packages in docker-context files - readarray -t airflow_packages< <(python /scripts/docker/get_package_specs.py /docker-context-files/apache?airflow?{providers,task?sdk}*.{whl,tar.gz} 2>/dev/null || true) + # Find apache-airflow-core distribution in docker-context files + readarray -t install_airflow_core_distribution < <(EXTRAS="" \ + python /scripts/docker/get_distribution_specs.py /docker-context-files/apache?airflow?core?[0-9]*.{whl,tar.gz} 2>/dev/null || true) echo - echo "${COLOR_BLUE}Found provider packages in docker-context-files folder: ${airflow_packages[*]}${COLOR_RESET}" + echo "${COLOR_BLUE}Found apache-airflow-core distributions in docker-context-files folder: ${install_airflow_core_distribution[*]}${COLOR_RESET}" echo - if [[ ${USE_CONSTRAINTS_FOR_CONTEXT_PACKAGES=} == "true" ]]; then + if [[ -z "${install_airflow_core_distribution[*]}" && ${AIRFLOW_VERSION=} != "" ]]; then + # When we install only provider distributions from docker-context files, we need to still + # install airflow from PyPI when AIRFLOW_VERSION is set. This handles the case where + # pre-release dockerhub image of airflow is built, but we want to install some providers from + # docker-context files + install_airflow_core_distribution=("apache-airflow-core==${AIRFLOW_VERSION}") + fi + + # Find Provider/TaskSDK distributions in docker-context files + readarray -t airflow_distributions< <(python /scripts/docker/get_distribution_specs.py /docker-context-files/apache?airflow?{providers,task?sdk}*.{whl,tar.gz} 2>/dev/null || true) + echo + echo "${COLOR_BLUE}Found provider distributions in docker-context-files folder: ${airflow_distributions[*]}${COLOR_RESET}" + echo + + if [[ ${USE_CONSTRAINTS_FOR_CONTEXT_DISTRIBUTIONS=} == "true" ]]; then local python_version python_version=$(python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') local local_constraints_file=/docker-context-files/constraints-"${python_version}"/${AIRFLOW_CONSTRAINTS_MODE}-"${python_version}".txt if [[ -f "${local_constraints_file}" ]]; then echo - echo "${COLOR_BLUE}Installing docker-context-files packages with constraints found in ${local_constraints_file}${COLOR_RESET}" + echo "${COLOR_BLUE}Installing docker-context-files distributions with constraints found in ${local_constraints_file}${COLOR_RESET}" echo - # force reinstall all airflow + provider packages with constraints found in + # force reinstall all airflow + provider distributions with constraints found in flags=(--upgrade --constraint "${local_constraints_file}") echo echo "${COLOR_BLUE}Copying ${local_constraints_file} to ${HOME}/constraints.txt${COLOR_RESET}" @@ -712,13 +727,13 @@ function install_airflow_and_providers_from_docker_context_files(){ cp "${local_constraints_file}" "${HOME}/constraints.txt" else echo - echo "${COLOR_BLUE}Installing docker-context-files packages with constraints from GitHub${COLOR_RESET}" + echo "${COLOR_BLUE}Installing docker-context-files distributions with constraints from GitHub${COLOR_RESET}" echo flags=(--constraint "${HOME}/constraints.txt") fi else echo - echo "${COLOR_BLUE}Installing docker-context-files packages without constraints${COLOR_RESET}" + echo "${COLOR_BLUE}Installing docker-context-files distributions without constraints${COLOR_RESET}" echo flags=() fi @@ -727,24 +742,24 @@ function install_airflow_and_providers_from_docker_context_files(){ ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} \ ${ADDITIONAL_PIP_INSTALL_FLAGS} \ "${flags[@]}" \ - "${install_airflow_package[@]}" "${airflow_packages[@]}" + "${install_airflow_distribution[@]}" "${install_airflow_core_distribution[@]}" "${airflow_distributions[@]}" set +x common::install_packaging_tools pip check } -function install_all_other_packages_from_docker_context_files() { +function install_all_other_distributions_from_docker_context_files() { echo - echo "${COLOR_BLUE}Force re-installing all other package from local files without dependencies${COLOR_RESET}" + echo "${COLOR_BLUE}Force re-installing all other distributions from local files without dependencies${COLOR_RESET}" echo - local reinstalling_other_packages + local reinstalling_other_distributions # shellcheck disable=SC2010 - reinstalling_other_packages=$(ls /docker-context-files/*.{whl,tar.gz} 2>/dev/null | \ + reinstalling_other_distributions=$(ls /docker-context-files/*.{whl,tar.gz} 2>/dev/null | \ grep -v apache_airflow | grep -v apache-airflow || true) - if [[ -n "${reinstalling_other_packages}" ]]; then + if [[ -n "${reinstalling_other_distributions}" ]]; then set -x ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} ${ADDITIONAL_PIP_INSTALL_FLAGS} \ - --force-reinstall --no-deps --no-index ${reinstalling_other_packages} + --force-reinstall --no-deps --no-index ${reinstalling_other_distributions} common::install_packaging_tools set +x fi @@ -758,11 +773,11 @@ common::show_packaging_tool_version_and_location install_airflow_and_providers_from_docker_context_files -install_all_other_packages_from_docker_context_files +install_all_other_distributions_from_docker_context_files EOF -# The content below is automatically copied from scripts/docker/get_package_specs.py -COPY <<"EOF" /get_package_specs.py +# The content below is automatically copied from scripts/docker/get_distribution_specs.py +COPY <<"EOF" /get_distribution_specs.py #!/usr/bin/env python from __future__ import annotations @@ -816,8 +831,10 @@ function install_airflow() { # Determine the installation_command_flags based on AIRFLOW_INSTALLATION_METHOD method local installation_command_flags if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then - # When installing from sources - we always use `--editable` mode - installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./task-sdk --editable ./devel-common" + # We do not yet use ``uv sync`` because we are not committing and using uv.lock yet and uv sync + # cannot use constraints - once we switch to uv.lock (with the workflow that dependabot will update it + # and constraints will be generated from it, we should be able to simply use ``uv sync`` here + installation_command_flags=" --editable .[${AIRFLOW_EXTRAS}] --editable ./airflow-core --editable ./task-sdk --editable ./devel-common --editable ./airflow-core" while IFS= read -r -d '' pyproject_toml_file; do project_folder=$(dirname ${pyproject_toml_file}) installation_command_flags="${installation_command_flags} --editable ${project_folder}" @@ -836,7 +853,7 @@ function install_airflow() { fi if [[ "${UPGRADE_INVALIDATION_STRING=}" != "" ]]; then echo - echo "${COLOR_BLUE}Remove airflow and all provider packages installed before potentially${COLOR_RESET}" + echo "${COLOR_BLUE}Remove airflow and all provider distributions installed before potentially${COLOR_RESET}" echo set -x ${PACKAGING_TOOL_CMD} freeze | grep apache-airflow | xargs ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} 2>/dev/null || true @@ -1454,15 +1471,15 @@ COPY --from=scripts common.sh install_packaging_tools.sh create_prod_venv.sh /sc # We can set this value to true in case we want to install .whl/.tar.gz packages placed in the # docker-context-files folder. This can be done for both additional packages you want to install -# as well as Airflow and Provider packages (it will be automatically detected if airflow +# as well as Airflow and provider distributions (it will be automatically detected if airflow # is installed from docker-context files rather than from PyPI) -ARG INSTALL_PACKAGES_FROM_CONTEXT="false" +ARG INSTALL_DISTRIBUTIONS_FROM_CONTEXT="false" # Normally constraints are not used when context packages are build - because we might have packages # that are conflicting with Airflow constraints, however there are cases when we want to use constraints # for example in CI builds when we already have source-package constraints - either from github branch or # from eager-upgraded constraints by the CI builds -ARG USE_CONSTRAINTS_FOR_CONTEXT_PACKAGES="false" +ARG USE_CONSTRAINTS_FOR_CONTEXT_DISTRIBUTIONS="false" # By changing the epoch we can force reinstalling Airflow and pip all dependencies # It can also be overwritten manually by setting the AIRFLOW_CI_BUILD_EPOCH environment variable. @@ -1475,7 +1492,7 @@ ENV AIRFLOW_CI_BUILD_EPOCH=${AIRFLOW_CI_BUILD_EPOCH} # The Airflow and providers are uninstalled, only dependencies remain # the cache is only used when "upgrade to newer dependencies" is not set to automatically # account for removed dependencies (we do not install them in the first place) and in case -# INSTALL_PACKAGES_FROM_CONTEXT is not set (because then caching it from main makes no sense). +# INSTALL_DISTRIBUTIONS_FROM_CONTEXT is not set (because then caching it from main makes no sense). # By default PIP installs everything to ~/.local and it's also treated as VIRTUALENV ENV VIRTUAL_ENV="${AIRFLOW_USER_HOME_DIR}/.local" @@ -1491,14 +1508,14 @@ ARG ADDITIONAL_PYTHON_DEPS="" ARG VERSION_SUFFIX_FOR_PYPI="" ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS} \ - INSTALL_PACKAGES_FROM_CONTEXT=${INSTALL_PACKAGES_FROM_CONTEXT} \ - USE_CONSTRAINTS_FOR_CONTEXT_PACKAGES=${USE_CONSTRAINTS_FOR_CONTEXT_PACKAGES} \ + INSTALL_DISTRIBUTIONS_FROM_CONTEXT=${INSTALL_DISTRIBUTIONS_FROM_CONTEXT} \ + USE_CONSTRAINTS_FOR_CONTEXT_DISTRIBUTIONS=${USE_CONSTRAINTS_FOR_CONTEXT_DISTRIBUTIONS} \ VERSION_SUFFIX_FOR_PYPI=${VERSION_SUFFIX_FOR_PYPI} WORKDIR ${AIRFLOW_HOME} COPY --from=scripts install_from_docker_context_files.sh install_airflow.sh \ - install_additional_dependencies.sh create_prod_venv.sh get_package_specs.py /scripts/docker/ + install_additional_dependencies.sh create_prod_venv.sh get_distribution_specs.py /scripts/docker/ # Useful for creating a cache id based on the underlying architecture, preventing the use of cached python packages from # an incorrect architecture. @@ -1508,7 +1525,7 @@ ARG DEPENDENCY_CACHE_EPOCH="9" # hadolint ignore=SC2086, SC2010, DL3042 RUN --mount=type=cache,id=prod-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/tmp/.cache/,uid=${AIRFLOW_UID} \ - if [[ ${INSTALL_PACKAGES_FROM_CONTEXT} == "true" ]]; then \ + if [[ ${INSTALL_DISTRIBUTIONS_FROM_CONTEXT} == "true" ]]; then \ bash /scripts/docker/install_from_docker_context_files.sh; \ fi; \ if ! airflow version 2>/dev/null >/dev/null; then \ diff --git a/Dockerfile.ci b/Dockerfile.ci index f435366ccde65..114d9055a5e14 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -586,8 +586,10 @@ function install_airflow() { # Determine the installation_command_flags based on AIRFLOW_INSTALLATION_METHOD method local installation_command_flags if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then - # When installing from sources - we always use `--editable` mode - installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./task-sdk --editable ./devel-common" + # We do not yet use ``uv sync`` because we are not committing and using uv.lock yet and uv sync + # cannot use constraints - once we switch to uv.lock (with the workflow that dependabot will update it + # and constraints will be generated from it, we should be able to simply use ``uv sync`` here + installation_command_flags=" --editable .[${AIRFLOW_EXTRAS}] --editable ./airflow-core --editable ./task-sdk --editable ./devel-common --editable ./airflow-core" while IFS= read -r -d '' pyproject_toml_file; do project_folder=$(dirname ${pyproject_toml_file}) installation_command_flags="${installation_command_flags} --editable ${project_folder}" @@ -606,7 +608,7 @@ function install_airflow() { fi if [[ "${UPGRADE_INVALIDATION_STRING=}" != "" ]]; then echo - echo "${COLOR_BLUE}Remove airflow and all provider packages installed before potentially${COLOR_RESET}" + echo "${COLOR_BLUE}Remove airflow and all provider distributions installed before potentially${COLOR_RESET}" echo set -x ${PACKAGING_TOOL_CMD} freeze | grep apache-airflow | xargs ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} 2>/dev/null || true @@ -875,7 +877,7 @@ function handle_mount_sources() { function determine_airflow_to_use() { USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION:=""}" - if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_PACKAGES_FROM_DIST=} != "true" ]]; then + if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_DISTRIBUTIONS_FROM_DIST=} != "true" ]]; then export PYTHONPATH=${AIRFLOW_SOURCES} echo echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}" @@ -938,7 +940,8 @@ function check_downgrade_sqlalchemy() { if [[ ${DOWNGRADE_SQLALCHEMY=} != "true" ]]; then return fi - min_sqlalchemy_version=$(grep "\"sqlalchemy>=" hatch_build.py | sed "s/.*>=\([0-9\.]*\).*/\1/" | xargs) + local min_sqlalchemy_version + min_sqlalchemy_version=$(grep "sqlalchemy>=" airflow-core/pyproject.toml | sed "s/.*>=\([0-9\.]*\).*/\1/" | xargs) echo echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}" echo @@ -951,12 +954,13 @@ function check_downgrade_pendulum() { if [[ ${DOWNGRADE_PENDULUM=} != "true" || ${PYTHON_MAJOR_MINOR_VERSION} == "3.12" ]]; then return fi - local MIN_PENDULUM_VERSION="2.1.2" + local min_pendulum_version + min_pendulum_version=$(grep "pendulum>=" airflow-core/pyproject.toml | head -1 | sed "s/.*>=\([0-9\.]*\).*/\1/" | xargs) echo - echo "${COLOR_BLUE}Downgrading pendulum to minimum supported version: ${MIN_PENDULUM_VERSION}${COLOR_RESET}" + echo "${COLOR_BLUE}Downgrading pendulum to minimum supported version: ${min_pendulum_version}${COLOR_RESET}" echo # shellcheck disable=SC2086 - ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} "pendulum==${MIN_PENDULUM_VERSION}" + ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} "pendulum==${min_pendulum_version}" pip check } @@ -1003,7 +1007,7 @@ function check_force_lowest_dependencies() { echo fi set -x - uv pip install --python "$(which python)" --resolution lowest-direct --upgrade --editable ".${EXTRA}" --editable "./task-sdk" --editable "./devel-common" + uv pip install --python "$(which python)" --resolution lowest-direct --upgrade --editable ".${EXTRA}" --editable "./airflow-core" --editable "./task-sdk" --editable "./devel-common" set +x } diff --git a/INSTALL b/INSTALL index 1483aef27c777..6a8d3a78233be 100644 --- a/INSTALL +++ b/INSTALL @@ -130,13 +130,17 @@ and there are those manual ways to build the assets. pnpm install -frozen-lockfile --config.confirmModulesPurge=false pnpm run build -Finally, you can also clean and recompile assets with `custom` build target when running the Hatch build: +Finally, you can also clean and recompile assets with `custom` build target when running the Hatch build for +the ``airflow-core`` package. - hatch build -t custom -t wheel -t sdist + cd airflow-core + hatch build -c -t custom + +This will also clean-up the generated files,update `git_version` file in the Airflow package (used to display +it in the UI) that should contain the git commit hash of the build and it will generate the assets. -This will also update `git_version` file in the Airflow package that should contain the git commit hash of the -build. This is used to display the commit hash in the UI. Result of this command is airflow package built -in the `dist` folder. +The result of this command is airflow sdist package built in the `dist` folder of `airflow-core` +package as well. It requires ``pre-commit`` to be installed in your system. Using pip and manually managing your virtualenv =============================================== @@ -239,7 +243,11 @@ Using Hatch to build your packages You can use Hatch to build installable packages from the Airflow sources. Such package will include all metadata configured in `pyproject.toml` and will be installable with ``pip`` and and any other -PEP-compliant packaging front-end. +PEP-compliant packaging front-end. You can run those commands in: + +* root folder of the repository to build "meta" airflow package that install other packages +* `airflow-core` folder to build the core airflow package +* any of the `providers` folders that has a pyproject.toml file to build the provider package The packages will have pre-installed dependencies for providers that are available when Airflow is i onstalled from PyPI. Both `wheel` and `sdist` packages are built by default. @@ -251,6 +259,11 @@ You can also build only `wheel` or `sdist` packages: hatch build -t wheel hatch build -t sdist +In the `airflow-core` folder, you can also build the package with the `custom` target that will clean +the build directory, update the `git_version` file, and build the assets: + + hatch build -t custom -t wheel -t sdist + Installing recommended version of dependencies ============================================== @@ -299,7 +312,7 @@ auth, graphviz, kerberos, ldap, leveldb, otel, pandas, password, rabbitmq, s3fs, Provider extras --------------- -Those extras are available as regular Airflow extras; they install provider packages in standard builds +Those extras are available as regular Airflow extras; they install provider distributions in standard builds or dependencies that are necessary to enable the feature in an editable build. # START PROVIDER EXTRAS HERE diff --git a/LICENSE b/LICENSE index 25c727ac6e927..11069edd79019 100644 --- a/LICENSE +++ b/LICENSE @@ -199,54 +199,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -============================================================================ - APACHE AIRFLOW SUBCOMPONENTS: - - The Apache Airflow project contains subcomponents with separate copyright - notices and license terms. Your use of the source code for the these - subcomponents is subject to the terms and conditions of the following - licenses. - - -======================================================================== -Third party Apache 2.0 licenses -======================================================================== - -The following components are provided under the Apache 2.0 License. -See project link for details. The text of each license is also included -at 3rd-party-licenses/LICENSE-[project].txt. - - (ALv2 License) hue v4.3.0 (https://github.com/cloudera/hue/) - (ALv2 License) jqclock v2.3.0 (https://github.com/JohnRDOrazio/jQuery-Clock-Plugin) - (ALv2 License) bootstrap3-typeahead v4.0.2 (https://github.com/bassjobsen/Bootstrap-3-Typeahead) - -======================================================================== -MIT licenses -======================================================================== - -The following components are provided under the MIT License. See project link for details. -The text of each license is also included at 3rd-party-licenses/LICENSE-[project].txt. - - (MIT License) jquery v3.5.1 (https://jquery.org/license/) - (MIT License) dagre-d3 v0.6.4 (https://github.com/cpettitt/dagre-d3) - (MIT License) bootstrap v3.4.1 (https://github.com/twbs/bootstrap/) - (MIT License) d3-tip v0.9.1 (https://github.com/Caged/d3-tip) - (MIT License) dataTables v1.10.25 (https://datatables.net) - (MIT License) normalize.css v3.0.2 (http://necolas.github.io/normalize.css/) - (MIT License) ElasticMock v1.3.2 (https://github.com/vrcmarcos/elasticmock) - (MIT License) MomentJS v2.24.0 (http://momentjs.com/) - (MIT License) eonasdan-bootstrap-datetimepicker v4.17.49 (https://github.com/eonasdan/bootstrap-datetimepicker/) - -======================================================================== -BSD 3-Clause licenses -======================================================================== -The following components are provided under the BSD 3-Clause license. See project links for details. -The text of each license is also included at 3rd-party-licenses/LICENSE-[project].txt. - - (BSD 3 License) d3 v5.16.0 (https://d3js.org) - (BSD 3 License) d3-shape v2.1.0 (https://github.com/d3/d3-shape) - (BSD 3 License) cgroupspy 0.2.1 (https://github.com/cloudsigma/cgroupspy) - -======================================================================== -See 3rd-party-licenses/LICENSES-ui.txt for packages used in `/airflow/www` diff --git a/PROVIDERS.rst b/PROVIDERS.rst index 4b0f77e5aa029..1d1386cceb454 100644 --- a/PROVIDERS.rst +++ b/PROVIDERS.rst @@ -314,7 +314,7 @@ There are the following consequences (or lack of them) of removing the provider: longer maintained by the Apache Airflow community - linking to this page. This information should also find its way to the package documentation and consequently - to the description of the package in PyPI. * An ``[ANNOUNCE]`` thread is sent to the devlist and user list announcing removal of the provider -* The released provider packages remain available on PyPI and in the +* The released providers remain available on PyPI and in the `Archives `_ of the Apache Software Foundation, while they are removed from the `Downloads `_ . diff --git a/README.md b/README.md index d015d8c7e6644..fef21b5d169f3 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ through a more complete [tutorial](https://airflow.apache.org/docs/apache-airflo For more information on Airflow Improvement Proposals (AIPs), visit the [Airflow Wiki](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals). -Documentation for dependent projects like provider packages, Docker image, Helm Chart, you'll find it in [the documentation index](https://airflow.apache.org/docs/). +Documentation for dependent projects like provider distributions, Docker image, Helm Chart, you'll find it in [the documentation index](https://airflow.apache.org/docs/). @@ -186,7 +186,7 @@ pip install 'apache-airflow[postgres,google]==2.10.5' \ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.10.5/constraints-3.9.txt" ``` -For information on installing provider packages, check +For information on installing provider distributions, check [providers](http://airflow.apache.org/docs/apache-airflow-providers/index.html). @@ -231,27 +231,27 @@ following the ASF Policy. - **DAGs**: Overview of all DAGs in your environment. - ![DAGs](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/dags.png) + ![DAGs](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/dags.png) - **Grid**: Grid representation of a DAG that spans across time. - ![Grid](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/grid.png) + ![Grid](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/grid.png) - **Graph**: Visualization of a DAG's dependencies and their current status for a specific run. - ![Graph](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/graph.png) + ![Graph](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/graph.png) - **Task Duration**: Total time spent on different tasks over time. - ![Task Duration](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/duration.png) + ![Task Duration](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/duration.png) - **Gantt**: Duration and overlap of a DAG. - ![Gantt](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/gantt.png) + ![Gantt](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/gantt.png) - **Code**: Quick way to view source code of a DAG. - ![Code](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/img/code.png) + ![Code](https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/img/code.png) ## Semantic versioning @@ -520,7 +520,7 @@ repository. ## Can I use the Apache Airflow logo in my presentation? -Yes! Be sure to abide by the Apache Foundation [trademark policies](https://www.apache.org/foundation/marks/#books) and the Apache Airflow [Brandbook](https://cwiki.apache.org/confluence/display/AIRFLOW/Brandbook). The most up-to-date logos are found in [this repo](https://github.com/apache/airflow/tree/main/docs/apache-airflow/img/logos/) and on the Apache Software Foundation [website](https://www.apache.org/logos/about.html). +Yes! Be sure to abide by the Apache Foundation [trademark policies](https://www.apache.org/foundation/marks/#books) and the Apache Airflow [Brandbook](https://cwiki.apache.org/confluence/display/AIRFLOW/Brandbook). The most up-to-date logos are found in [this repo](https://github.com/apache/airflow/tree/main/airflow-core/docs/img/logos/) and on the Apache Software Foundation [website](https://www.apache.org/logos/about.html). ## Links diff --git a/3rd-party-licenses/LICENSE-bootstrap.txt b/airflow-core/3rd-party-licenses/LICENSE-bootstrap.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-bootstrap.txt rename to airflow-core/3rd-party-licenses/LICENSE-bootstrap.txt diff --git a/3rd-party-licenses/LICENSE-bootstrap3-typeahead.txt b/airflow-core/3rd-party-licenses/LICENSE-bootstrap3-typeahead.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-bootstrap3-typeahead.txt rename to airflow-core/3rd-party-licenses/LICENSE-bootstrap3-typeahead.txt diff --git a/3rd-party-licenses/LICENSE-d3-shape.txt b/airflow-core/3rd-party-licenses/LICENSE-d3-shape.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-d3-shape.txt rename to airflow-core/3rd-party-licenses/LICENSE-d3-shape.txt diff --git a/3rd-party-licenses/LICENSE-d3-tip.txt b/airflow-core/3rd-party-licenses/LICENSE-d3-tip.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-d3-tip.txt rename to airflow-core/3rd-party-licenses/LICENSE-d3-tip.txt diff --git a/3rd-party-licenses/LICENSE-d3js.txt b/airflow-core/3rd-party-licenses/LICENSE-d3js.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-d3js.txt rename to airflow-core/3rd-party-licenses/LICENSE-d3js.txt diff --git a/3rd-party-licenses/LICENSE-dagre-d3.txt b/airflow-core/3rd-party-licenses/LICENSE-dagre-d3.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-dagre-d3.txt rename to airflow-core/3rd-party-licenses/LICENSE-dagre-d3.txt diff --git a/3rd-party-licenses/LICENSE-datatables.txt b/airflow-core/3rd-party-licenses/LICENSE-datatables.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-datatables.txt rename to airflow-core/3rd-party-licenses/LICENSE-datatables.txt diff --git a/3rd-party-licenses/LICENSE-elasticmock.txt b/airflow-core/3rd-party-licenses/LICENSE-elasticmock.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-elasticmock.txt rename to airflow-core/3rd-party-licenses/LICENSE-elasticmock.txt diff --git a/3rd-party-licenses/LICENSE-eonasdan-bootstrap-datetimepicker.txt b/airflow-core/3rd-party-licenses/LICENSE-eonasdan-bootstrap-datetimepicker.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-eonasdan-bootstrap-datetimepicker.txt rename to airflow-core/3rd-party-licenses/LICENSE-eonasdan-bootstrap-datetimepicker.txt diff --git a/3rd-party-licenses/LICENSE-flask-kerberos.txt b/airflow-core/3rd-party-licenses/LICENSE-flask-kerberos.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-flask-kerberos.txt rename to airflow-core/3rd-party-licenses/LICENSE-flask-kerberos.txt diff --git a/3rd-party-licenses/LICENSE-hue.txt b/airflow-core/3rd-party-licenses/LICENSE-hue.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-hue.txt rename to airflow-core/3rd-party-licenses/LICENSE-hue.txt diff --git a/3rd-party-licenses/LICENSE-jqclock.txt b/airflow-core/3rd-party-licenses/LICENSE-jqclock.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-jqclock.txt rename to airflow-core/3rd-party-licenses/LICENSE-jqclock.txt diff --git a/3rd-party-licenses/LICENSE-jquery.txt b/airflow-core/3rd-party-licenses/LICENSE-jquery.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-jquery.txt rename to airflow-core/3rd-party-licenses/LICENSE-jquery.txt diff --git a/3rd-party-licenses/LICENSE-moment.txt b/airflow-core/3rd-party-licenses/LICENSE-moment.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-moment.txt rename to airflow-core/3rd-party-licenses/LICENSE-moment.txt diff --git a/3rd-party-licenses/LICENSE-normalize.txt b/airflow-core/3rd-party-licenses/LICENSE-normalize.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-normalize.txt rename to airflow-core/3rd-party-licenses/LICENSE-normalize.txt diff --git a/3rd-party-licenses/LICENSE-pytest-capture-warnings.txt b/airflow-core/3rd-party-licenses/LICENSE-pytest-capture-warnings.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-pytest-capture-warnings.txt rename to airflow-core/3rd-party-licenses/LICENSE-pytest-capture-warnings.txt diff --git a/3rd-party-licenses/LICENSE-reproducible.txt b/airflow-core/3rd-party-licenses/LICENSE-reproducible.txt similarity index 100% rename from 3rd-party-licenses/LICENSE-reproducible.txt rename to airflow-core/3rd-party-licenses/LICENSE-reproducible.txt diff --git a/airflow-core/LICENSE b/airflow-core/LICENSE new file mode 100644 index 0000000000000..25c727ac6e927 --- /dev/null +++ b/airflow-core/LICENSE @@ -0,0 +1,252 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +============================================================================ + APACHE AIRFLOW SUBCOMPONENTS: + + The Apache Airflow project contains subcomponents with separate copyright + notices and license terms. Your use of the source code for the these + subcomponents is subject to the terms and conditions of the following + licenses. + + +======================================================================== +Third party Apache 2.0 licenses +======================================================================== + +The following components are provided under the Apache 2.0 License. +See project link for details. The text of each license is also included +at 3rd-party-licenses/LICENSE-[project].txt. + + (ALv2 License) hue v4.3.0 (https://github.com/cloudera/hue/) + (ALv2 License) jqclock v2.3.0 (https://github.com/JohnRDOrazio/jQuery-Clock-Plugin) + (ALv2 License) bootstrap3-typeahead v4.0.2 (https://github.com/bassjobsen/Bootstrap-3-Typeahead) + +======================================================================== +MIT licenses +======================================================================== + +The following components are provided under the MIT License. See project link for details. +The text of each license is also included at 3rd-party-licenses/LICENSE-[project].txt. + + (MIT License) jquery v3.5.1 (https://jquery.org/license/) + (MIT License) dagre-d3 v0.6.4 (https://github.com/cpettitt/dagre-d3) + (MIT License) bootstrap v3.4.1 (https://github.com/twbs/bootstrap/) + (MIT License) d3-tip v0.9.1 (https://github.com/Caged/d3-tip) + (MIT License) dataTables v1.10.25 (https://datatables.net) + (MIT License) normalize.css v3.0.2 (http://necolas.github.io/normalize.css/) + (MIT License) ElasticMock v1.3.2 (https://github.com/vrcmarcos/elasticmock) + (MIT License) MomentJS v2.24.0 (http://momentjs.com/) + (MIT License) eonasdan-bootstrap-datetimepicker v4.17.49 (https://github.com/eonasdan/bootstrap-datetimepicker/) + +======================================================================== +BSD 3-Clause licenses +======================================================================== +The following components are provided under the BSD 3-Clause license. See project links for details. +The text of each license is also included at 3rd-party-licenses/LICENSE-[project].txt. + + (BSD 3 License) d3 v5.16.0 (https://d3js.org) + (BSD 3 License) d3-shape v2.1.0 (https://github.com/d3/d3-shape) + (BSD 3 License) cgroupspy 0.2.1 (https://github.com/cloudsigma/cgroupspy) + +======================================================================== +See 3rd-party-licenses/LICENSES-ui.txt for packages used in `/airflow/www` diff --git a/NOTICE b/airflow-core/NOTICE similarity index 100% rename from NOTICE rename to airflow-core/NOTICE diff --git a/airflow-core/README.md b/airflow-core/README.md new file mode 100644 index 0000000000000..edeaa585c67c0 --- /dev/null +++ b/airflow-core/README.md @@ -0,0 +1,21 @@ + + +This is a core airflow package that contains the functionality of Apache Airflow components: +scheduler, API server, dag file processor and triggerer. diff --git a/docs/apache-airflow/.gitignore b/airflow-core/docs/.gitignore similarity index 100% rename from docs/apache-airflow/.gitignore rename to airflow-core/docs/.gitignore diff --git a/docs/apache-airflow/administration-and-deployment/cluster-policies.rst b/airflow-core/docs/administration-and-deployment/cluster-policies.rst similarity index 95% rename from docs/apache-airflow/administration-and-deployment/cluster-policies.rst rename to airflow-core/docs/administration-and-deployment/cluster-policies.rst index afeee6fe50470..2711a9e452650 100644 --- a/docs/apache-airflow/administration-and-deployment/cluster-policies.rst +++ b/airflow-core/docs/administration-and-deployment/cluster-policies.rst @@ -129,7 +129,7 @@ DAG policies This policy checks if each DAG has at least one tag defined: -.. literalinclude:: /../../tests/cluster_policies/__init__.py +.. literalinclude:: /../../airflow-core/tests/unit/cluster_policies/__init__.py :language: python :start-after: [START example_dag_cluster_policy] :end-before: [END example_dag_cluster_policy] @@ -147,14 +147,14 @@ Task policies Here's an example of enforcing a maximum timeout policy on every task: -.. literalinclude:: /../../tests/cluster_policies/__init__.py +.. literalinclude:: /../../airflow-core/tests/unit/cluster_policies/__init__.py :language: python :start-after: [START example_task_cluster_policy] :end-before: [END example_task_cluster_policy] You could also implement to protect against common errors, rather than as technical security controls. For example, don't run tasks without airflow owners: -.. literalinclude:: /../../tests/cluster_policies/__init__.py +.. literalinclude:: /../../airflow-core/tests/unit/cluster_policies/__init__.py :language: python :start-after: [START example_cluster_policy_rule] :end-before: [END example_cluster_policy_rule] @@ -163,7 +163,7 @@ If you have multiple checks to apply, it is best practice to curate these rules For example, your ``airflow_local_settings.py`` might follow this pattern: -.. literalinclude:: /../../tests/cluster_policies/__init__.py +.. literalinclude:: /../../airflow-core/tests/unit/cluster_policies/__init__.py :language: python :start-after: [START example_list_of_cluster_policy_rules] :end-before: [END example_list_of_cluster_policy_rules] @@ -177,7 +177,7 @@ Task instance mutation Here's an example of re-routing tasks that are on their second (or greater) retry to a different queue: -.. literalinclude:: /../../tests/cluster_policies/__init__.py +.. literalinclude:: /../../airflow-core/tests/unit/cluster_policies/__init__.py :language: python :start-after: [START example_task_mutation_hook] :end-before: [END example_task_mutation_hook] diff --git a/docs/apache-airflow/administration-and-deployment/dag-serialization.rst b/airflow-core/docs/administration-and-deployment/dag-serialization.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/dag-serialization.rst rename to airflow-core/docs/administration-and-deployment/dag-serialization.rst diff --git a/docs/apache-airflow/administration-and-deployment/dagfile-processing.rst b/airflow-core/docs/administration-and-deployment/dagfile-processing.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/dagfile-processing.rst rename to airflow-core/docs/administration-and-deployment/dagfile-processing.rst diff --git a/docs/apache-airflow/administration-and-deployment/index.rst b/airflow-core/docs/administration-and-deployment/index.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/index.rst rename to airflow-core/docs/administration-and-deployment/index.rst diff --git a/docs/apache-airflow/administration-and-deployment/kubernetes.rst b/airflow-core/docs/administration-and-deployment/kubernetes.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/kubernetes.rst rename to airflow-core/docs/administration-and-deployment/kubernetes.rst diff --git a/docs/apache-airflow/administration-and-deployment/lineage.rst b/airflow-core/docs/administration-and-deployment/lineage.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/lineage.rst rename to airflow-core/docs/administration-and-deployment/lineage.rst diff --git a/docs/apache-airflow/administration-and-deployment/listeners.rst b/airflow-core/docs/administration-and-deployment/listeners.rst similarity index 93% rename from docs/apache-airflow/administration-and-deployment/listeners.rst rename to airflow-core/docs/administration-and-deployment/listeners.rst index 6790376b1f3af..61bf710153f1c 100644 --- a/docs/apache-airflow/administration-and-deployment/listeners.rst +++ b/airflow-core/docs/administration-and-deployment/listeners.rst @@ -43,21 +43,21 @@ DagRun state change events occur when a :class:`~airflow.models.dagrun.DagRun` c - ``on_dag_run_running`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_dagrun_running_task] :end-before: [END howto_listen_dagrun_running_task] - ``on_dag_run_success`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_dagrun_success_task] :end-before: [END howto_listen_dagrun_success_task] - ``on_dag_run_failed`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_dagrun_failure_task] :end-before: [END howto_listen_dagrun_failure_task] @@ -71,21 +71,21 @@ You can use these events to react to ``LocalTaskJob`` state changes. - ``on_task_instance_running`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_ti_running_task] :end-before: [END howto_listen_ti_running_task] - ``on_task_instance_success`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_ti_success_task] :end-before: [END howto_listen_ti_success_task] - ``on_task_instance_failed`` -.. exampleinclude:: /../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_ti_failure_task] :end-before: [END howto_listen_ti_failure_task] diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/callbacks.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/callbacks.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/callbacks.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/callbacks.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/check-health.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/check-health.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/check-health.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/check-health.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/errors.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/errors.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/errors.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/errors.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/index.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/index.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/index.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/index.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/logging-architecture.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-architecture.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/logging-architecture.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/logging-architecture.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/logging-tasks.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/logging-tasks.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/metrics.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/metrics.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/traces.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/traces.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/traces.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/traces.rst diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/tracking-user-activity.rst b/airflow-core/docs/administration-and-deployment/logging-monitoring/tracking-user-activity.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/logging-monitoring/tracking-user-activity.rst rename to airflow-core/docs/administration-and-deployment/logging-monitoring/tracking-user-activity.rst diff --git a/docs/apache-airflow/administration-and-deployment/modules_management.rst b/airflow-core/docs/administration-and-deployment/modules_management.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/modules_management.rst rename to airflow-core/docs/administration-and-deployment/modules_management.rst diff --git a/docs/apache-airflow/administration-and-deployment/plugins.rst b/airflow-core/docs/administration-and-deployment/plugins.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/plugins.rst rename to airflow-core/docs/administration-and-deployment/plugins.rst diff --git a/docs/apache-airflow/administration-and-deployment/pools.rst b/airflow-core/docs/administration-and-deployment/pools.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/pools.rst rename to airflow-core/docs/administration-and-deployment/pools.rst diff --git a/docs/apache-airflow/administration-and-deployment/priority-weight.rst b/airflow-core/docs/administration-and-deployment/priority-weight.rst similarity index 95% rename from docs/apache-airflow/administration-and-deployment/priority-weight.rst rename to airflow-core/docs/administration-and-deployment/priority-weight.rst index 912963b6e7791..266e5bcdec876 100644 --- a/docs/apache-airflow/administration-and-deployment/priority-weight.rst +++ b/airflow-core/docs/administration-and-deployment/priority-weight.rst @@ -77,7 +77,7 @@ Custom Weight Rule You can implement your own custom weighting method by extending the ``PriorityWeightStrategy`` class and registering it in a plugin. -.. exampleinclude:: /../../airflow/example_dags/plugins/decreasing_priority_weight_strategy.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/decreasing_priority_weight_strategy.py :language: python :dedent: 0 :start-after: [START custom_priority_weight_strategy] @@ -88,7 +88,7 @@ To check if the custom priority weight strategy is already available in Airflow, ``airflow plugins``. Then to use it, you can create an instance of the custom class and provide it in the ``weight_rule`` parameter of the task or provide the path of the custom class: -.. exampleinclude:: /../../airflow/example_dags/example_custom_weight.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_custom_weight.py :language: python :dedent: 0 :start-after: [START example_custom_weight_dag] diff --git a/docs/apache-airflow/administration-and-deployment/production-deployment.rst b/airflow-core/docs/administration-and-deployment/production-deployment.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/production-deployment.rst rename to airflow-core/docs/administration-and-deployment/production-deployment.rst diff --git a/docs/apache-airflow/administration-and-deployment/scheduler.rst b/airflow-core/docs/administration-and-deployment/scheduler.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/scheduler.rst rename to airflow-core/docs/administration-and-deployment/scheduler.rst diff --git a/docs/apache-airflow/administration-and-deployment/web-stack.rst b/airflow-core/docs/administration-and-deployment/web-stack.rst similarity index 100% rename from docs/apache-airflow/administration-and-deployment/web-stack.rst rename to airflow-core/docs/administration-and-deployment/web-stack.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/connections.rst b/airflow-core/docs/authoring-and-scheduling/connections.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/connections.rst rename to airflow-core/docs/authoring-and-scheduling/connections.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/cron.rst b/airflow-core/docs/authoring-and-scheduling/cron.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/cron.rst rename to airflow-core/docs/authoring-and-scheduling/cron.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/datasets.rst b/airflow-core/docs/authoring-and-scheduling/datasets.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/datasets.rst rename to airflow-core/docs/authoring-and-scheduling/datasets.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/deferring.rst b/airflow-core/docs/authoring-and-scheduling/deferring.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/deferring.rst rename to airflow-core/docs/authoring-and-scheduling/deferring.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/dynamic-task-mapping.rst b/airflow-core/docs/authoring-and-scheduling/dynamic-task-mapping.rst similarity index 99% rename from docs/apache-airflow/authoring-and-scheduling/dynamic-task-mapping.rst rename to airflow-core/docs/authoring-and-scheduling/dynamic-task-mapping.rst index eee97e0849f43..9cf13288c77c5 100644 --- a/docs/apache-airflow/authoring-and-scheduling/dynamic-task-mapping.rst +++ b/airflow-core/docs/authoring-and-scheduling/dynamic-task-mapping.rst @@ -34,7 +34,7 @@ In its simplest form you can map over a list defined directly in your DAG file u If you want to see a simple usage of Dynamic Task Mapping, you can look below: -.. exampleinclude:: /../../airflow/example_dags/example_dynamic_task_mapping.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_dynamic_task_mapping.py :language: python This will show ``Total was 9`` in the task logs when executed. @@ -222,7 +222,7 @@ Mapping with non-TaskFlow operators It is possible to use ``partial`` and ``expand`` with classic style operators as well. Some arguments are not mappable and must be passed to ``partial()``, such as ``task_id``, ``queue``, ``pool``, and most other arguments to ``BaseOperator``. -.. exampleinclude:: /../../airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py :language: python .. note:: Only keyword arguments are allowed to be passed to ``partial()``. diff --git a/docs/apache-airflow/authoring-and-scheduling/event-scheduling.rst b/airflow-core/docs/authoring-and-scheduling/event-scheduling.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/event-scheduling.rst rename to airflow-core/docs/authoring-and-scheduling/event-scheduling.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/index.rst b/airflow-core/docs/authoring-and-scheduling/index.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/index.rst rename to airflow-core/docs/authoring-and-scheduling/index.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/serializers.rst b/airflow-core/docs/authoring-and-scheduling/serializers.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/serializers.rst rename to airflow-core/docs/authoring-and-scheduling/serializers.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/timetable.rst b/airflow-core/docs/authoring-and-scheduling/timetable.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/timetable.rst rename to airflow-core/docs/authoring-and-scheduling/timetable.rst diff --git a/docs/apache-airflow/authoring-and-scheduling/timezone.rst b/airflow-core/docs/authoring-and-scheduling/timezone.rst similarity index 100% rename from docs/apache-airflow/authoring-and-scheduling/timezone.rst rename to airflow-core/docs/authoring-and-scheduling/timezone.rst diff --git a/docs/apache-airflow/best-practices.rst b/airflow-core/docs/best-practices.rst similarity index 100% rename from docs/apache-airflow/best-practices.rst rename to airflow-core/docs/best-practices.rst diff --git a/docs/apache-airflow/cli-and-env-variables-ref.rst b/airflow-core/docs/cli-and-env-variables-ref.rst similarity index 100% rename from docs/apache-airflow/cli-and-env-variables-ref.rst rename to airflow-core/docs/cli-and-env-variables-ref.rst diff --git a/docs/apache-airflow/configurations-ref.rst b/airflow-core/docs/configurations-ref.rst similarity index 95% rename from docs/apache-airflow/configurations-ref.rst rename to airflow-core/docs/configurations-ref.rst index 1648ab1674b39..c22032a5e6037 100644 --- a/docs/apache-airflow/configurations-ref.rst +++ b/airflow-core/docs/configurations-ref.rst @@ -43,7 +43,7 @@ Some of the providers have their own configuration options, you will find detail in the provider's documentation. You can find all the provider configuration in -:doc:`configurations specific for provider packages ` +:doc:`configurations specific to providers ` Airflow configuration options ----------------------------- diff --git a/docs/apache-airflow/core-concepts/auth-manager/index.rst b/airflow-core/docs/core-concepts/auth-manager/index.rst similarity index 100% rename from docs/apache-airflow/core-concepts/auth-manager/index.rst rename to airflow-core/docs/core-concepts/auth-manager/index.rst diff --git a/docs/apache-airflow/core-concepts/auth-manager/simple.rst b/airflow-core/docs/core-concepts/auth-manager/simple.rst similarity index 100% rename from docs/apache-airflow/core-concepts/auth-manager/simple.rst rename to airflow-core/docs/core-concepts/auth-manager/simple.rst diff --git a/docs/apache-airflow/core-concepts/backfill.rst b/airflow-core/docs/core-concepts/backfill.rst similarity index 100% rename from docs/apache-airflow/core-concepts/backfill.rst rename to airflow-core/docs/core-concepts/backfill.rst diff --git a/docs/apache-airflow/core-concepts/dag-run.rst b/airflow-core/docs/core-concepts/dag-run.rst similarity index 100% rename from docs/apache-airflow/core-concepts/dag-run.rst rename to airflow-core/docs/core-concepts/dag-run.rst diff --git a/docs/apache-airflow/core-concepts/dags.rst b/airflow-core/docs/core-concepts/dags.rst similarity index 99% rename from docs/apache-airflow/core-concepts/dags.rst rename to airflow-core/docs/core-concepts/dags.rst index df70410a11c68..3fd9a88ed8a7c 100644 --- a/docs/apache-airflow/core-concepts/dags.rst +++ b/airflow-core/docs/core-concepts/dags.rst @@ -292,7 +292,7 @@ The DAG decorator As well as the more traditional ways of declaring a single DAG using a context manager or the ``DAG()`` constructor, you can also decorate a function with ``@dag`` to turn it into a DAG generator function: -.. exampleinclude:: /../../airflow/example_dags/example_dag_decorator.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_dag_decorator.py :language: python :start-after: [START dag_decorator_usage] :end-before: [END dag_decorator_usage] @@ -399,7 +399,7 @@ This special Operator skips all tasks downstream of itself if you are not on the Here's an example: -.. exampleinclude:: /../../airflow/example_dags/example_latest_only_with_trigger.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_latest_only_with_trigger.py :language: python :start-after: [START example] :end-before: [END example] @@ -636,7 +636,7 @@ Here's an example DAG which illustrates labeling different branches: .. image:: /img/edge_label_example.png -.. exampleinclude:: /../../airflow/example_dags/example_branch_labels.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_branch_labels.py :language: python :start-after: from airflow.utils.edgemodifier import Label diff --git a/docs/apache-airflow/core-concepts/debug.rst b/airflow-core/docs/core-concepts/debug.rst similarity index 100% rename from docs/apache-airflow/core-concepts/debug.rst rename to airflow-core/docs/core-concepts/debug.rst diff --git a/docs/apache-airflow/core-concepts/executor/index.rst b/airflow-core/docs/core-concepts/executor/index.rst similarity index 100% rename from docs/apache-airflow/core-concepts/executor/index.rst rename to airflow-core/docs/core-concepts/executor/index.rst diff --git a/docs/apache-airflow/core-concepts/executor/local.rst b/airflow-core/docs/core-concepts/executor/local.rst similarity index 100% rename from docs/apache-airflow/core-concepts/executor/local.rst rename to airflow-core/docs/core-concepts/executor/local.rst diff --git a/docs/apache-airflow/core-concepts/executor/sequential.rst b/airflow-core/docs/core-concepts/executor/sequential.rst similarity index 100% rename from docs/apache-airflow/core-concepts/executor/sequential.rst rename to airflow-core/docs/core-concepts/executor/sequential.rst diff --git a/docs/apache-airflow/core-concepts/index.rst b/airflow-core/docs/core-concepts/index.rst similarity index 100% rename from docs/apache-airflow/core-concepts/index.rst rename to airflow-core/docs/core-concepts/index.rst diff --git a/docs/apache-airflow/core-concepts/objectstorage.rst b/airflow-core/docs/core-concepts/objectstorage.rst similarity index 100% rename from docs/apache-airflow/core-concepts/objectstorage.rst rename to airflow-core/docs/core-concepts/objectstorage.rst diff --git a/docs/apache-airflow/core-concepts/operators.rst b/airflow-core/docs/core-concepts/operators.rst similarity index 99% rename from docs/apache-airflow/core-concepts/operators.rst rename to airflow-core/docs/core-concepts/operators.rst index f6385ddc1b0ea..24c1357955ab5 100644 --- a/docs/apache-airflow/core-concepts/operators.rst +++ b/airflow-core/docs/core-concepts/operators.rst @@ -38,7 +38,7 @@ Airflow has a very extensive set of operators available, with some built-in to t For a list of all core operators, see: :doc:`Core Operators and Hooks Reference `. -If the operator you need isn't installed with Airflow by default, you can probably find it as part of our huge set of community :doc:`provider packages `. Some popular operators from here include: +If the operator you need isn't installed with Airflow by default, you can probably find it as part of our huge set of community :doc:`providers `. Some popular operators from here include: - :class:`~airflow.providers.smtp.operators.smtp.EmailOperator` - :class:`~airflow.providers.http.operators.http.HttpOperator` diff --git a/docs/apache-airflow/core-concepts/overview.rst b/airflow-core/docs/core-concepts/overview.rst similarity index 100% rename from docs/apache-airflow/core-concepts/overview.rst rename to airflow-core/docs/core-concepts/overview.rst diff --git a/docs/apache-airflow/core-concepts/params.rst b/airflow-core/docs/core-concepts/params.rst similarity index 97% rename from docs/apache-airflow/core-concepts/params.rst rename to airflow-core/docs/core-concepts/params.rst index 078e39e6a6377..2f46588d6c8e4 100644 --- a/docs/apache-airflow/core-concepts/params.rst +++ b/airflow-core/docs/core-concepts/params.rst @@ -361,24 +361,24 @@ The following features are supported in the Trigger UI Form: For examples, please take a look at the two example dags provided: :ref:`Params trigger example DAG ` and :ref:`Params UI example DAG `. .. _params-trigger-ui: -.. exampleinclude:: /../../airflow/example_dags/example_params_trigger_ui.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_params_trigger_ui.py :language: python :start-after: [START params_trigger] :end-before: [END params_trigger] .. _params-ui-tutorial: -.. exampleinclude:: /../../airflow/example_dags/example_params_ui_tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py :language: python :start-after: [START section_1] :end-before: [END section_1] -.. exampleinclude:: /../../airflow/example_dags/example_params_ui_tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py :language: python :start-after: [START section_2] :end-before: [END section_2] -.. exampleinclude:: /../../airflow/example_dags/example_params_ui_tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py :language: python :start-after: [START section_3] :end-before: [END section_3] diff --git a/docs/apache-airflow/core-concepts/sensors.rst b/airflow-core/docs/core-concepts/sensors.rst similarity index 100% rename from docs/apache-airflow/core-concepts/sensors.rst rename to airflow-core/docs/core-concepts/sensors.rst diff --git a/docs/apache-airflow/core-concepts/taskflow.rst b/airflow-core/docs/core-concepts/taskflow.rst similarity index 100% rename from docs/apache-airflow/core-concepts/taskflow.rst rename to airflow-core/docs/core-concepts/taskflow.rst diff --git a/docs/apache-airflow/core-concepts/tasks.rst b/airflow-core/docs/core-concepts/tasks.rst similarity index 100% rename from docs/apache-airflow/core-concepts/tasks.rst rename to airflow-core/docs/core-concepts/tasks.rst diff --git a/docs/apache-airflow/core-concepts/variables.rst b/airflow-core/docs/core-concepts/variables.rst similarity index 100% rename from docs/apache-airflow/core-concepts/variables.rst rename to airflow-core/docs/core-concepts/variables.rst diff --git a/docs/apache-airflow/core-concepts/xcoms.rst b/airflow-core/docs/core-concepts/xcoms.rst similarity index 100% rename from docs/apache-airflow/core-concepts/xcoms.rst rename to airflow-core/docs/core-concepts/xcoms.rst diff --git a/docs/apache-airflow/database-erd-ref.rst b/airflow-core/docs/database-erd-ref.rst similarity index 100% rename from docs/apache-airflow/database-erd-ref.rst rename to airflow-core/docs/database-erd-ref.rst diff --git a/docs/apache-airflow/empty_plugin/README.md b/airflow-core/docs/empty_plugin/README.md similarity index 100% rename from docs/apache-airflow/empty_plugin/README.md rename to airflow-core/docs/empty_plugin/README.md diff --git a/docs/apache-airflow/empty_plugin/empty_plugin.py b/airflow-core/docs/empty_plugin/empty_plugin.py similarity index 100% rename from docs/apache-airflow/empty_plugin/empty_plugin.py rename to airflow-core/docs/empty_plugin/empty_plugin.py diff --git a/docs/apache-airflow/empty_plugin/templates/empty_plugin/index.html b/airflow-core/docs/empty_plugin/templates/empty_plugin/index.html similarity index 100% rename from docs/apache-airflow/empty_plugin/templates/empty_plugin/index.html rename to airflow-core/docs/empty_plugin/templates/empty_plugin/index.html diff --git a/docs/apache-airflow/extra-packages-ref.rst b/airflow-core/docs/extra-packages-ref.rst similarity index 99% rename from docs/apache-airflow/extra-packages-ref.rst rename to airflow-core/docs/extra-packages-ref.rst index 9c07105b77eae..aac5be80b659d 100644 --- a/docs/apache-airflow/extra-packages-ref.rst +++ b/airflow-core/docs/extra-packages-ref.rst @@ -92,7 +92,7 @@ python dependencies for the provided package. Providers extras ---------------- -These providers extras are simply convenience extras to install provider packages so that you can install the providers with simple command - including +These providers extras are simply convenience extras to install providers so that you can install the providers with simple command - including provider package and necessary dependencies in single command, which allows PIP to resolve any conflicting dependencies. This is extremely useful for first time installation where you want to repeatably install version of dependencies which are 'valid' for both airflow and providers installed. diff --git a/docs/apache-airflow/faq.rst b/airflow-core/docs/faq.rst similarity index 100% rename from docs/apache-airflow/faq.rst rename to airflow-core/docs/faq.rst diff --git a/docs/apache-airflow/howto/add-dag-tags.rst b/airflow-core/docs/howto/add-dag-tags.rst similarity index 100% rename from docs/apache-airflow/howto/add-dag-tags.rst rename to airflow-core/docs/howto/add-dag-tags.rst diff --git a/docs/apache-airflow/howto/add-owner-links.rst b/airflow-core/docs/howto/add-owner-links.rst similarity index 100% rename from docs/apache-airflow/howto/add-owner-links.rst rename to airflow-core/docs/howto/add-owner-links.rst diff --git a/docs/apache-airflow/howto/connection.rst b/airflow-core/docs/howto/connection.rst similarity index 98% rename from docs/apache-airflow/howto/connection.rst rename to airflow-core/docs/howto/connection.rst index d0cc058a4305b..54037634d304d 100644 --- a/docs/apache-airflow/howto/connection.rst +++ b/airflow-core/docs/howto/connection.rst @@ -268,7 +268,7 @@ will be disabled (if you are testing in the UI). .. note:: If webserver & worker machines (if testing via the Airflow UI) or machines/pods (if testing via the - Airflow CLI) have different libs or provider packages installed, test results *might* differ. + Airflow CLI) have different libs or providers installed, test results *might* differ. Custom connection types @@ -294,7 +294,7 @@ deprecated ``hook-class-names``) in the provider meta-data, you can customize Ai * Hiding fields that are not used for your connection * Adding placeholders showing examples of how fields should be formatted -You can read more about details how to add custom provider packages in the :doc:`apache-airflow-providers:index` +You can read more about details how to add custom providers in the :doc:`apache-airflow-providers:index` Custom connection fields ------------------------ diff --git a/docs/apache-airflow/howto/create-custom-decorator.rst b/airflow-core/docs/howto/create-custom-decorator.rst similarity index 97% rename from docs/apache-airflow/howto/create-custom-decorator.rst rename to airflow-core/docs/howto/create-custom-decorator.rst index 81312b2335f7e..df9d295388112 100644 --- a/docs/apache-airflow/howto/create-custom-decorator.rst +++ b/airflow-core/docs/howto/create-custom-decorator.rst @@ -100,7 +100,7 @@ To hack around this problem, a type stub ``airflow/decorators/__init__.pyi`` is the type signature of each task decorator. A newly added task decorator should declare its signature stub like this: -.. exampleinclude:: ../../../airflow/decorators/__init__.pyi +.. exampleinclude:: ../../../airflow-core/src/airflow/decorators/__init__.pyi :language: python :start-after: [START decorator_signature] :end-before: [END decorator_signature] @@ -114,7 +114,7 @@ If the new decorator can be used without arguments (e.g. ``@task.python`` instea You should also add an overload that takes a single callable immediately after the "real" definition so mypy can recognize the function as a "bare decorator": -.. exampleinclude:: ../../../airflow/decorators/__init__.pyi +.. exampleinclude:: ../../../airflow-core/src/airflow/decorators/__init__.pyi :language: python :start-after: [START mixin_for_typing] :end-before: [END mixin_for_typing] diff --git a/docs/apache-airflow/howto/custom-operator.rst b/airflow-core/docs/howto/custom-operator.rst similarity index 100% rename from docs/apache-airflow/howto/custom-operator.rst rename to airflow-core/docs/howto/custom-operator.rst diff --git a/docs/apache-airflow/howto/custom-view-plugin.rst b/airflow-core/docs/howto/custom-view-plugin.rst similarity index 100% rename from docs/apache-airflow/howto/custom-view-plugin.rst rename to airflow-core/docs/howto/custom-view-plugin.rst diff --git a/docs/apache-airflow/howto/customize-ui.rst b/airflow-core/docs/howto/customize-ui.rst similarity index 100% rename from docs/apache-airflow/howto/customize-ui.rst rename to airflow-core/docs/howto/customize-ui.rst diff --git a/docs/apache-airflow/howto/define-extra-link.rst b/airflow-core/docs/howto/define-extra-link.rst similarity index 100% rename from docs/apache-airflow/howto/define-extra-link.rst rename to airflow-core/docs/howto/define-extra-link.rst diff --git a/docs/apache-airflow/howto/docker-compose/airflow.sh b/airflow-core/docs/howto/docker-compose/airflow.sh similarity index 100% rename from docs/apache-airflow/howto/docker-compose/airflow.sh rename to airflow-core/docs/howto/docker-compose/airflow.sh diff --git a/docs/apache-airflow/howto/docker-compose/docker-compose.yaml b/airflow-core/docs/howto/docker-compose/docker-compose.yaml similarity index 99% rename from docs/apache-airflow/howto/docker-compose/docker-compose.yaml rename to airflow-core/docs/howto/docker-compose/docker-compose.yaml index c717d6ca3823c..7b3dc4de519af 100644 --- a/docs/apache-airflow/howto/docker-compose/docker-compose.yaml +++ b/airflow-core/docs/howto/docker-compose/docker-compose.yaml @@ -46,7 +46,7 @@ --- x-airflow-common: &airflow-common - # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # In order to add custom dependencies or upgrade provider distributions you can use your extended image. # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml # and uncomment the "build" line below, Then run `docker-compose build` to build the images. image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:|version|} diff --git a/docs/apache-airflow/howto/docker-compose/index.rst b/airflow-core/docs/howto/docker-compose/index.rst similarity index 100% rename from docs/apache-airflow/howto/docker-compose/index.rst rename to airflow-core/docs/howto/docker-compose/index.rst diff --git a/docs/apache-airflow/howto/dynamic-dag-generation.rst b/airflow-core/docs/howto/dynamic-dag-generation.rst similarity index 100% rename from docs/apache-airflow/howto/dynamic-dag-generation.rst rename to airflow-core/docs/howto/dynamic-dag-generation.rst diff --git a/docs/apache-airflow/howto/email-config.rst b/airflow-core/docs/howto/email-config.rst similarity index 100% rename from docs/apache-airflow/howto/email-config.rst rename to airflow-core/docs/howto/email-config.rst diff --git a/docs/apache-airflow/howto/export-more-env-vars.rst b/airflow-core/docs/howto/export-more-env-vars.rst similarity index 100% rename from docs/apache-airflow/howto/export-more-env-vars.rst rename to airflow-core/docs/howto/export-more-env-vars.rst diff --git a/docs/apache-airflow/howto/index.rst b/airflow-core/docs/howto/index.rst similarity index 100% rename from docs/apache-airflow/howto/index.rst rename to airflow-core/docs/howto/index.rst diff --git a/docs/apache-airflow/howto/listener-plugin.rst b/airflow-core/docs/howto/listener-plugin.rst similarity index 95% rename from docs/apache-airflow/howto/listener-plugin.rst rename to airflow-core/docs/howto/listener-plugin.rst index 542674bfdee6c..ff56ff970c854 100644 --- a/docs/apache-airflow/howto/listener-plugin.rst +++ b/airflow-core/docs/howto/listener-plugin.rst @@ -75,7 +75,7 @@ For reference, here's the plugin code within ``listener.py`` class that shows li This example listens when the task instance is in running state -.. exampleinclude:: ../../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: ../../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_ti_running_task] :end-before: [END howto_listen_ti_running_task] @@ -84,7 +84,7 @@ Similarly, code to listen after task_instance success and failure can be impleme This example listens when the dag run is change to failed state -.. exampleinclude:: ../../../airflow/example_dags/plugins/event_listener.py +.. exampleinclude:: ../../../airflow-core/src/airflow/example_dags/plugins/event_listener.py :language: python :start-after: [START howto_listen_dagrun_failure_task] :end-before: [END howto_listen_dagrun_failure_task] diff --git a/docs/apache-airflow/howto/notifications.rst b/airflow-core/docs/howto/notifications.rst similarity index 100% rename from docs/apache-airflow/howto/notifications.rst rename to airflow-core/docs/howto/notifications.rst diff --git a/docs/apache-airflow/howto/operator/index.rst b/airflow-core/docs/howto/operator/index.rst similarity index 100% rename from docs/apache-airflow/howto/operator/index.rst rename to airflow-core/docs/howto/operator/index.rst diff --git a/docs/apache-airflow/howto/run-behind-proxy.rst b/airflow-core/docs/howto/run-behind-proxy.rst similarity index 100% rename from docs/apache-airflow/howto/run-behind-proxy.rst rename to airflow-core/docs/howto/run-behind-proxy.rst diff --git a/docs/apache-airflow/howto/run-with-systemd.rst b/airflow-core/docs/howto/run-with-systemd.rst similarity index 100% rename from docs/apache-airflow/howto/run-with-systemd.rst rename to airflow-core/docs/howto/run-with-systemd.rst diff --git a/docs/apache-airflow/howto/set-config.rst b/airflow-core/docs/howto/set-config.rst similarity index 100% rename from docs/apache-airflow/howto/set-config.rst rename to airflow-core/docs/howto/set-config.rst diff --git a/docs/apache-airflow/howto/set-up-database.rst b/airflow-core/docs/howto/set-up-database.rst similarity index 99% rename from docs/apache-airflow/howto/set-up-database.rst rename to airflow-core/docs/howto/set-up-database.rst index 85281b618790f..e94f5c11106dc 100644 --- a/docs/apache-airflow/howto/set-up-database.rst +++ b/airflow-core/docs/howto/set-up-database.rst @@ -330,7 +330,7 @@ MsSQL Database the Airflow's PMC members and Committers have reached a resolution to no longer maintain MsSQL as a supported Database Backend. As of Airflow 2.9.0 support of MsSQL has been removed for Airflow Database Backend. - This does not affect the existing provider packages (operators and hooks), dags can still access and process data from MsSQL. + This does not affect the existing providers (operators and hooks), dags can still access and process data from MsSQL. However, further usage may throw errors making Airflow's core functionality unusable. diff --git a/docs/apache-airflow/howto/setup-and-teardown.rst b/airflow-core/docs/howto/setup-and-teardown.rst similarity index 100% rename from docs/apache-airflow/howto/setup-and-teardown.rst rename to airflow-core/docs/howto/setup-and-teardown.rst diff --git a/docs/apache-airflow/howto/timetable.rst b/airflow-core/docs/howto/timetable.rst similarity index 98% rename from docs/apache-airflow/howto/timetable.rst rename to airflow-core/docs/howto/timetable.rst index 9351faa8721b0..ab100f02bf8c3 100644 --- a/docs/apache-airflow/howto/timetable.rst +++ b/airflow-core/docs/howto/timetable.rst @@ -101,7 +101,7 @@ know when to schedule the DAG's next run. We'll start with ``infer_manual_data_interval`` since it's the easier of the two: -.. exampleinclude:: /../../airflow/example_dags/plugins/workday.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/workday.py :language: python :dedent: 4 :start-after: [START howto_timetable_infer_manual_data_interval] @@ -119,7 +119,7 @@ interval. Next is the implementation of ``next_dagrun_info``: -.. exampleinclude:: /../../airflow/example_dags/plugins/workday.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/workday.py :language: python :dedent: 4 :start-after: [START howto_timetable_next_dagrun_info] @@ -185,7 +185,7 @@ provides a shortcut for this: For reference, here's our plugin and DAG files in their entirety: -.. exampleinclude:: /../../airflow/example_dags/plugins/workday.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/plugins/workday.py :language: python :start-after: [START howto_timetable] :end-before: [END howto_timetable] diff --git a/docs/apache-airflow/howto/upgrading-from-1-10/index.rst b/airflow-core/docs/howto/upgrading-from-1-10/index.rst similarity index 98% rename from docs/apache-airflow/howto/upgrading-from-1-10/index.rst rename to airflow-core/docs/howto/upgrading-from-1-10/index.rst index 7f0b779e43b07..267529b8dc53d 100644 --- a/docs/apache-airflow/howto/upgrading-from-1-10/index.rst +++ b/airflow-core/docs/howto/upgrading-from-1-10/index.rst @@ -103,7 +103,7 @@ Step 4: Switch to Backport Providers Now that you are set up in Airflow 1.10.15 with Python a 3.6+ environment, you are ready to start porting your dags to Airflow 2.0 compliance! The most important step in this transition is also the easiest step to do in pieces. All Airflow 2.0 operators are backwards compatible with Airflow 1.10 -using the backport provider packages. In your own time, you can transition to using these backport-providers +using the backport providers. In your own time, you can transition to using these backport-providers by pip installing the provider via PyPI and changing the import path. For example: While historically you might have imported the DockerOperator in this fashion: @@ -125,7 +125,7 @@ and then import the operator with this path: from airflow.providers.docker.operators.docker import DockerOperator -Please note that the backport provider packages are just backports of the provider packages compatible with Airflow 2.0. +Please note that the backport providers are just backports of the providers compatible with Airflow 2.0. For example: .. code-block:: bash @@ -133,9 +133,9 @@ For example: pip install 'apache-airflow[docker]' automatically installs the ``apache-airflow-providers-docker`` package. -But you can manage/upgrade/remove provider packages separately from the Airflow core. +But you can manage/upgrade/remove providers separately from the Airflow core. -After you upgrade to Apache Airflow 2.0, those provider packages are installed automatically when you install Airflow with extras. +After you upgrade to Apache Airflow 2.0, those providers are installed automatically when you install Airflow with extras. Several of the providers (http, ftp, sqlite, imap) will also be installed automatically when you install Airflow even without extras. You can read more about providers at :doc:`apache-airflow-providers:index`. diff --git a/docs/apache-airflow/howto/upgrading-from-1-10/upgrade-check.rst b/airflow-core/docs/howto/upgrading-from-1-10/upgrade-check.rst similarity index 100% rename from docs/apache-airflow/howto/upgrading-from-1-10/upgrade-check.rst rename to airflow-core/docs/howto/upgrading-from-1-10/upgrade-check.rst diff --git a/docs/apache-airflow/howto/usage-cli.rst b/airflow-core/docs/howto/usage-cli.rst similarity index 100% rename from docs/apache-airflow/howto/usage-cli.rst rename to airflow-core/docs/howto/usage-cli.rst diff --git a/docs/apache-airflow/howto/variable.rst b/airflow-core/docs/howto/variable.rst similarity index 100% rename from docs/apache-airflow/howto/variable.rst rename to airflow-core/docs/howto/variable.rst diff --git a/docs/apache-airflow/img/add-dag-tags.png b/airflow-core/docs/img/add-dag-tags.png similarity index 100% rename from docs/apache-airflow/img/add-dag-tags.png rename to airflow-core/docs/img/add-dag-tags.png diff --git a/docs/apache-airflow/img/add_container_python_interpreter.png b/airflow-core/docs/img/add_container_python_interpreter.png similarity index 100% rename from docs/apache-airflow/img/add_container_python_interpreter.png rename to airflow-core/docs/img/add_container_python_interpreter.png diff --git a/airflow-core/docs/img/airflow_erd.sha256 b/airflow-core/docs/img/airflow_erd.sha256 new file mode 100644 index 0000000000000..e3013acd3cff1 --- /dev/null +++ b/airflow-core/docs/img/airflow_erd.sha256 @@ -0,0 +1 @@ +dc8f1fc86bdb072de6d89ea79a985e0bb805e6bf0f064b48faa497ca90a4ea2d \ No newline at end of file diff --git a/docs/apache-airflow/img/airflow_erd.svg b/airflow-core/docs/img/airflow_erd.svg similarity index 100% rename from docs/apache-airflow/img/airflow_erd.svg rename to airflow-core/docs/img/airflow_erd.svg diff --git a/docs/apache-airflow/img/apache.jpg b/airflow-core/docs/img/apache.jpg similarity index 100% rename from docs/apache-airflow/img/apache.jpg rename to airflow-core/docs/img/apache.jpg diff --git a/docs/apache-airflow/img/arch-diag-logging.png b/airflow-core/docs/img/arch-diag-logging.png similarity index 100% rename from docs/apache-airflow/img/arch-diag-logging.png rename to airflow-core/docs/img/arch-diag-logging.png diff --git a/docs/apache-airflow/img/asset-scheduled-dags.png b/airflow-core/docs/img/asset-scheduled-dags.png similarity index 100% rename from docs/apache-airflow/img/asset-scheduled-dags.png rename to airflow-core/docs/img/asset-scheduled-dags.png diff --git a/docs/apache-airflow/img/assets.png b/airflow-core/docs/img/assets.png similarity index 100% rename from docs/apache-airflow/img/assets.png rename to airflow-core/docs/img/assets.png diff --git a/docs/apache-airflow/img/audit_log.png b/airflow-core/docs/img/audit_log.png similarity index 100% rename from docs/apache-airflow/img/audit_log.png rename to airflow-core/docs/img/audit_log.png diff --git a/docs/apache-airflow/img/aws-web-identity-federation-gcp.png b/airflow-core/docs/img/aws-web-identity-federation-gcp.png similarity index 100% rename from docs/apache-airflow/img/aws-web-identity-federation-gcp.png rename to airflow-core/docs/img/aws-web-identity-federation-gcp.png diff --git a/docs/apache-airflow/img/basic-dag.png b/airflow-core/docs/img/basic-dag.png similarity index 100% rename from docs/apache-airflow/img/basic-dag.png rename to airflow-core/docs/img/basic-dag.png diff --git a/docs/apache-airflow/img/branch_note.png b/airflow-core/docs/img/branch_note.png similarity index 100% rename from docs/apache-airflow/img/branch_note.png rename to airflow-core/docs/img/branch_note.png diff --git a/docs/apache-airflow/img/branch_with_trigger.png b/airflow-core/docs/img/branch_with_trigger.png similarity index 100% rename from docs/apache-airflow/img/branch_with_trigger.png rename to airflow-core/docs/img/branch_with_trigger.png diff --git a/docs/apache-airflow/img/branch_without_trigger.png b/airflow-core/docs/img/branch_without_trigger.png similarity index 100% rename from docs/apache-airflow/img/branch_without_trigger.png rename to airflow-core/docs/img/branch_without_trigger.png diff --git a/docs/apache-airflow/img/calendar.png b/airflow-core/docs/img/calendar.png similarity index 100% rename from docs/apache-airflow/img/calendar.png rename to airflow-core/docs/img/calendar.png diff --git a/docs/apache-airflow/img/change-site-title/default_instance_name_configuration.png b/airflow-core/docs/img/change-site-title/default_instance_name_configuration.png similarity index 100% rename from docs/apache-airflow/img/change-site-title/default_instance_name_configuration.png rename to airflow-core/docs/img/change-site-title/default_instance_name_configuration.png diff --git a/docs/apache-airflow/img/change-site-title/example_instance_name_configuration.png b/airflow-core/docs/img/change-site-title/example_instance_name_configuration.png similarity index 100% rename from docs/apache-airflow/img/change-site-title/example_instance_name_configuration.png rename to airflow-core/docs/img/change-site-title/example_instance_name_configuration.png diff --git a/docs/apache-airflow/img/change-ui-colors/dags-page-new.png b/airflow-core/docs/img/change-ui-colors/dags-page-new.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/dags-page-new.png rename to airflow-core/docs/img/change-ui-colors/dags-page-new.png diff --git a/docs/apache-airflow/img/change-ui-colors/dags-page-old.png b/airflow-core/docs/img/change-ui-colors/dags-page-old.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/dags-page-old.png rename to airflow-core/docs/img/change-ui-colors/dags-page-old.png diff --git a/docs/apache-airflow/img/change-ui-colors/graph-view-new.png b/airflow-core/docs/img/change-ui-colors/graph-view-new.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/graph-view-new.png rename to airflow-core/docs/img/change-ui-colors/graph-view-new.png diff --git a/docs/apache-airflow/img/change-ui-colors/graph-view-old.png b/airflow-core/docs/img/change-ui-colors/graph-view-old.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/graph-view-old.png rename to airflow-core/docs/img/change-ui-colors/graph-view-old.png diff --git a/docs/apache-airflow/img/change-ui-colors/tree-view-new.png b/airflow-core/docs/img/change-ui-colors/tree-view-new.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/tree-view-new.png rename to airflow-core/docs/img/change-ui-colors/tree-view-new.png diff --git a/docs/apache-airflow/img/change-ui-colors/tree-view-old.png b/airflow-core/docs/img/change-ui-colors/tree-view-old.png similarity index 100% rename from docs/apache-airflow/img/change-ui-colors/tree-view-old.png rename to airflow-core/docs/img/change-ui-colors/tree-view-old.png diff --git a/docs/apache-airflow/img/cli_completion.gif b/airflow-core/docs/img/cli_completion.gif similarity index 100% rename from docs/apache-airflow/img/cli_completion.gif rename to airflow-core/docs/img/cli_completion.gif diff --git a/docs/apache-airflow/img/cluster_activity.png b/airflow-core/docs/img/cluster_activity.png similarity index 100% rename from docs/apache-airflow/img/cluster_activity.png rename to airflow-core/docs/img/cluster_activity.png diff --git a/docs/apache-airflow/img/code.png b/airflow-core/docs/img/code.png similarity index 100% rename from docs/apache-airflow/img/code.png rename to airflow-core/docs/img/code.png diff --git a/docs/apache-airflow/img/connection_create.png b/airflow-core/docs/img/connection_create.png similarity index 100% rename from docs/apache-airflow/img/connection_create.png rename to airflow-core/docs/img/connection_create.png diff --git a/docs/apache-airflow/img/connection_edit.png b/airflow-core/docs/img/connection_edit.png similarity index 100% rename from docs/apache-airflow/img/connection_edit.png rename to airflow-core/docs/img/connection_edit.png diff --git a/docs/apache-airflow/img/dag_doc.png b/airflow-core/docs/img/dag_doc.png similarity index 100% rename from docs/apache-airflow/img/dag_doc.png rename to airflow-core/docs/img/dag_doc.png diff --git a/docs/apache-airflow/img/dag_file_processing_diagram.png b/airflow-core/docs/img/dag_file_processing_diagram.png similarity index 100% rename from docs/apache-airflow/img/dag_file_processing_diagram.png rename to airflow-core/docs/img/dag_file_processing_diagram.png diff --git a/docs/apache-airflow/img/dag_serialization.png b/airflow-core/docs/img/dag_serialization.png similarity index 100% rename from docs/apache-airflow/img/dag_serialization.png rename to airflow-core/docs/img/dag_serialization.png diff --git a/docs/apache-airflow/img/dags.png b/airflow-core/docs/img/dags.png similarity index 100% rename from docs/apache-airflow/img/dags.png rename to airflow-core/docs/img/dags.png diff --git a/docs/apache-airflow/img/demo_graph_view.png b/airflow-core/docs/img/demo_graph_view.png similarity index 100% rename from docs/apache-airflow/img/demo_graph_view.png rename to airflow-core/docs/img/demo_graph_view.png diff --git a/docs/apache-airflow/img/demo_grid_view.png b/airflow-core/docs/img/demo_grid_view.png similarity index 100% rename from docs/apache-airflow/img/demo_grid_view.png rename to airflow-core/docs/img/demo_grid_view.png diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum rename to airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png rename to airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py similarity index 100% rename from docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py rename to airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py diff --git a/docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum b/airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum rename to airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_basic_airflow_architecture.png b/airflow-core/docs/img/diagram_basic_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_basic_airflow_architecture.png rename to airflow-core/docs/img/diagram_basic_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_basic_airflow_architecture.py b/airflow-core/docs/img/diagram_basic_airflow_architecture.py similarity index 100% rename from docs/apache-airflow/img/diagram_basic_airflow_architecture.py rename to airflow-core/docs/img/diagram_basic_airflow_architecture.py diff --git a/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum rename to airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.png b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.png rename to airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py similarity index 100% rename from docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py rename to airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py diff --git a/docs/apache-airflow/img/diagram_distributed_airflow_architecture.md5sum b/airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_distributed_airflow_architecture.md5sum rename to airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_distributed_airflow_architecture.png b/airflow-core/docs/img/diagram_distributed_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_distributed_airflow_architecture.png rename to airflow-core/docs/img/diagram_distributed_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_distributed_airflow_architecture.py b/airflow-core/docs/img/diagram_distributed_airflow_architecture.py similarity index 100% rename from docs/apache-airflow/img/diagram_distributed_airflow_architecture.py rename to airflow-core/docs/img/diagram_distributed_airflow_architecture.py diff --git a/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png b/airflow-core/docs/img/diagram_fab_auth_manager_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png rename to airflow-core/docs/img/diagram_fab_auth_manager_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_multi_team_airflow_architecture.md5sum b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_multi_team_airflow_architecture.md5sum rename to airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_multi_team_airflow_architecture.png b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.png similarity index 100% rename from docs/apache-airflow/img/diagram_multi_team_airflow_architecture.png rename to airflow-core/docs/img/diagram_multi_team_airflow_architecture.png diff --git a/docs/apache-airflow/img/diagram_multi_team_airflow_architecture.py b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.py similarity index 100% rename from docs/apache-airflow/img/diagram_multi_team_airflow_architecture.py rename to airflow-core/docs/img/diagram_multi_team_airflow_architecture.py diff --git a/docs/apache-airflow/img/diagram_multitenant_architecture.md5sum b/airflow-core/docs/img/diagram_multitenant_architecture.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_multitenant_architecture.md5sum rename to airflow-core/docs/img/diagram_multitenant_architecture.md5sum diff --git a/docs/apache-airflow/img/diagram_task_lifecycle.md5sum b/airflow-core/docs/img/diagram_task_lifecycle.md5sum similarity index 100% rename from docs/apache-airflow/img/diagram_task_lifecycle.md5sum rename to airflow-core/docs/img/diagram_task_lifecycle.md5sum diff --git a/docs/apache-airflow/img/diagram_task_lifecycle.png b/airflow-core/docs/img/diagram_task_lifecycle.png similarity index 100% rename from docs/apache-airflow/img/diagram_task_lifecycle.png rename to airflow-core/docs/img/diagram_task_lifecycle.png diff --git a/docs/apache-airflow/img/diagram_task_lifecycle.py b/airflow-core/docs/img/diagram_task_lifecycle.py similarity index 100% rename from docs/apache-airflow/img/diagram_task_lifecycle.py rename to airflow-core/docs/img/diagram_task_lifecycle.py diff --git a/docs/apache-airflow/img/docker-compose-pycharm.png b/airflow-core/docs/img/docker-compose-pycharm.png similarity index 100% rename from docs/apache-airflow/img/docker-compose-pycharm.png rename to airflow-core/docs/img/docker-compose-pycharm.png diff --git a/docs/apache-airflow/img/duration.png b/airflow-core/docs/img/duration.png similarity index 100% rename from docs/apache-airflow/img/duration.png rename to airflow-core/docs/img/duration.png diff --git a/docs/apache-airflow/img/edge_label_example.png b/airflow-core/docs/img/edge_label_example.png similarity index 100% rename from docs/apache-airflow/img/edge_label_example.png rename to airflow-core/docs/img/edge_label_example.png diff --git a/docs/apache-airflow/img/email_connection.png b/airflow-core/docs/img/email_connection.png similarity index 100% rename from docs/apache-airflow/img/email_connection.png rename to airflow-core/docs/img/email_connection.png diff --git a/docs/apache-airflow/img/example_passing_conf.png b/airflow-core/docs/img/example_passing_conf.png similarity index 100% rename from docs/apache-airflow/img/example_passing_conf.png rename to airflow-core/docs/img/example_passing_conf.png diff --git a/docs/apache-airflow/img/gantt.png b/airflow-core/docs/img/gantt.png similarity index 100% rename from docs/apache-airflow/img/gantt.png rename to airflow-core/docs/img/gantt.png diff --git a/docs/apache-airflow/img/graph.png b/airflow-core/docs/img/graph.png similarity index 100% rename from docs/apache-airflow/img/graph.png rename to airflow-core/docs/img/graph.png diff --git a/docs/apache-airflow/img/grid.png b/airflow-core/docs/img/grid.png similarity index 100% rename from docs/apache-airflow/img/grid.png rename to airflow-core/docs/img/grid.png diff --git a/docs/apache-airflow/img/grid_instance_details.png b/airflow-core/docs/img/grid_instance_details.png similarity index 100% rename from docs/apache-airflow/img/grid_instance_details.png rename to airflow-core/docs/img/grid_instance_details.png diff --git a/docs/apache-airflow/img/grid_mapped_task.png b/airflow-core/docs/img/grid_mapped_task.png similarity index 100% rename from docs/apache-airflow/img/grid_mapped_task.png rename to airflow-core/docs/img/grid_mapped_task.png diff --git a/docs/apache-airflow/img/grid_run_details.png b/airflow-core/docs/img/grid_run_details.png similarity index 100% rename from docs/apache-airflow/img/grid_run_details.png rename to airflow-core/docs/img/grid_run_details.png diff --git a/docs/apache-airflow/img/grid_task_details.png b/airflow-core/docs/img/grid_task_details.png similarity index 100% rename from docs/apache-airflow/img/grid_task_details.png rename to airflow-core/docs/img/grid_task_details.png diff --git a/docs/apache-airflow/img/grid_task_group.png b/airflow-core/docs/img/grid_task_group.png similarity index 100% rename from docs/apache-airflow/img/grid_task_group.png rename to airflow-core/docs/img/grid_task_group.png diff --git a/docs/apache-airflow/img/howto-owner-links.gif b/airflow-core/docs/img/howto-owner-links.gif similarity index 100% rename from docs/apache-airflow/img/howto-owner-links.gif rename to airflow-core/docs/img/howto-owner-links.gif diff --git a/docs/apache-airflow/img/landing_times.png b/airflow-core/docs/img/landing_times.png similarity index 100% rename from docs/apache-airflow/img/landing_times.png rename to airflow-core/docs/img/landing_times.png diff --git a/docs/apache-airflow/img/latest_only_with_trigger.png b/airflow-core/docs/img/latest_only_with_trigger.png similarity index 100% rename from docs/apache-airflow/img/latest_only_with_trigger.png rename to airflow-core/docs/img/latest_only_with_trigger.png diff --git a/docs/apache-airflow/img/logos/airflow_64x64_emoji_transparent.png b/airflow-core/docs/img/logos/airflow_64x64_emoji_transparent.png similarity index 100% rename from docs/apache-airflow/img/logos/airflow_64x64_emoji_transparent.png rename to airflow-core/docs/img/logos/airflow_64x64_emoji_transparent.png diff --git a/docs/apache-airflow/img/logos/airflow_dark_bg.png b/airflow-core/docs/img/logos/airflow_dark_bg.png similarity index 100% rename from docs/apache-airflow/img/logos/airflow_dark_bg.png rename to airflow-core/docs/img/logos/airflow_dark_bg.png diff --git a/docs/apache-airflow/img/logos/airflow_transparent.png b/airflow-core/docs/img/logos/airflow_transparent.png similarity index 100% rename from docs/apache-airflow/img/logos/airflow_transparent.png rename to airflow-core/docs/img/logos/airflow_transparent.png diff --git a/docs/apache-airflow/img/logos/airflow_white_bg.png b/airflow-core/docs/img/logos/airflow_white_bg.png similarity index 100% rename from docs/apache-airflow/img/logos/airflow_white_bg.png rename to airflow-core/docs/img/logos/airflow_white_bg.png diff --git a/docs/apache-airflow/img/logos/github_repository_social_image.png b/airflow-core/docs/img/logos/github_repository_social_image.png similarity index 100% rename from docs/apache-airflow/img/logos/github_repository_social_image.png rename to airflow-core/docs/img/logos/github_repository_social_image.png diff --git a/docs/apache-airflow/img/logos/wordmark_1.png b/airflow-core/docs/img/logos/wordmark_1.png similarity index 100% rename from docs/apache-airflow/img/logos/wordmark_1.png rename to airflow-core/docs/img/logos/wordmark_1.png diff --git a/docs/apache-airflow/img/logos/wordmark_1.svg b/airflow-core/docs/img/logos/wordmark_1.svg similarity index 100% rename from docs/apache-airflow/img/logos/wordmark_1.svg rename to airflow-core/docs/img/logos/wordmark_1.svg diff --git a/docs/apache-airflow/img/logos/wordmark_2.png b/airflow-core/docs/img/logos/wordmark_2.png similarity index 100% rename from docs/apache-airflow/img/logos/wordmark_2.png rename to airflow-core/docs/img/logos/wordmark_2.png diff --git a/docs/apache-airflow/img/logos/wordmark_2.svg b/airflow-core/docs/img/logos/wordmark_2.svg similarity index 100% rename from docs/apache-airflow/img/logos/wordmark_2.svg rename to airflow-core/docs/img/logos/wordmark_2.svg diff --git a/docs/apache-airflow/img/mapping-simple-graph.png b/airflow-core/docs/img/mapping-simple-graph.png similarity index 100% rename from docs/apache-airflow/img/mapping-simple-graph.png rename to airflow-core/docs/img/mapping-simple-graph.png diff --git a/docs/apache-airflow/img/mapping-simple-grid.png b/airflow-core/docs/img/mapping-simple-grid.png similarity index 100% rename from docs/apache-airflow/img/mapping-simple-grid.png rename to airflow-core/docs/img/mapping-simple-grid.png diff --git a/docs/apache-airflow/img/operator_extra_link.png b/airflow-core/docs/img/operator_extra_link.png similarity index 100% rename from docs/apache-airflow/img/operator_extra_link.png rename to airflow-core/docs/img/operator_extra_link.png diff --git a/docs/apache-airflow/img/run_task_on_celery_executor.puml b/airflow-core/docs/img/run_task_on_celery_executor.puml similarity index 100% rename from docs/apache-airflow/img/run_task_on_celery_executor.puml rename to airflow-core/docs/img/run_task_on_celery_executor.puml diff --git a/docs/apache-airflow/img/run_types.png b/airflow-core/docs/img/run_types.png similarity index 100% rename from docs/apache-airflow/img/run_types.png rename to airflow-core/docs/img/run_types.png diff --git a/docs/apache-airflow/img/setup-teardown-complex.png b/airflow-core/docs/img/setup-teardown-complex.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-complex.png rename to airflow-core/docs/img/setup-teardown-complex.png diff --git a/docs/apache-airflow/img/setup-teardown-group.png b/airflow-core/docs/img/setup-teardown-group.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-group.png rename to airflow-core/docs/img/setup-teardown-group.png diff --git a/docs/apache-airflow/img/setup-teardown-nesting.png b/airflow-core/docs/img/setup-teardown-nesting.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-nesting.png rename to airflow-core/docs/img/setup-teardown-nesting.png diff --git a/docs/apache-airflow/img/setup-teardown-parallel.png b/airflow-core/docs/img/setup-teardown-parallel.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-parallel.png rename to airflow-core/docs/img/setup-teardown-parallel.png diff --git a/docs/apache-airflow/img/setup-teardown-scope.png b/airflow-core/docs/img/setup-teardown-scope.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-scope.png rename to airflow-core/docs/img/setup-teardown-scope.png diff --git a/docs/apache-airflow/img/setup-teardown-setup-group.png b/airflow-core/docs/img/setup-teardown-setup-group.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-setup-group.png rename to airflow-core/docs/img/setup-teardown-setup-group.png diff --git a/docs/apache-airflow/img/setup-teardown-simple.png b/airflow-core/docs/img/setup-teardown-simple.png similarity index 100% rename from docs/apache-airflow/img/setup-teardown-simple.png rename to airflow-core/docs/img/setup-teardown-simple.png diff --git a/docs/apache-airflow/img/task_doc.png b/airflow-core/docs/img/task_doc.png similarity index 100% rename from docs/apache-airflow/img/task_doc.png rename to airflow-core/docs/img/task_doc.png diff --git a/docs/apache-airflow/img/task_group.gif b/airflow-core/docs/img/task_group.gif similarity index 100% rename from docs/apache-airflow/img/task_group.gif rename to airflow-core/docs/img/task_group.gif diff --git a/docs/apache-airflow/img/task_instance_history.png b/airflow-core/docs/img/task_instance_history.png similarity index 100% rename from docs/apache-airflow/img/task_instance_history.png rename to airflow-core/docs/img/task_instance_history.png diff --git a/docs/apache-airflow/img/task_instance_history_log.png b/airflow-core/docs/img/task_instance_history_log.png similarity index 100% rename from docs/apache-airflow/img/task_instance_history_log.png rename to airflow-core/docs/img/task_instance_history_log.png diff --git a/airflow-core/docs/img/task_lifecycle_diagram.png b/airflow-core/docs/img/task_lifecycle_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2114d7f5d7234b13cb8aa3694fc9a48175819982 GIT binary patch literal 32164 zcmdSB2UJsA*ESmED8~j02nYf;z(_NK^iY(d6cJE5L_vBJ=`H9%L5iT#J5oiO^iC`U zlwJf3Rl(2$LLec8BzJAkdEf7R{rm16_aEbT48=`$lC{^KYtCmr&$D*K%^R9W4)Pp? z!C*(OUsE%H!G607gY6yseLwh3Fn{+D__4>+K=TT$toP(1IQY$8RaX@TtB5_cdv_l= zK5+kuRdE{HzF*2hva8ZjkxL!*=b|x!>6K?m73u^61T@ zYNit=k3WeY+-r4QU!wC3`VTJs-&EC9e=D~-_bKO{ZJfG_Z5*L9Ci2q_&Qo`AS0zwSyTJ_a-q5qZU zjVz_$V$&)+F_fqcVtE?F*u*EH=&RS`gfcSi%FD$Gs^OM3+Tf%Z7uSrY+xZ3+d{R#n z6B8G;#fIls8$9PTGilbbnbR!Q%twk=3GZJSM=uTerkt&2ekSP7y0b|epOEuJTNRS- z+;U=#>F1Y9bYR_onEPkl=Qv@8VviGRKoRzBNH)?z#oL|Lh53jh0{m0t7InA2+jG4wja!?O0WJz)L}fd* z%*Lp%gN18uW1;Pm<;ditg!k#iW+AQA5Ds7OrZ4;!$z!3D;EIIDLYK=iO75&Liwy$% zZN?wbLfdc8)0haVp>OO1?P22oq6coM5rC7EftsZ-xAGHCA3mkhuknU z62IKfNWK!={o)wv^O{jGnf0IblrIyWjTVqU#Uzrl{WtFi-oNX_>NCVI)!K|qCYi-@ zSX*l<)G#+WvhtYc8+;xQRamXh)%2-PlHV9RlxT{kAj3+kNbjtV9eEQ@W)GZi)+WAB~V&T7V_OS?_f(+2O6y%AB` z&l62|W^T(&ef8--XXUs3-O+Q}&lBUe8c>3CxP%^#cPFVEy8>CvCz4r3KIkT(E`foX{qtxaaD^yzLaA~*%6!l^!Kl;gK6mQWP}I@ zQR*$fGq}~d`OI~pVRg4W#@||Zhc9Rubr1e#9gGbSv1?L~-otJg9c7xTQc`Z>j&-R6 zcPWeCku`DA^D!yA;RoTp!C2^2Nq#;Ev9QA@273taFO7u?#nmwfQ~C9~eWG%Z_rFb^ z3wVQk%O{nTImVKz`jP9d^~L=9#MrrG%OWG@h;cFN=PmW^Y5zQ|X6`A}91CsmtY+3N z7~{Xy*o55924B{;lZvp>kf~!Pv8L)y@poqsUs>0hJFuqe=~Xk=hRzMKkE=>LY@gAI zwsXChKgYIQ+@yKB{MLmo-h1WX&5>J1-9Cp1s>DS)DSObsahP8!tr>Z3xip!;A_k_6 zec73`f}3oDmVi9+ZAkyi+TuOMWsOb%Y~xZ9ZS<4UW$Om(vS2R4+XwX4#EVDj_(Y=x z=s&}8#+aR9Yqx>jWfY?`(JEjOoaAw5cyRC~lD<8QeYww*gtNELqIBCwHiV7zkE>Si z>kFn^u6@#NDl=2enRjj7xP&7sU93+wx4!Hh*#EncnPdKn0ApJdFvSogOTHeEK&)Tf0FuplBU!`ZsuqOTZA~VF&pS^GO z_|Q;JxsE&wYEbHnPyfP&1T92Oo8va&+oPoEPo$k8ZTGGu29JA#l2YwXB`(Q{WhwFI z7}J#@7iP)1Tb1xC^D43MEs?}~IG^IJK6lOGbQAx+Z~0Xohe+YLhm)B<9J;orPRnhZ3p6 zr9WF0muT*mGU+{PN!bWoYmuR@*ej=HAwx!+rV?b{_)Z7=qEWJI&BRJwnMo=0KtfH` zS_p%x9Z)xuYiMQ|qZJWSA7{X6KD(27ycl_GHCa|6O|kegm6|70$>bIw*EFAx!yW9p zr7YdyrX;HzcbWdq*H&h=(MkHP3BSU1B)&*4U$nNuOp zcKtnsTvBE#b2FxDTu7f{XNR+VBRM zt;N@e*OZp#!5gd0n7vBGjQ_^tq~NzTY+Ut`Raudt<6b?WfvXv{N|T7~n_)%&4E68o zlV2_g^7s4xglnVE8^@xPsYv1L@}2PLSa}uB-}pbfHcivYOj2zzyLgEz zcD-oYvp3rch3OBp5adJ$?b>m-rrjE42Boi$n&v?nSnm+XD#g%uDAUdJnSmR4-RxJj zp(LHm%Q8(eHOw_9(pcW0>#^UO3%dhEZjC>mcE>!RT=X>tU1Hp|ZgOMsDD_AdeX}sCA%@JFBRnarv>vf5 zDbR%icQ?pC&iM`D6p0I@fUKZK_nqjnilFJ03ghW?a!T~nrO?57Dycf;nEcMlRP*>7 z98Taw>Kd<_d#agm@O|vc0L`dxO2#W?cdKmDHldmJG&n}U%{16$m#~0jcU5Vo*M2O< zW($o-jjIO5%n}2ZiVEklhI*Cy`1q8&Q!k553v(j_yr#<9>}lzqy`Qs)n?ri`%9PJ~ z8;iX$%KZL6UNj@0&TFP|An#@clW@DOLL(gG@1dmO-+`_`NxP0!yR=82pvY%jynBV7 zyf{=iPsHy;u03~XvO)6ue7#GN?#FG!kZAH_z61xksPHp7G7+p_4hW||FKt?Fq_B)K zu_`{NEg54v?fNn^)=b2}s=;lIqOu6pLpN}}3Tx>tn}gaE=8ZvZi5@zgjIqbi2=2s= zT?~WF*cfg49>!ZKfnJZoC4n$$euN}Xcvi*Ti1e|G@Yd*DhF6e}6+X{tx?8QKzgR|H zoT8%8X9KHhUIr`k-J}Wf9i?H&<Ipx4rAqiRw6aXHTMzjSzmAG4I1@}OUCgX zyN3(X*;DOHu0bc#s2T#W%}D4zo5Y zaN=ctxZS*xG;-VlyToF`Jr+{rg0+34;CXt^SgYuGh=k9(L~R9YVWg~Jpxs#d3Z{jUPkkgauC8_DG}P}nJQ{SU$FReL}Z_rs4|$EjXpf0<76CP zz``qBGQwtK-okg%8wVCvTpbgu^6vd97PZ&}KewPg(3JJD4oZ)^RJnA2Q-QX%Jz-ezICfWLIRfsnoi8J z51}oih*bHVlfEP3Isk^cJ{dDH>h-M+c}rbwnop8!53C1Cn`o>3umH#M!F$%K?@-=y z$y={lZ6~I|j*HZhX{*o5)B%l^=SpkeHwx{&c5s%LgMHU7S>smlDV|lzF=;8v!a=@O z$1D5FF+o1<%7yrSS=xiM(@leexCPBZdt)WZvume)`vdpSl^+WsRxKa?M0U*7B51@p zrxH%Fl$F=dL^eCHQJFJ>GZo~~Pvg#$Cw);?E^@TZAtKXGC@Vus zBqg#te6OuAXNJ%zxGcu*eDn6;z(y}vfaAWd?td=8F`sc)qLbIHI#&6G?4YZdtr2q~ zUm1fo&FEpR%z1UVMnRLy;=XDvjWllG!5`>i_58rV!**x2Sw1orxAOJ6^Cgdoii`fs zXO`+@%Dj~yq$BHI61)geII+H-?h*bkG72uUsyGJWvLbb;(CBlYLkO)Uv~qOHrKk15 zc-~5Pc%f~fqSTga=;G>q!Xca^BRMsLwl+Gq^_+5L3=zpx?$=w+?=RMLh9K&Sa7o!+ zxwZ0^fc_YTJ3!X^Oh=8Gnsa+dBYmn{{g(4qMi;%w+e1;5_c$(TzvZ@fbeWcPz7(II zoN=|w{%FT!!l{EI9$`5s3>xQ)p-!%V0{w}3>X}5Pd+@S3?zMhyB@>J6DMoXmeNydI z!19Ww@{ax#%L;};_t&du76`h?$a#h^ogtoN*7+EAq-*?Kn?1L}$IR z0B;{>(oOm8)HIfvavoy9loHnVr~+;M$;zPD9bdJb5($i#cCDj_29n-O6%STYm>W`&^tp}oMf+(DxX)9d;|eS%8xjlWS?Rj zxgaWo1pZUyr}1&ImyrGaLKpr(tp3@=p1=>SQl4&Bq7k&ng~{64ro@W zJr&JIX!5B}$6h^Fz^iWje(<13$@89cIZ5R%J_S1_=2mZ&lgt+D?+;getl8Zd{^06m zD$>NF$;87PfY`P>$1@zkE<8uR{KCP6OK2GFb=y5p&7WisM@8@3;&>7#+fRu#7qWF` z&>L3RN1LBdruh6Z)iijC^3KmAY>Beye%YczaWzPMDqZZCL zr~O0y+Hpk-;?4GB*Q59<&-XuG?!b7r7nkOb%Uv9=|7uG8C>)M2=S`AqJMmWb+TnHA z=y+rm%I6Zn4C}T%;nh{nXh+3 zgZ$GY8kXJ^SF#2#T%`nU{|r~Q&=KP#lrHxUzV~@Mle8fih0}$We9J;Z9lpI<)MC4B zGsxm;>mo1db&lo2iszVVph0m4Z zR?oe@@JqG%+>Cs5NtwPL%jIc`HflVJpRWg@S-SBcw|{{Co=`WPSz0$0fa`yCmDqu8 z)d*bzvAH^Zh{&#Nt(KRngADyloc|M=@#`J}+>+f;uR zC=jjd|G3GoSv~6cs%5_8`ZtI0MAL$uN%oc%o-b_VmZL4PIY$Ma#F@AcoD~`)*E-dO zZYw?29@Wyn!x&6z{qp@+{{0sKv@|qd>NcA%doxP%hiyKhQGh|rVsw}9Icz)o)o3?I zHN7FmE%e29wt8seZwiWnW`9&7p1owejkhsaLhq2a#rE5?t`J8|4#(>GOOBJ?fQdc<*ee6qrp z7a^}S`VtrDrdC6|IZcZ+@^qFSnLzD*lx9R>peg5iU9!0(R_2$Ey5?y#rO>pH7&1ETC1r2xL};c$$Rt9 zsE}_e|1xDWvwbF@Bf(WK5IZR}44Q%H9=4>g_Iw+U9I>#hryjp)Gc$x#S1r}^2Y zQ|$?h4*xnIg(uj*>T=%0*eq1W6K#(boYh~9W;IQpjO1%72bkv2mzIVInyg@qRad*z z{wXt;+mDyqd%9WCy_ALip#G-Uv1)bSWvlo?iB=n5HeD7fgEt;sn&nv&aIdkhH8}j+ zKtu>;LjyfY3J6W=4J*hf;}#_+_w2XlLhAEL%yhdNb#~mRyytX3@{ZgVFGD0BQ+7RJ z|87Rq%p7l8w&vD)WonY5Jc3f9Vx_MR_D(58?fKPN)vI0H-+xjm$PewP|5RdlVT?EF zm`2?1q#XBX*tg_HIR#zssFV#oHoBWQ6|1xyFL_nok}+=cbIC`_8YlQC)ISh7PX@*~sD}uVY4Uriq1Z zb&W?EDpy-8(Lclj#K^kAM^FP%5;GRptHkge8ZgbOZk?^n*Un6Ram2h#4=t_OhCe9L zmzsu}`SODYt#BUe8yvmom_prvMw{So`7ufz88wHB%Uc7`ynRtVuSi?+W6DppGiOVj z6{Q837m^D499OQk+3!?J@o|!>s3uPAGcR*f zJTFk_*ExK1=X>l&_@6Uc$mJ6f1oM*gV4sXIo-_GPQj)H5*p`XS#{G}B3TU&e;u8|ZJ15(&dCs+X)~h!(bjzS zljGFe@q(W!-~-`}r+J3bveHseS$y_s{EP`6Ts_lt0xHaF{IMy{olZ0J*-9QIW+f@g z@rh10%>Q)RNgr7WUwl|BIbCn_fD|xh+89)L7bn(Ko_fS2plHRpPPfxH+l^aBl0oSV zLHle4Swx)gtS(?oz4V!ysSM-ZB-SFs>ILOern)_6TM3ND`xLTv@N z=O5Gc`+ejlSUqP16vVHF9saBlb27!33aF21<+U!6Ud4|0#z7U{UKCYO$o$_4CRw}; zrjAedmSbsO3Y8LK8At79XQJfG$T8X{jI8|eb>2swbzpH-H6vys%EfG`#+sQZnasd1 z`kJ-^luw!)^X*9i79uBIy8#uP7V^G5FmNq!I!)jkmg>0oNDW`Lu()nCO1!A29CT(G z87$E=m9Hcw4EU&mV-W&wagFlXQ593uc&zI4{(loJMYpK$%3K zbmSHv6;Wum3Iln+!tU!$1nFuu`@m!qsl-z=YqodnNqw|`IG@ia<;1u_3UBV|HEG0CR}+eLTD89?u)UrZ`4N@@J1J+MBKYe@9A-b{_r8;j<_l}>VJut zXZ)nY{ZDTf^Rjfu)O$XVcEKs(kb%Y_2i6mCo>glTv=Mx??k>f>*s(UWHmd=&|AfVr zzyMXHzV%%P0c+GL(t(^&HA`~J4V-)UC!4b=7VeX`T*qaMflry>I`$zgsQ=kAurRQa+eOF)gWBhQ~eMYBI?TgEHNLj~X zP}iPHP8FBdniaaLoZQ5k7*@<4FE@-{?_+)Kx^2_#}^~3u;x1C0EY8kixh=yEI!CRZs?p#5NPua-W^o8 zc)-DQDRHg5s?WooaK+*chw%NeT0{nTIfW!^$V27Ls5udJwRue`cqcDSi+nqjYlyDu zyR>94Gxi5->6k>It&y|RH+RW}Ia+9#3+vd@0&#+U#&|S`84IA_3ltqRm;)jbV}+EA z-^-Ht9asS&_f%T`pqOiv+kjFyDd47Ng{Zhh)Cbejm_*;|wb6lAXM1XOls2RSysBu; z80QknPtG&-T2nQy{B7mlmWK9~V_{{6k56xgozYp$3|#d$KNj|8n|u@eru~c#5_=$d z;WpPtfwpq#c0F9j!x9gFgWP|xJD3Ck|TN~EUyj5%UYssyXMCviW%9C;D3 z?X-JEZ`a~-KQ{+Z8XNU3e7t_V(B$-lZE?+_+qm@+4$EAvKc9p(96oUK@g6|2zdoeS z4Sqb7hYqvF52qf8uV#KcRnK?+1K{6pE|#ILylTL)JbX!d*uPxM^tY3jvehx3m5H3= zdnWsQhSM7ZTW~C?hVB;bM^KL!A*l^ud`?fPP!m+eR3y&rg;M&^d@IEcp(*)v>o}wk zZ~}o~h(=J=&bNgVRI7mWQw>gBy*U8n5EB$_XKQ&15}$?^fe@uNR%Qpv-yy7MPd4)y z)3_@8QpDO5yZ)c*0J#7~4>Vz~l5K^1OZ(MJ$4Ha7d@R3z7joO|@wZ(kRrPltsh!>=9{l%JFi=*T-Kri_; z9xCU)l12;aTb)qgPZ$f00$+L>O*=Cdx<1>nmS)%Ft{}S^`GtRTlwaxv|Clm<z~z zUz?f8R=ahA41aAE( z%&O#*dSs$k(c0+GECR%xYq2%V_N!>ivDPv$+2KHl8w$8B!*%C_wj*?3VFCd|PcyRg9(MWm?h&>{)XhU|+BV5DkvmxqmqSVo41=6X|uy_Xl8wm$g) zRmo+`m6bH+(B2iN;l#?*r!W?pwMG)aT28(xKynu$9TW%nEdmzvae&ymUCWHDnf4_ za_W}=H+eoXX~@7zFXiQiU8go&(r~WeOO;G?CU~(W3jDiy0i~Ogu|bGef|uuuW<9vp z867`su%r&uylh|n$9u9zBWARVL_dhKK!RRN)S1Il2%8V@aw587zyR(%f`$%*eR*^S zvKXlR$~pg=!yc!kS69QQzG6Zcqk~@RJZCGEtXuLHErHPjmTj(n?2d|eex&K!uextu5e!(Fs_8uvwHjY$1W;?$UXd6Bt{jGWDX4QhSc_rB-Y(?)Uggvo9aPo|dcicMj{hnvz*M-@kF~#L>(2}Fd$r6V zxqJ^YB=7@W=HNx$b0fwjb=I6PSioiG*naOJL!;{h>;>W2?D9TEV)q7Q1xV~)5W10` zTnYf!kbO_;<+mok!MvVjUhHqg!b^ru1 zUa}hs<)^3Ta0AI!R3AF`ftQwZr#@VwFg{_`10 zu8oTYxH0GQj9`F9`y?1Cmz|Aj@rmYk_URrP=xM;M$I=MF?jmW6Cpp#)=+viPhaI1AL=Scvc+j_~SJvxXI#_ML% z0Mr!`0osBlkplSV`Uk_ejqyWC77wo5j+B^EJbkA8=R3gw^yNrjZA6%uSxTC>XQC3$ z#>nPWeq>SL2x)kU(P$+$S~>x^w^QeRt@FLg~h= z07Eup0>Foq={i{~_1Yd-qh|Wsy$`LNJ-F@$T%Eespjg0Fc>cp-Ug?rczN-^KXfR== zC&8_tctIkSZOhh3n(^ZXpbl@~A%0p(8K_S|N}0YN4hY|JtN$KWC&sF;*07KhbpePW z#^`C0^5#qBKR3SG#NNK4OxtX}KQuO$s;rcV4Q3aqcDjkGavx$N2%Sy0mGc((0v(*Bh z)xCBIEY?r%RPtJuD;Nmw-J@ZVVr%s3L<1zaOw}s7RDKr1MM<Tu-{DjK2pm_yc^a;rgHIE-7=I&yvJ(U1Rau^Z< z`vRxpkkpkbe^nv1!WSVxGNF9EsDDrH=R2k<=kgZmrkO|)Af;89g+feCEtb=~o0?`= zp!0dPnb_+BCco>DY@aeCh+hA*ja`r9Uj`CuxKjWI!u{G83?kAB5wiVJU}H*Rs8Fx3 zmA+MOuS{Fiiwc}CU#WS}D>wgxX@|b37t%SO`#U?Z6=bdCM2UBn0WHv_yoJ=6R(qssO=C7B`y(_aCmD2+#r3}ma@Au&h^^gh3jZbHB!^Wr#WoED<5;^wI5tOEN zPTb0HG4_7`0{a7^@bM3sSkBK~NB|mr&Bl6cNb^ZzUM0AuTkX$yW!!a=?KAy_LM#sV z@`i3ELc<7pK6!t{)E*!Etm4j$bbCV4ahvWom3KAP6GN2@>7PXkS_`yma5>U`$*mr3)QAd8NZdrR zakLn68d(@{Bwd2iB$sXXOui|Mb||f*5{e zLW=w!nh~0SxZVXiMg$bLz(m=CL==V$b#D{HN*W*$GJ@g_);kE1`5p1q^craMOuc+0l;4IpTJ#qXhD^e;D_)IDx@iYXrzN;6! zWQYS8;>9%MU)&{T63sua(0SIkA#}rFT(Cq_@c!#UQ?qMma+5U_=AugFg}=gF%cJRB zM5p?0h`L>2w^l?ZqN}6w3BtBBe%Ct_#8wa;l!Bi5EFgGyV!2T1dICW|-zPw>%*y4m zCL^EeVDhd9P$Hac3p0G)On|bIz^FYW@+b&C~28B7594T)+6D)4PI zF>U&m74Rqp(f>WF*`kA~n(J!<+SmrwdZ$yQyaaeD&xZ8=D?l~hQt0QRgL?2;kmBt1 z15~(Fa=l-RpE8QlX?y_^{_$zkyLR-k($dldUiW4MqvdSN) z1M%3!Cl#mElYx&IPktt#tdtddrTujHNdp{!8W$jUh}G+-XLLm|bE(c3z+yC_Z&&_K z{1K-&M=Z=j2iQKlJn~6E0Fn`R>3|b4qSMww=CLoq^7(;%c0OqL8?$oqUpQ>u0@P&6 zZnfjk2Ic(WjQbxBP`or}XdRxJ=$*wNB{~MA_*6{$6E3UdX&KKs-~|PUBa+$?eIiaG zmdqd9u)EPE0zi+OZJe(3=cI6;I!lJEIp-_R25cgBav00M^AZ zn2~pnn26M?7OOB%`pFOA58}81hp3jG;<_4I z!R71QUsfHc8`vFvZhbPD+Z_+}5^HOpzP%46Uco~6uFZJ@^d`7~<c;pEQVPamaN&EC!erpC6l=-#q02_7An=5P! z=JiOAi(*;;u|~9#2V$_Z)wRf}i@6%lIs-qpRW9^+(kb)vv0x{{L#(4m%z>&rkm0kJ z?lnc~Yj92ghaf8Ex&Z`uiQ^A+k{>ZK_wwGCZue|}d_nUQpkty`)+;~gS7pX`&HArz zbAuU*h@d+0d4JI-(v1|$f?6QIA<;^tJ)Y7o)A~Yr4xpD__b!C9_5CUCYjxFqO4J`~ z7|AO8zDzO?P;U6&Oq!1=9BkTl=zr-5@TcAzJ0t4x`YHU z|AA8*+|{yfTG$Kv8L6|T*~ny_)QOl3bQ3?d!MsXK>wl8jy3hb9*@eu zz3zULApqH;EAD;AQlry?_QMw5oc~atvnMq^!+JqpJ$c78?~G1h=b3JBVdkQa7V{at zR_KVE=K2%cq&kdc_hoSaNf(SF0X?w7adi~_;fr3~@w+*`*E#M0x>tfjdjbAWcng8v zs59MK@Tv{D00VFuR4e~_bC4gz3@xervSVknKqT^ib@;Gg;D3v8YdGrO<)o!lT6dNN z#bio3wLLw?1=g9*O@v-3uiS$l)gH6$!Q#4B#+G|wUi!|Faf=Xx^2qMNucau2K_3t)I5U|9_I!+}UssfYpq>=+0w@G%XfC4Ie(?YkOr>Sv0F$oHzT;p7|NTV$*VFhvd$mzBzaCnOK7X-hs=t6{ z3Ov-%Zr)RccIyI4i!mu|+ZCSxHcNa@hz~Rr?=dq&r%CL|ZmKSjO<~amDYFqk)TL4b zf7H$zBTsGpNxP3;=V)bOBF5N$&%zm~VF%ak9eMGl-tgY;9(X{jRP1MX)+aMFx_-vK z>_dOGNBu52%-zjcR1Hyw<&vh^E}|I?zH}Qq5W^~Nj4M6LcLaiK(a3LfDoLX zaZie5Ve(#BwlL62R1`E~`7=tJH#%{@5ZCqDo$st6$-!I2D6u)t9#AjJT|gldpBv*+ zPX*Do0qF34@xF*ELCR#wtGv<8j?q~?jn3PZ+ly7pS$e@VB(2^6I6lW+@n9cz( zd*VHCnpDdPNxOT%HfJjh`ja3upsFdmpw^~O1`&IH`F2-+eq`-4GPO-uu@Rtt4GMe! z0Z<%@u`{{?(RgKGl)DC55NZpAZ1R})U#Jw=w@~~c^K}@SYwdsrudSXE<=*Zkk(6v=DAm zd(THnNEDt-U>jBC%K*K3e~~Gi_9jjxHd35h-AOm)l3=6Vt^YB0<@2A35WWD}_V55> zxY2o_hQb!e6A6GaD1HE_!`mY!HqSai$71deS_9%}3^hiXzP%gl^#f3neF9DY9?|xo zJiolwPXO+8>5vuB4Vd8^3o|Z|r$a*UfZXX8kZ~R<>4fYjyY4i=o|ISsC`{Sd4pCaI zpWRsW!z5Yyn9}JtWWPVw0t~EelvwTSmA4;RARt@u0K%-XQ6X8tR6I8X1a1@jF0rp1 z@Oq+ItkaZU-wVuqUN@Eatm)6MvZRn1)P>wwpB=h$O+mN0`%pnm!MxhK;8+iCefLb9 z0nFs$K;mAN^5e|x!g+06IZrq5nVDU{v7+BzQ%^o`{TQfE^F&Fz?oaayZ2O)Z60bj% z6>~*{!%|CME#iu%Y5X?9J;Z!ssN(Mkm(HVq{y;2}WP)b2MX(e9=m1`5BmeF1;Y4b# zAIF-^lqN@@7T6L~zOnZj$6d%3YVBC#umL%+C1%>3V?a}d;x9jrO$0&Q{9v_V-UtGs zLH@GDZb@QC*gp6NFB09krSx~e=T-1eKkcabtT0;h^r=_8gUll#{DX4~`~&XFN_uAo z;~aIVnbQn(>WalUiUK}Fw-QZz!#84t3f|f!0RU)^ZaVeL(8naOt%69hh1M#>5|)A8 z7|?DC?5+9zEGLsoA@T?`SIQZfb^~p(1XiD>_xpK&bP4OG#`Af0BXE^n;%TnU>+O_T zsLa~~ZrFmZG)2rL|A;+=qK=JjbUnI4X}k->FAClOaQZq*0&6mKjos2Ds{lAgXBpbF zLY{aF2s94Ewas>3eHs6z-l>rAUIhtypqbX@A4S0f#s*`k`7>t*rJ+hRbM-Jx`|*Z- z>aT4BwVRzH9?_^R5L-X$ARDbams)h1fw@=2=vNSUkqx2}S42zRhceGUiRJDS0&-pa z3h@4S0|v7tXa_XZp3v5~m8WN8KCyrfb_GJiQ{+~14=-7$&F?Z4w@Q-iE#SnYzHbKuS37c+~(ZXOk!o$IMR)LxkU~I-$a!a1V zzvX~E6ifx$j;=%iT1_I3+d=x^Uc_6M((~C9_dg!Nf!&6gG;#>T*Xp6EXU}E8X}W_b z`qZn;*lp%M)^bI>b$ezdE^GIm$65{!!nuE3e+t6{vO!sVLVm!18~tj%pdsv z35~NLDFNJ1JBZMh27JrP3r+sdQE=N=`N%ZaT2pi&*d{Zlo(ksSvP8O?dorNb@hx|) zO*gF~7#M@y@d-4Q0PO(y)onL{?msGUY7j?7!G;W+q7cCbQ*s*;fHLOYKldb{=maXS zlv_lQ|JXk+Mq90u|>n|PzC2pr7jCA}_ayN9N4;U(hb;Y7Lb2}l@Ru5`` ziFA!0d2u&7llnj%3ejm$+%FO{ei7W!-D&vTtTbKBspB!65uy;lsF{)$(n-~gb=C8F z5rMkC_YPg&N&At|+n=<;N3}V>vojxEJ1Mni!OG(lDp^L~1_;R%SJ$=Y+Tso86u`EK zN(c`7v%cgO5Dai`!%Onf@-`u|oqVO}c+$LD-*ekUQz1st5=mTjhm2ulklP$Z_{|jx zbV|9i@PIt%mSA0)#)MQzbrtBQC1R$*#w7*bi>Jy){Ixe%BBm7AtvJ=13;os*{JoJP zWhSDfk(gs4zCbe(OT1N6TWbet0l2lny&hO9r zQw__unlpUtsAu}P0hFdF!P|)aTG2&=ncQ!EfCJ^i94FMZnU2d)klJN!3a(J5KE|!4{qY4B{X}K3<2zV#S`7_5`HX(Sam*7NGIe&-qwa zADvFV;p;qK2=M9Bf8wHJ`yb8?3_ft%S!)?i5gixDcfiGUokSs=8+0x!ZGNhnjyBf; zP*v-fVrf@+SjYct7E^#x{sw(>I?ceSbKY@(oMCMrfOJ+6r28j>tm5hD=zpH(OO5wO zT01yYWOCer!Po$fTi$&92%B#}G1ytNH>kZfAX(tiR(?u-9bY-ab_v!P3kkta`j1Tu zK+~n86 zzSPj@^Srzdx-+&ou7T1bt`chq`Fc2qF@_^rxN}*>V+#1yr5}nNd5SML{5l=s!I2Yb z8`$`IcS5|u$--SxJQ-etj4{@x-1ffIlv6*6#FOH=48?U!k%B>rf>YY&<^}Pwm{Ydb zw4P#4v;@o`>4NxBI7}tfLyisB&l@Z#7kK!{neTcUe||zOHm*{3<4OF@m;>xc%N%Zlamj*_4uhPZY(`qRV)>NP z^aplY(Om3fA|Fn^V8do?4CZkQ3$2=87Ubt`ao5s+2;2*e30*HhK$g`bY+K^V1#Ng` zj|2Lq4-X6(T0b9`gR>T@A@W9$SXVed@9byMPvrtV*Zf1YI9#o?BL28(pYyg#LyP0m z3{okPEv%r;labhWn}+f@)b9$l9uLc&Uip*{&(fvnbPmI7Vzf+UZ0~hu$1CT5c_a4q zaec``PCVm!#FS(PP7wb!eu0l2X?5eqVt0Hz)nGrziS$a{PIfp$2i_5PK;LBVug)Ji zwyFr6AVNuCT=$$hLo2d1IPR?Kok*%Q?G!eY7b%Or9szdVRIE#W&G7ftI?S>g8xI() z?D$?QYD~PCK~6tA)g95Q0}ORY8|&=p?fgP-18J=YgbVE9es-G=Z7E!!F*|qg9HLeG zDZjY>7g@oqV!DpE#TgDCoruM2U^ZuK+iY?_vDG2OwaD-#-R&Vk^$xMR2%(n(^`4lt8FSGOm}z8pw#c#`H{9{ zsb`?q1)V5ZtPcb9L6)}zAM_t2m-Ec+dpRwm4^&xnrU$Xy8EEs}D1{4ro`+@I#LNP! z;BfaLukf$0VzSisJ?!O9=7I=R@Hzi;hU7mvxv}ieUY_OOJ7837UUSp|y8hMQI#izU zDd3;cz6d7bKe&j$oP7V{_IR}Vol6&-xe)*V(pUrD`*-?c2pih;(Asor&ItV>Q+P^q_X#c}rzz_V=eJ4)`e6)Cx^SAds!rFfU8*toL zfML?vvC-#_xoLF77UJHg=a^qUrUff-y_-&v7vFLp=2zVQ0AxfRKFGWQl=I^}nkBKG zy>f+>KzO*JyS%t-ov^1L`PUG$dvjn_U{ANMSPaGSCM1ej`cB?Hy+1n;!Zglsw@2z+ z>dCeSL8q?-NAn=8+th(1@(gjy;eLXa;4dQXPa~rHYjFS)th0s=s5lrXHN&J5PG1c> z=>fKv!{13o0476p#MsPTlQRk+7qP#o{#xryx&U8h>$$2F&*wmAk4bbrhoOg3>dOCIr8{~|3g#pu4kTgCG z?p)BezXjcC14qnwaoEG;bN*tlvOR?h)n4T3aNPN@8NWbb!)}KgTA!M#Ez^-x#?QqY z8?b1lq*nT9ak$Og0SHY0;eo5b(RSxR9)L=39iZ|eC@vYP9YK#DG~zIexnT+yJa~~> zu#$C25Z@ZVM}2>xOWcOqLD<{J1_17QnhL0_aqLT`8d?V>^%y9n4Eo%eLK^fI->@^z zYlF4W3|Ft=&fuBg1MG7@;}ctxWOhm0_;#I+!Yi=>%!4X@@U7!WjHmzEngShkIoZ83ylqM?LyhW1IY5C{d2+4 zV-JoSM|+qDY5-Owvo)B?sm)^;$J(u+OfxXjK9R=8JJ$)qkQCKo76Y&Z=@%z4qZh%E|t;GrP0s*QbFIai|J!>U|^Kt2Nz{C8Dj+@m= z*yjtRqrV=^Q6PO0|7q#oP)f!nq5P7=?GggRoOiA$&JDzq&|ByE8RZ=N0GGTEthVel z6Nz}N}R#MFhd)BrZaJS)OSEZiS0{4=LZAv_MGAWt^ z6s#NA8pi&Hu$`xUW`}={^+Qr#=i9ph3wZvzbv(pXo3 zEx9Yv%&92o?bH$JucuH-j)Qr-4FWs;;Tx2nfYGf_cH%+lL}b~@wa!xG zMD64SodcqQ>U#bm*yeNSF-i*SZR}ML&A>RGXA>h=P+u4f9{SW<3#4f12@n1SIw>zF z|Dia#0y`VAJ?;P`SR#g{3i8{&N_;f9p$CsbFd4AuI+pu}eUX5vu!2JKkY5Ve7=G!e z(vx08K@TSfay9Ke=W9VA)j`gKzq`GlE!E?|jJA=9K=iNeY#xLpx1-i&MHsOOA`wKQpZ%9|u;QR#^o9b?L{r+A%>OEd;r}r|E&*d1Rv@b65he4ex@Q zM0`9duQ~pb65bpR+uRF%Ndnl;7$ zn<|~F!=EW;$(d)g3xfo0m*YdQ|4(~o8VL3N_kGLJMk*wgCCW0^CS>1=Ft#!s`_^bI zA=x$7QrhKZFmYy@S08k*nM=e57DwHRZ_`cnrEbNBJCycOy^T06^?QY*Fv>l7_LD;> z;fE$^9o5(OsbH^Ok$`lp$gsf#(XG-kU-<82>d9AQ!Z^ix|qF9eQYR>qfvbfXo z7+LB?%yO|q4iM#0)GG)4JkM$_#iJOlgJ!nMlTlc@FH>ARM}%HGG1u-zb-j=q;!jh+ zVloS2cQcn5jcbzuN29VMtXN%$P}m7N9{TMaCotVAv1wcOaik%$+yy)5 zKE*2?{Nt`?Os9-&W7OouNgVhkv+cD8X%pCdBc6O!2ArARLOr>v#4=3HlJ6XDb=i{J zh&WkUR=2GhgBD8t=AAmX7LrVi(+m>TvnA8AM@4x${;Hg zzmjHN)I7csRgh}JXOX|cGp7L=f0XQaWm+P$ZGOBY+(|ZmRUlV_TBT8X$CtPL-bz%W z3E4&Ouc+}6Zg*_j)E>pZ$aT^mkq7iP<37nb)&iE7N*fyDJGRtnsa#0rxK@nKPc=@L zGLKmz9rY@tR^csAES@J0dQ@!V<;dt4MS(6(ta}gY%xP4cuWMFXg90J<6$x#JyX+wG z{TZ%N_DW3XTPfjWD1^zqv|0^myV-+(^AUyCIhGq%`iVA%lA%x|N+~rFP7VjabcKW# zC3I4m_79SZsR4A~M^`NW42J(}P^->;zL1q?+V$y8(LS$39gTU6WRA3BvwLy;AN>of zwgtFg_%2{-4U+3%uM|s?$u+tkUQb*&$_@SYxKHPqdvZ_0mBn|6)aFZK_yRAC``S;g zC77h2;L>zhQ|StqqqK;bt~T#x*7fmv%#!E*YUu&}V|mox{YWo!%SVp9bVn7K!-d?Q zXY6%vED(@J*uOiH7KvR-^kcgZ*z;}Qs8(0ASR9xtG3aimo5Aj~69$SxLMj7sZV9&Yf(KxAWVGrx$->#Le+V4;6f0n=no_^)WzG<$*Pc7qAhU^0qQ@Yd`QTx}Bnzz9RnNU@C`5JqM(mU?X$VB+@JDk(x+&5+hPfZsV^#@9f zl9lcA4c#*}AlPyXxTS_c|`im_mRIj zL+X-ii90<}x3IOCI;4t@>j49GvEC`*xjQkMJVU#BwF$7brO9h+9Qa!dvv431TOBdqE?I)*Lgvb!6YTi~v>9C-9v zx3PL0(Xxw6w_q)@vQ1!28}+vQb0B?-Mxt(_JC4@o3j~}E;+fj=_fho5HP-H~j^hx> zTl?3&N;#3h#-+sf&vwr{N>imC>HbkUw_Ug5WBl&uQ}sr%0vrM!M*nPwi~s)a0v7h2 zU9FNVEg1?YSTfq#_Tup_1C`nb2qt~O5kcLD4&drQ7eZWs%!P%U%v`1 zN@rCZHSQh=K*~*_Od!&8rDON>1emAYD+8k@>`Q`rn+;y6t_nH28-E{NNww6Y8E~w_ z#=AxyKr~Bu;DLXQ^W>I8!4!KSH^RaL$B5+&Gz;G&|7-RyUtC@R(k*{LBX}kcm$StR zFyUK=4b2bgM6S1bE?xU#dEoR6?+Y_V#1>=^n<}ad8XR?^DkMmJE*bhJCMNvTG7stx z#~Xl*Ed^9qL46S;?%Tf{*%A@)G2J~y1UitFF{e}j$nXYWEYb&JXOjC36JX$l5nWxt zyKS3ICf?lIfd*7z0CbRt+>ax7`3a165&^B{!sHWl=m~62FTMPB)(gai_2)*H& zkaHm^I7_31yv+R;zRyXhGv_Z$OnxD2SYn*bRxi;?QAvd$IT-=T!oF|SjlIf|`3Js~ zqN4JDAe6I}13I#@A;gX?DxaW7Wln!1Z%6s447H-B3r#I9%kwL-=$zU4{11z>CpW7I z!aV=3B19r0lx#rFkVdwXtfvP%HnGfH9!)>=d6m2*eJ#LJ*u;~}2GT~QSk-_bhvE-+ zA5P{zbn^qk#9;08Wk}oO#lI_Fp8v4!3oY-3_S@~nwY9bV@EKFs3hlMO=0E<-=2Y7t z9*;}fr7Vkf$Su~gi&2BLOjm28$8e`C7LVmuCBTwB<9DcFoZi6!LBtIBxyJL zKNY`7CD`-f@sO$eh9U8}=gT56jq0MeERr+COh@P@8`_o6$zuyigrQqS1PnCQ6C1#5K! z7)|pp*Hy?qSqGT&`KP%y=0-STC%hWoToIZLRLr_h>fzc5C%&ZoL%i*2yIWj0DXEuQ zcZ;?K7+@R--q>1V;I`oa8V6NQ$*;76=m&ks5Tm~FHoXuCUr?uL=hyI|V!MD=kNEs2EqW5TBG zzhoxCoS=pDPcL+5A8hNl|CL`210prMNPC!&HRhTF?nVZ~k*d7tND^`G#&2rV#-WBV z_uO~iDL#iMnvz{;C~yiuq~yg`r%1>e$erxiqu0X7tS-+(uCa>QbR$a4f7pyvoH z%S}#^&!LKo$?a*ZsOxYHvVBO^?suq~yVZ|Jh8>4`%FN@fBHiV!Kfcg&?!#!%$b`p! zX>FXTt?(47skCb?Ak^CVD1g)E>1GX}iL8P=Qh9o?!dbgb3UPy6UwXo+(EVd+HuEiv zyElNT-&($g3VTiMIbZLN2ts_@zCZBA=dO)@n*XeR!9L;h9e)hs4BvYwU&b&f@0RfH ziE5;}wYnnUcd#w)tcFB4a8xPd9ih^QNh_l)5!vwSbd110JZLbom)8ZFCXtHY+*)5! zTG|v@CXhjCh^m^U@5hLrjeWFKdu?oh-(HIU}QRV!#W64{{OS&1HbD! zbeTmd^S?+0ZPumxH&ue0M&+f1ExkbxQ07G^@65mF$a~|U67=Pj7oy?u1RDaQn&~R#?+EQix6(o zo#sawzicXG>1{z4=DheVMGj7*Y`TVj{>$9_azO(}bRrZtKq0R`mud^W6^qd?JK2$M zfc7%z2#d{nYi7S?cDJvqFmkOfLOeagfj#9b0PPS28-|^`Fw`ZG|Li}w*^xYGppYhz z5aI@!G1VqDwaM>fn{pK{79RxEW{H27i8>PvIR~MQtTA9%NS!a3S7QkU00?l7Gd}PH zsMDLEIE;qF{hxPsVH5w;2I+r43=g+WA*Sn}Ld;|d3ondGCf+RFMg)wVR!uU-#5v$6 z9&X4>1ug+kk2OpZc1(xhgJ+A%7KEzEVYM8SY8Q0X*oUd%{CumgJ{34rv-1PDxyg#iCiz_Qvv`hg- z43F!n2f2`vA!+tmn29T21E}cG-N*H(`0+RKo?dcOJeN7~N!I|%*>u$jW2_LqS&_|4 zuK~+tuhsW|T;I1jVqn-hwWe{TXfo4}DNn}HgUxA7ieTC?MaqMJb^a(wckr_2WDQx{ z;Hw!i-+Z+G;tpLb8ll-^mO!dz9ju7%Gf3!MD83v~{<#2>;{ zCf|{NVuMYH!boz7UF>ERyOG{ZZlHPuLQVjExzn_LmK&0k0U;E+wQH+oehE*ixMMoFALO$H zL}47R)gb5y?libcxS-=6@0U?Z1$`w3(jh??R+Dn6`&5Mk2InZKS6q42yOdtO>O}O@Er;d#-Pk3AXWX z=^ncN-G$s`Sk=ygcSYOe%jfxbe!E<-;_naafTAla%L3j7uEiHz<=%6`Ad5thOh;H* zA}tZtcpeWSv;`i*`v-{Wg8#eUwpvL5F|3eu;@P?DLMaO4K)o)A(Lj}VXP+g=`le$L z(a+ezF4cF@G;o4W{qI5e8n`5k-DQYL|Wzvm4q+T`mZk*aM>up};l=y}2?b+1{D=0pGXz1AOI_JvIz9A7zwpMFsP z0`W@VNQS8U<3eqZmwgP1Q|En}YvR4|uK~HGn&9b>45`t_*qq&3!Soho-8~;kYxEz$y{h0{^>OVh87g0o$P&e=kceh78yz?jgM)r zRbY5@d?a+@#zH5A9#K62e?MH`=#OS)uevTwkUFU3ar!uj6ld<2mP>!VHw*;w!eCA= zL{Cj=w5q*UHlmqo0dB!?;BFAIU##ms2FCd+NXS{o8jgl}Y>EStg8mO=so#llPuCYJ z;Q(PaeIzFEm+!=Rgy&cMPX-*iddTexhFk82BqWUP`+s*X7p^>m&iMS3=lN6MJAwY5 zBGtO-XFU2aU||&m8)|JnKtv~+?@#e3U~Chho?x>BTKEWW#s3%zGnvpojCixDN{msP zNKmY5SsIp^Yw?Gcts4@}9tZndZ|2YC9uXZ-My$6YT5N+Dk-n#;hzh`N%o5#hoyDfJmS< zzLXSHC53-Dyh=H>`ND(0dXv7vpi2NM9w3(UVB^)z4VK+Aa8sgken&JfU~TT}l!iEe z%$uapzkdZ&txd@c(`uGtRNIr88|u{T)SMb>(dQ~j(mV%>o)^9cjo<=g%sW>i>$V5i zneC`+VLn{wl8aoAG(e+^Gky&XO&KH$mWFGokaD&K;P7N5p?ryU@!?uL*!6^r!b(@P zZ4k8I!l{0gj3j;r6N`%ObVW&#ES1O%^^Lc%Wcn(zFF-hW!B^+OR+bxbt@ZRzarXmi zWaRBhPKt;es1A(B-4XS#w$UYroElYVKf(@Qxh_89_!FYbAc}RfK^4q97;02*7FyrW zMykDJ-70v~S-Msg8EI#cRoIm8Tn2(>=_Y53!WsP+AUCh`VGR5QZga`5iC$KgmKQPS%PfjUe8Uxgd~wR-;7_iAcj_k0MO(3Ao6ac4CFbp z1L+`%&9toe!+oVv7C@f~5dfHZ9H@4C{^Jk0?+ty3^5zyKCtvD8V-Eh*+_GQse(`7* zdGH)SXojpMkZU_B!w_LgePx3a%6L`sFK4OsABjr3xCkVyQScOK*SemDzRi^T_fVOz_qUDY7*w+7UT0mIA_qKRUIc z`1``Sg~1MN846NWPe=3!8w;OTJBy7+^a|qGOjF*bRQYI+YhCQJv(vT%jJ|g#WF;!9 zi?pk2i_^<5lfm&@uS>Qqyz2N4lJ!a+a8(%-OHR%e8_k^g^;~t&g=8D0tv~mP7(s7b> zs<6@LB?=#PlzS8tx`Bw4paa$}#^3gnG&0kMoU;PypS$d3`T)$fBB1&DVE*ZzN zTb?TBdhtoUE-z^!yKFj9Zid;@fwC_yyWP`gY7Q(OhL2}okpQp3orCezkPjKqHh6ek zoaC?7;>bLNul{mAiEs$N3}8m9idQQ8BE*}zA;a?c5%N{b93scF36!%LbcBQX*9rwQ z=fQlLLqiV#hP;7VE)vX{Pa+TPe~X@^lS3UwJ0`ACMsxi2G0nk+ngIgACYO)k?P$NE zyb5DNcR`1+`Xz%fSX`FHV`WAh)2P&Zfoatd_fF^ON-`lXAJn+vca8ZLrDI_$Gda&U z#>2eEONvodMSTh}CkE|HB7Q$D+}z39xgS-jIqgDVr4Ut};BybtYm88fTp^IjO2vL|t!5cxr;h3_d zmGbFlvp-_UL;MqKDulwCdPkugN7L10Kukvlh6B^oIAnBau~{@ zC|pZCQvQn$mfq@RNq={VNmji{s$TK4LUXHY-ssW7IC%veD(k;$!Y8`IE$`3Xf^JZm8aHrPPJ?Dm$T{Yt%NT7AneuxD-qw>lDT$ z4z~+*P1DFL?F%iI$IXaW$6st{<*Rg#p%@K{SVFv%H1z*RBG%XR-^-EEl`ZXU#)ch5 z)Mq4{LB@eTnIj}_#!Kdzr!#QdLQstQD7ak)BeT*3w{~LU%Ed(Ciwrx)Py0xV&bpxU z7`_R*GCd-s=4bnO;t9u*x##|u)5at9!lHJu-2`#OC?b&AXH-M*~>qAvzI^y~z^uTP2vM#^WFh`40@hgT`{{Qy>;kTMTCR<$cYJ3Zb{py#K zHTWwICV9;ru`^_9`yCbX@m|-tCKcE|k>9CrIE!0<5ZbL`Ni)IIFK7P@)A!T-YA;FI zV{l7s%(;c9y-wA*H(lzc!DBH3cXCg>)1k`9u*RM7ZTm+|J(?Wbw(p|wce=7{v%t80-C%Zej&!Jw7UK_yyZn7;1LKpT{#a3w+ck7D z>)8#(={~P__sCPWyWLYx&eU}NklH0ZOsf9=sdzMtM{7rZv4M}mRZH)%%IDPaB=(-A zZeM$s$Fj!L>fE|sBX_^`ko{*;R%>_l6(|sd^cAjn7`BrRzRdP`ZtYJr_pu4f%{t zJQUL3mB;Zjyv{vxjbrwwR&)_iAA!Y&@gqrm^%T`@@$z4>mUP+B*%!a^`Q)2~d0zC> z(3yN}KEu-aX3-jpb4R}zN}(xMF{Lk#gw6U(qF?OjOjEu!wc+68E~4=&(9xlBw^lkm z!7WQ%uBrF>R7xurBlr%w9q?$o<4y*?PEx$@7cJ~5Q%4cFBg%amSFH1b-*9l%&Tsbt zt)ujW06~|O7M|gZ@w!J>Y;O+))p*WfP@IqY#;9Qlip%HphObZU+@rN8UufM6qjt^Q z@Z(@&P+>t-u1820`XS=2|2$kwyk=0oBMn`toqu|_*1`On!UhSeKf@MJp%ZNvhd{nx zT&(~8FyYz&f9WtO2y4$0CMqu99wASWEh2w;d#xRBFkPgtr!)|;{^Z<)rMh&E)$riL zrX^06j4NVXz1jI;3wV@{8S%G6u3NPmOLCKWQU$2Cb*h|#g9)AHZVo3!-VTj?eJ2+O z)H(MzoTS2zV^21>qcI?58Z1=O$;>Juol6cY4`Plq{>hD^BMu~Xn zSCoWaynITf%( zwfp2dR8<$MrDkoW;0YY=P~FYc#jI!Q_Z=e0k(t7?L^0d-gY5#MXl}zJTX?@FMkR@x zIbilN`SA?#9eeuh@safLW5OcShg&&a58hyXPyj;dcmj;@wE~y^9H~e8J>;p_z3gnA zgz{P9a86=fn;pYxWNmDw{3ly<5%k*w>rY~FqgMsC9h29HW4}3GM16Eebjx%?In{5= zQEq9Rq>moA>4}+ec&7v*@O#qLTGf*Hw$;zEFb*sw|)pC} z+g~vAy*ZoT-mWPxxIq-&iQaZ${jJnZs(_3i%SgIMDUF#M>V5grf%c>&>O_~5a(1n2 zZN-QcOreZ9k%@%S6rR+`c9v$pnkGTccVAB~+0@N&N3zNIYZwLR`% z^GyOBMjR7YPm>fc_|<8`x@9*P`{pjGI);%oWht`t0z-!H%*?&L?0l!@(uVG4jz6|U zHTrahk+Me{YCQF*Za>)$c6xf;)9uQNAFKJtp+$(6c1!;}azjqi}`eEx5Yv z1$CciPF)!~ap6Vp*?v-ax}%H9aAV?<#Bk1vL3-Wnn=5f+Jbmy^tX%t}@%@QGOLM#v zSExgBX9VKeS2^}*;pmTA1+SLAdL6ZEj7O^#m)*W>q_$!4AZN6^K+@FV$*ZwR?Mk`! z;{v(wJ@|2J#J0C@D0C6A=se1m4b5Wr-|aYxbl(=Y z$VL3nWOgjhTc2%`K=P|JN5Oo~1r%y>WxH%1^u2VV0F2-daOADvt+4K{Qmw7g|CGFb z>{{B&ucm=|nV;%IF8{(QPnd4+*`CT?#KzK+1zTlHRtrds!gr^6I?7S03ll-~?<51I zTkyVSL3nqlC9AC%#*Tyb<5b-P|j#T& Database ERD Schema - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: System tests - - System Tests <_api/tests/system/core/index> diff --git a/docs/apache-airflow/installation/dependencies.rst b/airflow-core/docs/installation/dependencies.rst similarity index 86% rename from docs/apache-airflow/installation/dependencies.rst rename to airflow-core/docs/installation/dependencies.rst index b5ca62e669612..515b2a9d3c8db 100644 --- a/docs/apache-airflow/installation/dependencies.rst +++ b/airflow-core/docs/installation/dependencies.rst @@ -29,37 +29,37 @@ yum package, or whatever equivalent applies on the distribution you are using. Most of the extra dependencies are linked to a corresponding provider package. For example "amazon" extra has a corresponding ``apache-airflow-providers-amazon`` provider package to be installed. When you install -Airflow with such extras, the necessary provider packages are installed automatically (latest versions from -PyPI for those packages). However, you can freely upgrade and install provider packages independently from +Airflow with such extras, the necessary providers are installed automatically (latest versions from +PyPI for those packages). However, you can freely upgrade and install providers independently from the main Airflow installation. For the list of the extras and what they enable, see: :doc:`/extra-packages-ref`. -Provider packages -''''''''''''''''' +Provider distributions +'''''''''''''''''''''' Unlike Apache Airflow 1.10, the Airflow 2.0 is delivered in multiple, separate, but connected packages. The core of Airflow scheduling system is delivered as ``apache-airflow`` package and there are around -60 provider packages which can be installed separately as so called ``Airflow Provider packages``. +60 providers which can be installed separately as so called ``Airflow providers``. The default Airflow installation doesn't have many integrations and you have to install them yourself. You can even develop and install your own providers for Airflow. For more information, see: :doc:`apache-airflow-providers:index` -For the list of the provider packages and what they enable, see: :doc:`apache-airflow-providers:packages-ref`. +For the list of the providers and what they enable, see: :doc:`apache-airflow-providers:packages-ref`. Differences between extras and providers '''''''''''''''''''''''''''''''''''''''' -Just to prevent confusion of extras versus provider packages: Extras and providers are different things, +Just to prevent confusion of extras versus providers: Extras and providers are different things, though many extras are leading to installing providers. Extras are standard Python setuptools feature that allows to add additional set of dependencies as optional features to "core" Apache Airflow. One of the type of such optional features are providers packages, but not all optional features of Apache Airflow have corresponding providers. -We are using the ``extras`` setuptools features to also install provider packages. -Most of the extras are also linked (same name) with provider packages - for example adding ``[google]`` +We are using the ``extras`` setuptools features to also install providers. +Most of the extras are also linked (same name) with providers - for example adding ``[google]`` extra also adds ``apache-airflow-providers-google`` as dependency. However, there are some extras that do not install providers (examples ``github_enterprise``, ``kerberos``, ``async`` - they add some extra dependencies which are needed for those ``extra`` features of Airflow mentioned. The three examples diff --git a/docs/apache-airflow/installation/index.rst b/airflow-core/docs/installation/index.rst similarity index 100% rename from docs/apache-airflow/installation/index.rst rename to airflow-core/docs/installation/index.rst diff --git a/docs/apache-airflow/installation/installing-from-pypi.rst b/airflow-core/docs/installation/installing-from-pypi.rst similarity index 99% rename from docs/apache-airflow/installation/installing-from-pypi.rst rename to airflow-core/docs/installation/installing-from-pypi.rst index c9a434f9812bf..542c7463fded4 100644 --- a/docs/apache-airflow/installation/installing-from-pypi.rst +++ b/airflow-core/docs/installation/installing-from-pypi.rst @@ -255,7 +255,7 @@ a one-liner (the example below installs Postgres and Google providers, as well a Note, that it will install the versions of providers that were available at the moment this version of Airflow has been released. You need to run separate ``pip`` commands without constraints, if you want to upgrade -provider packages in case they were released afterwards. +providers in case they were released afterwards. Upgrading Airflow together with providers ========================================= diff --git a/docs/apache-airflow/installation/installing-from-sources.rst b/airflow-core/docs/installation/installing-from-sources.rst similarity index 81% rename from docs/apache-airflow/installation/installing-from-sources.rst rename to airflow-core/docs/installation/installing-from-sources.rst index 92053841a8d5a..949d949df2ac8 100644 --- a/docs/apache-airflow/installation/installing-from-sources.rst +++ b/airflow-core/docs/installation/installing-from-sources.rst @@ -45,9 +45,11 @@ The |version| downloads of Airflow® are available at: .. jinja:: official_download_page - * `Sources package <{{ closer_lua_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz>`__ (`asc <{{ base_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz.asc>`__, `sha512 <{{ base_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz.sha512>`__) - * `Sdist package <{{ closer_lua_url }}/apache-airflow-{{ airflow_version }}.tar.gz>`__ (`asc <{{ base_url }}/apache-airflow-{{ airflow_version }}.tar.gz.asc>`__, `sha512 <{{ base_url }}/apache-airflow-{{ airflow_version }}.tar.gz.sha512>`__) - * `Whl package <{{ closer_lua_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl>`__ (`asc <{{ base_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl.asc>`__, `sha512 <{{ base_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl.sha512>`__) + * `Sources package for airflow <{{ closer_lua_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz>`__ (`asc <{{ base_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz.asc>`__, `sha512 <{{ base_url }}/apache-airflow-{{ airflow_version }}-source.tar.gz.sha512>`__) + * `Sdist package for airflow meta package <{{ closer_lua_url }}/apache-airflow-{{ airflow_version }}.tar.gz>`__ (`asc <{{ base_url }}/apache-airflow-{{ airflow_version }}.tar.gz.asc>`__, `sha512 <{{ base_url }}/apache-airflow-{{ airflow_version }}.tar.gz.sha512>`__) + * `Whl package for airflow meta package <{{ closer_lua_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl>`__ (`asc <{{ base_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl.asc>`__, `sha512 <{{ base_url }}/apache_airflow-{{ airflow_version }}-py3-none-any.whl.sha512>`__) + * `Sdist package for airflow core package <{{ closer_lua_url }}/apache-airflow_core-{{ airflow_version }}.tar.gz>`__ (`asc <{{ base_url }}/apache-airflow_core-{{ airflow_version }}.tar.gz.asc>`__, `sha512 <{{ base_url }}/apache-airflow_core-{{ airflow_version }}.tar.gz.sha512>`__) + * `Whl package for airflow core package <{{ closer_lua_url }}/apache_airflow_core-{{ airflow_version }}-py3-none-any.whl>`__ (`asc <{{ base_url }}/apache_airflow_core-{{ airflow_version }}-py3-none-any.whl.asc>`__, `sha512 <{{ base_url }}/apache_airflow_core-{{ airflow_version }}-py3-none-any.whl.sha512>`__) If you want to install from the source code, you can download from the sources link above, it will contain a ``INSTALL`` file containing details on how you can build and install Airflow. diff --git a/docs/apache-airflow/installation/prerequisites.rst b/airflow-core/docs/installation/prerequisites.rst similarity index 100% rename from docs/apache-airflow/installation/prerequisites.rst rename to airflow-core/docs/installation/prerequisites.rst diff --git a/docs/apache-airflow/installation/setting-up-the-database.rst b/airflow-core/docs/installation/setting-up-the-database.rst similarity index 100% rename from docs/apache-airflow/installation/setting-up-the-database.rst rename to airflow-core/docs/installation/setting-up-the-database.rst diff --git a/docs/apache-airflow/installation/supported-versions.rst b/airflow-core/docs/installation/supported-versions.rst similarity index 100% rename from docs/apache-airflow/installation/supported-versions.rst rename to airflow-core/docs/installation/supported-versions.rst diff --git a/docs/apache-airflow/installation/upgrading.rst b/airflow-core/docs/installation/upgrading.rst similarity index 100% rename from docs/apache-airflow/installation/upgrading.rst rename to airflow-core/docs/installation/upgrading.rst diff --git a/docs/apache-airflow/integration.rst b/airflow-core/docs/integration.rst similarity index 100% rename from docs/apache-airflow/integration.rst rename to airflow-core/docs/integration.rst diff --git a/docs/apache-airflow/license.rst b/airflow-core/docs/license.rst similarity index 100% rename from docs/apache-airflow/license.rst rename to airflow-core/docs/license.rst diff --git a/docs/apache-airflow/migrations-ref.rst b/airflow-core/docs/migrations-ref.rst similarity index 100% rename from docs/apache-airflow/migrations-ref.rst rename to airflow-core/docs/migrations-ref.rst diff --git a/docs/apache-airflow/operators-and-hooks-ref.rst b/airflow-core/docs/operators-and-hooks-ref.rst similarity index 100% rename from docs/apache-airflow/operators-and-hooks-ref.rst rename to airflow-core/docs/operators-and-hooks-ref.rst diff --git a/docs/apache-airflow/privacy_notice.rst b/airflow-core/docs/privacy_notice.rst similarity index 100% rename from docs/apache-airflow/privacy_notice.rst rename to airflow-core/docs/privacy_notice.rst diff --git a/docs/apache-airflow/project.rst b/airflow-core/docs/project.rst similarity index 100% rename from docs/apache-airflow/project.rst rename to airflow-core/docs/project.rst diff --git a/docs/apache-airflow/public-airflow-interface.rst b/airflow-core/docs/public-airflow-interface.rst similarity index 98% rename from docs/apache-airflow/public-airflow-interface.rst rename to airflow-core/docs/public-airflow-interface.rst index ed249ad47fddd..4b87bd200b09b 100644 --- a/docs/apache-airflow/public-airflow-interface.rst +++ b/airflow-core/docs/public-airflow-interface.rst @@ -35,7 +35,7 @@ The following are some examples of the public interface of Airflow: DAG building blocks. Secrets, Timetables, Triggers, Listeners are all examples of such functionality. This is usually done by users who manage Airflow instances. * Bundling custom Operators, Hooks, Plugins and releasing them together via - :doc:`provider packages ` - this is usually done by those who intend to + :doc:`providers ` - this is usually done by those who intend to provide a reusable set of functionality for external services or applications Airflow integrates with. * Using the taskflow API to write tasks * Relying on the consistent behavior of Airflow objects @@ -281,8 +281,8 @@ Using Public Interface to integrate with external services and applications Tasks in Airflow can orchestrate external services via Hooks and Operators. The core functionality of Airflow (such as authentication) can also be extended to leverage external services. -You can read more about providers :doc:`provider packages ` and core -extensions they can provide in :doc:`provider packages `. +You can read more about providers :doc:`providers ` and core +extensions they can provide in :doc:`providers `. Executors --------- diff --git a/docs/apache-airflow/redirects.txt b/airflow-core/docs/redirects.txt similarity index 100% rename from docs/apache-airflow/redirects.txt rename to airflow-core/docs/redirects.txt diff --git a/docs/apache-airflow/release-process.rst b/airflow-core/docs/release-process.rst similarity index 96% rename from docs/apache-airflow/release-process.rst rename to airflow-core/docs/release-process.rst index cea64e4718e23..247f18016e760 100644 --- a/docs/apache-airflow/release-process.rst +++ b/airflow-core/docs/release-process.rst @@ -19,7 +19,7 @@ Airflow's release process and version policy ============================================ -Since Airflow 2.0.0 and provider packages 1.0.0 we aim to follow SemVer, meaning the release numbering works as follows: +Since Airflow 2.0.0 and providers 1.0.0 we aim to follow SemVer, meaning the release numbering works as follows: - Versions are numbered in the form X.Y.Z. - X is the major version number. @@ -35,7 +35,7 @@ In all cases, the release managers reserve the right to postpone a PR to a later Additionally, no new features will be added to a patch release and minor releases are currently targeted at a roughly 2-3 month cadence. Each Airflow release will also have a tag in git indicating its version number, signed with the release manager's key. -Tags for the main Airflow release have the form ``X.Y.Z`` (no leading ``v``) and provider packages are tagged with the form ``providers-/X.Y.Z``. +Tags for the main Airflow release have the form ``X.Y.Z`` (no leading ``v``) and providers are tagged with the form ``providers-/X.Y.Z``. Although Airflow follows SemVer this is not a promise of 100% compatibility between minor or patch releases, simply because this is not possible: what is a bug to one person might be a feature another person is depending on. diff --git a/docs/apache-airflow/release_notes.rst b/airflow-core/docs/release_notes.rst similarity index 100% rename from docs/apache-airflow/release_notes.rst rename to airflow-core/docs/release_notes.rst diff --git a/docs/apache-airflow/security/api.rst b/airflow-core/docs/security/api.rst similarity index 100% rename from docs/apache-airflow/security/api.rst rename to airflow-core/docs/security/api.rst diff --git a/docs/apache-airflow/security/audit_logs.rst b/airflow-core/docs/security/audit_logs.rst similarity index 100% rename from docs/apache-airflow/security/audit_logs.rst rename to airflow-core/docs/security/audit_logs.rst diff --git a/docs/apache-airflow/security/flower.rst b/airflow-core/docs/security/flower.rst similarity index 100% rename from docs/apache-airflow/security/flower.rst rename to airflow-core/docs/security/flower.rst diff --git a/docs/apache-airflow/security/index.rst b/airflow-core/docs/security/index.rst similarity index 100% rename from docs/apache-airflow/security/index.rst rename to airflow-core/docs/security/index.rst diff --git a/docs/apache-airflow/security/kerberos.rst b/airflow-core/docs/security/kerberos.rst similarity index 100% rename from docs/apache-airflow/security/kerberos.rst rename to airflow-core/docs/security/kerberos.rst diff --git a/docs/apache-airflow/security/releasing_security_patches.rst b/airflow-core/docs/security/releasing_security_patches.rst similarity index 100% rename from docs/apache-airflow/security/releasing_security_patches.rst rename to airflow-core/docs/security/releasing_security_patches.rst diff --git a/docs/apache-airflow/security/sbom.rst b/airflow-core/docs/security/sbom.rst similarity index 100% rename from docs/apache-airflow/security/sbom.rst rename to airflow-core/docs/security/sbom.rst diff --git a/docs/apache-airflow/security/secrets/fernet.rst b/airflow-core/docs/security/secrets/fernet.rst similarity index 100% rename from docs/apache-airflow/security/secrets/fernet.rst rename to airflow-core/docs/security/secrets/fernet.rst diff --git a/docs/apache-airflow/security/secrets/index.rst b/airflow-core/docs/security/secrets/index.rst similarity index 100% rename from docs/apache-airflow/security/secrets/index.rst rename to airflow-core/docs/security/secrets/index.rst diff --git a/docs/apache-airflow/security/secrets/mask-sensitive-values.rst b/airflow-core/docs/security/secrets/mask-sensitive-values.rst similarity index 100% rename from docs/apache-airflow/security/secrets/mask-sensitive-values.rst rename to airflow-core/docs/security/secrets/mask-sensitive-values.rst diff --git a/docs/apache-airflow/security/secrets/secrets-backend/index.rst b/airflow-core/docs/security/secrets/secrets-backend/index.rst similarity index 100% rename from docs/apache-airflow/security/secrets/secrets-backend/index.rst rename to airflow-core/docs/security/secrets/secrets-backend/index.rst diff --git a/docs/apache-airflow/security/secrets/secrets-backend/local-filesystem-secrets-backend.rst b/airflow-core/docs/security/secrets/secrets-backend/local-filesystem-secrets-backend.rst similarity index 100% rename from docs/apache-airflow/security/secrets/secrets-backend/local-filesystem-secrets-backend.rst rename to airflow-core/docs/security/secrets/secrets-backend/local-filesystem-secrets-backend.rst diff --git a/docs/apache-airflow/security/security_model.rst b/airflow-core/docs/security/security_model.rst similarity index 100% rename from docs/apache-airflow/security/security_model.rst rename to airflow-core/docs/security/security_model.rst diff --git a/docs/apache-airflow/security/webserver.rst b/airflow-core/docs/security/webserver.rst similarity index 100% rename from docs/apache-airflow/security/webserver.rst rename to airflow-core/docs/security/webserver.rst diff --git a/docs/apache-airflow/security/workload.rst b/airflow-core/docs/security/workload.rst similarity index 100% rename from docs/apache-airflow/security/workload.rst rename to airflow-core/docs/security/workload.rst diff --git a/docs/apache-airflow/stable-rest-api-ref.rst b/airflow-core/docs/stable-rest-api-ref.rst similarity index 100% rename from docs/apache-airflow/stable-rest-api-ref.rst rename to airflow-core/docs/stable-rest-api-ref.rst diff --git a/docs/apache-airflow/start.rst b/airflow-core/docs/start.rst similarity index 100% rename from docs/apache-airflow/start.rst rename to airflow-core/docs/start.rst diff --git a/docs/apache-airflow/static/exampleinclude.css b/airflow-core/docs/static/exampleinclude.css similarity index 100% rename from docs/apache-airflow/static/exampleinclude.css rename to airflow-core/docs/static/exampleinclude.css diff --git a/docs/apache-airflow/static/gh-jira-links.js b/airflow-core/docs/static/gh-jira-links.js similarity index 100% rename from docs/apache-airflow/static/gh-jira-links.js rename to airflow-core/docs/static/gh-jira-links.js diff --git a/docs/apache-airflow/static/redirects.js b/airflow-core/docs/static/redirects.js similarity index 100% rename from docs/apache-airflow/static/redirects.js rename to airflow-core/docs/static/redirects.js diff --git a/docs/apache-airflow/templates-ref.rst b/airflow-core/docs/templates-ref.rst similarity index 100% rename from docs/apache-airflow/templates-ref.rst rename to airflow-core/docs/templates-ref.rst diff --git a/docs/apache-airflow/templates/footer.html b/airflow-core/docs/templates/footer.html similarity index 100% rename from docs/apache-airflow/templates/footer.html rename to airflow-core/docs/templates/footer.html diff --git a/docs/apache-airflow/troubleshooting.rst b/airflow-core/docs/troubleshooting.rst similarity index 100% rename from docs/apache-airflow/troubleshooting.rst rename to airflow-core/docs/troubleshooting.rst diff --git a/docs/apache-airflow/tutorial/fundamentals.rst b/airflow-core/docs/tutorial/fundamentals.rst similarity index 95% rename from docs/apache-airflow/tutorial/fundamentals.rst rename to airflow-core/docs/tutorial/fundamentals.rst index 66001e3d95d8a..4603ca01fb215 100644 --- a/docs/apache-airflow/tutorial/fundamentals.rst +++ b/airflow-core/docs/tutorial/fundamentals.rst @@ -30,7 +30,7 @@ Example Pipeline definition Here is an example of a basic pipeline definition. Do not worry if this looks complicated, a line by line explanation follows below. -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] @@ -60,7 +60,7 @@ Importing Modules An Airflow pipeline is just a Python script that happens to define an Airflow DAG object. Let's start by importing the libraries we will need. -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :start-after: [START import_module] :end-before: [END import_module] @@ -75,7 +75,7 @@ explicitly pass a set of arguments to each task's constructor (which would become redundant), or (better!) we can define a dictionary of default parameters that we can use when creating tasks. -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :dedent: 4 :start-after: [START default_args] @@ -97,7 +97,7 @@ that defines the ``dag_id``, which serves as a unique identifier for your DAG. We also pass the default argument dictionary that we just defined and define a ``schedule`` of 1 day for the DAG. -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :start-after: [START instantiate_dag] :end-before: [END instantiate_dag] @@ -128,7 +128,7 @@ In the following example, we instantiate the BashOperator as two separate tasks separate bash scripts. The first argument for each instantiation, ``task_id``, acts as a unique identifier for the task. -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :dedent: 4 :start-after: [START basic_task] @@ -167,7 +167,7 @@ this feature exists, get you familiar with double curly brackets, and point to the most common template variable: ``{{ ds }}`` (today's "date stamp"). -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :dedent: 4 :start-after: [START jinja_template] @@ -207,7 +207,7 @@ json, and yaml. The DAG documentation can be written as a doc string at the begi of the DAG file (recommended), or anywhere else in the file. Below you can find some examples on how to implement task and DAG docs, as well as screenshots: -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :dedent: 4 :start-after: [START documentation] @@ -266,7 +266,7 @@ Recap Alright, so we have a pretty basic DAG. At this point your code should look something like this: -.. exampleinclude:: /../../airflow/example_dags/tutorial.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] diff --git a/docs/apache-airflow/tutorial/index.rst b/airflow-core/docs/tutorial/index.rst similarity index 100% rename from docs/apache-airflow/tutorial/index.rst rename to airflow-core/docs/tutorial/index.rst diff --git a/docs/apache-airflow/tutorial/objectstorage.rst b/airflow-core/docs/tutorial/objectstorage.rst similarity index 93% rename from docs/apache-airflow/tutorial/objectstorage.rst rename to airflow-core/docs/tutorial/objectstorage.rst index 39e42ddd76627..011646116b576 100644 --- a/docs/apache-airflow/tutorial/objectstorage.rst +++ b/airflow-core/docs/tutorial/objectstorage.rst @@ -50,7 +50,7 @@ Creating an ObjectStoragePath The ObjectStoragePath is a path-like object that represents a path on object storage. It is the fundamental building block of the Object Storage API. -.. exampleinclude:: /../../airflow/example_dags/tutorial_objectstorage.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_objectstorage.py :language: python :start-after: [START create_object_storage_path] :end-before: [END create_object_storage_path] @@ -80,7 +80,7 @@ An ObjectStoragePath behaves mostly like a pathlib.Path object. You can use it to save and load data directly to and from object storage. So, a typical flow could look like this: -.. exampleinclude:: /../../airflow/example_dags/tutorial_objectstorage.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_objectstorage.py :language: python :start-after: [START get_air_quality_data] :end-before: [END get_air_quality_data] @@ -113,7 +113,7 @@ In Duck DB we can then create a table from the data and run a query on it. The query is returned as a dataframe, which could be used for further analysis or saved to object storage. -.. exampleinclude:: /../../airflow/example_dags/tutorial_objectstorage.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_objectstorage.py :language: python :start-after: [START analyze] :end-before: [END analyze] @@ -128,7 +128,7 @@ Putting it all together The final DAG looks like this, which wraps things so that we can run it: -.. exampleinclude:: /../../airflow/example_dags/tutorial_objectstorage.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_objectstorage.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] diff --git a/docs/apache-airflow/tutorial/pipeline.rst b/airflow-core/docs/tutorial/pipeline.rst similarity index 99% rename from docs/apache-airflow/tutorial/pipeline.rst rename to airflow-core/docs/tutorial/pipeline.rst index 77758c89c83d7..a71ee3a9e5820 100644 --- a/docs/apache-airflow/tutorial/pipeline.rst +++ b/airflow-core/docs/tutorial/pipeline.rst @@ -136,7 +136,7 @@ Here we retrieve data, save it to a file on our Airflow instance, and load the d data_path = "/opt/airflow/dags/files/employees.csv" os.makedirs(os.path.dirname(data_path), exist_ok=True) - url = "https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/tutorial/pipeline_example.csv" + url = "https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/tutorial/pipeline_example.csv" response = requests.request("GET", url) @@ -265,7 +265,7 @@ Putting all of the pieces together, we have our completed DAG. data_path = "/opt/airflow/dags/files/employees.csv" os.makedirs(os.path.dirname(data_path), exist_ok=True) - url = "https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/tutorial/pipeline_example.csv" + url = "https://raw.githubusercontent.com/apache/airflow/main/airflow-core/docs/tutorial/pipeline_example.csv" response = requests.request("GET", url) diff --git a/docs/apache-airflow/tutorial/pipeline_example.csv b/airflow-core/docs/tutorial/pipeline_example.csv similarity index 98% rename from docs/apache-airflow/tutorial/pipeline_example.csv rename to airflow-core/docs/tutorial/pipeline_example.csv index 7e600d3077def..1efa60a48f367 100644 --- a/docs/apache-airflow/tutorial/pipeline_example.csv +++ b/airflow-core/docs/tutorial/pipeline_example.csv @@ -24,7 +24,7 @@ Serial Number,Company Name,Employee Markme,Description,Leave 24,I AM THE MIND,DEEP TRIVEDI,AATMARAM & SONS,0 25,THE ART OF CHOOSING,SHEEMark IYENGAR,ABACUS,0 26,IN SPITE OF THE GODS,EDWARD LUCE,ABACUS,1 -27,QUESTIONS & ANWERS ABOUT THE GREAT BIBLE,Mark,ABC PUBLISHERS DISTRIBUTORS,4 +27,QUESTIONS & ANSWERS ABOUT THE GREAT BIBLE,Mark,ABC PUBLISHERS DISTRIBUTORS,4 28,NIBANDH EVAM KAHANI LEKHAN { HINDI },Mark,ABHI BOOKS,1 29,INDIAN ECONOMY SINCE INDEPENDENCE 27TH /E,UMA KAPILA,ACADEMIC FOUNDATION,1 30,ECONOMIC DEVELOPMENT AND POLICY IN INDIA,UMA KAPILA,ACADEMIC FOUNDATION,1 diff --git a/docs/apache-airflow/tutorial/taskflow.rst b/airflow-core/docs/tutorial/taskflow.rst similarity index 95% rename from docs/apache-airflow/tutorial/taskflow.rst rename to airflow-core/docs/tutorial/taskflow.rst index d34aa5a320c69..c98f65c99d8a3 100644 --- a/docs/apache-airflow/tutorial/taskflow.rst +++ b/airflow-core/docs/tutorial/taskflow.rst @@ -34,7 +34,7 @@ Example "TaskFlow API" Pipeline Here is a very simple pipeline using the TaskFlow API paradigm. A more detailed explanation is given below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] @@ -57,7 +57,7 @@ when we set this up with Airflow, without any retries or complex scheduling. In this example, please notice that we are creating this DAG using the ``@dag`` decorator as shown below, with the Python function name acting as the DAG identifier. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :start-after: [START instantiate_dag] :end-before: [END instantiate_dag] @@ -65,7 +65,7 @@ as shown below, with the Python function name acting as the DAG identifier. Now to actually enable this to be run as a DAG, we invoke the Python function ``tutorial_taskflow_api`` set up using the ``@dag`` decorator earlier, as shown below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :start-after: [START dag_invocation] :end-before: [END dag_invocation] @@ -79,7 +79,7 @@ Tasks In this data pipeline, tasks are created based on Python functions using the ``@task`` decorator as shown below. The function name acts as a unique identifier for the task. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :dedent: 4 :start-after: [START extract] @@ -94,7 +94,7 @@ Main flow of the DAG Now that we have the Extract, Transform, and Load tasks defined based on the Python functions, we can move to the main part of the DAG. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :dedent: 4 :start-after: [START main_flow] @@ -109,7 +109,7 @@ running on different workers on different nodes on the network is all handled by Now to actually enable this to be run as a DAG, we invoke the Python function ``tutorial_taskflow_api`` set up using the ``@dag`` decorator earlier, as shown below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :start-after: [START dag_invocation] :end-before: [END dag_invocation] @@ -120,7 +120,7 @@ But how? For experienced Airflow DAG authors, this is startlingly simple! Let's contrast this with how this DAG had to be written before Airflow 2.0 below: -.. exampleinclude:: /../../airflow/example_dags/tutorial_dag.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_dag.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] @@ -131,7 +131,7 @@ it is all abstracted from the DAG developer. Let's examine this in detail by looking at the Transform task in isolation since it is in the middle of the data pipeline. In Airflow 1.x, this task is defined as shown below: -.. exampleinclude:: /../../airflow/example_dags/tutorial_dag.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_dag.py :language: python :dedent: 4 :start-after: [START transform_function] @@ -143,7 +143,7 @@ into another XCom variable which will then be used by the Load task. Contrasting that with TaskFlow API in Airflow 2.0 as shown below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :dedent: 4 :start-after: [START transform] @@ -157,7 +157,7 @@ Similarly, task dependencies are automatically generated within TaskFlows based functional invocation of tasks. In Airflow 1.x, tasks had to be explicitly created and dependencies specified as shown below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_dag.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_dag.py :language: python :dedent: 4 :start-after: [START main_flow] @@ -166,7 +166,7 @@ dependencies specified as shown below. In contrast, with the TaskFlow API in Airflow 2.0, the invocation itself automatically generates the dependencies as shown below. -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_api.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py :language: python :dedent: 4 :start-after: [START main_flow] @@ -268,7 +268,7 @@ run your function. Example (dynamically created virtualenv): -.. exampleinclude:: /../../airflow/example_dags/example_python_operator.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_python_operator.py :language: python :dedent: 4 :start-after: [START howto_operator_python_venv] @@ -286,7 +286,7 @@ made available in all workers that can execute the tasks in the same location. Example with ``@task.external_python`` (using immutable, pre-existing virtualenv): -.. exampleinclude:: /../../airflow/example_dags/example_python_operator.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_python_operator.py :language: python :dedent: 4 :start-after: [START howto_operator_external_python] @@ -412,7 +412,7 @@ function can return a boolean-like value where ``True`` designates the sensor's .. _taskflow/task_sensor_example: -.. exampleinclude:: /../../airflow/example_dags/example_sensor_decorator.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/example_sensor_decorator.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] @@ -680,7 +680,7 @@ Finally, you can also manually render templates: Here is a full example that demonstrates everything above: -.. exampleinclude:: /../../airflow/example_dags/tutorial_taskflow_templates.py +.. exampleinclude:: /../../airflow-core/src/airflow/example_dags/tutorial_taskflow_templates.py :language: python :start-after: [START tutorial] :end-before: [END tutorial] diff --git a/docs/apache-airflow/ui.rst b/airflow-core/docs/ui.rst similarity index 100% rename from docs/apache-airflow/ui.rst rename to airflow-core/docs/ui.rst diff --git a/airflow-core/hatch_build_airflow_core.py b/airflow-core/hatch_build_airflow_core.py new file mode 100644 index 0000000000000..438767bcd9d5d --- /dev/null +++ b/airflow-core/hatch_build_airflow_core.py @@ -0,0 +1,120 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import logging +import os +import shutil +from collections.abc import Iterable +from pathlib import Path +from subprocess import run +from typing import Any, Callable + +from hatchling.builders.config import BuilderConfig +from hatchling.builders.plugin.interface import BuilderInterface +from hatchling.plugin.manager import PluginManager + +log = logging.getLogger(__name__) +log_level = logging.getLevelName(os.getenv("CUSTOM_AIRFLOW_BUILD_LOG_LEVEL", "INFO")) +log.setLevel(log_level) + + +class CustomBuild(BuilderInterface[BuilderConfig, PluginManager]): + """Custom build class for Airflow assets and git version.""" + + # Note that this name of the plugin MUST be `custom` - as long as we use it from custom + # hatch_build.py file and not from external plugin. See note in the: + # https://hatch.pypa.io/latest/plugins/build-hook/custom/#example + PLUGIN_NAME = "custom" + + @staticmethod + def clean_dir(path: Path) -> None: + log.warning("Cleaning directory: %s", path) + shutil.rmtree(path, ignore_errors=True) + + def clean(self, directory: str, versions: Iterable[str]) -> None: + work_dir = Path(self.root) + log.warning("Cleaning generated files in directory: %s", work_dir) + airflow_package_src = work_dir / "src" / "airflow" + airflow_ui_path = airflow_package_src / "ui" + fastapi_ui_path = airflow_package_src / "api_fastapi" / "auth" / "managers" / "simple" / "ui" + self.clean_dir(airflow_ui_path / "dist") + self.clean_dir(airflow_ui_path / "node_modules") + self.clean_dir(fastapi_ui_path / "dist") + self.clean_dir(fastapi_ui_path / "node_modules") + + def get_version_api(self) -> dict[str, Callable[..., str]]: + """Get custom build target for standard package preparation.""" + return {"standard": self.build_standard} + + def build_standard(self, directory: str, artifacts: Any, **build_data: Any) -> str: + self.write_git_version() + # run this in the parent directory of the airflow-core (i.e. airflow repo root) + work_dir = Path(self.root).parent.resolve() + cmd = ["pre-commit", "run", "--hook-stage", "manual", "compile-ui-assets", "--all-files"] + log.warning("Running command: %s", " ".join(cmd)) + run(cmd, cwd=work_dir.as_posix(), check=True) + dist_path = Path(self.root) / "src" / "airflow" / "ui" / "dist" + return dist_path.resolve().as_posix() + + def get_git_version(self) -> str: + """ + Return a version to identify the state of the underlying git repo. + + The version will indicate whether the head of the current git-backed working directory + is tied to a release tag or not. It will indicate the former with a 'release:{version}' + prefix and the latter with a '.dev0' suffix. Following the prefix will be a sha of the + current branch head. Finally, a "dirty" suffix is appended to indicate that uncommitted + changes are present. + + Example pre-release version: ".dev0+2f635dc265e78db6708f59f68e8009abb92c1e65". + Example release version: ".release+2f635dc265e78db6708f59f68e8009abb92c1e65". + Example modified release version: ".release+2f635dc265e78db6708f59f68e8009abb92c1e65".dirty + + :return: Found Airflow version in Git repo. + """ + try: + import git + + try: + git_path = Path(self.root).parent.resolve() / ".git" + log.warning("Getting git version from: %s", git_path) + # Get git version from the git of the airflow root repo + repo = git.Repo(str(git_path)) + except git.NoSuchPathError: + log.warning(".git directory not found: Cannot compute the git version") + return "" + except git.InvalidGitRepositoryError: + log.warning("Invalid .git directory not found: Cannot compute the git version") + return "" + except ImportError: + log.warning("gitpython not found: Cannot compute the git version.") + return "" + if repo: + sha = repo.head.commit.hexsha + if repo.is_dirty(): + return f".dev0+{sha}.dirty" + # commit is clean + return f".release:{sha}" + return "no_git_version" + + def write_git_version(self) -> None: + """Write git version to git_version file.""" + version = self.get_git_version() + git_version_file = Path(self.root) / "src" / "airflow" / "git_version" + self.app.display(f"Writing version {version} to {git_version_file}") + git_version_file.write_text(version) diff --git a/airflow-core/pyproject.toml b/airflow-core/pyproject.toml new file mode 100644 index 0000000000000..471e62f50befe --- /dev/null +++ b/airflow-core/pyproject.toml @@ -0,0 +1,307 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +[build-system] +requires = [ + "GitPython==3.1.44", + "gitdb==4.0.12", + "hatchling==1.27.0", + "packaging==24.2", + "pathspec==0.12.1", + "pluggy==1.5.0", + "smmap==5.0.2", + "tomli==2.2.1; python_version < '3.11'", + "trove-classifiers==2025.3.13.13", +] +build-backend = "hatchling.build" + + +[project] +name = "apache-airflow-core" +description = "Core packages for Apache Airflow, schedule and API server" +readme = { file = "README.md", content-type = "text/markdown" } +license-files.globs = ["LICENSE", "3rd-party-licenses/*.txt", "NOTICE"] +requires-python = "~=3.9,<3.13" +authors = [ + { name = "Apache Software Foundation", email = "dev@airflow.apache.org" }, +] +maintainers = [ + { name = "Apache Software Foundation", email="dev@airflow.apache.org" }, +] +keywords = [ "airflow", "orchestration", "workflow", "dag", "pipelines", "automation", "data" ] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Environment :: Web Environment", + "Framework :: Apache Airflow", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: System :: Monitoring", +] + +dynamic = ["version"] + +dependencies = [ + "a2wsgi>=1.10.8", + # Alembic is important to handle our migrations in predictable and performant way. It is developed + # together with SQLAlchemy. Our experience with Alembic is that it very stable in minor version + # The 1.13.0 of alembic marked some migration code as SQLAlchemy 2+ only so we limit it to 1.13.1 + "alembic>=1.13.1, <2.0", + "argcomplete>=1.10", + "asgiref>=2.3.0", + "attrs>=22.1.0, !=25.2.0", + # Blinker use for signals in Flask, this is an optional dependency in Flask 2.2 and lower. + # In Flask 2.3 it becomes a mandatory dependency, and flask signals are always available. + "blinker>=1.6.2", + "cadwyn>=5.1.2", + "colorlog>=6.8.2", + "configupdater>=3.1.1", + "cron-descriptor>=1.2.24", + "croniter>=2.0.2", + "cryptography>=41.0.0", + "deprecated>=1.2.13", + "dill>=0.2.2", + # Required for python 3.9 to work with new annotations styles. Check package + # description on PyPI for more details: https://pypi.org/project/eval-type-backport/ + 'eval-type-backport>=0.2.0;python_version<"3.10"', + # 0.115.10 fastapi was a bad release that broke our API's and static checks. + # Related fastapi issue here: https://github.com/fastapi/fastapi/discussions/13431 + "fastapi[standard]>=0.112.4,!=0.115.10", + "flask-caching>=2.0.0", + # Flask-Session 0.6 add new arguments into the SqlAlchemySessionInterface constructor as well as + # all parameters now are mandatory which make AirflowDatabaseSessionInterface incompatible with this version. + "flask-session>=0.4.0,<0.6", + "flask-wtf>=1.1.0", + # Flask 2.3 is scheduled to introduce a number of deprecation removals - some of them might be breaking + # for our dependencies - notably `_app_ctx_stack` and `_request_ctx_stack` removals. + # We should remove the limitation after 2.3 is released and our dependencies are updated to handle it + "flask>=2.2.1,<2.3", + "fsspec>=2023.10.0", + "gitpython>=3.1.40", + "gunicorn>=20.1.0", + "httpx>=0.25.0", + 'importlib_metadata>=6.5;python_version<"3.12"', + "itsdangerous>=2.0", + "jinja2>=3.0.0", + "jsonschema>=4.18.0", + "lazy-object-proxy>=1.2.0", + "libcst >=1.1.0", + "linkify-it-py>=2.0.0", + "lockfile>=0.12.2", + "markdown-it-py>=2.1.0", + "markupsafe>=1.1.1", + "marshmallow-oneofschema>=2.0.1", + "mdit-py-plugins>=0.3.0", + "methodtools>=0.4.7", + "opentelemetry-api>=1.24.0", + "opentelemetry-exporter-otlp>=1.24.0", + "packaging>=23.2", + "pathspec>=0.9.0", + 'pendulum>=2.1.2,<4.0;python_version<"3.12"', + 'pendulum>=3.0.0,<4.0;python_version>="3.12"', + "pluggy>=1.5.0", + "psutil>=5.8.0", + "pydantic>=2.10.2", + # Pygments 2.19.0 improperly renders .ini files with dictionaries as values + # See https://github.com/pygments/pygments/issues/2834 + "pygments>=2.0.1,!=2.19.0", + "pyjwt>=2.10.0", + "python-daemon>=3.0.0", + "python-dateutil>=2.7.0", + "python-nvd3>=0.15.0", + "python-slugify>=5.0", + # Requests 3 if it will be released, will be heavily breaking. + "requests>=2.27.0,<3", + "requests-toolbelt>=1.0.0", + "rfc3339-validator>=0.1.4", + "rich-argparse>=1.0.0", + "rich>=13.1.0", + "setproctitle>=1.3.3", + # We use some deprecated features of sqlalchemy 2.0 and we should replace them before we can upgrade + # See https://sqlalche.me/e/b8d9 for details of deprecated features + # you can set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings. + # The issue tracking it is https://github.com/apache/airflow/issues/28723 + "sqlalchemy>=1.4.49,<2.0", + "sqlalchemy-jsonfield>=1.0", + "sqlalchemy-utils>=0.41.2", + "svcs>=25.1.0", + "tabulate>=0.7.5", + "tenacity>=8.0.0,!=8.2.0", + "termcolor>=2.5.0", + # Universal Pathlib 0.2.4 adds extra validation for Paths and our integration with local file paths + # Does not work with it Tracked in https://github.com/fsspec/universal_pathlib/issues/276 + "universal-pathlib>=0.2.2,!=0.2.4", + "uuid6>=2024.7.10", + # Werkzug 3 breaks Flask-Login 0.6.2 + # we should remove this limitation when FAB supports Flask 2.3 + "werkzeug>=2.0,<3", +] + + +[project.optional-dependencies] +# Aiobotocore required for AWS deferrable operators. +# There is conflict between boto3 and aiobotocore dependency botocore. +# TODO: We can remove it once boto3 and aiobotocore both have compatible botocore version or +# boto3 have native aync support and we move away from aio aiobotocore +"aiobotocore" = [ + "aiobotocore>=2.9.0", +] +"async" = [ + "eventlet>=0.33.3", + "gevent>=0.13", + "greenlet>=0.4.9", +] +"apache-atlas" = [ + "atlasclient>=0.1.2", +] +"apache-webhdfs" = [ + "hdfs[avro,dataframe,kerberos]>=2.0.4", +] +"cgroups" = [ + "cgroupspy>=0.2.2", +] +"cloudpickle" = [ + # Latest version of apache-beam requires cloudpickle~=2.2.1 + "cloudpickle>=2.2.1", +] +"github-enterprise" = [ + "apache-airflow-providers-fab", + "authlib>=1.0.0", +] +"google-auth" = [ + "apache-airflow-providers-fab", + "authlib>=1.0.0", +] +"graphviz" = [ + # The graphviz package creates friction when installing on MacOS as it needs graphviz system package to + # be installed, and it's really only used for very obscure features of Airflow, so we can skip it on MacOS + # Instead, if someone attempts to use it on MacOS, they will get explanatory error on how to install it + "graphviz>=0.12; sys_platform != 'darwin'", +] +"kerberos" = [ + "pykerberos>=1.1.13", + "requests-kerberos>=0.10.0", + "thrift-sasl>=0.2.0", +] +"ldap" = [ + "python-ldap>=3.4.4", +] +"leveldb" = [ + # The plyvel package is a huge pain when installing on MacOS - especially when Apple releases new + # OS version. It's usually next to impossible to install it at least for a few months after the new + # MacOS version is released. We can skip it on MacOS as this is an optional feature anyway. + "plyvel>=1.5.1; sys_platform != 'darwin'", +] +"otel" = [ + "opentelemetry-exporter-prometheus>=0.47b0", +] + +"pandas" = [ + # In pandas 2.2 minimal version of the sqlalchemy is 2.0 + # https://pandas.pydata.org/docs/whatsnew/v2.2.0.html#increased-minimum-versions-for-dependencies + # However Airflow not fully supports it yet: https://github.com/apache/airflow/issues/28723 + # In addition FAB also limit sqlalchemy to < 2.0 + "pandas>=1.2.5,<2.2", +] +"password" = [ + "bcrypt>=2.0.0", + "flask-bcrypt>=0.7.1", +] +"rabbitmq" = [ + "amqp>=5.2.0", +] +"s3fs" = [ + # This is required for support of S3 file system which uses aiobotocore + # which can have a conflict with boto3 as mentioned in aiobotocore extra + "s3fs>=2023.10.0", +] +"sentry" = [ + "blinker>=1.1", + # Sentry SDK 1.33 is broken when greenlets are installed and fails to import + # See https://github.com/getsentry/sentry-python/issues/2473 + "sentry-sdk>=1.32.0,!=1.33.0", +] +"statsd" = [ + "statsd>=3.3.0", +] +"uv" = [ + "uv>=0.6.3", +] + +[project.scripts] +airflow = "airflow.__main__:main" + +[project.urls] +"Bug Tracker" = "https://github.com/apache/airflow/issues" +Documentation = "https://airflow.apache.org/docs/" +Downloads = "https://archive.apache.org/dist/airflow/" +Homepage = "https://airflow.apache.org/" +"Release Notes" = "https://airflow.apache.org/docs/apache-airflow/stable/release_notes.html" +"Slack Chat" = "https://s.apache.org/airflow-slack" +"Source Code" = "https://github.com/apache/airflow" +LinkedIn = "https://www.linkedin.com/company/apache-airflow/" +Mastodon = "https://fosstodon.org/@airflow" +Bluesky = "https://bsky.app/profile/apache-airflow.bsky.social" +YouTube = "https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" + +[tool.hatch.version] +path = "src/airflow/__init__.py" + +[tool.hatch.build.targets.sdist] +include = [ + "src/airflow", + "NOTICE" +] +exclude = [ + "src/airflow/ui/node_modules/" +] + +[tool.hatch.build.targets.custom] +path = "./hatch_build_airflow_core.py" + +artifacts = [ + "airflow/ui/dist/", + "airflow/api_fastapi/auth/managers/simple/ui/dist/", + "airflow/git_version", + "generated/", +] + +[tool.hatch.build.targets.wheel] +packages = ['src/airflow'] +artifacts = [ + "airflow/ui/dist/", + "airflow/api_fastapi/auth/managers/simple/ui/dist/", + "airflow/git_version" +] + +[dependency-groups] +dev = [ + "apache-airflow[all-core]", + "apache-airflow-devel-common", +] + +[tool.uv] +required-version = ">=0.6.3" + +[tool.uv.sources] +apache-airflow-core = {workspace = true} +apache-airflow-devel-common = { workspace = true } diff --git a/airflow/METRICS.md b/airflow-core/src/airflow/METRICS.md similarity index 100% rename from airflow/METRICS.md rename to airflow-core/src/airflow/METRICS.md diff --git a/airflow/__init__.py b/airflow-core/src/airflow/__init__.py similarity index 100% rename from airflow/__init__.py rename to airflow-core/src/airflow/__init__.py diff --git a/airflow/__main__.py b/airflow-core/src/airflow/__main__.py similarity index 100% rename from airflow/__main__.py rename to airflow-core/src/airflow/__main__.py diff --git a/airflow/_vendor/README.md b/airflow-core/src/airflow/_vendor/README.md similarity index 100% rename from airflow/_vendor/README.md rename to airflow-core/src/airflow/_vendor/README.md diff --git a/airflow/_vendor/__init__.py b/airflow-core/src/airflow/_vendor/__init__.py similarity index 100% rename from airflow/_vendor/__init__.py rename to airflow-core/src/airflow/_vendor/__init__.py diff --git a/airflow/_vendor/vendor.md b/airflow-core/src/airflow/_vendor/vendor.md similarity index 100% rename from airflow/_vendor/vendor.md rename to airflow-core/src/airflow/_vendor/vendor.md diff --git a/airflow/alembic.ini b/airflow-core/src/airflow/alembic.ini similarity index 100% rename from airflow/alembic.ini rename to airflow-core/src/airflow/alembic.ini diff --git a/airflow/api_fastapi/__init__.py b/airflow-core/src/airflow/api/__init__.py similarity index 100% rename from airflow/api_fastapi/__init__.py rename to airflow-core/src/airflow/api/__init__.py diff --git a/airflow/api/client/__init__.py b/airflow-core/src/airflow/api/client/__init__.py similarity index 100% rename from airflow/api/client/__init__.py rename to airflow-core/src/airflow/api/client/__init__.py diff --git a/airflow/api/client/local_client.py b/airflow-core/src/airflow/api/client/local_client.py similarity index 100% rename from airflow/api/client/local_client.py rename to airflow-core/src/airflow/api/client/local_client.py diff --git a/airflow/api/common/__init__.py b/airflow-core/src/airflow/api/common/__init__.py similarity index 100% rename from airflow/api/common/__init__.py rename to airflow-core/src/airflow/api/common/__init__.py diff --git a/airflow/api/common/airflow_health.py b/airflow-core/src/airflow/api/common/airflow_health.py similarity index 100% rename from airflow/api/common/airflow_health.py rename to airflow-core/src/airflow/api/common/airflow_health.py diff --git a/airflow/api/common/delete_dag.py b/airflow-core/src/airflow/api/common/delete_dag.py similarity index 100% rename from airflow/api/common/delete_dag.py rename to airflow-core/src/airflow/api/common/delete_dag.py diff --git a/airflow/api/common/mark_tasks.py b/airflow-core/src/airflow/api/common/mark_tasks.py similarity index 100% rename from airflow/api/common/mark_tasks.py rename to airflow-core/src/airflow/api/common/mark_tasks.py diff --git a/airflow/api/common/trigger_dag.py b/airflow-core/src/airflow/api/common/trigger_dag.py similarity index 100% rename from airflow/api/common/trigger_dag.py rename to airflow-core/src/airflow/api/common/trigger_dag.py diff --git a/airflow/api_fastapi/auth/managers/simple/services/__init__.py b/airflow-core/src/airflow/api_fastapi/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/services/__init__.py rename to airflow-core/src/airflow/api_fastapi/__init__.py diff --git a/airflow/api_fastapi/app.py b/airflow-core/src/airflow/api_fastapi/app.py similarity index 100% rename from airflow/api_fastapi/app.py rename to airflow-core/src/airflow/api_fastapi/app.py diff --git a/airflow/api_fastapi/auth/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/__init__.py diff --git a/airflow/api_fastapi/auth/managers/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/__init__.py diff --git a/airflow/api_fastapi/auth/managers/base_auth_manager.py b/airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py similarity index 100% rename from airflow/api_fastapi/auth/managers/base_auth_manager.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py diff --git a/airflow/api_fastapi/auth/managers/models/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/models/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/models/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/models/__init__.py diff --git a/airflow/api_fastapi/auth/managers/models/base_user.py b/airflow-core/src/airflow/api_fastapi/auth/managers/models/base_user.py similarity index 100% rename from airflow/api_fastapi/auth/managers/models/base_user.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/models/base_user.py diff --git a/airflow/api_fastapi/auth/managers/models/batch_apis.py b/airflow-core/src/airflow/api_fastapi/auth/managers/models/batch_apis.py similarity index 100% rename from airflow/api_fastapi/auth/managers/models/batch_apis.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/models/batch_apis.py diff --git a/airflow/api_fastapi/auth/managers/models/resource_details.py b/airflow-core/src/airflow/api_fastapi/auth/managers/models/resource_details.py similarity index 100% rename from airflow/api_fastapi/auth/managers/models/resource_details.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/models/resource_details.py diff --git a/airflow/api_fastapi/auth/managers/simple/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/__init__.py diff --git a/airflow/api_fastapi/auth/managers/simple/datamodels/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/datamodels/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/datamodels/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/datamodels/__init__.py diff --git a/airflow/api_fastapi/auth/managers/simple/datamodels/login.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/datamodels/login.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/datamodels/login.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/datamodels/login.py diff --git a/airflow/api_fastapi/auth/managers/simple/openapi/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/openapi/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/openapi/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/openapi/__init__.py diff --git a/airflow/api_fastapi/auth/managers/simple/openapi/v1-generated.yaml b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/openapi/v1-generated.yaml similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/openapi/v1-generated.yaml rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/openapi/v1-generated.yaml diff --git a/airflow/api_fastapi/auth/managers/simple/routes/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/routes/__init__.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/routes/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/routes/__init__.py diff --git a/airflow/api_fastapi/auth/managers/simple/routes/login.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/routes/login.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/routes/login.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/routes/login.py diff --git a/airflow/api_fastapi/common/__init__.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/services/__init__.py similarity index 100% rename from airflow/api_fastapi/common/__init__.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/services/__init__.py diff --git a/airflow/api_fastapi/auth/managers/simple/services/login.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/services/login.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/services/login.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/services/login.py diff --git a/airflow/api_fastapi/auth/managers/simple/simple_auth_manager.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/simple_auth_manager.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/simple_auth_manager.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/simple_auth_manager.py diff --git a/airflow/api_fastapi/auth/managers/simple/ui/dev/index.html b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/dev/index.html similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/dev/index.html rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/dev/index.html diff --git a/airflow/api_fastapi/auth/managers/simple/ui/index.html b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/index.html similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/index.html rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/index.html diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/common.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/common.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/common.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/common.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/index.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/index.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/index.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/index.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/infiniteQueries.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/infiniteQueries.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/infiniteQueries.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/infiniteQueries.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/prefetch.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/prefetch.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/prefetch.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/prefetch.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/queries.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/queries.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/queries.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/queries.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/suspense.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/suspense.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/suspense.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/queries/suspense.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiError.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiError.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiError.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiError.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiRequestOptions.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiRequestOptions.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiRequestOptions.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiRequestOptions.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiResult.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiResult.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiResult.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/ApiResult.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/CancelablePromise.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/CancelablePromise.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/CancelablePromise.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/CancelablePromise.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/OpenAPI.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/OpenAPI.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/OpenAPI.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/OpenAPI.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/request.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/request.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/request.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/core/request.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/index.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/index.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/index.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/index.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/schemas.gen.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/schemas.gen.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/schemas.gen.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/schemas.gen.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/services.gen.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/services.gen.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/services.gen.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/services.gen.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/types.gen.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/types.gen.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/types.gen.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/openapi-gen/requests/types.gen.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/package-lock.json b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/package-lock.json similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/package-lock.json rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/package-lock.json diff --git a/airflow/api_fastapi/auth/managers/simple/ui/package.json b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/package.json similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/package.json rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/package.json diff --git a/airflow/api_fastapi/auth/managers/simple/ui/pnpm-lock.yaml b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/pnpm-lock.yaml similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/pnpm-lock.yaml rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/pnpm-lock.yaml diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.test.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.test.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.test.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.test.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/Login.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/main.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/main.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/main.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/main.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/queries/useCreateToken.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/queries/useCreateToken.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/queries/useCreateToken.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/queries/useCreateToken.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/queryClient.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/queryClient.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/queryClient.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/queryClient.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/router.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/router.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/router.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/router.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/src/test-utils.tsx b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/test-utils.tsx similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/src/test-utils.tsx rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/test-utils.tsx diff --git a/airflow/api_fastapi/auth/managers/simple/ui/tests-setup.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/tests-setup.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/tests-setup.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/tests-setup.ts diff --git a/airflow/api_fastapi/auth/managers/simple/ui/vite.config.ts b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/vite.config.ts similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/ui/vite.config.ts rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/vite.config.ts diff --git a/airflow/api_fastapi/auth/managers/simple/user.py b/airflow-core/src/airflow/api_fastapi/auth/managers/simple/user.py similarity index 100% rename from airflow/api_fastapi/auth/managers/simple/user.py rename to airflow-core/src/airflow/api_fastapi/auth/managers/simple/user.py diff --git a/airflow/api_fastapi/auth/tokens.py b/airflow-core/src/airflow/api_fastapi/auth/tokens.py similarity index 100% rename from airflow/api_fastapi/auth/tokens.py rename to airflow-core/src/airflow/api_fastapi/auth/tokens.py diff --git a/airflow/api_fastapi/common/db/__init__.py b/airflow-core/src/airflow/api_fastapi/common/__init__.py similarity index 100% rename from airflow/api_fastapi/common/db/__init__.py rename to airflow-core/src/airflow/api_fastapi/common/__init__.py diff --git a/airflow/api_fastapi/core_api/__init__.py b/airflow-core/src/airflow/api_fastapi/common/db/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/__init__.py rename to airflow-core/src/airflow/api_fastapi/common/db/__init__.py diff --git a/airflow/api_fastapi/common/db/common.py b/airflow-core/src/airflow/api_fastapi/common/db/common.py similarity index 100% rename from airflow/api_fastapi/common/db/common.py rename to airflow-core/src/airflow/api_fastapi/common/db/common.py diff --git a/airflow/api_fastapi/common/db/dag_runs.py b/airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py similarity index 100% rename from airflow/api_fastapi/common/db/dag_runs.py rename to airflow-core/src/airflow/api_fastapi/common/db/dag_runs.py diff --git a/airflow/api_fastapi/common/db/dags.py b/airflow-core/src/airflow/api_fastapi/common/db/dags.py similarity index 100% rename from airflow/api_fastapi/common/db/dags.py rename to airflow-core/src/airflow/api_fastapi/common/db/dags.py diff --git a/airflow/api_fastapi/common/exceptions.py b/airflow-core/src/airflow/api_fastapi/common/exceptions.py similarity index 100% rename from airflow/api_fastapi/common/exceptions.py rename to airflow-core/src/airflow/api_fastapi/common/exceptions.py diff --git a/airflow/api_fastapi/common/headers.py b/airflow-core/src/airflow/api_fastapi/common/headers.py similarity index 100% rename from airflow/api_fastapi/common/headers.py rename to airflow-core/src/airflow/api_fastapi/common/headers.py diff --git a/airflow/api_fastapi/common/parameters.py b/airflow-core/src/airflow/api_fastapi/common/parameters.py similarity index 100% rename from airflow/api_fastapi/common/parameters.py rename to airflow-core/src/airflow/api_fastapi/common/parameters.py diff --git a/airflow/api_fastapi/common/router.py b/airflow-core/src/airflow/api_fastapi/common/router.py similarity index 100% rename from airflow/api_fastapi/common/router.py rename to airflow-core/src/airflow/api_fastapi/common/router.py diff --git a/airflow/api_fastapi/common/types.py b/airflow-core/src/airflow/api_fastapi/common/types.py similarity index 100% rename from airflow/api_fastapi/common/types.py rename to airflow-core/src/airflow/api_fastapi/common/types.py diff --git a/airflow/api_fastapi/core_api/datamodels/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/__init__.py diff --git a/airflow/api_fastapi/core_api/app.py b/airflow-core/src/airflow/api_fastapi/core_api/app.py similarity index 100% rename from airflow/api_fastapi/core_api/app.py rename to airflow-core/src/airflow/api_fastapi/core_api/app.py diff --git a/airflow/api_fastapi/core_api/base.py b/airflow-core/src/airflow/api_fastapi/core_api/base.py similarity index 100% rename from airflow/api_fastapi/core_api/base.py rename to airflow-core/src/airflow/api_fastapi/core_api/base.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/__init__.py diff --git a/airflow/api_fastapi/core_api/datamodels/assets.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/assets.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/assets.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/assets.py diff --git a/airflow/api_fastapi/core_api/datamodels/backfills.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/backfills.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/backfills.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/backfills.py diff --git a/airflow/api_fastapi/core_api/datamodels/common.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/common.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/common.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/common.py diff --git a/airflow/api_fastapi/core_api/datamodels/config.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/config.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/config.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/config.py diff --git a/airflow/api_fastapi/core_api/datamodels/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/connections.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/connections.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/connections.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_report.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_report.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_report.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_report.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_run.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_run.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_run.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_run.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_sources.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_sources.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_sources.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_sources.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_stats.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_stats.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_stats.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_stats.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_tags.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_tags.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_tags.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_tags.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_versions.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_versions.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_versions.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_versions.py diff --git a/airflow/api_fastapi/core_api/datamodels/dag_warning.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_warning.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dag_warning.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dag_warning.py diff --git a/airflow/api_fastapi/core_api/datamodels/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/dags.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py diff --git a/airflow/api_fastapi/core_api/datamodels/event_logs.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/event_logs.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/event_logs.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/event_logs.py diff --git a/airflow/api_fastapi/core_api/datamodels/extra_links.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/extra_links.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/extra_links.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/extra_links.py diff --git a/airflow/api_fastapi/core_api/datamodels/import_error.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/import_error.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/import_error.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/import_error.py diff --git a/airflow/api_fastapi/core_api/datamodels/job.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/job.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/job.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/job.py diff --git a/airflow/api_fastapi/core_api/datamodels/log.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/log.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/log.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/log.py diff --git a/airflow/api_fastapi/core_api/datamodels/monitor.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/monitor.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/monitor.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/monitor.py diff --git a/airflow/api_fastapi/core_api/datamodels/plugins.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/plugins.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/plugins.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/plugins.py diff --git a/airflow/api_fastapi/core_api/datamodels/pools.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/pools.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/pools.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/pools.py diff --git a/airflow/api_fastapi/core_api/datamodels/providers.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/providers.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/providers.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/providers.py diff --git a/airflow/api_fastapi/core_api/datamodels/task_instances.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/task_instances.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/task_instances.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/task_instances.py diff --git a/airflow/api_fastapi/core_api/datamodels/tasks.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/tasks.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/tasks.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/tasks.py diff --git a/airflow/api_fastapi/core_api/datamodels/trigger.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/trigger.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/trigger.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/trigger.py diff --git a/airflow/api_fastapi/core_api/openapi/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/openapi/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/__init__.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/auth.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/auth.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/common.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/common.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/config.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/config.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/dags.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/dags.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/dags.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/dashboard.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/dashboard.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/dashboard.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/dashboard.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/grid.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/grid.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/grid.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/grid.py diff --git a/airflow/api_fastapi/core_api/datamodels/ui/structure.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/structure.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/ui/structure.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/structure.py diff --git a/airflow/api_fastapi/core_api/datamodels/variables.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/variables.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/variables.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/variables.py diff --git a/airflow/api_fastapi/core_api/datamodels/version.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/version.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/version.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/version.py diff --git a/airflow/api_fastapi/core_api/datamodels/xcom.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/xcom.py similarity index 100% rename from airflow/api_fastapi/core_api/datamodels/xcom.py rename to airflow-core/src/airflow/api_fastapi/core_api/datamodels/xcom.py diff --git a/airflow/api_fastapi/core_api/init_dagbag.py b/airflow-core/src/airflow/api_fastapi/core_api/init_dagbag.py similarity index 100% rename from airflow/api_fastapi/core_api/init_dagbag.py rename to airflow-core/src/airflow/api_fastapi/core_api/init_dagbag.py diff --git a/airflow/api_fastapi/core_api/middleware.py b/airflow-core/src/airflow/api_fastapi/core_api/middleware.py similarity index 100% rename from airflow/api_fastapi/core_api/middleware.py rename to airflow-core/src/airflow/api_fastapi/core_api/middleware.py diff --git a/airflow/api_fastapi/core_api/routes/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/openapi/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/openapi/__init__.py diff --git a/airflow/api_fastapi/core_api/openapi/exceptions.py b/airflow-core/src/airflow/api_fastapi/core_api/openapi/exceptions.py similarity index 100% rename from airflow/api_fastapi/core_api/openapi/exceptions.py rename to airflow-core/src/airflow/api_fastapi/core_api/openapi/exceptions.py diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml similarity index 100% rename from airflow/api_fastapi/core_api/openapi/v1-generated.yaml rename to airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml diff --git a/airflow/api_fastapi/core_api/services/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/services/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/__init__.py diff --git a/airflow/api_fastapi/core_api/routes/public/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/__init__.py diff --git a/airflow/api_fastapi/core_api/routes/public/assets.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/assets.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py diff --git a/airflow/api_fastapi/core_api/routes/public/auth.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/auth.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/auth.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/auth.py diff --git a/airflow/api_fastapi/core_api/routes/public/backfills.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/backfills.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py diff --git a/airflow/api_fastapi/core_api/routes/public/config.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/config.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/config.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/config.py diff --git a/airflow/api_fastapi/core_api/routes/public/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/connections.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/connections.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/connections.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_parsing.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_parsing.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_parsing.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_parsing.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_report.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_report.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_run.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_run.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_sources.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_sources.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_sources.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_sources.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_stats.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_stats.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_stats.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_stats.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_tags.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_tags.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_tags.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_tags.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_versions.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_versions.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_versions.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_versions.py diff --git a/airflow/api_fastapi/core_api/routes/public/dag_warning.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_warning.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dag_warning.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_warning.py diff --git a/airflow/api_fastapi/core_api/routes/public/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/dags.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py diff --git a/airflow/api_fastapi/core_api/routes/public/event_logs.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/event_logs.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/event_logs.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/event_logs.py diff --git a/airflow/api_fastapi/core_api/routes/public/extra_links.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/extra_links.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/extra_links.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/extra_links.py diff --git a/airflow/api_fastapi/core_api/routes/public/import_error.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/import_error.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/import_error.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/import_error.py diff --git a/airflow/api_fastapi/core_api/routes/public/job.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/job.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/job.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/job.py diff --git a/airflow/api_fastapi/core_api/routes/public/log.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/log.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/log.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/log.py diff --git a/airflow/api_fastapi/core_api/routes/public/monitor.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/monitor.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/monitor.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/monitor.py diff --git a/airflow/api_fastapi/core_api/routes/public/plugins.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/plugins.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py diff --git a/airflow/api_fastapi/core_api/routes/public/pools.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/pools.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/pools.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/pools.py diff --git a/airflow/api_fastapi/core_api/routes/public/providers.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/providers.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/providers.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/providers.py diff --git a/airflow/api_fastapi/core_api/routes/public/task_instances.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/task_instances.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py diff --git a/airflow/api_fastapi/core_api/routes/public/tasks.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/tasks.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py diff --git a/airflow/api_fastapi/core_api/routes/public/variables.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/variables.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/variables.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/variables.py diff --git a/airflow/api_fastapi/core_api/routes/public/version.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/version.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/version.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/version.py diff --git a/airflow/api_fastapi/core_api/routes/public/xcom.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/xcom.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/public/xcom.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/public/xcom.py diff --git a/airflow/api_fastapi/core_api/routes/ui/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/__init__.py diff --git a/airflow/api_fastapi/core_api/routes/ui/assets.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/assets.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/assets.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/assets.py diff --git a/airflow/api_fastapi/core_api/routes/ui/auth.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/auth.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py diff --git a/airflow/api_fastapi/core_api/routes/ui/backfills.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/backfills.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/backfills.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/backfills.py diff --git a/airflow/api_fastapi/core_api/routes/ui/config.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/config.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py diff --git a/airflow/api_fastapi/core_api/routes/ui/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/connections.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/connections.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/connections.py diff --git a/airflow/api_fastapi/core_api/routes/ui/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/dags.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py diff --git a/airflow/api_fastapi/core_api/routes/ui/dashboard.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dashboard.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/dashboard.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dashboard.py diff --git a/airflow/api_fastapi/core_api/routes/ui/dependencies.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dependencies.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/dependencies.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dependencies.py diff --git a/airflow/api_fastapi/core_api/routes/ui/grid.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/grid.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py diff --git a/airflow/api_fastapi/core_api/routes/ui/structure.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/structure.py similarity index 100% rename from airflow/api_fastapi/core_api/routes/ui/structure.py rename to airflow-core/src/airflow/api_fastapi/core_api/routes/ui/structure.py diff --git a/airflow/api_fastapi/core_api/security.py b/airflow-core/src/airflow/api_fastapi/core_api/security.py similarity index 100% rename from airflow/api_fastapi/core_api/security.py rename to airflow-core/src/airflow/api_fastapi/core_api/security.py diff --git a/airflow/api_fastapi/core_api/services/public/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/services/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/services/public/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/__init__.py diff --git a/airflow/api_fastapi/core_api/services/ui/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/services/public/__init__.py similarity index 100% rename from airflow/api_fastapi/core_api/services/ui/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/public/__init__.py diff --git a/airflow/api_fastapi/core_api/services/public/common.py b/airflow-core/src/airflow/api_fastapi/core_api/services/public/common.py similarity index 100% rename from airflow/api_fastapi/core_api/services/public/common.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/public/common.py diff --git a/airflow/api_fastapi/core_api/services/public/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/services/public/connections.py similarity index 100% rename from airflow/api_fastapi/core_api/services/public/connections.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/public/connections.py diff --git a/airflow/api_fastapi/core_api/services/public/pools.py b/airflow-core/src/airflow/api_fastapi/core_api/services/public/pools.py similarity index 100% rename from airflow/api_fastapi/core_api/services/public/pools.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/public/pools.py diff --git a/airflow/api_fastapi/core_api/services/public/variables.py b/airflow-core/src/airflow/api_fastapi/core_api/services/public/variables.py similarity index 100% rename from airflow/api_fastapi/core_api/services/public/variables.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/public/variables.py diff --git a/airflow/api_fastapi/execution_api/__init__.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/__init__.py similarity index 100% rename from airflow/api_fastapi/execution_api/__init__.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/ui/__init__.py diff --git a/airflow/api_fastapi/core_api/services/ui/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py similarity index 100% rename from airflow/api_fastapi/core_api/services/ui/connections.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py diff --git a/airflow/api_fastapi/core_api/services/ui/dependencies.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py similarity index 100% rename from airflow/api_fastapi/core_api/services/ui/dependencies.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py diff --git a/airflow/api_fastapi/core_api/services/ui/grid.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py similarity index 100% rename from airflow/api_fastapi/core_api/services/ui/grid.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py diff --git a/airflow/api_fastapi/core_api/services/ui/structure.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/structure.py similarity index 100% rename from airflow/api_fastapi/core_api/services/ui/structure.py rename to airflow-core/src/airflow/api_fastapi/core_api/services/ui/structure.py diff --git a/airflow/api_fastapi/execution_api/datamodels/__init__.py b/airflow-core/src/airflow/api_fastapi/execution_api/__init__.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/__init__.py rename to airflow-core/src/airflow/api_fastapi/execution_api/__init__.py diff --git a/airflow/api_fastapi/execution_api/app.py b/airflow-core/src/airflow/api_fastapi/execution_api/app.py similarity index 100% rename from airflow/api_fastapi/execution_api/app.py rename to airflow-core/src/airflow/api_fastapi/execution_api/app.py diff --git a/airflow/api_fastapi/logging/__init__.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/__init__.py similarity index 100% rename from airflow/api_fastapi/logging/__init__.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/__init__.py diff --git a/airflow/api_fastapi/execution_api/datamodels/asset.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/asset.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/asset.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/asset.py diff --git a/airflow/api_fastapi/execution_api/datamodels/asset_event.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/asset_event.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/asset_event.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/asset_event.py diff --git a/airflow/api_fastapi/execution_api/datamodels/connection.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/connection.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/connection.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/connection.py diff --git a/airflow/api_fastapi/execution_api/datamodels/dagrun.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/dagrun.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/dagrun.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/dagrun.py diff --git a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/taskinstance.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/taskinstance.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/taskinstance.py diff --git a/airflow/api_fastapi/execution_api/datamodels/token.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/token.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/token.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/token.py diff --git a/airflow/api_fastapi/execution_api/datamodels/variable.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/variable.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/variable.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/variable.py diff --git a/airflow/api_fastapi/execution_api/datamodels/xcom.py b/airflow-core/src/airflow/api_fastapi/execution_api/datamodels/xcom.py similarity index 100% rename from airflow/api_fastapi/execution_api/datamodels/xcom.py rename to airflow-core/src/airflow/api_fastapi/execution_api/datamodels/xcom.py diff --git a/airflow/api_fastapi/execution_api/deps.py b/airflow-core/src/airflow/api_fastapi/execution_api/deps.py similarity index 100% rename from airflow/api_fastapi/execution_api/deps.py rename to airflow-core/src/airflow/api_fastapi/execution_api/deps.py diff --git a/airflow/api_fastapi/execution_api/routes/__init__.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/__init__.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/__init__.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/__init__.py diff --git a/airflow/api_fastapi/execution_api/routes/asset_events.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/asset_events.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/asset_events.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/asset_events.py diff --git a/airflow/api_fastapi/execution_api/routes/assets.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/assets.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/assets.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/assets.py diff --git a/airflow/api_fastapi/execution_api/routes/connections.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/connections.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/connections.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/connections.py diff --git a/airflow/api_fastapi/execution_api/routes/dag_runs.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/dag_runs.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py diff --git a/airflow/api_fastapi/execution_api/routes/health.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/health.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/health.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/health.py diff --git a/airflow/api_fastapi/execution_api/routes/task_instances.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/task_instances.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py diff --git a/airflow/api_fastapi/execution_api/routes/variables.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/variables.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/variables.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/variables.py diff --git a/airflow/api_fastapi/execution_api/routes/xcoms.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/xcoms.py similarity index 100% rename from airflow/api_fastapi/execution_api/routes/xcoms.py rename to airflow-core/src/airflow/api_fastapi/execution_api/routes/xcoms.py diff --git a/airflow/api_fastapi/gunicorn_config.py b/airflow-core/src/airflow/api_fastapi/gunicorn_config.py similarity index 100% rename from airflow/api_fastapi/gunicorn_config.py rename to airflow-core/src/airflow/api_fastapi/gunicorn_config.py diff --git a/airflow/assets/__init__.py b/airflow-core/src/airflow/api_fastapi/logging/__init__.py similarity index 100% rename from airflow/assets/__init__.py rename to airflow-core/src/airflow/api_fastapi/logging/__init__.py diff --git a/airflow/api_fastapi/logging/decorators.py b/airflow-core/src/airflow/api_fastapi/logging/decorators.py similarity index 100% rename from airflow/api_fastapi/logging/decorators.py rename to airflow-core/src/airflow/api_fastapi/logging/decorators.py diff --git a/airflow/api_fastapi/main.py b/airflow-core/src/airflow/api_fastapi/main.py similarity index 100% rename from airflow/api_fastapi/main.py rename to airflow-core/src/airflow/api_fastapi/main.py diff --git a/airflow/callbacks/__init__.py b/airflow-core/src/airflow/assets/__init__.py similarity index 100% rename from airflow/callbacks/__init__.py rename to airflow-core/src/airflow/assets/__init__.py diff --git a/airflow/assets/evaluation.py b/airflow-core/src/airflow/assets/evaluation.py similarity index 100% rename from airflow/assets/evaluation.py rename to airflow-core/src/airflow/assets/evaluation.py diff --git a/airflow/assets/manager.py b/airflow-core/src/airflow/assets/manager.py similarity index 100% rename from airflow/assets/manager.py rename to airflow-core/src/airflow/assets/manager.py diff --git a/airflow/cli/commands/local_commands/__init__.py b/airflow-core/src/airflow/callbacks/__init__.py similarity index 100% rename from airflow/cli/commands/local_commands/__init__.py rename to airflow-core/src/airflow/callbacks/__init__.py diff --git a/airflow/callbacks/base_callback_sink.py b/airflow-core/src/airflow/callbacks/base_callback_sink.py similarity index 100% rename from airflow/callbacks/base_callback_sink.py rename to airflow-core/src/airflow/callbacks/base_callback_sink.py diff --git a/airflow/callbacks/callback_requests.py b/airflow-core/src/airflow/callbacks/callback_requests.py similarity index 100% rename from airflow/callbacks/callback_requests.py rename to airflow-core/src/airflow/callbacks/callback_requests.py diff --git a/airflow/callbacks/database_callback_sink.py b/airflow-core/src/airflow/callbacks/database_callback_sink.py similarity index 100% rename from airflow/callbacks/database_callback_sink.py rename to airflow-core/src/airflow/callbacks/database_callback_sink.py diff --git a/airflow/callbacks/pipe_callback_sink.py b/airflow-core/src/airflow/callbacks/pipe_callback_sink.py similarity index 100% rename from airflow/callbacks/pipe_callback_sink.py rename to airflow-core/src/airflow/callbacks/pipe_callback_sink.py diff --git a/airflow/cli/__init__.py b/airflow-core/src/airflow/cli/__init__.py similarity index 100% rename from airflow/cli/__init__.py rename to airflow-core/src/airflow/cli/__init__.py diff --git a/airflow/cli/commands/remote_commands/__init__.py b/airflow-core/src/airflow/cli/api/__init__.py similarity index 100% rename from airflow/cli/commands/remote_commands/__init__.py rename to airflow-core/src/airflow/cli/api/__init__.py diff --git a/airflow/dag_processing/__init__.py b/airflow-core/src/airflow/cli/api/datamodels/__init__.py similarity index 100% rename from airflow/dag_processing/__init__.py rename to airflow-core/src/airflow/cli/api/datamodels/__init__.py diff --git a/airflow/cli/cli_config.py b/airflow-core/src/airflow/cli/cli_config.py similarity index 100% rename from airflow/cli/cli_config.py rename to airflow-core/src/airflow/cli/cli_config.py diff --git a/airflow/cli/cli_parser.py b/airflow-core/src/airflow/cli/cli_parser.py similarity index 100% rename from airflow/cli/cli_parser.py rename to airflow-core/src/airflow/cli/cli_parser.py diff --git a/airflow/cli/commands/__init__.py b/airflow-core/src/airflow/cli/commands/__init__.py similarity index 100% rename from airflow/cli/commands/__init__.py rename to airflow-core/src/airflow/cli/commands/__init__.py diff --git a/airflow/cli/commands/legacy_commands.py b/airflow-core/src/airflow/cli/commands/legacy_commands.py similarity index 100% rename from airflow/cli/commands/legacy_commands.py rename to airflow-core/src/airflow/cli/commands/legacy_commands.py diff --git a/airflow/dag_processing/bundles/__init__.py b/airflow-core/src/airflow/cli/commands/local_commands/__init__.py similarity index 100% rename from airflow/dag_processing/bundles/__init__.py rename to airflow-core/src/airflow/cli/commands/local_commands/__init__.py diff --git a/airflow/cli/commands/local_commands/api_server_command.py b/airflow-core/src/airflow/cli/commands/local_commands/api_server_command.py similarity index 100% rename from airflow/cli/commands/local_commands/api_server_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/api_server_command.py diff --git a/airflow/cli/commands/local_commands/cheat_sheet_command.py b/airflow-core/src/airflow/cli/commands/local_commands/cheat_sheet_command.py similarity index 100% rename from airflow/cli/commands/local_commands/cheat_sheet_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/cheat_sheet_command.py diff --git a/airflow/cli/commands/local_commands/daemon_utils.py b/airflow-core/src/airflow/cli/commands/local_commands/daemon_utils.py similarity index 100% rename from airflow/cli/commands/local_commands/daemon_utils.py rename to airflow-core/src/airflow/cli/commands/local_commands/daemon_utils.py diff --git a/airflow/cli/commands/local_commands/dag_processor_command.py b/airflow-core/src/airflow/cli/commands/local_commands/dag_processor_command.py similarity index 100% rename from airflow/cli/commands/local_commands/dag_processor_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/dag_processor_command.py diff --git a/airflow/cli/commands/local_commands/db_command.py b/airflow-core/src/airflow/cli/commands/local_commands/db_command.py similarity index 100% rename from airflow/cli/commands/local_commands/db_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/db_command.py diff --git a/airflow/cli/commands/local_commands/info_command.py b/airflow-core/src/airflow/cli/commands/local_commands/info_command.py similarity index 100% rename from airflow/cli/commands/local_commands/info_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/info_command.py diff --git a/airflow/cli/commands/local_commands/kerberos_command.py b/airflow-core/src/airflow/cli/commands/local_commands/kerberos_command.py similarity index 100% rename from airflow/cli/commands/local_commands/kerberos_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/kerberos_command.py diff --git a/airflow/cli/commands/local_commands/plugins_command.py b/airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py similarity index 100% rename from airflow/cli/commands/local_commands/plugins_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py diff --git a/airflow/cli/commands/local_commands/rotate_fernet_key_command.py b/airflow-core/src/airflow/cli/commands/local_commands/rotate_fernet_key_command.py similarity index 100% rename from airflow/cli/commands/local_commands/rotate_fernet_key_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/rotate_fernet_key_command.py diff --git a/airflow/cli/commands/local_commands/scheduler_command.py b/airflow-core/src/airflow/cli/commands/local_commands/scheduler_command.py similarity index 100% rename from airflow/cli/commands/local_commands/scheduler_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/scheduler_command.py diff --git a/airflow/cli/commands/local_commands/standalone_command.py b/airflow-core/src/airflow/cli/commands/local_commands/standalone_command.py similarity index 100% rename from airflow/cli/commands/local_commands/standalone_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/standalone_command.py diff --git a/airflow/cli/commands/local_commands/triggerer_command.py b/airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py similarity index 100% rename from airflow/cli/commands/local_commands/triggerer_command.py rename to airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py diff --git a/airflow/example_dags/plugins/__init__.py b/airflow-core/src/airflow/cli/commands/remote_commands/__init__.py similarity index 100% rename from airflow/example_dags/plugins/__init__.py rename to airflow-core/src/airflow/cli/commands/remote_commands/__init__.py diff --git a/airflow/cli/commands/remote_commands/asset_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/asset_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/asset_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/asset_command.py diff --git a/airflow/cli/commands/remote_commands/backfill_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/backfill_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/backfill_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/backfill_command.py diff --git a/airflow/cli/commands/remote_commands/config_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/config_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/config_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/config_command.py diff --git a/airflow/cli/commands/remote_commands/connection_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/connection_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/connection_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/connection_command.py diff --git a/airflow/cli/commands/remote_commands/dag_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/dag_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/dag_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/dag_command.py diff --git a/airflow/cli/commands/remote_commands/jobs_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/jobs_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/jobs_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/jobs_command.py diff --git a/airflow/cli/commands/remote_commands/pool_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/pool_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/pool_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/pool_command.py diff --git a/airflow/cli/commands/remote_commands/provider_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/provider_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/provider_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/provider_command.py diff --git a/airflow/cli/commands/remote_commands/task_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/task_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/task_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/task_command.py diff --git a/airflow/cli/commands/remote_commands/variable_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/variable_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/variable_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/variable_command.py diff --git a/airflow/cli/commands/remote_commands/version_command.py b/airflow-core/src/airflow/cli/commands/remote_commands/version_command.py similarity index 100% rename from airflow/cli/commands/remote_commands/version_command.py rename to airflow-core/src/airflow/cli/commands/remote_commands/version_command.py diff --git a/airflow/cli/simple_table.py b/airflow-core/src/airflow/cli/simple_table.py similarity index 100% rename from airflow/cli/simple_table.py rename to airflow-core/src/airflow/cli/simple_table.py diff --git a/airflow/cli/utils.py b/airflow-core/src/airflow/cli/utils.py similarity index 100% rename from airflow/cli/utils.py rename to airflow-core/src/airflow/cli/utils.py diff --git a/airflow/config_templates/__init__.py b/airflow-core/src/airflow/config_templates/__init__.py similarity index 100% rename from airflow/config_templates/__init__.py rename to airflow-core/src/airflow/config_templates/__init__.py diff --git a/airflow/config_templates/airflow_local_settings.py b/airflow-core/src/airflow/config_templates/airflow_local_settings.py similarity index 100% rename from airflow/config_templates/airflow_local_settings.py rename to airflow-core/src/airflow/config_templates/airflow_local_settings.py diff --git a/airflow/config_templates/config.yml b/airflow-core/src/airflow/config_templates/config.yml similarity index 100% rename from airflow/config_templates/config.yml rename to airflow-core/src/airflow/config_templates/config.yml diff --git a/airflow/config_templates/config.yml.schema.json b/airflow-core/src/airflow/config_templates/config.yml.schema.json similarity index 100% rename from airflow/config_templates/config.yml.schema.json rename to airflow-core/src/airflow/config_templates/config.yml.schema.json diff --git a/airflow/config_templates/default_airflow.cfg b/airflow-core/src/airflow/config_templates/default_airflow.cfg similarity index 100% rename from airflow/config_templates/default_airflow.cfg rename to airflow-core/src/airflow/config_templates/default_airflow.cfg diff --git a/airflow/config_templates/default_webserver_config.py b/airflow-core/src/airflow/config_templates/default_webserver_config.py similarity index 100% rename from airflow/config_templates/default_webserver_config.py rename to airflow-core/src/airflow/config_templates/default_webserver_config.py diff --git a/airflow/config_templates/provider_config_fallback_defaults.cfg b/airflow-core/src/airflow/config_templates/provider_config_fallback_defaults.cfg similarity index 100% rename from airflow/config_templates/provider_config_fallback_defaults.cfg rename to airflow-core/src/airflow/config_templates/provider_config_fallback_defaults.cfg diff --git a/airflow/config_templates/unit_tests.cfg b/airflow-core/src/airflow/config_templates/unit_tests.cfg similarity index 100% rename from airflow/config_templates/unit_tests.cfg rename to airflow-core/src/airflow/config_templates/unit_tests.cfg diff --git a/airflow/configuration.py b/airflow-core/src/airflow/configuration.py similarity index 99% rename from airflow/configuration.py rename to airflow-core/src/airflow/configuration.py index 8c0e913fc610a..7f8cc758f3946 100644 --- a/airflow/configuration.py +++ b/airflow-core/src/airflow/configuration.py @@ -1336,10 +1336,10 @@ def as_dict( "raw" form that can be fed back in to ConfigParser :param include_env: Should the value of configuration from AIRFLOW__ environment variables be included or not - :param include_cmds: Should the result of calling any *_cmd config be + :param include_cmds: Should the result of calling any ``*_cmd`` config be set (True, default), or should the _cmd options be left as the command to run (False) - :param include_secret: Should the result of calling any *_secret config be + :param include_secret: Should the result of calling any ``*_secret`` config be set (True, default), or should the _secret options be left as the path to get the secret from (False) :return: Dictionary, where the key is the name of the section and the content is diff --git a/airflow/customized_form_field_behaviours.schema.json b/airflow-core/src/airflow/customized_form_field_behaviours.schema.json similarity index 100% rename from airflow/customized_form_field_behaviours.schema.json rename to airflow-core/src/airflow/customized_form_field_behaviours.schema.json diff --git a/airflow/executors/__init__.py b/airflow-core/src/airflow/dag_processing/__init__.py similarity index 100% rename from airflow/executors/__init__.py rename to airflow-core/src/airflow/dag_processing/__init__.py diff --git a/airflow/io/utils/__init__.py b/airflow-core/src/airflow/dag_processing/bundles/__init__.py similarity index 100% rename from airflow/io/utils/__init__.py rename to airflow-core/src/airflow/dag_processing/bundles/__init__.py diff --git a/airflow/dag_processing/bundles/base.py b/airflow-core/src/airflow/dag_processing/bundles/base.py similarity index 100% rename from airflow/dag_processing/bundles/base.py rename to airflow-core/src/airflow/dag_processing/bundles/base.py diff --git a/airflow/dag_processing/bundles/git.py b/airflow-core/src/airflow/dag_processing/bundles/git.py similarity index 100% rename from airflow/dag_processing/bundles/git.py rename to airflow-core/src/airflow/dag_processing/bundles/git.py diff --git a/airflow/dag_processing/bundles/local.py b/airflow-core/src/airflow/dag_processing/bundles/local.py similarity index 100% rename from airflow/dag_processing/bundles/local.py rename to airflow-core/src/airflow/dag_processing/bundles/local.py diff --git a/airflow/dag_processing/bundles/manager.py b/airflow-core/src/airflow/dag_processing/bundles/manager.py similarity index 100% rename from airflow/dag_processing/bundles/manager.py rename to airflow-core/src/airflow/dag_processing/bundles/manager.py diff --git a/airflow/dag_processing/bundles/provider.yaml b/airflow-core/src/airflow/dag_processing/bundles/provider.yaml similarity index 100% rename from airflow/dag_processing/bundles/provider.yaml rename to airflow-core/src/airflow/dag_processing/bundles/provider.yaml diff --git a/airflow/dag_processing/collection.py b/airflow-core/src/airflow/dag_processing/collection.py similarity index 100% rename from airflow/dag_processing/collection.py rename to airflow-core/src/airflow/dag_processing/collection.py diff --git a/airflow/dag_processing/manager.py b/airflow-core/src/airflow/dag_processing/manager.py similarity index 100% rename from airflow/dag_processing/manager.py rename to airflow-core/src/airflow/dag_processing/manager.py diff --git a/airflow/dag_processing/processor.py b/airflow-core/src/airflow/dag_processing/processor.py similarity index 100% rename from airflow/dag_processing/processor.py rename to airflow-core/src/airflow/dag_processing/processor.py diff --git a/airflow/datasets/__init__.py b/airflow-core/src/airflow/datasets/__init__.py similarity index 100% rename from airflow/datasets/__init__.py rename to airflow-core/src/airflow/datasets/__init__.py diff --git a/airflow/datasets/metadata.py b/airflow-core/src/airflow/datasets/metadata.py similarity index 100% rename from airflow/datasets/metadata.py rename to airflow-core/src/airflow/datasets/metadata.py diff --git a/airflow/decorators/__init__.py b/airflow-core/src/airflow/decorators/__init__.py similarity index 100% rename from airflow/decorators/__init__.py rename to airflow-core/src/airflow/decorators/__init__.py diff --git a/airflow/decorators/__init__.pyi b/airflow-core/src/airflow/decorators/__init__.pyi similarity index 100% rename from airflow/decorators/__init__.pyi rename to airflow-core/src/airflow/decorators/__init__.pyi diff --git a/airflow/decorators/base.py b/airflow-core/src/airflow/decorators/base.py similarity index 100% rename from airflow/decorators/base.py rename to airflow-core/src/airflow/decorators/base.py diff --git a/airflow/decorators/bash.py b/airflow-core/src/airflow/decorators/bash.py similarity index 100% rename from airflow/decorators/bash.py rename to airflow-core/src/airflow/decorators/bash.py diff --git a/airflow/decorators/branch_external_python.py b/airflow-core/src/airflow/decorators/branch_external_python.py similarity index 100% rename from airflow/decorators/branch_external_python.py rename to airflow-core/src/airflow/decorators/branch_external_python.py diff --git a/airflow/decorators/branch_python.py b/airflow-core/src/airflow/decorators/branch_python.py similarity index 100% rename from airflow/decorators/branch_python.py rename to airflow-core/src/airflow/decorators/branch_python.py diff --git a/airflow/decorators/branch_virtualenv.py b/airflow-core/src/airflow/decorators/branch_virtualenv.py similarity index 100% rename from airflow/decorators/branch_virtualenv.py rename to airflow-core/src/airflow/decorators/branch_virtualenv.py diff --git a/airflow/decorators/condition.py b/airflow-core/src/airflow/decorators/condition.py similarity index 100% rename from airflow/decorators/condition.py rename to airflow-core/src/airflow/decorators/condition.py diff --git a/airflow/decorators/external_python.py b/airflow-core/src/airflow/decorators/external_python.py similarity index 100% rename from airflow/decorators/external_python.py rename to airflow-core/src/airflow/decorators/external_python.py diff --git a/airflow/decorators/python.py b/airflow-core/src/airflow/decorators/python.py similarity index 100% rename from airflow/decorators/python.py rename to airflow-core/src/airflow/decorators/python.py diff --git a/airflow/decorators/python_virtualenv.py b/airflow-core/src/airflow/decorators/python_virtualenv.py similarity index 100% rename from airflow/decorators/python_virtualenv.py rename to airflow-core/src/airflow/decorators/python_virtualenv.py diff --git a/airflow/decorators/sensor.py b/airflow-core/src/airflow/decorators/sensor.py similarity index 100% rename from airflow/decorators/sensor.py rename to airflow-core/src/airflow/decorators/sensor.py diff --git a/airflow/decorators/setup_teardown.py b/airflow-core/src/airflow/decorators/setup_teardown.py similarity index 100% rename from airflow/decorators/setup_teardown.py rename to airflow-core/src/airflow/decorators/setup_teardown.py diff --git a/airflow/decorators/short_circuit.py b/airflow-core/src/airflow/decorators/short_circuit.py similarity index 100% rename from airflow/decorators/short_circuit.py rename to airflow-core/src/airflow/decorators/short_circuit.py diff --git a/airflow/decorators/task_group.py b/airflow-core/src/airflow/decorators/task_group.py similarity index 100% rename from airflow/decorators/task_group.py rename to airflow-core/src/airflow/decorators/task_group.py diff --git a/airflow/example_dags/__init__.py b/airflow-core/src/airflow/example_dags/__init__.py similarity index 100% rename from airflow/example_dags/__init__.py rename to airflow-core/src/airflow/example_dags/__init__.py diff --git a/airflow/example_dags/example_asset_alias.py b/airflow-core/src/airflow/example_dags/example_asset_alias.py similarity index 100% rename from airflow/example_dags/example_asset_alias.py rename to airflow-core/src/airflow/example_dags/example_asset_alias.py diff --git a/airflow/example_dags/example_asset_alias_with_no_taskflow.py b/airflow-core/src/airflow/example_dags/example_asset_alias_with_no_taskflow.py similarity index 100% rename from airflow/example_dags/example_asset_alias_with_no_taskflow.py rename to airflow-core/src/airflow/example_dags/example_asset_alias_with_no_taskflow.py diff --git a/airflow/example_dags/example_asset_decorator.py b/airflow-core/src/airflow/example_dags/example_asset_decorator.py similarity index 100% rename from airflow/example_dags/example_asset_decorator.py rename to airflow-core/src/airflow/example_dags/example_asset_decorator.py diff --git a/airflow/example_dags/example_asset_with_watchers.py b/airflow-core/src/airflow/example_dags/example_asset_with_watchers.py similarity index 100% rename from airflow/example_dags/example_asset_with_watchers.py rename to airflow-core/src/airflow/example_dags/example_asset_with_watchers.py diff --git a/airflow/example_dags/example_assets.py b/airflow-core/src/airflow/example_dags/example_assets.py similarity index 100% rename from airflow/example_dags/example_assets.py rename to airflow-core/src/airflow/example_dags/example_assets.py diff --git a/airflow/example_dags/example_bash_decorator.py b/airflow-core/src/airflow/example_dags/example_bash_decorator.py similarity index 100% rename from airflow/example_dags/example_bash_decorator.py rename to airflow-core/src/airflow/example_dags/example_bash_decorator.py diff --git a/airflow/example_dags/example_bash_operator.py b/airflow-core/src/airflow/example_dags/example_bash_operator.py similarity index 100% rename from airflow/example_dags/example_bash_operator.py rename to airflow-core/src/airflow/example_dags/example_bash_operator.py diff --git a/airflow/example_dags/example_branch_datetime_operator.py b/airflow-core/src/airflow/example_dags/example_branch_datetime_operator.py similarity index 100% rename from airflow/example_dags/example_branch_datetime_operator.py rename to airflow-core/src/airflow/example_dags/example_branch_datetime_operator.py diff --git a/airflow/example_dags/example_branch_day_of_week_operator.py b/airflow-core/src/airflow/example_dags/example_branch_day_of_week_operator.py similarity index 100% rename from airflow/example_dags/example_branch_day_of_week_operator.py rename to airflow-core/src/airflow/example_dags/example_branch_day_of_week_operator.py diff --git a/airflow/example_dags/example_branch_labels.py b/airflow-core/src/airflow/example_dags/example_branch_labels.py similarity index 100% rename from airflow/example_dags/example_branch_labels.py rename to airflow-core/src/airflow/example_dags/example_branch_labels.py diff --git a/airflow/example_dags/example_branch_operator.py b/airflow-core/src/airflow/example_dags/example_branch_operator.py similarity index 100% rename from airflow/example_dags/example_branch_operator.py rename to airflow-core/src/airflow/example_dags/example_branch_operator.py diff --git a/airflow/example_dags/example_branch_operator_decorator.py b/airflow-core/src/airflow/example_dags/example_branch_operator_decorator.py similarity index 100% rename from airflow/example_dags/example_branch_operator_decorator.py rename to airflow-core/src/airflow/example_dags/example_branch_operator_decorator.py diff --git a/airflow/example_dags/example_branch_python_dop_operator_3.py b/airflow-core/src/airflow/example_dags/example_branch_python_dop_operator_3.py similarity index 100% rename from airflow/example_dags/example_branch_python_dop_operator_3.py rename to airflow-core/src/airflow/example_dags/example_branch_python_dop_operator_3.py diff --git a/airflow/example_dags/example_complex.py b/airflow-core/src/airflow/example_dags/example_complex.py similarity index 100% rename from airflow/example_dags/example_complex.py rename to airflow-core/src/airflow/example_dags/example_complex.py diff --git a/airflow/example_dags/example_custom_weight.py b/airflow-core/src/airflow/example_dags/example_custom_weight.py similarity index 100% rename from airflow/example_dags/example_custom_weight.py rename to airflow-core/src/airflow/example_dags/example_custom_weight.py diff --git a/airflow/example_dags/example_dag_decorator.py b/airflow-core/src/airflow/example_dags/example_dag_decorator.py similarity index 100% rename from airflow/example_dags/example_dag_decorator.py rename to airflow-core/src/airflow/example_dags/example_dag_decorator.py diff --git a/airflow/example_dags/example_display_name.py b/airflow-core/src/airflow/example_dags/example_display_name.py similarity index 100% rename from airflow/example_dags/example_display_name.py rename to airflow-core/src/airflow/example_dags/example_display_name.py diff --git a/airflow/example_dags/example_dynamic_task_mapping.py b/airflow-core/src/airflow/example_dags/example_dynamic_task_mapping.py similarity index 100% rename from airflow/example_dags/example_dynamic_task_mapping.py rename to airflow-core/src/airflow/example_dags/example_dynamic_task_mapping.py diff --git a/airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py b/airflow-core/src/airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py similarity index 100% rename from airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py rename to airflow-core/src/airflow/example_dags/example_dynamic_task_mapping_with_no_taskflow_operators.py diff --git a/airflow/example_dags/example_external_task_marker_dag.py b/airflow-core/src/airflow/example_dags/example_external_task_marker_dag.py similarity index 100% rename from airflow/example_dags/example_external_task_marker_dag.py rename to airflow-core/src/airflow/example_dags/example_external_task_marker_dag.py diff --git a/airflow/example_dags/example_inlet_event_extra.py b/airflow-core/src/airflow/example_dags/example_inlet_event_extra.py similarity index 100% rename from airflow/example_dags/example_inlet_event_extra.py rename to airflow-core/src/airflow/example_dags/example_inlet_event_extra.py diff --git a/airflow/example_dags/example_kubernetes_executor.py b/airflow-core/src/airflow/example_dags/example_kubernetes_executor.py similarity index 100% rename from airflow/example_dags/example_kubernetes_executor.py rename to airflow-core/src/airflow/example_dags/example_kubernetes_executor.py diff --git a/airflow/example_dags/example_latest_only.py b/airflow-core/src/airflow/example_dags/example_latest_only.py similarity index 100% rename from airflow/example_dags/example_latest_only.py rename to airflow-core/src/airflow/example_dags/example_latest_only.py diff --git a/airflow/example_dags/example_latest_only_with_trigger.py b/airflow-core/src/airflow/example_dags/example_latest_only_with_trigger.py similarity index 100% rename from airflow/example_dags/example_latest_only_with_trigger.py rename to airflow-core/src/airflow/example_dags/example_latest_only_with_trigger.py diff --git a/airflow/example_dags/example_local_kubernetes_executor.py b/airflow-core/src/airflow/example_dags/example_local_kubernetes_executor.py similarity index 100% rename from airflow/example_dags/example_local_kubernetes_executor.py rename to airflow-core/src/airflow/example_dags/example_local_kubernetes_executor.py diff --git a/airflow/example_dags/example_nested_branch_dag.py b/airflow-core/src/airflow/example_dags/example_nested_branch_dag.py similarity index 100% rename from airflow/example_dags/example_nested_branch_dag.py rename to airflow-core/src/airflow/example_dags/example_nested_branch_dag.py diff --git a/airflow/example_dags/example_outlet_event_extra.py b/airflow-core/src/airflow/example_dags/example_outlet_event_extra.py similarity index 100% rename from airflow/example_dags/example_outlet_event_extra.py rename to airflow-core/src/airflow/example_dags/example_outlet_event_extra.py diff --git a/airflow/example_dags/example_params_trigger_ui.py b/airflow-core/src/airflow/example_dags/example_params_trigger_ui.py similarity index 100% rename from airflow/example_dags/example_params_trigger_ui.py rename to airflow-core/src/airflow/example_dags/example_params_trigger_ui.py diff --git a/airflow/example_dags/example_params_ui_tutorial.py b/airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py similarity index 100% rename from airflow/example_dags/example_params_ui_tutorial.py rename to airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py diff --git a/airflow/example_dags/example_passing_params_via_test_command.py b/airflow-core/src/airflow/example_dags/example_passing_params_via_test_command.py similarity index 100% rename from airflow/example_dags/example_passing_params_via_test_command.py rename to airflow-core/src/airflow/example_dags/example_passing_params_via_test_command.py diff --git a/airflow/example_dags/example_python_decorator.py b/airflow-core/src/airflow/example_dags/example_python_decorator.py similarity index 100% rename from airflow/example_dags/example_python_decorator.py rename to airflow-core/src/airflow/example_dags/example_python_decorator.py diff --git a/airflow/example_dags/example_python_operator.py b/airflow-core/src/airflow/example_dags/example_python_operator.py similarity index 100% rename from airflow/example_dags/example_python_operator.py rename to airflow-core/src/airflow/example_dags/example_python_operator.py diff --git a/airflow/example_dags/example_sensor_decorator.py b/airflow-core/src/airflow/example_dags/example_sensor_decorator.py similarity index 100% rename from airflow/example_dags/example_sensor_decorator.py rename to airflow-core/src/airflow/example_dags/example_sensor_decorator.py diff --git a/airflow/example_dags/example_sensors.py b/airflow-core/src/airflow/example_dags/example_sensors.py similarity index 100% rename from airflow/example_dags/example_sensors.py rename to airflow-core/src/airflow/example_dags/example_sensors.py diff --git a/airflow/example_dags/example_setup_teardown.py b/airflow-core/src/airflow/example_dags/example_setup_teardown.py similarity index 100% rename from airflow/example_dags/example_setup_teardown.py rename to airflow-core/src/airflow/example_dags/example_setup_teardown.py diff --git a/airflow/example_dags/example_setup_teardown_taskflow.py b/airflow-core/src/airflow/example_dags/example_setup_teardown_taskflow.py similarity index 100% rename from airflow/example_dags/example_setup_teardown_taskflow.py rename to airflow-core/src/airflow/example_dags/example_setup_teardown_taskflow.py diff --git a/airflow/example_dags/example_short_circuit_decorator.py b/airflow-core/src/airflow/example_dags/example_short_circuit_decorator.py similarity index 100% rename from airflow/example_dags/example_short_circuit_decorator.py rename to airflow-core/src/airflow/example_dags/example_short_circuit_decorator.py diff --git a/airflow/example_dags/example_short_circuit_operator.py b/airflow-core/src/airflow/example_dags/example_short_circuit_operator.py similarity index 100% rename from airflow/example_dags/example_short_circuit_operator.py rename to airflow-core/src/airflow/example_dags/example_short_circuit_operator.py diff --git a/airflow/example_dags/example_simplest_dag.py b/airflow-core/src/airflow/example_dags/example_simplest_dag.py similarity index 100% rename from airflow/example_dags/example_simplest_dag.py rename to airflow-core/src/airflow/example_dags/example_simplest_dag.py diff --git a/airflow/example_dags/example_skip_dag.py b/airflow-core/src/airflow/example_dags/example_skip_dag.py similarity index 100% rename from airflow/example_dags/example_skip_dag.py rename to airflow-core/src/airflow/example_dags/example_skip_dag.py diff --git a/airflow/example_dags/example_task_group.py b/airflow-core/src/airflow/example_dags/example_task_group.py similarity index 100% rename from airflow/example_dags/example_task_group.py rename to airflow-core/src/airflow/example_dags/example_task_group.py diff --git a/airflow/example_dags/example_task_group_decorator.py b/airflow-core/src/airflow/example_dags/example_task_group_decorator.py similarity index 100% rename from airflow/example_dags/example_task_group_decorator.py rename to airflow-core/src/airflow/example_dags/example_task_group_decorator.py diff --git a/airflow/example_dags/example_time_delta_sensor_async.py b/airflow-core/src/airflow/example_dags/example_time_delta_sensor_async.py similarity index 100% rename from airflow/example_dags/example_time_delta_sensor_async.py rename to airflow-core/src/airflow/example_dags/example_time_delta_sensor_async.py diff --git a/airflow/example_dags/example_trigger_controller_dag.py b/airflow-core/src/airflow/example_dags/example_trigger_controller_dag.py similarity index 100% rename from airflow/example_dags/example_trigger_controller_dag.py rename to airflow-core/src/airflow/example_dags/example_trigger_controller_dag.py diff --git a/airflow/example_dags/example_trigger_target_dag.py b/airflow-core/src/airflow/example_dags/example_trigger_target_dag.py similarity index 100% rename from airflow/example_dags/example_trigger_target_dag.py rename to airflow-core/src/airflow/example_dags/example_trigger_target_dag.py diff --git a/airflow/example_dags/example_workday_timetable.py b/airflow-core/src/airflow/example_dags/example_workday_timetable.py similarity index 100% rename from airflow/example_dags/example_workday_timetable.py rename to airflow-core/src/airflow/example_dags/example_workday_timetable.py diff --git a/airflow/example_dags/example_xcom.py b/airflow-core/src/airflow/example_dags/example_xcom.py similarity index 100% rename from airflow/example_dags/example_xcom.py rename to airflow-core/src/airflow/example_dags/example_xcom.py diff --git a/airflow/example_dags/example_xcomargs.py b/airflow-core/src/airflow/example_dags/example_xcomargs.py similarity index 100% rename from airflow/example_dags/example_xcomargs.py rename to airflow-core/src/airflow/example_dags/example_xcomargs.py diff --git a/airflow/example_dags/libs/__init__.py b/airflow-core/src/airflow/example_dags/libs/__init__.py similarity index 100% rename from airflow/example_dags/libs/__init__.py rename to airflow-core/src/airflow/example_dags/libs/__init__.py diff --git a/airflow/example_dags/libs/helper.py b/airflow-core/src/airflow/example_dags/libs/helper.py similarity index 100% rename from airflow/example_dags/libs/helper.py rename to airflow-core/src/airflow/example_dags/libs/helper.py diff --git a/airflow/listeners/spec/__init__.py b/airflow-core/src/airflow/example_dags/plugins/__init__.py similarity index 100% rename from airflow/listeners/spec/__init__.py rename to airflow-core/src/airflow/example_dags/plugins/__init__.py diff --git a/airflow/example_dags/plugins/decreasing_priority_weight_strategy.py b/airflow-core/src/airflow/example_dags/plugins/decreasing_priority_weight_strategy.py similarity index 100% rename from airflow/example_dags/plugins/decreasing_priority_weight_strategy.py rename to airflow-core/src/airflow/example_dags/plugins/decreasing_priority_weight_strategy.py diff --git a/airflow/example_dags/plugins/event_listener.py b/airflow-core/src/airflow/example_dags/plugins/event_listener.py similarity index 100% rename from airflow/example_dags/plugins/event_listener.py rename to airflow-core/src/airflow/example_dags/plugins/event_listener.py diff --git a/airflow/example_dags/plugins/listener_plugin.py b/airflow-core/src/airflow/example_dags/plugins/listener_plugin.py similarity index 100% rename from airflow/example_dags/plugins/listener_plugin.py rename to airflow-core/src/airflow/example_dags/plugins/listener_plugin.py diff --git a/airflow/example_dags/plugins/workday.py b/airflow-core/src/airflow/example_dags/plugins/workday.py similarity index 100% rename from airflow/example_dags/plugins/workday.py rename to airflow-core/src/airflow/example_dags/plugins/workday.py diff --git a/airflow/example_dags/sql/sample.sql b/airflow-core/src/airflow/example_dags/sql/sample.sql similarity index 100% rename from airflow/example_dags/sql/sample.sql rename to airflow-core/src/airflow/example_dags/sql/sample.sql diff --git a/airflow/example_dags/sql/tutorial_taskflow_template.sql b/airflow-core/src/airflow/example_dags/sql/tutorial_taskflow_template.sql similarity index 100% rename from airflow/example_dags/sql/tutorial_taskflow_template.sql rename to airflow-core/src/airflow/example_dags/sql/tutorial_taskflow_template.sql diff --git a/airflow/example_dags/tutorial.py b/airflow-core/src/airflow/example_dags/tutorial.py similarity index 100% rename from airflow/example_dags/tutorial.py rename to airflow-core/src/airflow/example_dags/tutorial.py diff --git a/airflow/example_dags/tutorial_dag.py b/airflow-core/src/airflow/example_dags/tutorial_dag.py similarity index 100% rename from airflow/example_dags/tutorial_dag.py rename to airflow-core/src/airflow/example_dags/tutorial_dag.py diff --git a/airflow/example_dags/tutorial_objectstorage.py b/airflow-core/src/airflow/example_dags/tutorial_objectstorage.py similarity index 100% rename from airflow/example_dags/tutorial_objectstorage.py rename to airflow-core/src/airflow/example_dags/tutorial_objectstorage.py diff --git a/airflow/example_dags/tutorial_taskflow_api.py b/airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py similarity index 100% rename from airflow/example_dags/tutorial_taskflow_api.py rename to airflow-core/src/airflow/example_dags/tutorial_taskflow_api.py diff --git a/airflow/example_dags/tutorial_taskflow_api_virtualenv.py b/airflow-core/src/airflow/example_dags/tutorial_taskflow_api_virtualenv.py similarity index 100% rename from airflow/example_dags/tutorial_taskflow_api_virtualenv.py rename to airflow-core/src/airflow/example_dags/tutorial_taskflow_api_virtualenv.py diff --git a/airflow/example_dags/tutorial_taskflow_templates.py b/airflow-core/src/airflow/example_dags/tutorial_taskflow_templates.py similarity index 100% rename from airflow/example_dags/tutorial_taskflow_templates.py rename to airflow-core/src/airflow/example_dags/tutorial_taskflow_templates.py diff --git a/airflow/exceptions.py b/airflow-core/src/airflow/exceptions.py similarity index 100% rename from airflow/exceptions.py rename to airflow-core/src/airflow/exceptions.py diff --git a/airflow/metrics/__init__.py b/airflow-core/src/airflow/executors/__init__.py similarity index 100% rename from airflow/metrics/__init__.py rename to airflow-core/src/airflow/executors/__init__.py diff --git a/airflow/executors/base_executor.py b/airflow-core/src/airflow/executors/base_executor.py similarity index 100% rename from airflow/executors/base_executor.py rename to airflow-core/src/airflow/executors/base_executor.py diff --git a/airflow/executors/debug_executor.py b/airflow-core/src/airflow/executors/debug_executor.py similarity index 100% rename from airflow/executors/debug_executor.py rename to airflow-core/src/airflow/executors/debug_executor.py diff --git a/airflow/executors/executor_constants.py b/airflow-core/src/airflow/executors/executor_constants.py similarity index 100% rename from airflow/executors/executor_constants.py rename to airflow-core/src/airflow/executors/executor_constants.py diff --git a/airflow/executors/executor_loader.py b/airflow-core/src/airflow/executors/executor_loader.py similarity index 100% rename from airflow/executors/executor_loader.py rename to airflow-core/src/airflow/executors/executor_loader.py diff --git a/airflow/executors/executor_utils.py b/airflow-core/src/airflow/executors/executor_utils.py similarity index 100% rename from airflow/executors/executor_utils.py rename to airflow-core/src/airflow/executors/executor_utils.py diff --git a/airflow/executors/local_executor.py b/airflow-core/src/airflow/executors/local_executor.py similarity index 100% rename from airflow/executors/local_executor.py rename to airflow-core/src/airflow/executors/local_executor.py diff --git a/airflow/executors/sequential_executor.py b/airflow-core/src/airflow/executors/sequential_executor.py similarity index 100% rename from airflow/executors/sequential_executor.py rename to airflow-core/src/airflow/executors/sequential_executor.py diff --git a/airflow/executors/workloads.py b/airflow-core/src/airflow/executors/workloads.py similarity index 100% rename from airflow/executors/workloads.py rename to airflow-core/src/airflow/executors/workloads.py diff --git a/airflow/hooks/README.md b/airflow-core/src/airflow/hooks/README.md similarity index 92% rename from airflow/hooks/README.md rename to airflow-core/src/airflow/hooks/README.md index 2d78ea988750a..98067b1cff1c3 100644 --- a/airflow/hooks/README.md +++ b/airflow-core/src/airflow/hooks/README.md @@ -21,4 +21,4 @@ Airflow Hooks are interfaces to external platforms and databases. They implement a common interface and act as building blocks for operators. -The Hooks contained within this directory are core Airflow Hooks from which others may inherit, including the modules distributed in provider packages. They are included by default in any Airflow implementation. +The Hooks contained within this directory are core Airflow Hooks from which others may inherit, including the modules distributed in provider distributions. They are included by default in any Airflow implementation. diff --git a/airflow/hooks/__init__.py b/airflow-core/src/airflow/hooks/__init__.py similarity index 100% rename from airflow/hooks/__init__.py rename to airflow-core/src/airflow/hooks/__init__.py diff --git a/airflow/hooks/base.py b/airflow-core/src/airflow/hooks/base.py similarity index 100% rename from airflow/hooks/base.py rename to airflow-core/src/airflow/hooks/base.py diff --git a/airflow/io/__init__.py b/airflow-core/src/airflow/io/__init__.py similarity index 100% rename from airflow/io/__init__.py rename to airflow-core/src/airflow/io/__init__.py diff --git a/airflow/io/path.py b/airflow-core/src/airflow/io/path.py similarity index 100% rename from airflow/io/path.py rename to airflow-core/src/airflow/io/path.py diff --git a/airflow/io/store/__init__.py b/airflow-core/src/airflow/io/store/__init__.py similarity index 100% rename from airflow/io/store/__init__.py rename to airflow-core/src/airflow/io/store/__init__.py diff --git a/airflow/io/typedef.py b/airflow-core/src/airflow/io/typedef.py similarity index 100% rename from airflow/io/typedef.py rename to airflow-core/src/airflow/io/typedef.py diff --git a/airflow/notifications/__init__.py b/airflow-core/src/airflow/io/utils/__init__.py similarity index 100% rename from airflow/notifications/__init__.py rename to airflow-core/src/airflow/io/utils/__init__.py diff --git a/airflow/io/utils/stat.py b/airflow-core/src/airflow/io/utils/stat.py similarity index 100% rename from airflow/io/utils/stat.py rename to airflow-core/src/airflow/io/utils/stat.py diff --git a/airflow/jobs/JOB_LIFECYCLE.md b/airflow-core/src/airflow/jobs/JOB_LIFECYCLE.md similarity index 100% rename from airflow/jobs/JOB_LIFECYCLE.md rename to airflow-core/src/airflow/jobs/JOB_LIFECYCLE.md diff --git a/airflow/jobs/__init__.py b/airflow-core/src/airflow/jobs/__init__.py similarity index 100% rename from airflow/jobs/__init__.py rename to airflow-core/src/airflow/jobs/__init__.py diff --git a/airflow/jobs/base_job_runner.py b/airflow-core/src/airflow/jobs/base_job_runner.py similarity index 100% rename from airflow/jobs/base_job_runner.py rename to airflow-core/src/airflow/jobs/base_job_runner.py diff --git a/airflow/jobs/dag_processor_job_runner.py b/airflow-core/src/airflow/jobs/dag_processor_job_runner.py similarity index 100% rename from airflow/jobs/dag_processor_job_runner.py rename to airflow-core/src/airflow/jobs/dag_processor_job_runner.py diff --git a/airflow/jobs/job.py b/airflow-core/src/airflow/jobs/job.py similarity index 100% rename from airflow/jobs/job.py rename to airflow-core/src/airflow/jobs/job.py diff --git a/airflow/jobs/scheduler_job_runner.py b/airflow-core/src/airflow/jobs/scheduler_job_runner.py similarity index 100% rename from airflow/jobs/scheduler_job_runner.py rename to airflow-core/src/airflow/jobs/scheduler_job_runner.py diff --git a/airflow/jobs/triggerer_job_runner.py b/airflow-core/src/airflow/jobs/triggerer_job_runner.py similarity index 100% rename from airflow/jobs/triggerer_job_runner.py rename to airflow-core/src/airflow/jobs/triggerer_job_runner.py diff --git a/airflow/lineage/__init__.py b/airflow-core/src/airflow/lineage/__init__.py similarity index 100% rename from airflow/lineage/__init__.py rename to airflow-core/src/airflow/lineage/__init__.py diff --git a/airflow/lineage/backend.py b/airflow-core/src/airflow/lineage/backend.py similarity index 100% rename from airflow/lineage/backend.py rename to airflow-core/src/airflow/lineage/backend.py diff --git a/airflow/lineage/hook.py b/airflow-core/src/airflow/lineage/hook.py similarity index 100% rename from airflow/lineage/hook.py rename to airflow-core/src/airflow/lineage/hook.py diff --git a/airflow/listeners/__init__.py b/airflow-core/src/airflow/listeners/__init__.py similarity index 100% rename from airflow/listeners/__init__.py rename to airflow-core/src/airflow/listeners/__init__.py diff --git a/airflow/listeners/listener.py b/airflow-core/src/airflow/listeners/listener.py similarity index 100% rename from airflow/listeners/listener.py rename to airflow-core/src/airflow/listeners/listener.py diff --git a/airflow/timetables/__init__.py b/airflow-core/src/airflow/listeners/spec/__init__.py similarity index 100% rename from airflow/timetables/__init__.py rename to airflow-core/src/airflow/listeners/spec/__init__.py diff --git a/airflow/listeners/spec/asset.py b/airflow-core/src/airflow/listeners/spec/asset.py similarity index 100% rename from airflow/listeners/spec/asset.py rename to airflow-core/src/airflow/listeners/spec/asset.py diff --git a/airflow/listeners/spec/dagrun.py b/airflow-core/src/airflow/listeners/spec/dagrun.py similarity index 100% rename from airflow/listeners/spec/dagrun.py rename to airflow-core/src/airflow/listeners/spec/dagrun.py diff --git a/airflow/listeners/spec/importerrors.py b/airflow-core/src/airflow/listeners/spec/importerrors.py similarity index 100% rename from airflow/listeners/spec/importerrors.py rename to airflow-core/src/airflow/listeners/spec/importerrors.py diff --git a/airflow/listeners/spec/lifecycle.py b/airflow-core/src/airflow/listeners/spec/lifecycle.py similarity index 100% rename from airflow/listeners/spec/lifecycle.py rename to airflow-core/src/airflow/listeners/spec/lifecycle.py diff --git a/airflow/listeners/spec/taskinstance.py b/airflow-core/src/airflow/listeners/spec/taskinstance.py similarity index 100% rename from airflow/listeners/spec/taskinstance.py rename to airflow-core/src/airflow/listeners/spec/taskinstance.py diff --git a/airflow/logging_config.py b/airflow-core/src/airflow/logging_config.py similarity index 100% rename from airflow/logging_config.py rename to airflow-core/src/airflow/logging_config.py diff --git a/airflow/macros/__init__.py b/airflow-core/src/airflow/macros/__init__.py similarity index 100% rename from airflow/macros/__init__.py rename to airflow-core/src/airflow/macros/__init__.py diff --git a/dev/provider_packages/__init__.py b/airflow-core/src/airflow/metrics/__init__.py similarity index 100% rename from dev/provider_packages/__init__.py rename to airflow-core/src/airflow/metrics/__init__.py diff --git a/airflow/metrics/base_stats_logger.py b/airflow-core/src/airflow/metrics/base_stats_logger.py similarity index 100% rename from airflow/metrics/base_stats_logger.py rename to airflow-core/src/airflow/metrics/base_stats_logger.py diff --git a/airflow/metrics/datadog_logger.py b/airflow-core/src/airflow/metrics/datadog_logger.py similarity index 100% rename from airflow/metrics/datadog_logger.py rename to airflow-core/src/airflow/metrics/datadog_logger.py diff --git a/airflow/metrics/otel_logger.py b/airflow-core/src/airflow/metrics/otel_logger.py similarity index 100% rename from airflow/metrics/otel_logger.py rename to airflow-core/src/airflow/metrics/otel_logger.py diff --git a/airflow/metrics/protocols.py b/airflow-core/src/airflow/metrics/protocols.py similarity index 100% rename from airflow/metrics/protocols.py rename to airflow-core/src/airflow/metrics/protocols.py diff --git a/airflow/metrics/statsd_logger.py b/airflow-core/src/airflow/metrics/statsd_logger.py similarity index 100% rename from airflow/metrics/statsd_logger.py rename to airflow-core/src/airflow/metrics/statsd_logger.py diff --git a/airflow/metrics/validators.py b/airflow-core/src/airflow/metrics/validators.py similarity index 100% rename from airflow/metrics/validators.py rename to airflow-core/src/airflow/metrics/validators.py diff --git a/airflow/migrations/__init__.py b/airflow-core/src/airflow/migrations/__init__.py similarity index 100% rename from airflow/migrations/__init__.py rename to airflow-core/src/airflow/migrations/__init__.py diff --git a/airflow/migrations/db_types.py b/airflow-core/src/airflow/migrations/db_types.py similarity index 100% rename from airflow/migrations/db_types.py rename to airflow-core/src/airflow/migrations/db_types.py diff --git a/airflow/migrations/db_types.pyi b/airflow-core/src/airflow/migrations/db_types.pyi similarity index 100% rename from airflow/migrations/db_types.pyi rename to airflow-core/src/airflow/migrations/db_types.pyi diff --git a/airflow/migrations/env.py b/airflow-core/src/airflow/migrations/env.py similarity index 100% rename from airflow/migrations/env.py rename to airflow-core/src/airflow/migrations/env.py diff --git a/airflow/migrations/script.py.mako b/airflow-core/src/airflow/migrations/script.py.mako similarity index 100% rename from airflow/migrations/script.py.mako rename to airflow-core/src/airflow/migrations/script.py.mako diff --git a/airflow/migrations/utils.py b/airflow-core/src/airflow/migrations/utils.py similarity index 100% rename from airflow/migrations/utils.py rename to airflow-core/src/airflow/migrations/utils.py diff --git a/airflow/migrations/versions/0001_2_7_0_add_index_to_task_instance_table.py b/airflow-core/src/airflow/migrations/versions/0001_2_7_0_add_index_to_task_instance_table.py similarity index 100% rename from airflow/migrations/versions/0001_2_7_0_add_index_to_task_instance_table.py rename to airflow-core/src/airflow/migrations/versions/0001_2_7_0_add_index_to_task_instance_table.py diff --git a/airflow/migrations/versions/0002_2_7_0_add_custom_operator_name_column.py b/airflow-core/src/airflow/migrations/versions/0002_2_7_0_add_custom_operator_name_column.py similarity index 100% rename from airflow/migrations/versions/0002_2_7_0_add_custom_operator_name_column.py rename to airflow-core/src/airflow/migrations/versions/0002_2_7_0_add_custom_operator_name_column.py diff --git a/airflow/migrations/versions/0003_2_7_0_add_include_deferred_column_to_pool.py b/airflow-core/src/airflow/migrations/versions/0003_2_7_0_add_include_deferred_column_to_pool.py similarity index 100% rename from airflow/migrations/versions/0003_2_7_0_add_include_deferred_column_to_pool.py rename to airflow-core/src/airflow/migrations/versions/0003_2_7_0_add_include_deferred_column_to_pool.py diff --git a/airflow/migrations/versions/0004_2_8_0_add_clear_number_to_dag_run.py b/airflow-core/src/airflow/migrations/versions/0004_2_8_0_add_clear_number_to_dag_run.py similarity index 100% rename from airflow/migrations/versions/0004_2_8_0_add_clear_number_to_dag_run.py rename to airflow-core/src/airflow/migrations/versions/0004_2_8_0_add_clear_number_to_dag_run.py diff --git a/airflow/migrations/versions/0005_2_8_0_add_owner_display_name_to_audit_log_table.py b/airflow-core/src/airflow/migrations/versions/0005_2_8_0_add_owner_display_name_to_audit_log_table.py similarity index 100% rename from airflow/migrations/versions/0005_2_8_0_add_owner_display_name_to_audit_log_table.py rename to airflow-core/src/airflow/migrations/versions/0005_2_8_0_add_owner_display_name_to_audit_log_table.py diff --git a/airflow/migrations/versions/0006_2_8_0_make_connection_login_password_text.py b/airflow-core/src/airflow/migrations/versions/0006_2_8_0_make_connection_login_password_text.py similarity index 100% rename from airflow/migrations/versions/0006_2_8_0_make_connection_login_password_text.py rename to airflow-core/src/airflow/migrations/versions/0006_2_8_0_make_connection_login_password_text.py diff --git a/airflow/migrations/versions/0007_2_8_0_add_processor_subdir_import_error.py b/airflow-core/src/airflow/migrations/versions/0007_2_8_0_add_processor_subdir_import_error.py similarity index 100% rename from airflow/migrations/versions/0007_2_8_0_add_processor_subdir_import_error.py rename to airflow-core/src/airflow/migrations/versions/0007_2_8_0_add_processor_subdir_import_error.py diff --git a/airflow/migrations/versions/0008_2_8_1_refactor_dag_run_indexes.py b/airflow-core/src/airflow/migrations/versions/0008_2_8_1_refactor_dag_run_indexes.py similarity index 100% rename from airflow/migrations/versions/0008_2_8_1_refactor_dag_run_indexes.py rename to airflow-core/src/airflow/migrations/versions/0008_2_8_1_refactor_dag_run_indexes.py diff --git a/airflow/migrations/versions/0009_2_9_0_add_rendered_map_index_to_taskinstance.py b/airflow-core/src/airflow/migrations/versions/0009_2_9_0_add_rendered_map_index_to_taskinstance.py similarity index 100% rename from airflow/migrations/versions/0009_2_9_0_add_rendered_map_index_to_taskinstance.py rename to airflow-core/src/airflow/migrations/versions/0009_2_9_0_add_rendered_map_index_to_taskinstance.py diff --git a/airflow/migrations/versions/0010_2_9_0_add_run_id_to_audit_log_table_and_change_event_name_length.py b/airflow-core/src/airflow/migrations/versions/0010_2_9_0_add_run_id_to_audit_log_table_and_change_event_name_length.py similarity index 100% rename from airflow/migrations/versions/0010_2_9_0_add_run_id_to_audit_log_table_and_change_event_name_length.py rename to airflow-core/src/airflow/migrations/versions/0010_2_9_0_add_run_id_to_audit_log_table_and_change_event_name_length.py diff --git a/airflow/migrations/versions/0011_2_9_0_add_dataset_expression_in_dagmodel.py b/airflow-core/src/airflow/migrations/versions/0011_2_9_0_add_dataset_expression_in_dagmodel.py similarity index 100% rename from airflow/migrations/versions/0011_2_9_0_add_dataset_expression_in_dagmodel.py rename to airflow-core/src/airflow/migrations/versions/0011_2_9_0_add_dataset_expression_in_dagmodel.py diff --git a/airflow/migrations/versions/0012_2_9_0_adding_adding_max_failure_runs_column_.py b/airflow-core/src/airflow/migrations/versions/0012_2_9_0_adding_adding_max_failure_runs_column_.py similarity index 100% rename from airflow/migrations/versions/0012_2_9_0_adding_adding_max_failure_runs_column_.py rename to airflow-core/src/airflow/migrations/versions/0012_2_9_0_adding_adding_max_failure_runs_column_.py diff --git a/airflow/migrations/versions/0013_2_9_0_make_xcom_value_to_longblob_for_mysql.py b/airflow-core/src/airflow/migrations/versions/0013_2_9_0_make_xcom_value_to_longblob_for_mysql.py similarity index 100% rename from airflow/migrations/versions/0013_2_9_0_make_xcom_value_to_longblob_for_mysql.py rename to airflow-core/src/airflow/migrations/versions/0013_2_9_0_make_xcom_value_to_longblob_for_mysql.py diff --git a/airflow/migrations/versions/0014_2_9_0_add_display_name_for_dag_and_task_.py b/airflow-core/src/airflow/migrations/versions/0014_2_9_0_add_display_name_for_dag_and_task_.py similarity index 100% rename from airflow/migrations/versions/0014_2_9_0_add_display_name_for_dag_and_task_.py rename to airflow-core/src/airflow/migrations/versions/0014_2_9_0_add_display_name_for_dag_and_task_.py diff --git a/airflow/migrations/versions/0015_2_9_0_update_trigger_kwargs_type.py b/airflow-core/src/airflow/migrations/versions/0015_2_9_0_update_trigger_kwargs_type.py similarity index 100% rename from airflow/migrations/versions/0015_2_9_0_update_trigger_kwargs_type.py rename to airflow-core/src/airflow/migrations/versions/0015_2_9_0_update_trigger_kwargs_type.py diff --git a/airflow/migrations/versions/0016_2_9_2_remove_idx_last_scheduling_decision_.py b/airflow-core/src/airflow/migrations/versions/0016_2_9_2_remove_idx_last_scheduling_decision_.py similarity index 100% rename from airflow/migrations/versions/0016_2_9_2_remove_idx_last_scheduling_decision_.py rename to airflow-core/src/airflow/migrations/versions/0016_2_9_2_remove_idx_last_scheduling_decision_.py diff --git a/airflow/migrations/versions/0017_2_9_2_fix_inconsistency_between_ORM_and_migration_files.py b/airflow-core/src/airflow/migrations/versions/0017_2_9_2_fix_inconsistency_between_ORM_and_migration_files.py similarity index 100% rename from airflow/migrations/versions/0017_2_9_2_fix_inconsistency_between_ORM_and_migration_files.py rename to airflow-core/src/airflow/migrations/versions/0017_2_9_2_fix_inconsistency_between_ORM_and_migration_files.py diff --git a/airflow/migrations/versions/0018_2_10_0_add_indexes_on_dag_id_column_in_referencing_tables.py b/airflow-core/src/airflow/migrations/versions/0018_2_10_0_add_indexes_on_dag_id_column_in_referencing_tables.py similarity index 100% rename from airflow/migrations/versions/0018_2_10_0_add_indexes_on_dag_id_column_in_referencing_tables.py rename to airflow-core/src/airflow/migrations/versions/0018_2_10_0_add_indexes_on_dag_id_column_in_referencing_tables.py diff --git a/airflow/migrations/versions/0019_2_10_0_add_new_executor_field_to_db.py b/airflow-core/src/airflow/migrations/versions/0019_2_10_0_add_new_executor_field_to_db.py similarity index 100% rename from airflow/migrations/versions/0019_2_10_0_add_new_executor_field_to_db.py rename to airflow-core/src/airflow/migrations/versions/0019_2_10_0_add_new_executor_field_to_db.py diff --git a/airflow/migrations/versions/0020_2_10_0_added_dagpriorityparsingrequest_table.py b/airflow-core/src/airflow/migrations/versions/0020_2_10_0_added_dagpriorityparsingrequest_table.py similarity index 100% rename from airflow/migrations/versions/0020_2_10_0_added_dagpriorityparsingrequest_table.py rename to airflow-core/src/airflow/migrations/versions/0020_2_10_0_added_dagpriorityparsingrequest_table.py diff --git a/airflow/migrations/versions/0021_2_10_0_add_task_instance_history.py b/airflow-core/src/airflow/migrations/versions/0021_2_10_0_add_task_instance_history.py similarity index 100% rename from airflow/migrations/versions/0021_2_10_0_add_task_instance_history.py rename to airflow-core/src/airflow/migrations/versions/0021_2_10_0_add_task_instance_history.py diff --git a/airflow/migrations/versions/0022_2_10_0_add_dataset_alias.py b/airflow-core/src/airflow/migrations/versions/0022_2_10_0_add_dataset_alias.py similarity index 100% rename from airflow/migrations/versions/0022_2_10_0_add_dataset_alias.py rename to airflow-core/src/airflow/migrations/versions/0022_2_10_0_add_dataset_alias.py diff --git a/airflow/migrations/versions/0023_2_10_0_dataset_alias_dataset_event.py b/airflow-core/src/airflow/migrations/versions/0023_2_10_0_dataset_alias_dataset_event.py similarity index 100% rename from airflow/migrations/versions/0023_2_10_0_dataset_alias_dataset_event.py rename to airflow-core/src/airflow/migrations/versions/0023_2_10_0_dataset_alias_dataset_event.py diff --git a/airflow/migrations/versions/0024_2_10_0_add_try_number_to_audit_log.py b/airflow-core/src/airflow/migrations/versions/0024_2_10_0_add_try_number_to_audit_log.py similarity index 100% rename from airflow/migrations/versions/0024_2_10_0_add_try_number_to_audit_log.py rename to airflow-core/src/airflow/migrations/versions/0024_2_10_0_add_try_number_to_audit_log.py diff --git a/airflow/migrations/versions/0025_2_10_0_dataset_alias_dataset.py b/airflow-core/src/airflow/migrations/versions/0025_2_10_0_dataset_alias_dataset.py similarity index 100% rename from airflow/migrations/versions/0025_2_10_0_dataset_alias_dataset.py rename to airflow-core/src/airflow/migrations/versions/0025_2_10_0_dataset_alias_dataset.py diff --git a/airflow/migrations/versions/0026_2_10_0_dag_schedule_dataset_alias_reference.py b/airflow-core/src/airflow/migrations/versions/0026_2_10_0_dag_schedule_dataset_alias_reference.py similarity index 100% rename from airflow/migrations/versions/0026_2_10_0_dag_schedule_dataset_alias_reference.py rename to airflow-core/src/airflow/migrations/versions/0026_2_10_0_dag_schedule_dataset_alias_reference.py diff --git a/airflow/migrations/versions/0027_2_10_3_fix_dag_schedule_dataset_alias_reference_naming.py b/airflow-core/src/airflow/migrations/versions/0027_2_10_3_fix_dag_schedule_dataset_alias_reference_naming.py similarity index 100% rename from airflow/migrations/versions/0027_2_10_3_fix_dag_schedule_dataset_alias_reference_naming.py rename to airflow-core/src/airflow/migrations/versions/0027_2_10_3_fix_dag_schedule_dataset_alias_reference_naming.py diff --git a/airflow/migrations/versions/0028_3_0_0_drop_ab_user_id_foreign_key.py b/airflow-core/src/airflow/migrations/versions/0028_3_0_0_drop_ab_user_id_foreign_key.py similarity index 100% rename from airflow/migrations/versions/0028_3_0_0_drop_ab_user_id_foreign_key.py rename to airflow-core/src/airflow/migrations/versions/0028_3_0_0_drop_ab_user_id_foreign_key.py diff --git a/airflow/migrations/versions/0029_3_0_0_remove_is_subdag.py b/airflow-core/src/airflow/migrations/versions/0029_3_0_0_remove_is_subdag.py similarity index 100% rename from airflow/migrations/versions/0029_3_0_0_remove_is_subdag.py rename to airflow-core/src/airflow/migrations/versions/0029_3_0_0_remove_is_subdag.py diff --git a/airflow/migrations/versions/0030_3_0_0_rename_schedule_interval_to_timetable_.py b/airflow-core/src/airflow/migrations/versions/0030_3_0_0_rename_schedule_interval_to_timetable_.py similarity index 100% rename from airflow/migrations/versions/0030_3_0_0_rename_schedule_interval_to_timetable_.py rename to airflow-core/src/airflow/migrations/versions/0030_3_0_0_rename_schedule_interval_to_timetable_.py diff --git a/airflow/migrations/versions/0031_3_0_0_add_triggered_by_field_to_dagrun.py b/airflow-core/src/airflow/migrations/versions/0031_3_0_0_add_triggered_by_field_to_dagrun.py similarity index 100% rename from airflow/migrations/versions/0031_3_0_0_add_triggered_by_field_to_dagrun.py rename to airflow-core/src/airflow/migrations/versions/0031_3_0_0_add_triggered_by_field_to_dagrun.py diff --git a/airflow/migrations/versions/0032_3_0_0_rename_execution_date_to_logical_date_and_nullable.py b/airflow-core/src/airflow/migrations/versions/0032_3_0_0_rename_execution_date_to_logical_date_and_nullable.py similarity index 100% rename from airflow/migrations/versions/0032_3_0_0_rename_execution_date_to_logical_date_and_nullable.py rename to airflow-core/src/airflow/migrations/versions/0032_3_0_0_rename_execution_date_to_logical_date_and_nullable.py diff --git a/airflow/migrations/versions/0033_3_0_0_add_tables_for_backfill.py b/airflow-core/src/airflow/migrations/versions/0033_3_0_0_add_tables_for_backfill.py similarity index 100% rename from airflow/migrations/versions/0033_3_0_0_add_tables_for_backfill.py rename to airflow-core/src/airflow/migrations/versions/0033_3_0_0_add_tables_for_backfill.py diff --git a/airflow/migrations/versions/0034_3_0_0_remove_redundant_index.py b/airflow-core/src/airflow/migrations/versions/0034_3_0_0_remove_redundant_index.py similarity index 100% rename from airflow/migrations/versions/0034_3_0_0_remove_redundant_index.py rename to airflow-core/src/airflow/migrations/versions/0034_3_0_0_remove_redundant_index.py diff --git a/airflow/migrations/versions/0035_3_0_0_update_user_id_type.py b/airflow-core/src/airflow/migrations/versions/0035_3_0_0_update_user_id_type.py similarity index 100% rename from airflow/migrations/versions/0035_3_0_0_update_user_id_type.py rename to airflow-core/src/airflow/migrations/versions/0035_3_0_0_update_user_id_type.py diff --git a/airflow/migrations/versions/0036_3_0_0_add_name_field_to_dataset_model.py b/airflow-core/src/airflow/migrations/versions/0036_3_0_0_add_name_field_to_dataset_model.py similarity index 100% rename from airflow/migrations/versions/0036_3_0_0_add_name_field_to_dataset_model.py rename to airflow-core/src/airflow/migrations/versions/0036_3_0_0_add_name_field_to_dataset_model.py diff --git a/airflow/migrations/versions/0037_3_0_0_add_backfill_to_dag_run_model.py b/airflow-core/src/airflow/migrations/versions/0037_3_0_0_add_backfill_to_dag_run_model.py similarity index 100% rename from airflow/migrations/versions/0037_3_0_0_add_backfill_to_dag_run_model.py rename to airflow-core/src/airflow/migrations/versions/0037_3_0_0_add_backfill_to_dag_run_model.py diff --git a/airflow/migrations/versions/0038_3_0_0_add_asset_active.py b/airflow-core/src/airflow/migrations/versions/0038_3_0_0_add_asset_active.py similarity index 100% rename from airflow/migrations/versions/0038_3_0_0_add_asset_active.py rename to airflow-core/src/airflow/migrations/versions/0038_3_0_0_add_asset_active.py diff --git a/airflow/migrations/versions/0039_3_0_0_tweak_assetaliasmodel_to_match_asset.py b/airflow-core/src/airflow/migrations/versions/0039_3_0_0_tweak_assetaliasmodel_to_match_asset.py similarity index 100% rename from airflow/migrations/versions/0039_3_0_0_tweak_assetaliasmodel_to_match_asset.py rename to airflow-core/src/airflow/migrations/versions/0039_3_0_0_tweak_assetaliasmodel_to_match_asset.py diff --git a/airflow/migrations/versions/0040_3_0_0_add_exception_reason_and_logical_date_.py b/airflow-core/src/airflow/migrations/versions/0040_3_0_0_add_exception_reason_and_logical_date_.py similarity index 100% rename from airflow/migrations/versions/0040_3_0_0_add_exception_reason_and_logical_date_.py rename to airflow-core/src/airflow/migrations/versions/0040_3_0_0_add_exception_reason_and_logical_date_.py diff --git a/airflow/migrations/versions/0041_3_0_0_rename_dataset_as_asset.py b/airflow-core/src/airflow/migrations/versions/0041_3_0_0_rename_dataset_as_asset.py similarity index 100% rename from airflow/migrations/versions/0041_3_0_0_rename_dataset_as_asset.py rename to airflow-core/src/airflow/migrations/versions/0041_3_0_0_rename_dataset_as_asset.py diff --git a/airflow/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py b/airflow-core/src/airflow/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py similarity index 100% rename from airflow/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py rename to airflow-core/src/airflow/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py diff --git a/airflow/migrations/versions/0043_3_0_0_remove_scheduler_lock_column.py b/airflow-core/src/airflow/migrations/versions/0043_3_0_0_remove_scheduler_lock_column.py similarity index 100% rename from airflow/migrations/versions/0043_3_0_0_remove_scheduler_lock_column.py rename to airflow-core/src/airflow/migrations/versions/0043_3_0_0_remove_scheduler_lock_column.py diff --git a/airflow/migrations/versions/0044_3_0_0__drop_task_fail_table.py b/airflow-core/src/airflow/migrations/versions/0044_3_0_0__drop_task_fail_table.py similarity index 100% rename from airflow/migrations/versions/0044_3_0_0__drop_task_fail_table.py rename to airflow-core/src/airflow/migrations/versions/0044_3_0_0__drop_task_fail_table.py diff --git a/airflow/migrations/versions/0045_3_0_0_add_last_heartbeat_at_directly_to_ti.py b/airflow-core/src/airflow/migrations/versions/0045_3_0_0_add_last_heartbeat_at_directly_to_ti.py similarity index 100% rename from airflow/migrations/versions/0045_3_0_0_add_last_heartbeat_at_directly_to_ti.py rename to airflow-core/src/airflow/migrations/versions/0045_3_0_0_add_last_heartbeat_at_directly_to_ti.py diff --git a/airflow/migrations/versions/0046_3_0_0_drop_dag_pickling.py b/airflow-core/src/airflow/migrations/versions/0046_3_0_0_drop_dag_pickling.py similarity index 100% rename from airflow/migrations/versions/0046_3_0_0_drop_dag_pickling.py rename to airflow-core/src/airflow/migrations/versions/0046_3_0_0_drop_dag_pickling.py diff --git a/airflow/migrations/versions/0047_3_0_0_add_dag_versioning.py b/airflow-core/src/airflow/migrations/versions/0047_3_0_0_add_dag_versioning.py similarity index 100% rename from airflow/migrations/versions/0047_3_0_0_add_dag_versioning.py rename to airflow-core/src/airflow/migrations/versions/0047_3_0_0_add_dag_versioning.py diff --git a/airflow/migrations/versions/0048_3_0_0_add_trigger_asset_reference.py b/airflow-core/src/airflow/migrations/versions/0048_3_0_0_add_trigger_asset_reference.py similarity index 100% rename from airflow/migrations/versions/0048_3_0_0_add_trigger_asset_reference.py rename to airflow-core/src/airflow/migrations/versions/0048_3_0_0_add_trigger_asset_reference.py diff --git a/airflow/migrations/versions/0049_3_0_0_remove_pickled_data_from_xcom_table.py b/airflow-core/src/airflow/migrations/versions/0049_3_0_0_remove_pickled_data_from_xcom_table.py similarity index 100% rename from airflow/migrations/versions/0049_3_0_0_remove_pickled_data_from_xcom_table.py rename to airflow-core/src/airflow/migrations/versions/0049_3_0_0_remove_pickled_data_from_xcom_table.py diff --git a/airflow/migrations/versions/0050_3_0_0_add_dagbundlemodel.py b/airflow-core/src/airflow/migrations/versions/0050_3_0_0_add_dagbundlemodel.py similarity index 100% rename from airflow/migrations/versions/0050_3_0_0_add_dagbundlemodel.py rename to airflow-core/src/airflow/migrations/versions/0050_3_0_0_add_dagbundlemodel.py diff --git a/airflow/migrations/versions/0051_3_0_0_update_task_instance_trigger_timeout_to_utcdatetime.py b/airflow-core/src/airflow/migrations/versions/0051_3_0_0_update_task_instance_trigger_timeout_to_utcdatetime.py similarity index 100% rename from airflow/migrations/versions/0051_3_0_0_update_task_instance_trigger_timeout_to_utcdatetime.py rename to airflow-core/src/airflow/migrations/versions/0051_3_0_0_update_task_instance_trigger_timeout_to_utcdatetime.py diff --git a/airflow/migrations/versions/0052_3_0_0_add_deadline_alerts_table.py b/airflow-core/src/airflow/migrations/versions/0052_3_0_0_add_deadline_alerts_table.py similarity index 100% rename from airflow/migrations/versions/0052_3_0_0_add_deadline_alerts_table.py rename to airflow-core/src/airflow/migrations/versions/0052_3_0_0_add_deadline_alerts_table.py diff --git a/airflow/migrations/versions/0053_3_0_0_remove_processor_subdir.py b/airflow-core/src/airflow/migrations/versions/0053_3_0_0_remove_processor_subdir.py similarity index 100% rename from airflow/migrations/versions/0053_3_0_0_remove_processor_subdir.py rename to airflow-core/src/airflow/migrations/versions/0053_3_0_0_remove_processor_subdir.py diff --git a/airflow/migrations/versions/0054_3_0_0_add_asset_reference_models.py b/airflow-core/src/airflow/migrations/versions/0054_3_0_0_add_asset_reference_models.py similarity index 100% rename from airflow/migrations/versions/0054_3_0_0_add_asset_reference_models.py rename to airflow-core/src/airflow/migrations/versions/0054_3_0_0_add_asset_reference_models.py diff --git a/airflow/migrations/versions/0055_3_0_0_remove_pickled_data_from_dagrun_table.py b/airflow-core/src/airflow/migrations/versions/0055_3_0_0_remove_pickled_data_from_dagrun_table.py similarity index 100% rename from airflow/migrations/versions/0055_3_0_0_remove_pickled_data_from_dagrun_table.py rename to airflow-core/src/airflow/migrations/versions/0055_3_0_0_remove_pickled_data_from_dagrun_table.py diff --git a/airflow/migrations/versions/0056_3_0_0_add_relative_fileloc_column.py b/airflow-core/src/airflow/migrations/versions/0056_3_0_0_add_relative_fileloc_column.py similarity index 100% rename from airflow/migrations/versions/0056_3_0_0_add_relative_fileloc_column.py rename to airflow-core/src/airflow/migrations/versions/0056_3_0_0_add_relative_fileloc_column.py diff --git a/airflow/migrations/versions/0057_3_0_0_add_new_task_instance_field_scheduled_.py b/airflow-core/src/airflow/migrations/versions/0057_3_0_0_add_new_task_instance_field_scheduled_.py similarity index 100% rename from airflow/migrations/versions/0057_3_0_0_add_new_task_instance_field_scheduled_.py rename to airflow-core/src/airflow/migrations/versions/0057_3_0_0_add_new_task_instance_field_scheduled_.py diff --git a/airflow/migrations/versions/0058_3_0_0_add_dagrun_run_after.py b/airflow-core/src/airflow/migrations/versions/0058_3_0_0_add_dagrun_run_after.py similarity index 100% rename from airflow/migrations/versions/0058_3_0_0_add_dagrun_run_after.py rename to airflow-core/src/airflow/migrations/versions/0058_3_0_0_add_dagrun_run_after.py diff --git a/airflow/migrations/versions/0059_3_0_0_remove_external_trigger_field.py b/airflow-core/src/airflow/migrations/versions/0059_3_0_0_remove_external_trigger_field.py similarity index 100% rename from airflow/migrations/versions/0059_3_0_0_remove_external_trigger_field.py rename to airflow-core/src/airflow/migrations/versions/0059_3_0_0_remove_external_trigger_field.py diff --git a/airflow/migrations/versions/0060_3_0_0_add_try_id_to_ti_and_tih.py b/airflow-core/src/airflow/migrations/versions/0060_3_0_0_add_try_id_to_ti_and_tih.py similarity index 100% rename from airflow/migrations/versions/0060_3_0_0_add_try_id_to_ti_and_tih.py rename to airflow-core/src/airflow/migrations/versions/0060_3_0_0_add_try_id_to_ti_and_tih.py diff --git a/airflow/migrations/versions/0061_3_0_0_use_ti_id_as_primary_key_to_TINote.py b/airflow-core/src/airflow/migrations/versions/0061_3_0_0_use_ti_id_as_primary_key_to_TINote.py similarity index 100% rename from airflow/migrations/versions/0061_3_0_0_use_ti_id_as_primary_key_to_TINote.py rename to airflow-core/src/airflow/migrations/versions/0061_3_0_0_use_ti_id_as_primary_key_to_TINote.py diff --git a/airflow/migrations/versions/0062_3_0_0_remove_dag_default_view.py b/airflow-core/src/airflow/migrations/versions/0062_3_0_0_remove_dag_default_view.py similarity index 100% rename from airflow/migrations/versions/0062_3_0_0_remove_dag_default_view.py rename to airflow-core/src/airflow/migrations/versions/0062_3_0_0_remove_dag_default_view.py diff --git a/airflow/migrations/versions/0063_3_0_0_use_ti_id_as_fk_to_taskreschedule.py b/airflow-core/src/airflow/migrations/versions/0063_3_0_0_use_ti_id_as_fk_to_taskreschedule.py similarity index 100% rename from airflow/migrations/versions/0063_3_0_0_use_ti_id_as_fk_to_taskreschedule.py rename to airflow-core/src/airflow/migrations/versions/0063_3_0_0_use_ti_id_as_fk_to_taskreschedule.py diff --git a/airflow/migrations/versions/__init__.py b/airflow-core/src/airflow/migrations/versions/__init__.py similarity index 100% rename from airflow/migrations/versions/__init__.py rename to airflow-core/src/airflow/migrations/versions/__init__.py diff --git a/airflow/models/__init__.py b/airflow-core/src/airflow/models/__init__.py similarity index 100% rename from airflow/models/__init__.py rename to airflow-core/src/airflow/models/__init__.py diff --git a/airflow/models/abstractoperator.py b/airflow-core/src/airflow/models/abstractoperator.py similarity index 100% rename from airflow/models/abstractoperator.py rename to airflow-core/src/airflow/models/abstractoperator.py diff --git a/airflow/models/asset.py b/airflow-core/src/airflow/models/asset.py similarity index 100% rename from airflow/models/asset.py rename to airflow-core/src/airflow/models/asset.py diff --git a/airflow/models/backfill.py b/airflow-core/src/airflow/models/backfill.py similarity index 100% rename from airflow/models/backfill.py rename to airflow-core/src/airflow/models/backfill.py diff --git a/airflow/models/base.py b/airflow-core/src/airflow/models/base.py similarity index 100% rename from airflow/models/base.py rename to airflow-core/src/airflow/models/base.py diff --git a/airflow/models/baseoperator.py b/airflow-core/src/airflow/models/baseoperator.py similarity index 100% rename from airflow/models/baseoperator.py rename to airflow-core/src/airflow/models/baseoperator.py diff --git a/airflow/models/connection.py b/airflow-core/src/airflow/models/connection.py similarity index 100% rename from airflow/models/connection.py rename to airflow-core/src/airflow/models/connection.py diff --git a/airflow/models/crypto.py b/airflow-core/src/airflow/models/crypto.py similarity index 100% rename from airflow/models/crypto.py rename to airflow-core/src/airflow/models/crypto.py diff --git a/airflow/models/dag.py b/airflow-core/src/airflow/models/dag.py similarity index 100% rename from airflow/models/dag.py rename to airflow-core/src/airflow/models/dag.py diff --git a/airflow/models/dag_version.py b/airflow-core/src/airflow/models/dag_version.py similarity index 100% rename from airflow/models/dag_version.py rename to airflow-core/src/airflow/models/dag_version.py diff --git a/airflow/models/dagbag.py b/airflow-core/src/airflow/models/dagbag.py similarity index 100% rename from airflow/models/dagbag.py rename to airflow-core/src/airflow/models/dagbag.py diff --git a/airflow/models/dagbundle.py b/airflow-core/src/airflow/models/dagbundle.py similarity index 88% rename from airflow/models/dagbundle.py rename to airflow-core/src/airflow/models/dagbundle.py index b07e84f3bee9c..e1f99d5effcc9 100644 --- a/airflow/models/dagbundle.py +++ b/airflow-core/src/airflow/models/dagbundle.py @@ -28,9 +28,11 @@ class DagBundleModel(Base): We track the following information about each bundle, as it can be useful for informational purposes and for debugging: - - active: Is the bundle currently found in configuration? - - version: The latest version Airflow has seen for the bundle. - - last_refreshed: When the bundle was last refreshed. + + - active: Is the bundle currently found in configuration? + - version: The latest version Airflow has seen for the bundle. + - last_refreshed: When the bundle was last refreshed. + """ __tablename__ = "dag_bundle" diff --git a/airflow/models/dagcode.py b/airflow-core/src/airflow/models/dagcode.py similarity index 100% rename from airflow/models/dagcode.py rename to airflow-core/src/airflow/models/dagcode.py diff --git a/airflow/models/dagrun.py b/airflow-core/src/airflow/models/dagrun.py similarity index 100% rename from airflow/models/dagrun.py rename to airflow-core/src/airflow/models/dagrun.py diff --git a/airflow/models/dagwarning.py b/airflow-core/src/airflow/models/dagwarning.py similarity index 100% rename from airflow/models/dagwarning.py rename to airflow-core/src/airflow/models/dagwarning.py diff --git a/airflow/models/db_callback_request.py b/airflow-core/src/airflow/models/db_callback_request.py similarity index 100% rename from airflow/models/db_callback_request.py rename to airflow-core/src/airflow/models/db_callback_request.py diff --git a/airflow/models/deadline.py b/airflow-core/src/airflow/models/deadline.py similarity index 100% rename from airflow/models/deadline.py rename to airflow-core/src/airflow/models/deadline.py diff --git a/airflow/models/errors.py b/airflow-core/src/airflow/models/errors.py similarity index 100% rename from airflow/models/errors.py rename to airflow-core/src/airflow/models/errors.py diff --git a/airflow/models/expandinput.py b/airflow-core/src/airflow/models/expandinput.py similarity index 100% rename from airflow/models/expandinput.py rename to airflow-core/src/airflow/models/expandinput.py diff --git a/airflow/models/log.py b/airflow-core/src/airflow/models/log.py similarity index 100% rename from airflow/models/log.py rename to airflow-core/src/airflow/models/log.py diff --git a/airflow/models/mappedoperator.py b/airflow-core/src/airflow/models/mappedoperator.py similarity index 100% rename from airflow/models/mappedoperator.py rename to airflow-core/src/airflow/models/mappedoperator.py diff --git a/airflow/models/operator.py b/airflow-core/src/airflow/models/operator.py similarity index 100% rename from airflow/models/operator.py rename to airflow-core/src/airflow/models/operator.py diff --git a/airflow/models/param.py b/airflow-core/src/airflow/models/param.py similarity index 100% rename from airflow/models/param.py rename to airflow-core/src/airflow/models/param.py diff --git a/airflow/models/pool.py b/airflow-core/src/airflow/models/pool.py similarity index 100% rename from airflow/models/pool.py rename to airflow-core/src/airflow/models/pool.py diff --git a/airflow/models/renderedtifields.py b/airflow-core/src/airflow/models/renderedtifields.py similarity index 100% rename from airflow/models/renderedtifields.py rename to airflow-core/src/airflow/models/renderedtifields.py diff --git a/airflow/models/serialized_dag.py b/airflow-core/src/airflow/models/serialized_dag.py similarity index 100% rename from airflow/models/serialized_dag.py rename to airflow-core/src/airflow/models/serialized_dag.py diff --git a/airflow/models/skipmixin.py b/airflow-core/src/airflow/models/skipmixin.py similarity index 100% rename from airflow/models/skipmixin.py rename to airflow-core/src/airflow/models/skipmixin.py diff --git a/airflow/models/taskinstance.py b/airflow-core/src/airflow/models/taskinstance.py similarity index 100% rename from airflow/models/taskinstance.py rename to airflow-core/src/airflow/models/taskinstance.py diff --git a/airflow/models/taskinstancehistory.py b/airflow-core/src/airflow/models/taskinstancehistory.py similarity index 100% rename from airflow/models/taskinstancehistory.py rename to airflow-core/src/airflow/models/taskinstancehistory.py diff --git a/airflow/models/taskinstancekey.py b/airflow-core/src/airflow/models/taskinstancekey.py similarity index 100% rename from airflow/models/taskinstancekey.py rename to airflow-core/src/airflow/models/taskinstancekey.py diff --git a/airflow/models/tasklog.py b/airflow-core/src/airflow/models/tasklog.py similarity index 100% rename from airflow/models/tasklog.py rename to airflow-core/src/airflow/models/tasklog.py diff --git a/airflow/models/taskmap.py b/airflow-core/src/airflow/models/taskmap.py similarity index 100% rename from airflow/models/taskmap.py rename to airflow-core/src/airflow/models/taskmap.py diff --git a/airflow/models/taskmixin.py b/airflow-core/src/airflow/models/taskmixin.py similarity index 100% rename from airflow/models/taskmixin.py rename to airflow-core/src/airflow/models/taskmixin.py diff --git a/airflow/models/taskreschedule.py b/airflow-core/src/airflow/models/taskreschedule.py similarity index 100% rename from airflow/models/taskreschedule.py rename to airflow-core/src/airflow/models/taskreschedule.py diff --git a/airflow/models/trigger.py b/airflow-core/src/airflow/models/trigger.py similarity index 100% rename from airflow/models/trigger.py rename to airflow-core/src/airflow/models/trigger.py diff --git a/airflow/models/variable.py b/airflow-core/src/airflow/models/variable.py similarity index 100% rename from airflow/models/variable.py rename to airflow-core/src/airflow/models/variable.py diff --git a/airflow/models/xcom.py b/airflow-core/src/airflow/models/xcom.py similarity index 100% rename from airflow/models/xcom.py rename to airflow-core/src/airflow/models/xcom.py diff --git a/airflow/models/xcom_arg.py b/airflow-core/src/airflow/models/xcom_arg.py similarity index 100% rename from airflow/models/xcom_arg.py rename to airflow-core/src/airflow/models/xcom_arg.py diff --git a/tests/always/__init__.py b/airflow-core/src/airflow/notifications/__init__.py similarity index 100% rename from tests/always/__init__.py rename to airflow-core/src/airflow/notifications/__init__.py diff --git a/airflow/notifications/basenotifier.py b/airflow-core/src/airflow/notifications/basenotifier.py similarity index 100% rename from airflow/notifications/basenotifier.py rename to airflow-core/src/airflow/notifications/basenotifier.py diff --git a/airflow/operators/__init__.py b/airflow-core/src/airflow/operators/__init__.py similarity index 100% rename from airflow/operators/__init__.py rename to airflow-core/src/airflow/operators/__init__.py diff --git a/airflow/plugins_manager.py b/airflow-core/src/airflow/plugins_manager.py similarity index 100% rename from airflow/plugins_manager.py rename to airflow-core/src/airflow/plugins_manager.py diff --git a/airflow/policies.py b/airflow-core/src/airflow/policies.py similarity index 100% rename from airflow/policies.py rename to airflow-core/src/airflow/policies.py diff --git a/airflow/provider.yaml.schema.json b/airflow-core/src/airflow/provider.yaml.schema.json similarity index 100% rename from airflow/provider.yaml.schema.json rename to airflow-core/src/airflow/provider.yaml.schema.json diff --git a/airflow/provider_info.schema.json b/airflow-core/src/airflow/provider_info.schema.json similarity index 100% rename from airflow/provider_info.schema.json rename to airflow-core/src/airflow/provider_info.schema.json diff --git a/airflow/providers_manager.py b/airflow-core/src/airflow/providers_manager.py similarity index 99% rename from airflow/providers_manager.py rename to airflow-core/src/airflow/providers_manager.py index f42cec3b007b9..16a8d67c0bdfb 100644 --- a/airflow/providers_manager.py +++ b/airflow-core/src/airflow/providers_manager.py @@ -374,7 +374,7 @@ def wrapped_function(*args: PS.args, **kwargs: PS.kwargs) -> None: class ProvidersManager(LoggingMixin, metaclass=Singleton): """ - Manages all provider packages. + Manages all provider distributions. This is a Singleton class. The first time it is instantiated, it discovers all available providers in installed packages. diff --git a/airflow/py.typed b/airflow-core/src/airflow/py.typed similarity index 100% rename from airflow/py.typed rename to airflow-core/src/airflow/py.typed diff --git a/airflow/secrets/__init__.py b/airflow-core/src/airflow/secrets/__init__.py similarity index 100% rename from airflow/secrets/__init__.py rename to airflow-core/src/airflow/secrets/__init__.py diff --git a/airflow/secrets/base_secrets.py b/airflow-core/src/airflow/secrets/base_secrets.py similarity index 100% rename from airflow/secrets/base_secrets.py rename to airflow-core/src/airflow/secrets/base_secrets.py diff --git a/airflow/secrets/cache.py b/airflow-core/src/airflow/secrets/cache.py similarity index 100% rename from airflow/secrets/cache.py rename to airflow-core/src/airflow/secrets/cache.py diff --git a/airflow/secrets/environment_variables.py b/airflow-core/src/airflow/secrets/environment_variables.py similarity index 100% rename from airflow/secrets/environment_variables.py rename to airflow-core/src/airflow/secrets/environment_variables.py diff --git a/airflow/secrets/local_filesystem.py b/airflow-core/src/airflow/secrets/local_filesystem.py similarity index 100% rename from airflow/secrets/local_filesystem.py rename to airflow-core/src/airflow/secrets/local_filesystem.py diff --git a/airflow/secrets/metastore.py b/airflow-core/src/airflow/secrets/metastore.py similarity index 100% rename from airflow/secrets/metastore.py rename to airflow-core/src/airflow/secrets/metastore.py diff --git a/airflow/security/__init__.py b/airflow-core/src/airflow/security/__init__.py similarity index 100% rename from airflow/security/__init__.py rename to airflow-core/src/airflow/security/__init__.py diff --git a/airflow/security/kerberos.py b/airflow-core/src/airflow/security/kerberos.py similarity index 100% rename from airflow/security/kerberos.py rename to airflow-core/src/airflow/security/kerberos.py diff --git a/airflow/security/permissions.py b/airflow-core/src/airflow/security/permissions.py similarity index 100% rename from airflow/security/permissions.py rename to airflow-core/src/airflow/security/permissions.py diff --git a/airflow/security/utils.py b/airflow-core/src/airflow/security/utils.py similarity index 100% rename from airflow/security/utils.py rename to airflow-core/src/airflow/security/utils.py diff --git a/airflow/sensors/README.md b/airflow-core/src/airflow/sensors/README.md similarity index 100% rename from airflow/sensors/README.md rename to airflow-core/src/airflow/sensors/README.md diff --git a/airflow/sensors/__init__.py b/airflow-core/src/airflow/sensors/__init__.py similarity index 100% rename from airflow/sensors/__init__.py rename to airflow-core/src/airflow/sensors/__init__.py diff --git a/airflow/sensors/base.py b/airflow-core/src/airflow/sensors/base.py similarity index 100% rename from airflow/sensors/base.py rename to airflow-core/src/airflow/sensors/base.py diff --git a/airflow/sentry.py b/airflow-core/src/airflow/sentry.py similarity index 100% rename from airflow/sentry.py rename to airflow-core/src/airflow/sentry.py diff --git a/airflow/serialization/__init__.py b/airflow-core/src/airflow/serialization/__init__.py similarity index 100% rename from airflow/serialization/__init__.py rename to airflow-core/src/airflow/serialization/__init__.py diff --git a/airflow/serialization/dag_dependency.py b/airflow-core/src/airflow/serialization/dag_dependency.py similarity index 100% rename from airflow/serialization/dag_dependency.py rename to airflow-core/src/airflow/serialization/dag_dependency.py diff --git a/airflow/serialization/enums.py b/airflow-core/src/airflow/serialization/enums.py similarity index 100% rename from airflow/serialization/enums.py rename to airflow-core/src/airflow/serialization/enums.py diff --git a/airflow/serialization/helpers.py b/airflow-core/src/airflow/serialization/helpers.py similarity index 100% rename from airflow/serialization/helpers.py rename to airflow-core/src/airflow/serialization/helpers.py diff --git a/airflow/serialization/json_schema.py b/airflow-core/src/airflow/serialization/json_schema.py similarity index 100% rename from airflow/serialization/json_schema.py rename to airflow-core/src/airflow/serialization/json_schema.py diff --git a/airflow/serialization/schema.json b/airflow-core/src/airflow/serialization/schema.json similarity index 100% rename from airflow/serialization/schema.json rename to airflow-core/src/airflow/serialization/schema.json diff --git a/airflow/serialization/serde.py b/airflow-core/src/airflow/serialization/serde.py similarity index 100% rename from airflow/serialization/serde.py rename to airflow-core/src/airflow/serialization/serde.py diff --git a/airflow/serialization/serialized_objects.py b/airflow-core/src/airflow/serialization/serialized_objects.py similarity index 100% rename from airflow/serialization/serialized_objects.py rename to airflow-core/src/airflow/serialization/serialized_objects.py diff --git a/airflow/serialization/serializers/__init__.py b/airflow-core/src/airflow/serialization/serializers/__init__.py similarity index 100% rename from airflow/serialization/serializers/__init__.py rename to airflow-core/src/airflow/serialization/serializers/__init__.py diff --git a/airflow/serialization/serializers/bignum.py b/airflow-core/src/airflow/serialization/serializers/bignum.py similarity index 100% rename from airflow/serialization/serializers/bignum.py rename to airflow-core/src/airflow/serialization/serializers/bignum.py diff --git a/airflow/serialization/serializers/builtin.py b/airflow-core/src/airflow/serialization/serializers/builtin.py similarity index 100% rename from airflow/serialization/serializers/builtin.py rename to airflow-core/src/airflow/serialization/serializers/builtin.py diff --git a/airflow/serialization/serializers/datetime.py b/airflow-core/src/airflow/serialization/serializers/datetime.py similarity index 100% rename from airflow/serialization/serializers/datetime.py rename to airflow-core/src/airflow/serialization/serializers/datetime.py diff --git a/airflow/serialization/serializers/deltalake.py b/airflow-core/src/airflow/serialization/serializers/deltalake.py similarity index 100% rename from airflow/serialization/serializers/deltalake.py rename to airflow-core/src/airflow/serialization/serializers/deltalake.py diff --git a/airflow/serialization/serializers/iceberg.py b/airflow-core/src/airflow/serialization/serializers/iceberg.py similarity index 100% rename from airflow/serialization/serializers/iceberg.py rename to airflow-core/src/airflow/serialization/serializers/iceberg.py diff --git a/airflow/serialization/serializers/kubernetes.py b/airflow-core/src/airflow/serialization/serializers/kubernetes.py similarity index 100% rename from airflow/serialization/serializers/kubernetes.py rename to airflow-core/src/airflow/serialization/serializers/kubernetes.py diff --git a/airflow/serialization/serializers/numpy.py b/airflow-core/src/airflow/serialization/serializers/numpy.py similarity index 100% rename from airflow/serialization/serializers/numpy.py rename to airflow-core/src/airflow/serialization/serializers/numpy.py diff --git a/airflow/serialization/serializers/pandas.py b/airflow-core/src/airflow/serialization/serializers/pandas.py similarity index 100% rename from airflow/serialization/serializers/pandas.py rename to airflow-core/src/airflow/serialization/serializers/pandas.py diff --git a/airflow/serialization/serializers/timezone.py b/airflow-core/src/airflow/serialization/serializers/timezone.py similarity index 100% rename from airflow/serialization/serializers/timezone.py rename to airflow-core/src/airflow/serialization/serializers/timezone.py diff --git a/airflow/settings.py b/airflow-core/src/airflow/settings.py similarity index 100% rename from airflow/settings.py rename to airflow-core/src/airflow/settings.py diff --git a/airflow/stats.py b/airflow-core/src/airflow/stats.py similarity index 100% rename from airflow/stats.py rename to airflow-core/src/airflow/stats.py diff --git a/airflow/task/__init__.py b/airflow-core/src/airflow/task/__init__.py similarity index 100% rename from airflow/task/__init__.py rename to airflow-core/src/airflow/task/__init__.py diff --git a/airflow/task/priority_strategy.py b/airflow-core/src/airflow/task/priority_strategy.py similarity index 100% rename from airflow/task/priority_strategy.py rename to airflow-core/src/airflow/task/priority_strategy.py diff --git a/airflow/ti_deps/__init__.py b/airflow-core/src/airflow/ti_deps/__init__.py similarity index 100% rename from airflow/ti_deps/__init__.py rename to airflow-core/src/airflow/ti_deps/__init__.py diff --git a/airflow/ti_deps/dep_context.py b/airflow-core/src/airflow/ti_deps/dep_context.py similarity index 100% rename from airflow/ti_deps/dep_context.py rename to airflow-core/src/airflow/ti_deps/dep_context.py diff --git a/airflow/ti_deps/dependencies_deps.py b/airflow-core/src/airflow/ti_deps/dependencies_deps.py similarity index 100% rename from airflow/ti_deps/dependencies_deps.py rename to airflow-core/src/airflow/ti_deps/dependencies_deps.py diff --git a/airflow/ti_deps/dependencies_states.py b/airflow-core/src/airflow/ti_deps/dependencies_states.py similarity index 100% rename from airflow/ti_deps/dependencies_states.py rename to airflow-core/src/airflow/ti_deps/dependencies_states.py diff --git a/airflow/ti_deps/deps/__init__.py b/airflow-core/src/airflow/ti_deps/deps/__init__.py similarity index 100% rename from airflow/ti_deps/deps/__init__.py rename to airflow-core/src/airflow/ti_deps/deps/__init__.py diff --git a/airflow/ti_deps/deps/base_ti_dep.py b/airflow-core/src/airflow/ti_deps/deps/base_ti_dep.py similarity index 100% rename from airflow/ti_deps/deps/base_ti_dep.py rename to airflow-core/src/airflow/ti_deps/deps/base_ti_dep.py diff --git a/airflow/ti_deps/deps/dag_ti_slots_available_dep.py b/airflow-core/src/airflow/ti_deps/deps/dag_ti_slots_available_dep.py similarity index 100% rename from airflow/ti_deps/deps/dag_ti_slots_available_dep.py rename to airflow-core/src/airflow/ti_deps/deps/dag_ti_slots_available_dep.py diff --git a/airflow/ti_deps/deps/dag_unpaused_dep.py b/airflow-core/src/airflow/ti_deps/deps/dag_unpaused_dep.py similarity index 100% rename from airflow/ti_deps/deps/dag_unpaused_dep.py rename to airflow-core/src/airflow/ti_deps/deps/dag_unpaused_dep.py diff --git a/airflow/ti_deps/deps/dagrun_exists_dep.py b/airflow-core/src/airflow/ti_deps/deps/dagrun_exists_dep.py similarity index 100% rename from airflow/ti_deps/deps/dagrun_exists_dep.py rename to airflow-core/src/airflow/ti_deps/deps/dagrun_exists_dep.py diff --git a/airflow/ti_deps/deps/exec_date_after_start_date_dep.py b/airflow-core/src/airflow/ti_deps/deps/exec_date_after_start_date_dep.py similarity index 100% rename from airflow/ti_deps/deps/exec_date_after_start_date_dep.py rename to airflow-core/src/airflow/ti_deps/deps/exec_date_after_start_date_dep.py diff --git a/airflow/ti_deps/deps/mapped_task_expanded.py b/airflow-core/src/airflow/ti_deps/deps/mapped_task_expanded.py similarity index 100% rename from airflow/ti_deps/deps/mapped_task_expanded.py rename to airflow-core/src/airflow/ti_deps/deps/mapped_task_expanded.py diff --git a/airflow/ti_deps/deps/mapped_task_upstream_dep.py b/airflow-core/src/airflow/ti_deps/deps/mapped_task_upstream_dep.py similarity index 100% rename from airflow/ti_deps/deps/mapped_task_upstream_dep.py rename to airflow-core/src/airflow/ti_deps/deps/mapped_task_upstream_dep.py diff --git a/airflow/ti_deps/deps/not_in_retry_period_dep.py b/airflow-core/src/airflow/ti_deps/deps/not_in_retry_period_dep.py similarity index 100% rename from airflow/ti_deps/deps/not_in_retry_period_dep.py rename to airflow-core/src/airflow/ti_deps/deps/not_in_retry_period_dep.py diff --git a/airflow/ti_deps/deps/not_previously_skipped_dep.py b/airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py similarity index 100% rename from airflow/ti_deps/deps/not_previously_skipped_dep.py rename to airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py diff --git a/airflow/ti_deps/deps/pool_slots_available_dep.py b/airflow-core/src/airflow/ti_deps/deps/pool_slots_available_dep.py similarity index 100% rename from airflow/ti_deps/deps/pool_slots_available_dep.py rename to airflow-core/src/airflow/ti_deps/deps/pool_slots_available_dep.py diff --git a/airflow/ti_deps/deps/prev_dagrun_dep.py b/airflow-core/src/airflow/ti_deps/deps/prev_dagrun_dep.py similarity index 100% rename from airflow/ti_deps/deps/prev_dagrun_dep.py rename to airflow-core/src/airflow/ti_deps/deps/prev_dagrun_dep.py diff --git a/airflow/ti_deps/deps/ready_to_reschedule.py b/airflow-core/src/airflow/ti_deps/deps/ready_to_reschedule.py similarity index 100% rename from airflow/ti_deps/deps/ready_to_reschedule.py rename to airflow-core/src/airflow/ti_deps/deps/ready_to_reschedule.py diff --git a/airflow/ti_deps/deps/runnable_exec_date_dep.py b/airflow-core/src/airflow/ti_deps/deps/runnable_exec_date_dep.py similarity index 100% rename from airflow/ti_deps/deps/runnable_exec_date_dep.py rename to airflow-core/src/airflow/ti_deps/deps/runnable_exec_date_dep.py diff --git a/airflow/ti_deps/deps/task_concurrency_dep.py b/airflow-core/src/airflow/ti_deps/deps/task_concurrency_dep.py similarity index 100% rename from airflow/ti_deps/deps/task_concurrency_dep.py rename to airflow-core/src/airflow/ti_deps/deps/task_concurrency_dep.py diff --git a/airflow/ti_deps/deps/task_not_running_dep.py b/airflow-core/src/airflow/ti_deps/deps/task_not_running_dep.py similarity index 100% rename from airflow/ti_deps/deps/task_not_running_dep.py rename to airflow-core/src/airflow/ti_deps/deps/task_not_running_dep.py diff --git a/airflow/ti_deps/deps/trigger_rule_dep.py b/airflow-core/src/airflow/ti_deps/deps/trigger_rule_dep.py similarity index 100% rename from airflow/ti_deps/deps/trigger_rule_dep.py rename to airflow-core/src/airflow/ti_deps/deps/trigger_rule_dep.py diff --git a/airflow/ti_deps/deps/valid_state_dep.py b/airflow-core/src/airflow/ti_deps/deps/valid_state_dep.py similarity index 100% rename from airflow/ti_deps/deps/valid_state_dep.py rename to airflow-core/src/airflow/ti_deps/deps/valid_state_dep.py diff --git a/tests/api/__init__.py b/airflow-core/src/airflow/timetables/__init__.py similarity index 100% rename from tests/api/__init__.py rename to airflow-core/src/airflow/timetables/__init__.py diff --git a/airflow/timetables/_cron.py b/airflow-core/src/airflow/timetables/_cron.py similarity index 100% rename from airflow/timetables/_cron.py rename to airflow-core/src/airflow/timetables/_cron.py diff --git a/airflow/timetables/_delta.py b/airflow-core/src/airflow/timetables/_delta.py similarity index 100% rename from airflow/timetables/_delta.py rename to airflow-core/src/airflow/timetables/_delta.py diff --git a/airflow/timetables/assets.py b/airflow-core/src/airflow/timetables/assets.py similarity index 100% rename from airflow/timetables/assets.py rename to airflow-core/src/airflow/timetables/assets.py diff --git a/airflow/timetables/base.py b/airflow-core/src/airflow/timetables/base.py similarity index 100% rename from airflow/timetables/base.py rename to airflow-core/src/airflow/timetables/base.py diff --git a/airflow/timetables/events.py b/airflow-core/src/airflow/timetables/events.py similarity index 100% rename from airflow/timetables/events.py rename to airflow-core/src/airflow/timetables/events.py diff --git a/airflow/timetables/interval.py b/airflow-core/src/airflow/timetables/interval.py similarity index 100% rename from airflow/timetables/interval.py rename to airflow-core/src/airflow/timetables/interval.py diff --git a/airflow/timetables/simple.py b/airflow-core/src/airflow/timetables/simple.py similarity index 100% rename from airflow/timetables/simple.py rename to airflow-core/src/airflow/timetables/simple.py diff --git a/airflow/timetables/trigger.py b/airflow-core/src/airflow/timetables/trigger.py similarity index 100% rename from airflow/timetables/trigger.py rename to airflow-core/src/airflow/timetables/trigger.py diff --git a/airflow/traces/__init__.py b/airflow-core/src/airflow/traces/__init__.py similarity index 100% rename from airflow/traces/__init__.py rename to airflow-core/src/airflow/traces/__init__.py diff --git a/airflow/traces/otel_tracer.py b/airflow-core/src/airflow/traces/otel_tracer.py similarity index 100% rename from airflow/traces/otel_tracer.py rename to airflow-core/src/airflow/traces/otel_tracer.py diff --git a/airflow/traces/tracer.py b/airflow-core/src/airflow/traces/tracer.py similarity index 100% rename from airflow/traces/tracer.py rename to airflow-core/src/airflow/traces/tracer.py diff --git a/airflow/traces/utils.py b/airflow-core/src/airflow/traces/utils.py similarity index 100% rename from airflow/traces/utils.py rename to airflow-core/src/airflow/traces/utils.py diff --git a/airflow/triggers/__init__.py b/airflow-core/src/airflow/triggers/__init__.py similarity index 100% rename from airflow/triggers/__init__.py rename to airflow-core/src/airflow/triggers/__init__.py diff --git a/airflow/triggers/base.py b/airflow-core/src/airflow/triggers/base.py similarity index 100% rename from airflow/triggers/base.py rename to airflow-core/src/airflow/triggers/base.py diff --git a/airflow/triggers/testing.py b/airflow-core/src/airflow/triggers/testing.py similarity index 100% rename from airflow/triggers/testing.py rename to airflow-core/src/airflow/triggers/testing.py diff --git a/airflow/typing_compat.py b/airflow-core/src/airflow/typing_compat.py similarity index 100% rename from airflow/typing_compat.py rename to airflow-core/src/airflow/typing_compat.py diff --git a/airflow/ui/.env.example b/airflow-core/src/airflow/ui/.env.example similarity index 100% rename from airflow/ui/.env.example rename to airflow-core/src/airflow/ui/.env.example diff --git a/airflow/ui/.prettierignore b/airflow-core/src/airflow/ui/.prettierignore similarity index 100% rename from airflow/ui/.prettierignore rename to airflow-core/src/airflow/ui/.prettierignore diff --git a/airflow/ui/.prettierrc b/airflow-core/src/airflow/ui/.prettierrc similarity index 100% rename from airflow/ui/.prettierrc rename to airflow-core/src/airflow/ui/.prettierrc diff --git a/airflow/ui/CONTRIBUTING.md b/airflow-core/src/airflow/ui/CONTRIBUTING.md similarity index 100% rename from airflow/ui/CONTRIBUTING.md rename to airflow-core/src/airflow/ui/CONTRIBUTING.md diff --git a/airflow/ui/README.md b/airflow-core/src/airflow/ui/README.md similarity index 100% rename from airflow/ui/README.md rename to airflow-core/src/airflow/ui/README.md diff --git a/airflow/ui/dev/index.html b/airflow-core/src/airflow/ui/dev/index.html similarity index 100% rename from airflow/ui/dev/index.html rename to airflow-core/src/airflow/ui/dev/index.html diff --git a/airflow/ui/eslint.config.js b/airflow-core/src/airflow/ui/eslint.config.js similarity index 100% rename from airflow/ui/eslint.config.js rename to airflow-core/src/airflow/ui/eslint.config.js diff --git a/airflow/ui/index.html b/airflow-core/src/airflow/ui/index.html similarity index 100% rename from airflow/ui/index.html rename to airflow-core/src/airflow/ui/index.html diff --git a/airflow/ui/openapi-gen/queries/common.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/common.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/common.ts diff --git a/airflow/ui/openapi-gen/queries/index.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/index.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/index.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/index.ts diff --git a/airflow/ui/openapi-gen/queries/infiniteQueries.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/infiniteQueries.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/infiniteQueries.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/infiniteQueries.ts diff --git a/airflow/ui/openapi-gen/queries/prefetch.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/prefetch.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts diff --git a/airflow/ui/openapi-gen/queries/queries.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/queries.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts diff --git a/airflow/ui/openapi-gen/queries/suspense.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts similarity index 100% rename from airflow/ui/openapi-gen/queries/suspense.ts rename to airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts diff --git a/airflow/ui/openapi-gen/requests/core/ApiError.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiError.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/ApiError.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiError.ts diff --git a/airflow/ui/openapi-gen/requests/core/ApiRequestOptions.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiRequestOptions.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/ApiRequestOptions.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiRequestOptions.ts diff --git a/airflow/ui/openapi-gen/requests/core/ApiResult.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiResult.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/ApiResult.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/ApiResult.ts diff --git a/airflow/ui/openapi-gen/requests/core/CancelablePromise.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/CancelablePromise.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/CancelablePromise.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/CancelablePromise.ts diff --git a/airflow/ui/openapi-gen/requests/core/OpenAPI.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/OpenAPI.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/OpenAPI.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/OpenAPI.ts diff --git a/airflow/ui/openapi-gen/requests/core/request.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/core/request.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/core/request.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/core/request.ts diff --git a/airflow/ui/openapi-gen/requests/index.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/index.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/index.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/index.ts diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/schemas.gen.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts diff --git a/airflow/ui/openapi-gen/requests/services.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/services.gen.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts diff --git a/airflow/ui/openapi-gen/requests/types.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts similarity index 100% rename from airflow/ui/openapi-gen/requests/types.gen.ts rename to airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts diff --git a/airflow/ui/package.json b/airflow-core/src/airflow/ui/package.json similarity index 100% rename from airflow/ui/package.json rename to airflow-core/src/airflow/ui/package.json diff --git a/airflow/ui/pnpm-lock.yaml b/airflow-core/src/airflow/ui/pnpm-lock.yaml similarity index 100% rename from airflow/ui/pnpm-lock.yaml rename to airflow-core/src/airflow/ui/pnpm-lock.yaml diff --git a/airflow/ui/public/pin_32.png b/airflow-core/src/airflow/ui/public/pin_32.png similarity index 100% rename from airflow/ui/public/pin_32.png rename to airflow-core/src/airflow/ui/public/pin_32.png diff --git a/airflow/ui/rules/core.js b/airflow-core/src/airflow/ui/rules/core.js similarity index 100% rename from airflow/ui/rules/core.js rename to airflow-core/src/airflow/ui/rules/core.js diff --git a/airflow/ui/rules/levels.js b/airflow-core/src/airflow/ui/rules/levels.js similarity index 100% rename from airflow/ui/rules/levels.js rename to airflow-core/src/airflow/ui/rules/levels.js diff --git a/airflow/ui/rules/off.js b/airflow-core/src/airflow/ui/rules/off.js similarity index 100% rename from airflow/ui/rules/off.js rename to airflow-core/src/airflow/ui/rules/off.js diff --git a/airflow/ui/rules/perfectionist.js b/airflow-core/src/airflow/ui/rules/perfectionist.js similarity index 100% rename from airflow/ui/rules/perfectionist.js rename to airflow-core/src/airflow/ui/rules/perfectionist.js diff --git a/airflow/ui/rules/plugin-patch.d.ts b/airflow-core/src/airflow/ui/rules/plugin-patch.d.ts similarity index 100% rename from airflow/ui/rules/plugin-patch.d.ts rename to airflow-core/src/airflow/ui/rules/plugin-patch.d.ts diff --git a/airflow/ui/rules/prettier.js b/airflow-core/src/airflow/ui/rules/prettier.js similarity index 100% rename from airflow/ui/rules/prettier.js rename to airflow-core/src/airflow/ui/rules/prettier.js diff --git a/airflow/ui/rules/react.js b/airflow-core/src/airflow/ui/rules/react.js similarity index 100% rename from airflow/ui/rules/react.js rename to airflow-core/src/airflow/ui/rules/react.js diff --git a/airflow/ui/rules/stylistic.js b/airflow-core/src/airflow/ui/rules/stylistic.js similarity index 100% rename from airflow/ui/rules/stylistic.js rename to airflow-core/src/airflow/ui/rules/stylistic.js diff --git a/airflow/ui/rules/typescript.js b/airflow-core/src/airflow/ui/rules/typescript.js similarity index 100% rename from airflow/ui/rules/typescript.js rename to airflow-core/src/airflow/ui/rules/typescript.js diff --git a/airflow/ui/rules/unicorn.js b/airflow-core/src/airflow/ui/rules/unicorn.js similarity index 100% rename from airflow/ui/rules/unicorn.js rename to airflow-core/src/airflow/ui/rules/unicorn.js diff --git a/airflow/ui/src/assets/AirflowPin.tsx b/airflow-core/src/airflow/ui/src/assets/AirflowPin.tsx similarity index 100% rename from airflow/ui/src/assets/AirflowPin.tsx rename to airflow-core/src/airflow/ui/src/assets/AirflowPin.tsx diff --git a/airflow/ui/src/assets/DagIcon.tsx b/airflow-core/src/airflow/ui/src/assets/DagIcon.tsx similarity index 100% rename from airflow/ui/src/assets/DagIcon.tsx rename to airflow-core/src/airflow/ui/src/assets/DagIcon.tsx diff --git a/airflow/ui/src/assets/TaskIcon.tsx b/airflow-core/src/airflow/ui/src/assets/TaskIcon.tsx similarity index 100% rename from airflow/ui/src/assets/TaskIcon.tsx rename to airflow-core/src/airflow/ui/src/assets/TaskIcon.tsx diff --git a/airflow/ui/src/components/ActionAccordion/ActionAccordion.tsx b/airflow-core/src/airflow/ui/src/components/ActionAccordion/ActionAccordion.tsx similarity index 100% rename from airflow/ui/src/components/ActionAccordion/ActionAccordion.tsx rename to airflow-core/src/airflow/ui/src/components/ActionAccordion/ActionAccordion.tsx diff --git a/airflow/ui/src/components/ActionAccordion/columns.tsx b/airflow-core/src/airflow/ui/src/components/ActionAccordion/columns.tsx similarity index 100% rename from airflow/ui/src/components/ActionAccordion/columns.tsx rename to airflow-core/src/airflow/ui/src/components/ActionAccordion/columns.tsx diff --git a/airflow/ui/src/components/ActionAccordion/index.tsx b/airflow-core/src/airflow/ui/src/components/ActionAccordion/index.tsx similarity index 100% rename from airflow/ui/src/components/ActionAccordion/index.tsx rename to airflow-core/src/airflow/ui/src/components/ActionAccordion/index.tsx diff --git a/airflow/ui/src/components/AssetExpression/AndGateNode.tsx b/airflow-core/src/airflow/ui/src/components/AssetExpression/AndGateNode.tsx similarity index 100% rename from airflow/ui/src/components/AssetExpression/AndGateNode.tsx rename to airflow-core/src/airflow/ui/src/components/AssetExpression/AndGateNode.tsx diff --git a/airflow/ui/src/components/AssetExpression/AssetExpression.tsx b/airflow-core/src/airflow/ui/src/components/AssetExpression/AssetExpression.tsx similarity index 100% rename from airflow/ui/src/components/AssetExpression/AssetExpression.tsx rename to airflow-core/src/airflow/ui/src/components/AssetExpression/AssetExpression.tsx diff --git a/airflow/ui/src/components/AssetExpression/AssetNode.tsx b/airflow-core/src/airflow/ui/src/components/AssetExpression/AssetNode.tsx similarity index 100% rename from airflow/ui/src/components/AssetExpression/AssetNode.tsx rename to airflow-core/src/airflow/ui/src/components/AssetExpression/AssetNode.tsx diff --git a/airflow/ui/src/components/AssetExpression/OrGateNode.tsx b/airflow-core/src/airflow/ui/src/components/AssetExpression/OrGateNode.tsx similarity index 100% rename from airflow/ui/src/components/AssetExpression/OrGateNode.tsx rename to airflow-core/src/airflow/ui/src/components/AssetExpression/OrGateNode.tsx diff --git a/airflow/ui/src/components/AssetExpression/index.ts b/airflow-core/src/airflow/ui/src/components/AssetExpression/index.ts similarity index 100% rename from airflow/ui/src/components/AssetExpression/index.ts rename to airflow-core/src/airflow/ui/src/components/AssetExpression/index.ts diff --git a/airflow/ui/src/components/AssetExpression/types.ts b/airflow-core/src/airflow/ui/src/components/AssetExpression/types.ts similarity index 100% rename from airflow/ui/src/components/AssetExpression/types.ts rename to airflow-core/src/airflow/ui/src/components/AssetExpression/types.ts diff --git a/airflow/ui/src/components/Assets/AssetEvent.tsx b/airflow-core/src/airflow/ui/src/components/Assets/AssetEvent.tsx similarity index 100% rename from airflow/ui/src/components/Assets/AssetEvent.tsx rename to airflow-core/src/airflow/ui/src/components/Assets/AssetEvent.tsx diff --git a/airflow/ui/src/components/Assets/AssetEvents.tsx b/airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx similarity index 100% rename from airflow/ui/src/components/Assets/AssetEvents.tsx rename to airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx diff --git a/airflow/ui/src/components/Banner/BackfillBanner.tsx b/airflow-core/src/airflow/ui/src/components/Banner/BackfillBanner.tsx similarity index 100% rename from airflow/ui/src/components/Banner/BackfillBanner.tsx rename to airflow-core/src/airflow/ui/src/components/Banner/BackfillBanner.tsx diff --git a/airflow/ui/src/components/Banner/index.tsx b/airflow-core/src/airflow/ui/src/components/Banner/index.tsx similarity index 100% rename from airflow/ui/src/components/Banner/index.tsx rename to airflow-core/src/airflow/ui/src/components/Banner/index.tsx diff --git a/airflow/ui/src/components/BreadcrumbStats.tsx b/airflow-core/src/airflow/ui/src/components/BreadcrumbStats.tsx similarity index 100% rename from airflow/ui/src/components/BreadcrumbStats.tsx rename to airflow-core/src/airflow/ui/src/components/BreadcrumbStats.tsx diff --git a/airflow/ui/src/components/Clear/Run/ClearRunButton.tsx b/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunButton.tsx similarity index 100% rename from airflow/ui/src/components/Clear/Run/ClearRunButton.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunButton.tsx diff --git a/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx b/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx similarity index 100% rename from airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx diff --git a/airflow/ui/src/components/Clear/Run/index.tsx b/airflow-core/src/airflow/ui/src/components/Clear/Run/index.tsx similarity index 100% rename from airflow/ui/src/components/Clear/Run/index.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/Run/index.tsx diff --git a/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceButton.tsx b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceButton.tsx similarity index 100% rename from airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceButton.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceButton.tsx diff --git a/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx similarity index 100% rename from airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx diff --git a/airflow/ui/src/components/Clear/TaskInstance/index.tsx b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/index.tsx similarity index 100% rename from airflow/ui/src/components/Clear/TaskInstance/index.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/index.tsx diff --git a/airflow/ui/src/components/Clear/columns.tsx b/airflow-core/src/airflow/ui/src/components/Clear/columns.tsx similarity index 100% rename from airflow/ui/src/components/Clear/columns.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/columns.tsx diff --git a/airflow/ui/src/components/Clear/index.tsx b/airflow-core/src/airflow/ui/src/components/Clear/index.tsx similarity index 100% rename from airflow/ui/src/components/Clear/index.tsx rename to airflow-core/src/airflow/ui/src/components/Clear/index.tsx diff --git a/airflow/ui/src/components/ConfirmationModal.tsx b/airflow-core/src/airflow/ui/src/components/ConfirmationModal.tsx similarity index 100% rename from airflow/ui/src/components/ConfirmationModal.tsx rename to airflow-core/src/airflow/ui/src/components/ConfirmationModal.tsx diff --git a/airflow/ui/src/components/DagActions/ParseDag.tsx b/airflow-core/src/airflow/ui/src/components/DagActions/ParseDag.tsx similarity index 100% rename from airflow/ui/src/components/DagActions/ParseDag.tsx rename to airflow-core/src/airflow/ui/src/components/DagActions/ParseDag.tsx diff --git a/airflow/ui/src/components/DagActions/RunBackfillButton.tsx b/airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillButton.tsx similarity index 100% rename from airflow/ui/src/components/DagActions/RunBackfillButton.tsx rename to airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillButton.tsx diff --git a/airflow/ui/src/components/DagActions/RunBackfillForm.tsx b/airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillForm.tsx similarity index 100% rename from airflow/ui/src/components/DagActions/RunBackfillForm.tsx rename to airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillForm.tsx diff --git a/airflow/ui/src/components/DagActions/RunBackfillModal.tsx b/airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillModal.tsx similarity index 100% rename from airflow/ui/src/components/DagActions/RunBackfillModal.tsx rename to airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillModal.tsx diff --git a/airflow/ui/src/components/DagRunInfo.tsx b/airflow-core/src/airflow/ui/src/components/DagRunInfo.tsx similarity index 100% rename from airflow/ui/src/components/DagRunInfo.tsx rename to airflow-core/src/airflow/ui/src/components/DagRunInfo.tsx diff --git a/airflow/ui/src/components/DagVersionDetails.tsx b/airflow-core/src/airflow/ui/src/components/DagVersionDetails.tsx similarity index 100% rename from airflow/ui/src/components/DagVersionDetails.tsx rename to airflow-core/src/airflow/ui/src/components/DagVersionDetails.tsx diff --git a/airflow/ui/src/components/DagVersionSelect.tsx b/airflow-core/src/airflow/ui/src/components/DagVersionSelect.tsx similarity index 100% rename from airflow/ui/src/components/DagVersionSelect.tsx rename to airflow-core/src/airflow/ui/src/components/DagVersionSelect.tsx diff --git a/airflow/ui/src/components/DataTable/CardList.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/CardList.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/CardList.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/CardList.tsx diff --git a/airflow/ui/src/components/DataTable/DataTable.test.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.test.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/DataTable.test.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/DataTable.test.tsx diff --git a/airflow/ui/src/components/DataTable/DataTable.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/DataTable.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx diff --git a/airflow/ui/src/components/DataTable/TableList.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/TableList.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/TableList.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/TableList.tsx diff --git a/airflow/ui/src/components/DataTable/ToggleTableDisplay.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/ToggleTableDisplay.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/ToggleTableDisplay.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/ToggleTableDisplay.tsx diff --git a/airflow/ui/src/components/DataTable/index.ts b/airflow-core/src/airflow/ui/src/components/DataTable/index.ts similarity index 100% rename from airflow/ui/src/components/DataTable/index.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/index.ts diff --git a/airflow/ui/src/components/DataTable/searchParams.test.ts b/airflow-core/src/airflow/ui/src/components/DataTable/searchParams.test.ts similarity index 100% rename from airflow/ui/src/components/DataTable/searchParams.test.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/searchParams.test.ts diff --git a/airflow/ui/src/components/DataTable/searchParams.ts b/airflow-core/src/airflow/ui/src/components/DataTable/searchParams.ts similarity index 100% rename from airflow/ui/src/components/DataTable/searchParams.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/searchParams.ts diff --git a/airflow/ui/src/components/DataTable/skeleton.tsx b/airflow-core/src/airflow/ui/src/components/DataTable/skeleton.tsx similarity index 100% rename from airflow/ui/src/components/DataTable/skeleton.tsx rename to airflow-core/src/airflow/ui/src/components/DataTable/skeleton.tsx diff --git a/airflow/ui/src/components/DataTable/types.ts b/airflow-core/src/airflow/ui/src/components/DataTable/types.ts similarity index 100% rename from airflow/ui/src/components/DataTable/types.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/types.ts diff --git a/airflow/ui/src/components/DataTable/useRowSelection.ts b/airflow-core/src/airflow/ui/src/components/DataTable/useRowSelection.ts similarity index 100% rename from airflow/ui/src/components/DataTable/useRowSelection.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/useRowSelection.ts diff --git a/airflow/ui/src/components/DataTable/useTableUrlState.ts b/airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts similarity index 100% rename from airflow/ui/src/components/DataTable/useTableUrlState.ts rename to airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts diff --git a/airflow/ui/src/components/DisplayMarkdownButton.tsx b/airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx similarity index 100% rename from airflow/ui/src/components/DisplayMarkdownButton.tsx rename to airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx diff --git a/airflow/ui/src/components/DurationChart.tsx b/airflow-core/src/airflow/ui/src/components/DurationChart.tsx similarity index 100% rename from airflow/ui/src/components/DurationChart.tsx rename to airflow-core/src/airflow/ui/src/components/DurationChart.tsx diff --git a/airflow/ui/src/components/EditableMarkdownButton.tsx b/airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx similarity index 100% rename from airflow/ui/src/components/EditableMarkdownButton.tsx rename to airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx diff --git a/airflow/ui/src/components/ErrorAlert.tsx b/airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx similarity index 100% rename from airflow/ui/src/components/ErrorAlert.tsx rename to airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldAdvancedArray.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldAdvancedArray.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldAdvancedArray.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldAdvancedArray.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldBool.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldBool.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldBool.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldBool.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldDateTime.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldDateTime.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldDateTime.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldDateTime.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldDropdown.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldDropdown.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldDropdown.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldDropdown.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldMultilineText.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultilineText.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldMultilineText.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultilineText.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldNumber.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldNumber.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldNumber.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldNumber.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldObject.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldObject.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldObject.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldObject.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldRow.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldRow.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldRow.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldRow.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldSelector.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldString.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldString.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldString.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldString.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FieldStringArray.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldStringArray.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FieldStringArray.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldStringArray.tsx diff --git a/airflow/ui/src/components/FlexibleForm/FlexibleForm.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FlexibleForm.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/FlexibleForm.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/FlexibleForm.tsx diff --git a/airflow/ui/src/components/FlexibleForm/HiddenInput.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/HiddenInput.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/HiddenInput.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/HiddenInput.tsx diff --git a/airflow/ui/src/components/FlexibleForm/Row.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/Row.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/Row.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/Row.tsx diff --git a/airflow/ui/src/components/FlexibleForm/index.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/index.tsx similarity index 100% rename from airflow/ui/src/components/FlexibleForm/index.tsx rename to airflow-core/src/airflow/ui/src/components/FlexibleForm/index.tsx diff --git a/airflow/ui/src/components/Graph/AliasNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/AliasNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/AliasNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/AliasNode.tsx diff --git a/airflow/ui/src/components/Graph/AssetConditionNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/AssetConditionNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/AssetConditionNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/AssetConditionNode.tsx diff --git a/airflow/ui/src/components/Graph/AssetNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/AssetNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/AssetNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/AssetNode.tsx diff --git a/airflow/ui/src/components/Graph/DagNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/DagNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx diff --git a/airflow/ui/src/components/Graph/Edge.tsx b/airflow-core/src/airflow/ui/src/components/Graph/Edge.tsx similarity index 100% rename from airflow/ui/src/components/Graph/Edge.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/Edge.tsx diff --git a/airflow/ui/src/components/Graph/JoinNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/JoinNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/JoinNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/JoinNode.tsx diff --git a/airflow/ui/src/components/Graph/NodeWrapper.tsx b/airflow-core/src/airflow/ui/src/components/Graph/NodeWrapper.tsx similarity index 100% rename from airflow/ui/src/components/Graph/NodeWrapper.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/NodeWrapper.tsx diff --git a/airflow/ui/src/components/Graph/TaskLink.tsx b/airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx similarity index 100% rename from airflow/ui/src/components/Graph/TaskLink.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx diff --git a/airflow/ui/src/components/Graph/TaskNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx similarity index 100% rename from airflow/ui/src/components/Graph/TaskNode.tsx rename to airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx diff --git a/airflow/ui/src/components/Graph/reactflowUtils.ts b/airflow-core/src/airflow/ui/src/components/Graph/reactflowUtils.ts similarity index 100% rename from airflow/ui/src/components/Graph/reactflowUtils.ts rename to airflow-core/src/airflow/ui/src/components/Graph/reactflowUtils.ts diff --git a/airflow/ui/src/components/Graph/useGraphLayout.ts b/airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts similarity index 100% rename from airflow/ui/src/components/Graph/useGraphLayout.ts rename to airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts diff --git a/airflow/ui/src/components/HeaderCard.tsx b/airflow-core/src/airflow/ui/src/components/HeaderCard.tsx similarity index 100% rename from airflow/ui/src/components/HeaderCard.tsx rename to airflow-core/src/airflow/ui/src/components/HeaderCard.tsx diff --git a/airflow/ui/src/components/JsonEditor.tsx b/airflow-core/src/airflow/ui/src/components/JsonEditor.tsx similarity index 100% rename from airflow/ui/src/components/JsonEditor.tsx rename to airflow-core/src/airflow/ui/src/components/JsonEditor.tsx diff --git a/airflow/ui/src/components/LimitedItemsList.tsx b/airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx similarity index 100% rename from airflow/ui/src/components/LimitedItemsList.tsx rename to airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx diff --git a/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx diff --git a/airflow/ui/src/components/MarkAs/Run/MarkRunAsDialog.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsDialog.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/Run/MarkRunAsDialog.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsDialog.tsx diff --git a/airflow/ui/src/components/MarkAs/Run/index.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/Run/index.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/Run/index.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/Run/index.tsx diff --git a/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx diff --git a/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsDialog.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsDialog.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsDialog.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsDialog.tsx diff --git a/airflow/ui/src/components/MarkAs/TaskInstance/index.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/index.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/TaskInstance/index.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/index.tsx diff --git a/airflow/ui/src/components/MarkAs/index.tsx b/airflow-core/src/airflow/ui/src/components/MarkAs/index.tsx similarity index 100% rename from airflow/ui/src/components/MarkAs/index.tsx rename to airflow-core/src/airflow/ui/src/components/MarkAs/index.tsx diff --git a/airflow/ui/src/components/MarkAs/utils.ts b/airflow-core/src/airflow/ui/src/components/MarkAs/utils.ts similarity index 100% rename from airflow/ui/src/components/MarkAs/utils.ts rename to airflow-core/src/airflow/ui/src/components/MarkAs/utils.ts diff --git a/airflow/ui/src/components/QuickFilterButton.tsx b/airflow-core/src/airflow/ui/src/components/QuickFilterButton.tsx similarity index 100% rename from airflow/ui/src/components/QuickFilterButton.tsx rename to airflow-core/src/airflow/ui/src/components/QuickFilterButton.tsx diff --git a/airflow/ui/src/components/ReactMarkdown.tsx b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx similarity index 100% rename from airflow/ui/src/components/ReactMarkdown.tsx rename to airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx diff --git a/airflow/ui/src/components/RenderedJsonField.tsx b/airflow-core/src/airflow/ui/src/components/RenderedJsonField.tsx similarity index 100% rename from airflow/ui/src/components/RenderedJsonField.tsx rename to airflow-core/src/airflow/ui/src/components/RenderedJsonField.tsx diff --git a/airflow/ui/src/components/RunTypeIcon.tsx b/airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx similarity index 100% rename from airflow/ui/src/components/RunTypeIcon.tsx rename to airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx diff --git a/airflow/ui/src/components/SearchBar.test.tsx b/airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx similarity index 100% rename from airflow/ui/src/components/SearchBar.test.tsx rename to airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx diff --git a/airflow/ui/src/components/SearchBar.tsx b/airflow-core/src/airflow/ui/src/components/SearchBar.tsx similarity index 100% rename from airflow/ui/src/components/SearchBar.tsx rename to airflow-core/src/airflow/ui/src/components/SearchBar.tsx diff --git a/airflow/ui/src/components/SearchDags/SearchDags.tsx b/airflow-core/src/airflow/ui/src/components/SearchDags/SearchDags.tsx similarity index 100% rename from airflow/ui/src/components/SearchDags/SearchDags.tsx rename to airflow-core/src/airflow/ui/src/components/SearchDags/SearchDags.tsx diff --git a/airflow/ui/src/components/SearchDags/SearchDagsButton.tsx b/airflow-core/src/airflow/ui/src/components/SearchDags/SearchDagsButton.tsx similarity index 100% rename from airflow/ui/src/components/SearchDags/SearchDagsButton.tsx rename to airflow-core/src/airflow/ui/src/components/SearchDags/SearchDagsButton.tsx diff --git a/airflow/ui/src/components/SearchDags/SearchDagsDropdownIndicator.tsx b/airflow-core/src/airflow/ui/src/components/SearchDags/SearchDagsDropdownIndicator.tsx similarity index 100% rename from airflow/ui/src/components/SearchDags/SearchDagsDropdownIndicator.tsx rename to airflow-core/src/airflow/ui/src/components/SearchDags/SearchDagsDropdownIndicator.tsx diff --git a/airflow/ui/src/components/SearchDags/index.ts b/airflow-core/src/airflow/ui/src/components/SearchDags/index.ts similarity index 100% rename from airflow/ui/src/components/SearchDags/index.ts rename to airflow-core/src/airflow/ui/src/components/SearchDags/index.ts diff --git a/airflow/ui/src/components/Stat.tsx b/airflow-core/src/airflow/ui/src/components/Stat.tsx similarity index 100% rename from airflow/ui/src/components/Stat.tsx rename to airflow-core/src/airflow/ui/src/components/Stat.tsx diff --git a/airflow/ui/src/components/StateBadge.tsx b/airflow-core/src/airflow/ui/src/components/StateBadge.tsx similarity index 100% rename from airflow/ui/src/components/StateBadge.tsx rename to airflow-core/src/airflow/ui/src/components/StateBadge.tsx diff --git a/airflow/ui/src/components/StateIcon.tsx b/airflow-core/src/airflow/ui/src/components/StateIcon.tsx similarity index 100% rename from airflow/ui/src/components/StateIcon.tsx rename to airflow-core/src/airflow/ui/src/components/StateIcon.tsx diff --git a/airflow/ui/src/components/TaskInstanceTooltip.tsx b/airflow-core/src/airflow/ui/src/components/TaskInstanceTooltip.tsx similarity index 100% rename from airflow/ui/src/components/TaskInstanceTooltip.tsx rename to airflow-core/src/airflow/ui/src/components/TaskInstanceTooltip.tsx diff --git a/airflow/ui/src/components/TaskName.tsx b/airflow-core/src/airflow/ui/src/components/TaskName.tsx similarity index 100% rename from airflow/ui/src/components/TaskName.tsx rename to airflow-core/src/airflow/ui/src/components/TaskName.tsx diff --git a/airflow/ui/src/components/TaskTrySelect.tsx b/airflow-core/src/airflow/ui/src/components/TaskTrySelect.tsx similarity index 100% rename from airflow/ui/src/components/TaskTrySelect.tsx rename to airflow-core/src/airflow/ui/src/components/TaskTrySelect.tsx diff --git a/airflow/ui/src/components/Time.test.tsx b/airflow-core/src/airflow/ui/src/components/Time.test.tsx similarity index 100% rename from airflow/ui/src/components/Time.test.tsx rename to airflow-core/src/airflow/ui/src/components/Time.test.tsx diff --git a/airflow/ui/src/components/Time.tsx b/airflow-core/src/airflow/ui/src/components/Time.tsx similarity index 100% rename from airflow/ui/src/components/Time.tsx rename to airflow-core/src/airflow/ui/src/components/Time.tsx diff --git a/airflow/ui/src/components/TimeRangeSelector.tsx b/airflow-core/src/airflow/ui/src/components/TimeRangeSelector.tsx similarity index 100% rename from airflow/ui/src/components/TimeRangeSelector.tsx rename to airflow-core/src/airflow/ui/src/components/TimeRangeSelector.tsx diff --git a/airflow/ui/src/components/TogglePause.tsx b/airflow-core/src/airflow/ui/src/components/TogglePause.tsx similarity index 100% rename from airflow/ui/src/components/TogglePause.tsx rename to airflow-core/src/airflow/ui/src/components/TogglePause.tsx diff --git a/airflow/ui/src/components/TrendCountButton.tsx b/airflow-core/src/airflow/ui/src/components/TrendCountButton.tsx similarity index 100% rename from airflow/ui/src/components/TrendCountButton.tsx rename to airflow-core/src/airflow/ui/src/components/TrendCountButton.tsx diff --git a/airflow/ui/src/components/TrendCountChart.tsx b/airflow-core/src/airflow/ui/src/components/TrendCountChart.tsx similarity index 100% rename from airflow/ui/src/components/TrendCountChart.tsx rename to airflow-core/src/airflow/ui/src/components/TrendCountChart.tsx diff --git a/airflow/ui/src/components/TriggerDag/EditableMarkdown.tsx b/airflow-core/src/airflow/ui/src/components/TriggerDag/EditableMarkdown.tsx similarity index 100% rename from airflow/ui/src/components/TriggerDag/EditableMarkdown.tsx rename to airflow-core/src/airflow/ui/src/components/TriggerDag/EditableMarkdown.tsx diff --git a/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx b/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx similarity index 100% rename from airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx rename to airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx diff --git a/airflow/ui/src/components/TriggerDag/TriggerDAGForm.tsx b/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGForm.tsx similarity index 100% rename from airflow/ui/src/components/TriggerDag/TriggerDAGForm.tsx rename to airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGForm.tsx diff --git a/airflow/ui/src/components/TriggerDag/TriggerDAGModal.tsx b/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGModal.tsx similarity index 100% rename from airflow/ui/src/components/TriggerDag/TriggerDAGModal.tsx rename to airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGModal.tsx diff --git a/airflow/ui/src/components/TruncatedText.tsx b/airflow-core/src/airflow/ui/src/components/TruncatedText.tsx similarity index 100% rename from airflow/ui/src/components/TruncatedText.tsx rename to airflow-core/src/airflow/ui/src/components/TruncatedText.tsx diff --git a/airflow/ui/src/components/ui/Accordion/ItemContent.tsx b/airflow-core/src/airflow/ui/src/components/ui/Accordion/ItemContent.tsx similarity index 100% rename from airflow/ui/src/components/ui/Accordion/ItemContent.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Accordion/ItemContent.tsx diff --git a/airflow/ui/src/components/ui/Accordion/ItemTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Accordion/ItemTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Accordion/ItemTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Accordion/ItemTrigger.tsx diff --git a/airflow/ui/src/components/ui/Accordion/index.tsx b/airflow-core/src/airflow/ui/src/components/ui/Accordion/index.tsx similarity index 100% rename from airflow/ui/src/components/ui/Accordion/index.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Accordion/index.tsx diff --git a/airflow/ui/src/components/ui/ActionBar/BarContent.tsx b/airflow-core/src/airflow/ui/src/components/ui/ActionBar/BarContent.tsx similarity index 100% rename from airflow/ui/src/components/ui/ActionBar/BarContent.tsx rename to airflow-core/src/airflow/ui/src/components/ui/ActionBar/BarContent.tsx diff --git a/airflow/ui/src/components/ui/ActionBar/CloseTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/ActionBar/CloseTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/ActionBar/CloseTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/ActionBar/CloseTrigger.tsx diff --git a/airflow/ui/src/components/ui/ActionBar/index.ts b/airflow-core/src/airflow/ui/src/components/ui/ActionBar/index.ts similarity index 100% rename from airflow/ui/src/components/ui/ActionBar/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/ActionBar/index.ts diff --git a/airflow/ui/src/components/ui/ActionButton.tsx b/airflow-core/src/airflow/ui/src/components/ui/ActionButton.tsx similarity index 100% rename from airflow/ui/src/components/ui/ActionButton.tsx rename to airflow-core/src/airflow/ui/src/components/ui/ActionButton.tsx diff --git a/airflow/ui/src/components/ui/Alert.tsx b/airflow-core/src/airflow/ui/src/components/ui/Alert.tsx similarity index 100% rename from airflow/ui/src/components/ui/Alert.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Alert.tsx diff --git a/airflow/ui/src/components/ui/Breadcrumb/Root.tsx b/airflow-core/src/airflow/ui/src/components/ui/Breadcrumb/Root.tsx similarity index 100% rename from airflow/ui/src/components/ui/Breadcrumb/Root.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Breadcrumb/Root.tsx diff --git a/airflow/ui/src/components/ui/Breadcrumb/index.ts b/airflow-core/src/airflow/ui/src/components/ui/Breadcrumb/index.ts similarity index 100% rename from airflow/ui/src/components/ui/Breadcrumb/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/Breadcrumb/index.ts diff --git a/airflow/ui/src/components/ui/Button.tsx b/airflow-core/src/airflow/ui/src/components/ui/Button.tsx similarity index 100% rename from airflow/ui/src/components/ui/Button.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Button.tsx diff --git a/airflow/ui/src/components/ui/Checkbox.tsx b/airflow-core/src/airflow/ui/src/components/ui/Checkbox.tsx similarity index 100% rename from airflow/ui/src/components/ui/Checkbox.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Checkbox.tsx diff --git a/airflow/ui/src/components/ui/Clipboard.tsx b/airflow-core/src/airflow/ui/src/components/ui/Clipboard.tsx similarity index 100% rename from airflow/ui/src/components/ui/Clipboard.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Clipboard.tsx diff --git a/airflow/ui/src/components/ui/CloseButton.tsx b/airflow-core/src/airflow/ui/src/components/ui/CloseButton.tsx similarity index 100% rename from airflow/ui/src/components/ui/CloseButton.tsx rename to airflow-core/src/airflow/ui/src/components/ui/CloseButton.tsx diff --git a/airflow/ui/src/components/ui/Dialog/CloseTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Dialog/CloseTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Dialog/CloseTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Dialog/CloseTrigger.tsx diff --git a/airflow/ui/src/components/ui/Dialog/Content.tsx b/airflow-core/src/airflow/ui/src/components/ui/Dialog/Content.tsx similarity index 100% rename from airflow/ui/src/components/ui/Dialog/Content.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Dialog/Content.tsx diff --git a/airflow/ui/src/components/ui/Dialog/index.ts b/airflow-core/src/airflow/ui/src/components/ui/Dialog/index.ts similarity index 100% rename from airflow/ui/src/components/ui/Dialog/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/Dialog/index.ts diff --git a/airflow/ui/src/components/ui/FileUpload/Dropzone.tsx b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/Dropzone.tsx similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/Dropzone.tsx rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/Dropzone.tsx diff --git a/airflow/ui/src/components/ui/FileUpload/FileInput.tsx b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/FileInput.tsx similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/FileInput.tsx rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/FileInput.tsx diff --git a/airflow/ui/src/components/ui/FileUpload/Item.tsx b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/Item.tsx similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/Item.tsx rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/Item.tsx diff --git a/airflow/ui/src/components/ui/FileUpload/List.tsx b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/List.tsx similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/List.tsx rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/List.tsx diff --git a/airflow/ui/src/components/ui/FileUpload/Root.tsx b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/Root.tsx similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/Root.tsx rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/Root.tsx diff --git a/airflow/ui/src/components/ui/FileUpload/index.ts b/airflow-core/src/airflow/ui/src/components/ui/FileUpload/index.ts similarity index 100% rename from airflow/ui/src/components/ui/FileUpload/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/FileUpload/index.ts diff --git a/airflow/ui/src/components/ui/InputGroup.tsx b/airflow-core/src/airflow/ui/src/components/ui/InputGroup.tsx similarity index 100% rename from airflow/ui/src/components/ui/InputGroup.tsx rename to airflow-core/src/airflow/ui/src/components/ui/InputGroup.tsx diff --git a/airflow/ui/src/components/ui/Menu.tsx b/airflow-core/src/airflow/ui/src/components/ui/Menu.tsx similarity index 100% rename from airflow/ui/src/components/ui/Menu.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Menu.tsx diff --git a/airflow/ui/src/components/ui/NumberInput.tsx b/airflow-core/src/airflow/ui/src/components/ui/NumberInput.tsx similarity index 100% rename from airflow/ui/src/components/ui/NumberInput.tsx rename to airflow-core/src/airflow/ui/src/components/ui/NumberInput.tsx diff --git a/airflow/ui/src/components/ui/Pagination/Ellipsis.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/Ellipsis.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/Ellipsis.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/Ellipsis.tsx diff --git a/airflow/ui/src/components/ui/Pagination/Item.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/Item.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/Item.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/Item.tsx diff --git a/airflow/ui/src/components/ui/Pagination/Items.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/Items.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/Items.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/Items.tsx diff --git a/airflow/ui/src/components/ui/Pagination/NextTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/NextTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/NextTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/NextTrigger.tsx diff --git a/airflow/ui/src/components/ui/Pagination/PageText.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/PageText.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/PageText.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/PageText.tsx diff --git a/airflow/ui/src/components/ui/Pagination/PrevTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/PrevTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/PrevTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/PrevTrigger.tsx diff --git a/airflow/ui/src/components/ui/Pagination/Root.tsx b/airflow-core/src/airflow/ui/src/components/ui/Pagination/Root.tsx similarity index 100% rename from airflow/ui/src/components/ui/Pagination/Root.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/Root.tsx diff --git a/airflow/ui/src/components/ui/Pagination/context.ts b/airflow-core/src/airflow/ui/src/components/ui/Pagination/context.ts similarity index 100% rename from airflow/ui/src/components/ui/Pagination/context.ts rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/context.ts diff --git a/airflow/ui/src/components/ui/Pagination/index.ts b/airflow-core/src/airflow/ui/src/components/ui/Pagination/index.ts similarity index 100% rename from airflow/ui/src/components/ui/Pagination/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/Pagination/index.ts diff --git a/airflow/ui/src/components/ui/Popover/Arrow.tsx b/airflow-core/src/airflow/ui/src/components/ui/Popover/Arrow.tsx similarity index 100% rename from airflow/ui/src/components/ui/Popover/Arrow.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Popover/Arrow.tsx diff --git a/airflow/ui/src/components/ui/Popover/CloseTrigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Popover/CloseTrigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Popover/CloseTrigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Popover/CloseTrigger.tsx diff --git a/airflow/ui/src/components/ui/Popover/Content.tsx b/airflow-core/src/airflow/ui/src/components/ui/Popover/Content.tsx similarity index 100% rename from airflow/ui/src/components/ui/Popover/Content.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Popover/Content.tsx diff --git a/airflow/ui/src/components/ui/Popover/index.tsx b/airflow-core/src/airflow/ui/src/components/ui/Popover/index.tsx similarity index 100% rename from airflow/ui/src/components/ui/Popover/index.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Popover/index.tsx diff --git a/airflow/ui/src/components/ui/ProgressBar.tsx b/airflow-core/src/airflow/ui/src/components/ui/ProgressBar.tsx similarity index 100% rename from airflow/ui/src/components/ui/ProgressBar.tsx rename to airflow-core/src/airflow/ui/src/components/ui/ProgressBar.tsx diff --git a/airflow/ui/src/components/ui/RadioCard.tsx b/airflow-core/src/airflow/ui/src/components/ui/RadioCard.tsx similarity index 100% rename from airflow/ui/src/components/ui/RadioCard.tsx rename to airflow-core/src/airflow/ui/src/components/ui/RadioCard.tsx diff --git a/airflow/ui/src/components/ui/SegmentedControl.tsx b/airflow-core/src/airflow/ui/src/components/ui/SegmentedControl.tsx similarity index 100% rename from airflow/ui/src/components/ui/SegmentedControl.tsx rename to airflow-core/src/airflow/ui/src/components/ui/SegmentedControl.tsx diff --git a/airflow/ui/src/components/ui/Select/Content.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/Content.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/Content.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/Content.tsx diff --git a/airflow/ui/src/components/ui/Select/Item.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/Item.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/Item.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/Item.tsx diff --git a/airflow/ui/src/components/ui/Select/ItemGroup.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/ItemGroup.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/ItemGroup.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/ItemGroup.tsx diff --git a/airflow/ui/src/components/ui/Select/Root.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/Root.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/Root.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/Root.tsx diff --git a/airflow/ui/src/components/ui/Select/Trigger.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/Trigger.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/Trigger.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/Trigger.tsx diff --git a/airflow/ui/src/components/ui/Select/ValueText.tsx b/airflow-core/src/airflow/ui/src/components/ui/Select/ValueText.tsx similarity index 100% rename from airflow/ui/src/components/ui/Select/ValueText.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Select/ValueText.tsx diff --git a/airflow/ui/src/components/ui/Select/index.ts b/airflow-core/src/airflow/ui/src/components/ui/Select/index.ts similarity index 100% rename from airflow/ui/src/components/ui/Select/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/Select/index.ts diff --git a/airflow/ui/src/components/ui/Switch.tsx b/airflow-core/src/airflow/ui/src/components/ui/Switch.tsx similarity index 100% rename from airflow/ui/src/components/ui/Switch.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Switch.tsx diff --git a/airflow/ui/src/components/ui/Tag.tsx b/airflow-core/src/airflow/ui/src/components/ui/Tag.tsx similarity index 100% rename from airflow/ui/src/components/ui/Tag.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Tag.tsx diff --git a/airflow/ui/src/components/ui/Toaster.tsx b/airflow-core/src/airflow/ui/src/components/ui/Toaster.tsx similarity index 100% rename from airflow/ui/src/components/ui/Toaster.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Toaster.tsx diff --git a/airflow/ui/src/components/ui/Tooltip.tsx b/airflow-core/src/airflow/ui/src/components/ui/Tooltip.tsx similarity index 100% rename from airflow/ui/src/components/ui/Tooltip.tsx rename to airflow-core/src/airflow/ui/src/components/ui/Tooltip.tsx diff --git a/airflow/ui/src/components/ui/index.ts b/airflow-core/src/airflow/ui/src/components/ui/index.ts similarity index 100% rename from airflow/ui/src/components/ui/index.ts rename to airflow-core/src/airflow/ui/src/components/ui/index.ts diff --git a/airflow/ui/src/constants/reprocessBehaviourParams.ts b/airflow-core/src/airflow/ui/src/constants/reprocessBehaviourParams.ts similarity index 100% rename from airflow/ui/src/constants/reprocessBehaviourParams.ts rename to airflow-core/src/airflow/ui/src/constants/reprocessBehaviourParams.ts diff --git a/airflow/ui/src/constants/searchParams.ts b/airflow-core/src/airflow/ui/src/constants/searchParams.ts similarity index 100% rename from airflow/ui/src/constants/searchParams.ts rename to airflow-core/src/airflow/ui/src/constants/searchParams.ts diff --git a/airflow/ui/src/constants/sortParams.ts b/airflow-core/src/airflow/ui/src/constants/sortParams.ts similarity index 100% rename from airflow/ui/src/constants/sortParams.ts rename to airflow-core/src/airflow/ui/src/constants/sortParams.ts diff --git a/airflow/ui/src/constants/stateOptions.ts b/airflow-core/src/airflow/ui/src/constants/stateOptions.ts similarity index 100% rename from airflow/ui/src/constants/stateOptions.ts rename to airflow-core/src/airflow/ui/src/constants/stateOptions.ts diff --git a/airflow/ui/src/context/colorMode/ColorModeProvider.tsx b/airflow-core/src/airflow/ui/src/context/colorMode/ColorModeProvider.tsx similarity index 100% rename from airflow/ui/src/context/colorMode/ColorModeProvider.tsx rename to airflow-core/src/airflow/ui/src/context/colorMode/ColorModeProvider.tsx diff --git a/airflow/ui/src/context/colorMode/index.ts b/airflow-core/src/airflow/ui/src/context/colorMode/index.ts similarity index 100% rename from airflow/ui/src/context/colorMode/index.ts rename to airflow-core/src/airflow/ui/src/context/colorMode/index.ts diff --git a/airflow/ui/src/context/colorMode/useColorMode.tsx b/airflow-core/src/airflow/ui/src/context/colorMode/useColorMode.tsx similarity index 100% rename from airflow/ui/src/context/colorMode/useColorMode.tsx rename to airflow-core/src/airflow/ui/src/context/colorMode/useColorMode.tsx diff --git a/airflow/ui/src/context/openGroups/OpenGroupsProvider.tsx b/airflow-core/src/airflow/ui/src/context/openGroups/OpenGroupsProvider.tsx similarity index 100% rename from airflow/ui/src/context/openGroups/OpenGroupsProvider.tsx rename to airflow-core/src/airflow/ui/src/context/openGroups/OpenGroupsProvider.tsx diff --git a/airflow/ui/src/context/openGroups/index.ts b/airflow-core/src/airflow/ui/src/context/openGroups/index.ts similarity index 100% rename from airflow/ui/src/context/openGroups/index.ts rename to airflow-core/src/airflow/ui/src/context/openGroups/index.ts diff --git a/airflow/ui/src/context/openGroups/useOpenGroups.ts b/airflow-core/src/airflow/ui/src/context/openGroups/useOpenGroups.ts similarity index 100% rename from airflow/ui/src/context/openGroups/useOpenGroups.ts rename to airflow-core/src/airflow/ui/src/context/openGroups/useOpenGroups.ts diff --git a/airflow/ui/src/context/timezone/TimezoneProvider.tsx b/airflow-core/src/airflow/ui/src/context/timezone/TimezoneProvider.tsx similarity index 100% rename from airflow/ui/src/context/timezone/TimezoneProvider.tsx rename to airflow-core/src/airflow/ui/src/context/timezone/TimezoneProvider.tsx diff --git a/airflow/ui/src/context/timezone/index.ts b/airflow-core/src/airflow/ui/src/context/timezone/index.ts similarity index 100% rename from airflow/ui/src/context/timezone/index.ts rename to airflow-core/src/airflow/ui/src/context/timezone/index.ts diff --git a/airflow/ui/src/context/timezone/useTimezone.ts b/airflow-core/src/airflow/ui/src/context/timezone/useTimezone.ts similarity index 100% rename from airflow/ui/src/context/timezone/useTimezone.ts rename to airflow-core/src/airflow/ui/src/context/timezone/useTimezone.ts diff --git a/airflow/ui/src/hooks/useSelectedVersion.ts b/airflow-core/src/airflow/ui/src/hooks/useSelectedVersion.ts similarity index 100% rename from airflow/ui/src/hooks/useSelectedVersion.ts rename to airflow-core/src/airflow/ui/src/hooks/useSelectedVersion.ts diff --git a/airflow/ui/src/layouts/BaseLayout.tsx b/airflow-core/src/airflow/ui/src/layouts/BaseLayout.tsx similarity index 100% rename from airflow/ui/src/layouts/BaseLayout.tsx rename to airflow-core/src/airflow/ui/src/layouts/BaseLayout.tsx diff --git a/airflow/ui/src/layouts/DagsLayout.tsx b/airflow-core/src/airflow/ui/src/layouts/DagsLayout.tsx similarity index 100% rename from airflow/ui/src/layouts/DagsLayout.tsx rename to airflow-core/src/airflow/ui/src/layouts/DagsLayout.tsx diff --git a/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/DagBreadcrumb.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx diff --git a/airflow/ui/src/layouts/Details/DagRunSelect.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/DagRunSelect.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/DagRunSelect.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/DagRunSelect.tsx diff --git a/airflow/ui/src/layouts/Details/DetailsLayout.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/DetailsLayout.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx diff --git a/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Gantt/Gantt.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx diff --git a/airflow/ui/src/layouts/Details/Gantt/index.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/index.ts similarity index 100% rename from airflow/ui/src/layouts/Details/Gantt/index.ts rename to airflow-core/src/airflow/ui/src/layouts/Details/Gantt/index.ts diff --git a/airflow/ui/src/layouts/Details/Graph/Graph.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/Graph.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Graph/Graph.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Graph/Graph.tsx diff --git a/airflow/ui/src/layouts/Details/Graph/index.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/index.ts similarity index 100% rename from airflow/ui/src/layouts/Details/Graph/index.ts rename to airflow-core/src/airflow/ui/src/layouts/Details/Graph/index.ts diff --git a/airflow/ui/src/layouts/Details/Grid/Bar.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/Bar.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/Bar.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/Bar.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/DurationAxis.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/DurationAxis.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/DurationAxis.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/DurationAxis.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/DurationTick.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/DurationTick.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/DurationTick.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/DurationTick.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/Grid.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/Grid.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/Grid.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/Grid.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/GridButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/GridButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/GridButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/GridButton.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/GridTI.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/GridTI.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/GridTI.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/GridTI.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/TaskInstancesColumn.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/TaskInstancesColumn.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/TaskInstancesColumn.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/TaskInstancesColumn.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/TaskNames.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx diff --git a/airflow/ui/src/layouts/Details/Grid/index.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/index.ts similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/index.ts rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/index.ts diff --git a/airflow/ui/src/layouts/Details/Grid/utils.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Grid/utils.ts similarity index 100% rename from airflow/ui/src/layouts/Details/Grid/utils.ts rename to airflow-core/src/airflow/ui/src/layouts/Details/Grid/utils.ts diff --git a/airflow/ui/src/layouts/Details/NavTabs.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/NavTabs.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/NavTabs.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/NavTabs.tsx diff --git a/airflow/ui/src/layouts/Details/PanelButtons.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/PanelButtons.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx diff --git a/airflow/ui/src/layouts/Details/ToggleGroups.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/ToggleGroups.tsx similarity index 100% rename from airflow/ui/src/layouts/Details/ToggleGroups.tsx rename to airflow-core/src/airflow/ui/src/layouts/Details/ToggleGroups.tsx diff --git a/airflow/ui/src/layouts/Nav/AdminButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/AdminButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/AdminButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/AdminButton.tsx diff --git a/airflow/ui/src/layouts/Nav/BrowseButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/BrowseButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/BrowseButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/BrowseButton.tsx diff --git a/airflow/ui/src/layouts/Nav/DocsButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/DocsButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/DocsButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/DocsButton.tsx diff --git a/airflow/ui/src/layouts/Nav/LogoutModal.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/LogoutModal.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/LogoutModal.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/LogoutModal.tsx diff --git a/airflow/ui/src/layouts/Nav/Nav.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/Nav.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/Nav.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/Nav.tsx diff --git a/airflow/ui/src/layouts/Nav/NavButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/NavButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/NavButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/NavButton.tsx diff --git a/airflow/ui/src/layouts/Nav/PluginMenus.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/PluginMenus.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/PluginMenus.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/PluginMenus.tsx diff --git a/airflow/ui/src/layouts/Nav/SecurityButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/SecurityButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx diff --git a/airflow/ui/src/layouts/Nav/TimezoneModal.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/TimezoneModal.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/TimezoneModal.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/TimezoneModal.tsx diff --git a/airflow/ui/src/layouts/Nav/TimezoneSelector.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/TimezoneSelector.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/TimezoneSelector.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/TimezoneSelector.tsx diff --git a/airflow/ui/src/layouts/Nav/UserSettingsButton.tsx b/airflow-core/src/airflow/ui/src/layouts/Nav/UserSettingsButton.tsx similarity index 100% rename from airflow/ui/src/layouts/Nav/UserSettingsButton.tsx rename to airflow-core/src/airflow/ui/src/layouts/Nav/UserSettingsButton.tsx diff --git a/airflow/ui/src/layouts/Nav/index.ts b/airflow-core/src/airflow/ui/src/layouts/Nav/index.ts similarity index 100% rename from airflow/ui/src/layouts/Nav/index.ts rename to airflow-core/src/airflow/ui/src/layouts/Nav/index.ts diff --git a/airflow/ui/src/main.tsx b/airflow-core/src/airflow/ui/src/main.tsx similarity index 100% rename from airflow/ui/src/main.tsx rename to airflow-core/src/airflow/ui/src/main.tsx diff --git a/airflow/ui/src/mocks/handlers/config.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts similarity index 100% rename from airflow/ui/src/mocks/handlers/config.ts rename to airflow-core/src/airflow/ui/src/mocks/handlers/config.ts diff --git a/airflow/ui/src/mocks/handlers/dag.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts similarity index 100% rename from airflow/ui/src/mocks/handlers/dag.ts rename to airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts diff --git a/airflow/ui/src/mocks/handlers/dags.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts similarity index 100% rename from airflow/ui/src/mocks/handlers/dags.ts rename to airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts diff --git a/airflow/ui/src/mocks/handlers/index.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/index.ts similarity index 100% rename from airflow/ui/src/mocks/handlers/index.ts rename to airflow-core/src/airflow/ui/src/mocks/handlers/index.ts diff --git a/airflow/ui/src/mocks/handlers/log.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/log.ts similarity index 100% rename from airflow/ui/src/mocks/handlers/log.ts rename to airflow-core/src/airflow/ui/src/mocks/handlers/log.ts diff --git a/airflow/ui/src/pages/Asset/Asset.tsx b/airflow-core/src/airflow/ui/src/pages/Asset/Asset.tsx similarity index 100% rename from airflow/ui/src/pages/Asset/Asset.tsx rename to airflow-core/src/airflow/ui/src/pages/Asset/Asset.tsx diff --git a/airflow/ui/src/pages/Asset/AssetGraph.tsx b/airflow-core/src/airflow/ui/src/pages/Asset/AssetGraph.tsx similarity index 100% rename from airflow/ui/src/pages/Asset/AssetGraph.tsx rename to airflow-core/src/airflow/ui/src/pages/Asset/AssetGraph.tsx diff --git a/airflow/ui/src/pages/Asset/CreateAssetEvent.tsx b/airflow-core/src/airflow/ui/src/pages/Asset/CreateAssetEvent.tsx similarity index 100% rename from airflow/ui/src/pages/Asset/CreateAssetEvent.tsx rename to airflow-core/src/airflow/ui/src/pages/Asset/CreateAssetEvent.tsx diff --git a/airflow/ui/src/pages/Asset/CreateAssetEventModal.tsx b/airflow-core/src/airflow/ui/src/pages/Asset/CreateAssetEventModal.tsx similarity index 100% rename from airflow/ui/src/pages/Asset/CreateAssetEventModal.tsx rename to airflow-core/src/airflow/ui/src/pages/Asset/CreateAssetEventModal.tsx diff --git a/airflow/ui/src/pages/Asset/Header.tsx b/airflow-core/src/airflow/ui/src/pages/Asset/Header.tsx similarity index 100% rename from airflow/ui/src/pages/Asset/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/Asset/Header.tsx diff --git a/airflow/ui/src/pages/Asset/index.ts b/airflow-core/src/airflow/ui/src/pages/Asset/index.ts similarity index 100% rename from airflow/ui/src/pages/Asset/index.ts rename to airflow-core/src/airflow/ui/src/pages/Asset/index.ts diff --git a/airflow/ui/src/pages/AssetsList/AssetsList.tsx b/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx similarity index 100% rename from airflow/ui/src/pages/AssetsList/AssetsList.tsx rename to airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx diff --git a/airflow/ui/src/pages/AssetsList/DependencyPopover.tsx b/airflow-core/src/airflow/ui/src/pages/AssetsList/DependencyPopover.tsx similarity index 100% rename from airflow/ui/src/pages/AssetsList/DependencyPopover.tsx rename to airflow-core/src/airflow/ui/src/pages/AssetsList/DependencyPopover.tsx diff --git a/airflow/ui/src/pages/AssetsList/index.ts b/airflow-core/src/airflow/ui/src/pages/AssetsList/index.ts similarity index 100% rename from airflow/ui/src/pages/AssetsList/index.ts rename to airflow-core/src/airflow/ui/src/pages/AssetsList/index.ts diff --git a/airflow/ui/src/pages/Connections/AddConnectionButton.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/AddConnectionButton.tsx similarity index 100% rename from airflow/ui/src/pages/Connections/AddConnectionButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Connections/AddConnectionButton.tsx diff --git a/airflow/ui/src/pages/Connections/ConnectionForm.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx similarity index 100% rename from airflow/ui/src/pages/Connections/ConnectionForm.tsx rename to airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx diff --git a/airflow/ui/src/pages/Connections/Connections.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx similarity index 100% rename from airflow/ui/src/pages/Connections/Connections.tsx rename to airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx diff --git a/airflow/ui/src/pages/Connections/DeleteConnectionButton.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/DeleteConnectionButton.tsx similarity index 100% rename from airflow/ui/src/pages/Connections/DeleteConnectionButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Connections/DeleteConnectionButton.tsx diff --git a/airflow/ui/src/pages/Connections/index.ts b/airflow-core/src/airflow/ui/src/pages/Connections/index.ts similarity index 100% rename from airflow/ui/src/pages/Connections/index.ts rename to airflow-core/src/airflow/ui/src/pages/Connections/index.ts diff --git a/airflow/ui/src/pages/Dag/Backfills/Backfills.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/Backfills.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Backfills/Backfills.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Backfills/Backfills.tsx diff --git a/airflow/ui/src/pages/Dag/Backfills/index.ts b/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/index.ts similarity index 100% rename from airflow/ui/src/pages/Dag/Backfills/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dag/Backfills/index.ts diff --git a/airflow/ui/src/pages/Dag/Code/Code.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Code/Code.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx diff --git a/airflow/ui/src/pages/Dag/Code/index.ts b/airflow-core/src/airflow/ui/src/pages/Dag/Code/index.ts similarity index 100% rename from airflow/ui/src/pages/Dag/Code/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dag/Code/index.ts diff --git a/airflow/ui/src/pages/Dag/Dag.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Dag.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx diff --git a/airflow/ui/src/pages/Dag/DagHeader.test.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/DagHeader.test.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/DagHeader.test.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/DagHeader.test.tsx diff --git a/airflow/ui/src/pages/Dag/Details.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Details.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Details.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Details.tsx diff --git a/airflow/ui/src/pages/Dag/Header.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Header.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Header.tsx diff --git a/airflow/ui/src/pages/Dag/Overview/FailedLogs.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Overview/FailedLogs.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Overview/FailedLogs.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Overview/FailedLogs.tsx diff --git a/airflow/ui/src/pages/Dag/Overview/Overview.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Overview/Overview.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Overview/Overview.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Overview/Overview.tsx diff --git a/airflow/ui/src/pages/Dag/Overview/TaskLogPreview.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Overview/TaskLogPreview.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Overview/TaskLogPreview.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Overview/TaskLogPreview.tsx diff --git a/airflow/ui/src/pages/Dag/Overview/index.ts b/airflow-core/src/airflow/ui/src/pages/Dag/Overview/index.ts similarity index 100% rename from airflow/ui/src/pages/Dag/Overview/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dag/Overview/index.ts diff --git a/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx diff --git a/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx diff --git a/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx similarity index 100% rename from airflow/ui/src/pages/Dag/Tasks/Tasks.tsx rename to airflow-core/src/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx diff --git a/airflow/ui/src/pages/Dag/Tasks/index.ts b/airflow-core/src/airflow/ui/src/pages/Dag/Tasks/index.ts similarity index 100% rename from airflow/ui/src/pages/Dag/Tasks/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dag/Tasks/index.ts diff --git a/airflow/ui/src/pages/Dag/index.ts b/airflow-core/src/airflow/ui/src/pages/Dag/index.ts similarity index 100% rename from airflow/ui/src/pages/Dag/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dag/index.ts diff --git a/airflow/ui/src/pages/DagRuns.tsx b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx similarity index 100% rename from airflow/ui/src/pages/DagRuns.tsx rename to airflow-core/src/airflow/ui/src/pages/DagRuns.tsx diff --git a/airflow/ui/src/pages/DagsList/AssetSchedule.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/AssetSchedule.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/AssetSchedule.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/AssetSchedule.tsx diff --git a/airflow/ui/src/pages/DagsList/DagCard.test.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagCard.test.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx diff --git a/airflow/ui/src/pages/DagsList/DagCard.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagCard.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.tsx diff --git a/airflow/ui/src/pages/DagsList/DagTags.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagTags.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagTags.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagTags.tsx diff --git a/airflow/ui/src/pages/DagsList/DagsFilters.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagsFilters.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagsFilters.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagsFilters.tsx diff --git a/airflow/ui/src/pages/DagsList/DagsList.test.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.test.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagsList.test.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.test.tsx diff --git a/airflow/ui/src/pages/DagsList/DagsList.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/DagsList.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx diff --git a/airflow/ui/src/pages/DagsList/RecentRuns.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/RecentRuns.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/RecentRuns.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/RecentRuns.tsx diff --git a/airflow/ui/src/pages/DagsList/Schedule.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/Schedule.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/Schedule.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/Schedule.tsx diff --git a/airflow/ui/src/pages/DagsList/SortSelect.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/SortSelect.tsx similarity index 100% rename from airflow/ui/src/pages/DagsList/SortSelect.tsx rename to airflow-core/src/airflow/ui/src/pages/DagsList/SortSelect.tsx diff --git a/airflow/ui/src/pages/DagsList/index.ts b/airflow-core/src/airflow/ui/src/pages/DagsList/index.ts similarity index 100% rename from airflow/ui/src/pages/DagsList/index.ts rename to airflow-core/src/airflow/ui/src/pages/DagsList/index.ts diff --git a/airflow/ui/src/pages/Dashboard/Dashboard.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Dashboard.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Dashboard.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Dashboard.tsx diff --git a/airflow/ui/src/pages/Dashboard/Health/Health.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Health/Health.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Health/Health.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Health/Health.tsx diff --git a/airflow/ui/src/pages/Dashboard/Health/HealthBadge.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Health/HealthBadge.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Health/HealthBadge.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Health/HealthBadge.tsx diff --git a/airflow/ui/src/pages/Dashboard/Health/HealthSection.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Health/HealthSection.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Health/HealthSection.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Health/HealthSection.tsx diff --git a/airflow/ui/src/pages/Dashboard/Health/index.ts b/airflow-core/src/airflow/ui/src/pages/Dashboard/Health/index.ts similarity index 100% rename from airflow/ui/src/pages/Dashboard/Health/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Health/index.ts diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/DagRunMetrics.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/DagRunMetrics.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/DagRunMetrics.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/DagRunMetrics.tsx diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/HistoricalMetrics.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/HistoricalMetrics.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/HistoricalMetrics.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/HistoricalMetrics.tsx diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSection.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSection.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSection.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSection.tsx diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSectionSkeleton.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSectionSkeleton.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSectionSkeleton.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/MetricSectionSkeleton.tsx diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/TaskInstanceMetrics.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/TaskInstanceMetrics.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/TaskInstanceMetrics.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/TaskInstanceMetrics.tsx diff --git a/airflow/ui/src/pages/Dashboard/HistoricalMetrics/index.ts b/airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/index.ts similarity index 100% rename from airflow/ui/src/pages/Dashboard/HistoricalMetrics/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dashboard/HistoricalMetrics/index.ts diff --git a/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrors.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrors.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Stats/DAGImportErrors.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrors.tsx diff --git a/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrorsModal.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrorsModal.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Stats/DAGImportErrorsModal.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DAGImportErrorsModal.tsx diff --git a/airflow/ui/src/pages/Dashboard/Stats/DagFilterButton.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagFilterButton.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Stats/DagFilterButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagFilterButton.tsx diff --git a/airflow/ui/src/pages/Dashboard/Stats/Stats.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/Stats.tsx similarity index 100% rename from airflow/ui/src/pages/Dashboard/Stats/Stats.tsx rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/Stats.tsx diff --git a/airflow/ui/src/pages/Dashboard/Stats/index.ts b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/index.ts similarity index 100% rename from airflow/ui/src/pages/Dashboard/Stats/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/index.ts diff --git a/airflow/ui/src/pages/Dashboard/index.ts b/airflow-core/src/airflow/ui/src/pages/Dashboard/index.ts similarity index 100% rename from airflow/ui/src/pages/Dashboard/index.ts rename to airflow-core/src/airflow/ui/src/pages/Dashboard/index.ts diff --git a/airflow/ui/src/pages/Error.tsx b/airflow-core/src/airflow/ui/src/pages/Error.tsx similarity index 100% rename from airflow/ui/src/pages/Error.tsx rename to airflow-core/src/airflow/ui/src/pages/Error.tsx diff --git a/airflow/ui/src/pages/Events/Events.tsx b/airflow-core/src/airflow/ui/src/pages/Events/Events.tsx similarity index 100% rename from airflow/ui/src/pages/Events/Events.tsx rename to airflow-core/src/airflow/ui/src/pages/Events/Events.tsx diff --git a/airflow/ui/src/pages/Events/index.tsx b/airflow-core/src/airflow/ui/src/pages/Events/index.tsx similarity index 100% rename from airflow/ui/src/pages/Events/index.tsx rename to airflow-core/src/airflow/ui/src/pages/Events/index.tsx diff --git a/airflow/ui/src/pages/MappedTaskInstance/Header.tsx b/airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/Header.tsx similarity index 100% rename from airflow/ui/src/pages/MappedTaskInstance/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/Header.tsx diff --git a/airflow/ui/src/pages/MappedTaskInstance/MappedTaskInstance.tsx b/airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/MappedTaskInstance.tsx similarity index 100% rename from airflow/ui/src/pages/MappedTaskInstance/MappedTaskInstance.tsx rename to airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/MappedTaskInstance.tsx diff --git a/airflow/ui/src/pages/MappedTaskInstance/index.ts b/airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/index.ts similarity index 100% rename from airflow/ui/src/pages/MappedTaskInstance/index.ts rename to airflow-core/src/airflow/ui/src/pages/MappedTaskInstance/index.ts diff --git a/airflow/ui/src/pages/Plugins.tsx b/airflow-core/src/airflow/ui/src/pages/Plugins.tsx similarity index 100% rename from airflow/ui/src/pages/Plugins.tsx rename to airflow-core/src/airflow/ui/src/pages/Plugins.tsx diff --git a/airflow/ui/src/pages/Pools/AddPoolButton.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/AddPoolButton.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/AddPoolButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/AddPoolButton.tsx diff --git a/airflow/ui/src/pages/Pools/DeletePoolButton.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/DeletePoolButton.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/DeletePoolButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/DeletePoolButton.tsx diff --git a/airflow/ui/src/pages/Pools/EditPoolButton.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/EditPoolButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx diff --git a/airflow/ui/src/pages/Pools/PoolBar.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/PoolBar.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/PoolBar.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/PoolBar.tsx diff --git a/airflow/ui/src/pages/Pools/PoolForm.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/PoolForm.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx diff --git a/airflow/ui/src/pages/Pools/Pools.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/Pools.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx diff --git a/airflow/ui/src/pages/Pools/index.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/index.tsx similarity index 100% rename from airflow/ui/src/pages/Pools/index.tsx rename to airflow-core/src/airflow/ui/src/pages/Pools/index.tsx diff --git a/airflow/ui/src/pages/Providers.tsx b/airflow-core/src/airflow/ui/src/pages/Providers.tsx similarity index 100% rename from airflow/ui/src/pages/Providers.tsx rename to airflow-core/src/airflow/ui/src/pages/Providers.tsx diff --git a/airflow/ui/src/pages/Run/Details.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Details.tsx similarity index 100% rename from airflow/ui/src/pages/Run/Details.tsx rename to airflow-core/src/airflow/ui/src/pages/Run/Details.tsx diff --git a/airflow/ui/src/pages/Run/Header.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Header.tsx similarity index 100% rename from airflow/ui/src/pages/Run/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/Run/Header.tsx diff --git a/airflow/ui/src/pages/Run/Run.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx similarity index 100% rename from airflow/ui/src/pages/Run/Run.tsx rename to airflow-core/src/airflow/ui/src/pages/Run/Run.tsx diff --git a/airflow/ui/src/pages/Run/index.ts b/airflow-core/src/airflow/ui/src/pages/Run/index.ts similarity index 100% rename from airflow/ui/src/pages/Run/index.ts rename to airflow-core/src/airflow/ui/src/pages/Run/index.ts diff --git a/airflow/ui/src/pages/Security.tsx b/airflow-core/src/airflow/ui/src/pages/Security.tsx similarity index 100% rename from airflow/ui/src/pages/Security.tsx rename to airflow-core/src/airflow/ui/src/pages/Security.tsx diff --git a/airflow/ui/src/pages/Task/Header.tsx b/airflow-core/src/airflow/ui/src/pages/Task/Header.tsx similarity index 100% rename from airflow/ui/src/pages/Task/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/Task/Header.tsx diff --git a/airflow/ui/src/pages/Task/Overview/Overview.tsx b/airflow-core/src/airflow/ui/src/pages/Task/Overview/Overview.tsx similarity index 100% rename from airflow/ui/src/pages/Task/Overview/Overview.tsx rename to airflow-core/src/airflow/ui/src/pages/Task/Overview/Overview.tsx diff --git a/airflow/ui/src/pages/Task/Overview/index.ts b/airflow-core/src/airflow/ui/src/pages/Task/Overview/index.ts similarity index 100% rename from airflow/ui/src/pages/Task/Overview/index.ts rename to airflow-core/src/airflow/ui/src/pages/Task/Overview/index.ts diff --git a/airflow/ui/src/pages/Task/Task.tsx b/airflow-core/src/airflow/ui/src/pages/Task/Task.tsx similarity index 100% rename from airflow/ui/src/pages/Task/Task.tsx rename to airflow-core/src/airflow/ui/src/pages/Task/Task.tsx diff --git a/airflow/ui/src/pages/Task/index.ts b/airflow-core/src/airflow/ui/src/pages/Task/index.ts similarity index 100% rename from airflow/ui/src/pages/Task/index.ts rename to airflow-core/src/airflow/ui/src/pages/Task/index.ts diff --git a/airflow/ui/src/pages/TaskInstance/BlockingDeps.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/BlockingDeps.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/BlockingDeps.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/BlockingDeps.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Details.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Details.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx diff --git a/airflow/ui/src/pages/TaskInstance/ExtraLinks.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/ExtraLinks.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/ExtraLinks.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/ExtraLinks.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Header.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Header.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Header.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Header.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Logs/Logs.test.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/Logs.test.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Logs/Logs.test.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/Logs.test.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Logs/TaskLogContent.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogContent.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Logs/TaskLogContent.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogContent.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx diff --git a/airflow/ui/src/pages/TaskInstance/Logs/index.ts b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/index.ts similarity index 100% rename from airflow/ui/src/pages/TaskInstance/Logs/index.ts rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/index.ts diff --git a/airflow/ui/src/pages/TaskInstance/RenderedTemplates.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/RenderedTemplates.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/RenderedTemplates.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/RenderedTemplates.tsx diff --git a/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/TaskInstance.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx diff --git a/airflow/ui/src/pages/TaskInstance/TriggererInfo.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TriggererInfo.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstance/TriggererInfo.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/TriggererInfo.tsx diff --git a/airflow/ui/src/pages/TaskInstance/index.ts b/airflow-core/src/airflow/ui/src/pages/TaskInstance/index.ts similarity index 100% rename from airflow/ui/src/pages/TaskInstance/index.ts rename to airflow-core/src/airflow/ui/src/pages/TaskInstance/index.ts diff --git a/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstances/TaskInstances.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx diff --git a/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx similarity index 100% rename from airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx rename to airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx diff --git a/airflow/ui/src/pages/TaskInstances/index.ts b/airflow-core/src/airflow/ui/src/pages/TaskInstances/index.ts similarity index 100% rename from airflow/ui/src/pages/TaskInstances/index.ts rename to airflow-core/src/airflow/ui/src/pages/TaskInstances/index.ts diff --git a/airflow/ui/src/pages/Variables/DeleteVariablesButton.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/DeleteVariablesButton.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/DeleteVariablesButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/DeleteVariablesButton.tsx diff --git a/airflow/ui/src/pages/Variables/ImportVariablesButton.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ImportVariablesButton.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ImportVariablesButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ImportVariablesButton.tsx diff --git a/airflow/ui/src/pages/Variables/ImportVariablesForm.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ImportVariablesForm.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ImportVariablesForm.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ImportVariablesForm.tsx diff --git a/airflow/ui/src/pages/Variables/ManageVariable/AddVariableButton.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/AddVariableButton.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ManageVariable/AddVariableButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/AddVariableButton.tsx diff --git a/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx diff --git a/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx diff --git a/airflow/ui/src/pages/Variables/ManageVariable/VariableForm.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/VariableForm.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/ManageVariable/VariableForm.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/VariableForm.tsx diff --git a/airflow/ui/src/pages/Variables/Variables.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/Variables.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx diff --git a/airflow/ui/src/pages/Variables/index.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/index.tsx similarity index 100% rename from airflow/ui/src/pages/Variables/index.tsx rename to airflow-core/src/airflow/ui/src/pages/Variables/index.tsx diff --git a/airflow/ui/src/pages/XCom/XCom.tsx b/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx similarity index 100% rename from airflow/ui/src/pages/XCom/XCom.tsx rename to airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx diff --git a/airflow/ui/src/pages/XCom/XComEntry.tsx b/airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx similarity index 100% rename from airflow/ui/src/pages/XCom/XComEntry.tsx rename to airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx diff --git a/airflow/ui/src/pages/XCom/index.ts b/airflow-core/src/airflow/ui/src/pages/XCom/index.ts similarity index 100% rename from airflow/ui/src/pages/XCom/index.ts rename to airflow-core/src/airflow/ui/src/pages/XCom/index.ts diff --git a/airflow/ui/src/queries/useAddConnection.ts b/airflow-core/src/airflow/ui/src/queries/useAddConnection.ts similarity index 100% rename from airflow/ui/src/queries/useAddConnection.ts rename to airflow-core/src/airflow/ui/src/queries/useAddConnection.ts diff --git a/airflow/ui/src/queries/useAddPool.ts b/airflow-core/src/airflow/ui/src/queries/useAddPool.ts similarity index 100% rename from airflow/ui/src/queries/useAddPool.ts rename to airflow-core/src/airflow/ui/src/queries/useAddPool.ts diff --git a/airflow/ui/src/queries/useAddVariable.ts b/airflow-core/src/airflow/ui/src/queries/useAddVariable.ts similarity index 100% rename from airflow/ui/src/queries/useAddVariable.ts rename to airflow-core/src/airflow/ui/src/queries/useAddVariable.ts diff --git a/airflow/ui/src/queries/useBulkDeleteVariables.ts b/airflow-core/src/airflow/ui/src/queries/useBulkDeleteVariables.ts similarity index 100% rename from airflow/ui/src/queries/useBulkDeleteVariables.ts rename to airflow-core/src/airflow/ui/src/queries/useBulkDeleteVariables.ts diff --git a/airflow/ui/src/queries/useClearDagRunDryRun.ts b/airflow-core/src/airflow/ui/src/queries/useClearDagRunDryRun.ts similarity index 100% rename from airflow/ui/src/queries/useClearDagRunDryRun.ts rename to airflow-core/src/airflow/ui/src/queries/useClearDagRunDryRun.ts diff --git a/airflow/ui/src/queries/useClearRun.ts b/airflow-core/src/airflow/ui/src/queries/useClearRun.ts similarity index 100% rename from airflow/ui/src/queries/useClearRun.ts rename to airflow-core/src/airflow/ui/src/queries/useClearRun.ts diff --git a/airflow/ui/src/queries/useClearTaskInstances.ts b/airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts similarity index 100% rename from airflow/ui/src/queries/useClearTaskInstances.ts rename to airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts diff --git a/airflow/ui/src/queries/useClearTaskInstancesDryRun.ts b/airflow-core/src/airflow/ui/src/queries/useClearTaskInstancesDryRun.ts similarity index 100% rename from airflow/ui/src/queries/useClearTaskInstancesDryRun.ts rename to airflow-core/src/airflow/ui/src/queries/useClearTaskInstancesDryRun.ts diff --git a/airflow/ui/src/queries/useConfig.tsx b/airflow-core/src/airflow/ui/src/queries/useConfig.tsx similarity index 100% rename from airflow/ui/src/queries/useConfig.tsx rename to airflow-core/src/airflow/ui/src/queries/useConfig.tsx diff --git a/airflow/ui/src/queries/useConnectionTypeMeta.ts b/airflow-core/src/airflow/ui/src/queries/useConnectionTypeMeta.ts similarity index 100% rename from airflow/ui/src/queries/useConnectionTypeMeta.ts rename to airflow-core/src/airflow/ui/src/queries/useConnectionTypeMeta.ts diff --git a/airflow/ui/src/queries/useCreateBackfill.ts b/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts similarity index 100% rename from airflow/ui/src/queries/useCreateBackfill.ts rename to airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts diff --git a/airflow/ui/src/queries/useCreateBackfillDryRun.ts b/airflow-core/src/airflow/ui/src/queries/useCreateBackfillDryRun.ts similarity index 100% rename from airflow/ui/src/queries/useCreateBackfillDryRun.ts rename to airflow-core/src/airflow/ui/src/queries/useCreateBackfillDryRun.ts diff --git a/airflow/ui/src/queries/useDagParams.ts b/airflow-core/src/airflow/ui/src/queries/useDagParams.ts similarity index 100% rename from airflow/ui/src/queries/useDagParams.ts rename to airflow-core/src/airflow/ui/src/queries/useDagParams.ts diff --git a/airflow/ui/src/queries/useDagParsing.ts b/airflow-core/src/airflow/ui/src/queries/useDagParsing.ts similarity index 100% rename from airflow/ui/src/queries/useDagParsing.ts rename to airflow-core/src/airflow/ui/src/queries/useDagParsing.ts diff --git a/airflow/ui/src/queries/useDags.tsx b/airflow-core/src/airflow/ui/src/queries/useDags.tsx similarity index 100% rename from airflow/ui/src/queries/useDags.tsx rename to airflow-core/src/airflow/ui/src/queries/useDags.tsx diff --git a/airflow/ui/src/queries/useDeleteConnection.ts b/airflow-core/src/airflow/ui/src/queries/useDeleteConnection.ts similarity index 100% rename from airflow/ui/src/queries/useDeleteConnection.ts rename to airflow-core/src/airflow/ui/src/queries/useDeleteConnection.ts diff --git a/airflow/ui/src/queries/useDeletePool.ts b/airflow-core/src/airflow/ui/src/queries/useDeletePool.ts similarity index 100% rename from airflow/ui/src/queries/useDeletePool.ts rename to airflow-core/src/airflow/ui/src/queries/useDeletePool.ts diff --git a/airflow/ui/src/queries/useDeleteVariable.ts b/airflow-core/src/airflow/ui/src/queries/useDeleteVariable.ts similarity index 100% rename from airflow/ui/src/queries/useDeleteVariable.ts rename to airflow-core/src/airflow/ui/src/queries/useDeleteVariable.ts diff --git a/airflow/ui/src/queries/useEditPool.ts b/airflow-core/src/airflow/ui/src/queries/useEditPool.ts similarity index 100% rename from airflow/ui/src/queries/useEditPool.ts rename to airflow-core/src/airflow/ui/src/queries/useEditPool.ts diff --git a/airflow/ui/src/queries/useEditVariable.ts b/airflow-core/src/airflow/ui/src/queries/useEditVariable.ts similarity index 100% rename from airflow/ui/src/queries/useEditVariable.ts rename to airflow-core/src/airflow/ui/src/queries/useEditVariable.ts diff --git a/airflow/ui/src/queries/useGrid.ts b/airflow-core/src/airflow/ui/src/queries/useGrid.ts similarity index 100% rename from airflow/ui/src/queries/useGrid.ts rename to airflow-core/src/airflow/ui/src/queries/useGrid.ts diff --git a/airflow/ui/src/queries/useImportVariables.ts b/airflow-core/src/airflow/ui/src/queries/useImportVariables.ts similarity index 100% rename from airflow/ui/src/queries/useImportVariables.ts rename to airflow-core/src/airflow/ui/src/queries/useImportVariables.ts diff --git a/airflow/ui/src/queries/useLogs.tsx b/airflow-core/src/airflow/ui/src/queries/useLogs.tsx similarity index 100% rename from airflow/ui/src/queries/useLogs.tsx rename to airflow-core/src/airflow/ui/src/queries/useLogs.tsx diff --git a/airflow/ui/src/queries/useParamStore.ts b/airflow-core/src/airflow/ui/src/queries/useParamStore.ts similarity index 100% rename from airflow/ui/src/queries/useParamStore.ts rename to airflow-core/src/airflow/ui/src/queries/useParamStore.ts diff --git a/airflow/ui/src/queries/usePatchDagRun.ts b/airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts similarity index 100% rename from airflow/ui/src/queries/usePatchDagRun.ts rename to airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts diff --git a/airflow/ui/src/queries/usePatchTaskInstance.ts b/airflow-core/src/airflow/ui/src/queries/usePatchTaskInstance.ts similarity index 100% rename from airflow/ui/src/queries/usePatchTaskInstance.ts rename to airflow-core/src/airflow/ui/src/queries/usePatchTaskInstance.ts diff --git a/airflow/ui/src/queries/usePatchTaskInstanceDryRun.ts b/airflow-core/src/airflow/ui/src/queries/usePatchTaskInstanceDryRun.ts similarity index 100% rename from airflow/ui/src/queries/usePatchTaskInstanceDryRun.ts rename to airflow-core/src/airflow/ui/src/queries/usePatchTaskInstanceDryRun.ts diff --git a/airflow/ui/src/queries/useTogglePause.ts b/airflow-core/src/airflow/ui/src/queries/useTogglePause.ts similarity index 100% rename from airflow/ui/src/queries/useTogglePause.ts rename to airflow-core/src/airflow/ui/src/queries/useTogglePause.ts diff --git a/airflow/ui/src/queries/useTrigger.ts b/airflow-core/src/airflow/ui/src/queries/useTrigger.ts similarity index 100% rename from airflow/ui/src/queries/useTrigger.ts rename to airflow-core/src/airflow/ui/src/queries/useTrigger.ts diff --git a/airflow/ui/src/queryClient.ts b/airflow-core/src/airflow/ui/src/queryClient.ts similarity index 100% rename from airflow/ui/src/queryClient.ts rename to airflow-core/src/airflow/ui/src/queryClient.ts diff --git a/airflow/ui/src/router.tsx b/airflow-core/src/airflow/ui/src/router.tsx similarity index 100% rename from airflow/ui/src/router.tsx rename to airflow-core/src/airflow/ui/src/router.tsx diff --git a/airflow/ui/src/theme.ts b/airflow-core/src/airflow/ui/src/theme.ts similarity index 100% rename from airflow/ui/src/theme.ts rename to airflow-core/src/airflow/ui/src/theme.ts diff --git a/airflow/ui/src/utils/AppWrapper.tsx b/airflow-core/src/airflow/ui/src/utils/AppWrapper.tsx similarity index 100% rename from airflow/ui/src/utils/AppWrapper.tsx rename to airflow-core/src/airflow/ui/src/utils/AppWrapper.tsx diff --git a/airflow/ui/src/utils/ChakraWrapper.test.tsx b/airflow-core/src/airflow/ui/src/utils/ChakraWrapper.test.tsx similarity index 100% rename from airflow/ui/src/utils/ChakraWrapper.test.tsx rename to airflow-core/src/airflow/ui/src/utils/ChakraWrapper.test.tsx diff --git a/airflow/ui/src/utils/ChakraWrapper.tsx b/airflow-core/src/airflow/ui/src/utils/ChakraWrapper.tsx similarity index 100% rename from airflow/ui/src/utils/ChakraWrapper.tsx rename to airflow-core/src/airflow/ui/src/utils/ChakraWrapper.tsx diff --git a/airflow/ui/src/utils/RouterWrapper.test.tsx b/airflow-core/src/airflow/ui/src/utils/RouterWrapper.test.tsx similarity index 100% rename from airflow/ui/src/utils/RouterWrapper.test.tsx rename to airflow-core/src/airflow/ui/src/utils/RouterWrapper.test.tsx diff --git a/airflow/ui/src/utils/RouterWrapper.tsx b/airflow-core/src/airflow/ui/src/utils/RouterWrapper.tsx similarity index 100% rename from airflow/ui/src/utils/RouterWrapper.tsx rename to airflow-core/src/airflow/ui/src/utils/RouterWrapper.tsx diff --git a/airflow/ui/src/utils/TrimText.tsx b/airflow-core/src/airflow/ui/src/utils/TrimText.tsx similarity index 100% rename from airflow/ui/src/utils/TrimText.tsx rename to airflow-core/src/airflow/ui/src/utils/TrimText.tsx diff --git a/airflow/ui/src/utils/Wrapper.tsx b/airflow-core/src/airflow/ui/src/utils/Wrapper.tsx similarity index 100% rename from airflow/ui/src/utils/Wrapper.tsx rename to airflow-core/src/airflow/ui/src/utils/Wrapper.tsx diff --git a/airflow/ui/src/utils/advancedSelectStyles.ts b/airflow-core/src/airflow/ui/src/utils/advancedSelectStyles.ts similarity index 100% rename from airflow/ui/src/utils/advancedSelectStyles.ts rename to airflow-core/src/airflow/ui/src/utils/advancedSelectStyles.ts diff --git a/airflow/ui/src/utils/capitalize.ts b/airflow-core/src/airflow/ui/src/utils/capitalize.ts similarity index 100% rename from airflow/ui/src/utils/capitalize.ts rename to airflow-core/src/airflow/ui/src/utils/capitalize.ts diff --git a/airflow/ui/src/utils/datetime_utils.ts b/airflow-core/src/airflow/ui/src/utils/datetime_utils.ts similarity index 100% rename from airflow/ui/src/utils/datetime_utils.ts rename to airflow-core/src/airflow/ui/src/utils/datetime_utils.ts diff --git a/airflow/ui/src/utils/downloadJson.ts b/airflow-core/src/airflow/ui/src/utils/downloadJson.ts similarity index 100% rename from airflow/ui/src/utils/downloadJson.ts rename to airflow-core/src/airflow/ui/src/utils/downloadJson.ts diff --git a/airflow/ui/src/utils/getMetaKey.ts b/airflow-core/src/airflow/ui/src/utils/getMetaKey.ts similarity index 100% rename from airflow/ui/src/utils/getMetaKey.ts rename to airflow-core/src/airflow/ui/src/utils/getMetaKey.ts diff --git a/airflow/ui/src/utils/index.ts b/airflow-core/src/airflow/ui/src/utils/index.ts similarity index 100% rename from airflow/ui/src/utils/index.ts rename to airflow-core/src/airflow/ui/src/utils/index.ts diff --git a/airflow/ui/src/utils/links.ts b/airflow-core/src/airflow/ui/src/utils/links.ts similarity index 100% rename from airflow/ui/src/utils/links.ts rename to airflow-core/src/airflow/ui/src/utils/links.ts diff --git a/airflow/ui/src/utils/logs.ts b/airflow-core/src/airflow/ui/src/utils/logs.ts similarity index 100% rename from airflow/ui/src/utils/logs.ts rename to airflow-core/src/airflow/ui/src/utils/logs.ts diff --git a/airflow/ui/src/utils/option.ts b/airflow-core/src/airflow/ui/src/utils/option.ts similarity index 100% rename from airflow/ui/src/utils/option.ts rename to airflow-core/src/airflow/ui/src/utils/option.ts diff --git a/airflow/ui/src/utils/pluralize.test.ts b/airflow-core/src/airflow/ui/src/utils/pluralize.test.ts similarity index 100% rename from airflow/ui/src/utils/pluralize.test.ts rename to airflow-core/src/airflow/ui/src/utils/pluralize.test.ts diff --git a/airflow/ui/src/utils/pluralize.ts b/airflow-core/src/airflow/ui/src/utils/pluralize.ts similarity index 100% rename from airflow/ui/src/utils/pluralize.ts rename to airflow-core/src/airflow/ui/src/utils/pluralize.ts diff --git a/airflow/ui/src/utils/query.ts b/airflow-core/src/airflow/ui/src/utils/query.ts similarity index 100% rename from airflow/ui/src/utils/query.ts rename to airflow-core/src/airflow/ui/src/utils/query.ts diff --git a/airflow/ui/src/utils/tokenHandler.test.ts b/airflow-core/src/airflow/ui/src/utils/tokenHandler.test.ts similarity index 100% rename from airflow/ui/src/utils/tokenHandler.test.ts rename to airflow-core/src/airflow/ui/src/utils/tokenHandler.test.ts diff --git a/airflow/ui/src/utils/tokenHandler.ts b/airflow-core/src/airflow/ui/src/utils/tokenHandler.ts similarity index 100% rename from airflow/ui/src/utils/tokenHandler.ts rename to airflow-core/src/airflow/ui/src/utils/tokenHandler.ts diff --git a/airflow/ui/src/utils/trimTextFn.ts b/airflow-core/src/airflow/ui/src/utils/trimTextFn.ts similarity index 100% rename from airflow/ui/src/utils/trimTextFn.ts rename to airflow-core/src/airflow/ui/src/utils/trimTextFn.ts diff --git a/airflow/ui/src/utils/useContainerWidth.ts b/airflow-core/src/airflow/ui/src/utils/useContainerWidth.ts similarity index 100% rename from airflow/ui/src/utils/useContainerWidth.ts rename to airflow-core/src/airflow/ui/src/utils/useContainerWidth.ts diff --git a/airflow/ui/src/vite-env.d.ts b/airflow-core/src/airflow/ui/src/vite-env.d.ts similarity index 100% rename from airflow/ui/src/vite-env.d.ts rename to airflow-core/src/airflow/ui/src/vite-env.d.ts diff --git a/airflow/ui/testsSetup.ts b/airflow-core/src/airflow/ui/testsSetup.ts similarity index 100% rename from airflow/ui/testsSetup.ts rename to airflow-core/src/airflow/ui/testsSetup.ts diff --git a/airflow/ui/tsconfig.app.json b/airflow-core/src/airflow/ui/tsconfig.app.json similarity index 100% rename from airflow/ui/tsconfig.app.json rename to airflow-core/src/airflow/ui/tsconfig.app.json diff --git a/airflow/ui/tsconfig.dev.json b/airflow-core/src/airflow/ui/tsconfig.dev.json similarity index 100% rename from airflow/ui/tsconfig.dev.json rename to airflow-core/src/airflow/ui/tsconfig.dev.json diff --git a/airflow/ui/tsconfig.json b/airflow-core/src/airflow/ui/tsconfig.json similarity index 100% rename from airflow/ui/tsconfig.json rename to airflow-core/src/airflow/ui/tsconfig.json diff --git a/airflow/ui/tsconfig.node.json b/airflow-core/src/airflow/ui/tsconfig.node.json similarity index 100% rename from airflow/ui/tsconfig.node.json rename to airflow-core/src/airflow/ui/tsconfig.node.json diff --git a/airflow/ui/vite.config.ts b/airflow-core/src/airflow/ui/vite.config.ts similarity index 100% rename from airflow/ui/vite.config.ts rename to airflow-core/src/airflow/ui/vite.config.ts diff --git a/airflow/utils/__init__.py b/airflow-core/src/airflow/utils/__init__.py similarity index 100% rename from airflow/utils/__init__.py rename to airflow-core/src/airflow/utils/__init__.py diff --git a/airflow/utils/api_migration.py b/airflow-core/src/airflow/utils/api_migration.py similarity index 100% rename from airflow/utils/api_migration.py rename to airflow-core/src/airflow/utils/api_migration.py diff --git a/airflow/utils/cli.py b/airflow-core/src/airflow/utils/cli.py similarity index 100% rename from airflow/utils/cli.py rename to airflow-core/src/airflow/utils/cli.py diff --git a/airflow/utils/cli_action_loggers.py b/airflow-core/src/airflow/utils/cli_action_loggers.py similarity index 100% rename from airflow/utils/cli_action_loggers.py rename to airflow-core/src/airflow/utils/cli_action_loggers.py diff --git a/airflow/utils/code_utils.py b/airflow-core/src/airflow/utils/code_utils.py similarity index 100% rename from airflow/utils/code_utils.py rename to airflow-core/src/airflow/utils/code_utils.py diff --git a/airflow/utils/configuration.py b/airflow-core/src/airflow/utils/configuration.py similarity index 87% rename from airflow/utils/configuration.py rename to airflow-core/src/airflow/utils/configuration.py index 15c8beb4d1b73..5d1bf51a580af 100644 --- a/airflow/utils/configuration.py +++ b/airflow-core/src/airflow/utils/configuration.py @@ -30,10 +30,10 @@ def tmp_configuration_copy(chmod=0o600, include_env=True, include_cmds=True): Return a path for a temporary file including a full copy of the configuration settings. :param include_env: Should the value of configuration from ``AIRFLOW__`` - environment variables be included or not - :param include_cmds: Should the result of calling any *_cmd config be - set (True, default), or should the _cmd options be left as the - command to run (False) + environment variables be included or not + :param include_cmds: Should the result of calling any ``*_cmd`` config be + set (True, default), or should the _cmd options be left as the + command to run (False) :return: a path to a temporary file """ cfg_dict = conf.as_dict( diff --git a/airflow/utils/context.py b/airflow-core/src/airflow/utils/context.py similarity index 100% rename from airflow/utils/context.py rename to airflow-core/src/airflow/utils/context.py diff --git a/airflow/utils/dag_cycle_tester.py b/airflow-core/src/airflow/utils/dag_cycle_tester.py similarity index 100% rename from airflow/utils/dag_cycle_tester.py rename to airflow-core/src/airflow/utils/dag_cycle_tester.py diff --git a/airflow/utils/dag_edges.py b/airflow-core/src/airflow/utils/dag_edges.py similarity index 100% rename from airflow/utils/dag_edges.py rename to airflow-core/src/airflow/utils/dag_edges.py diff --git a/airflow/utils/dag_parsing_context.py b/airflow-core/src/airflow/utils/dag_parsing_context.py similarity index 100% rename from airflow/utils/dag_parsing_context.py rename to airflow-core/src/airflow/utils/dag_parsing_context.py diff --git a/airflow/utils/dates.py b/airflow-core/src/airflow/utils/dates.py similarity index 100% rename from airflow/utils/dates.py rename to airflow-core/src/airflow/utils/dates.py diff --git a/airflow/utils/db.py b/airflow-core/src/airflow/utils/db.py similarity index 99% rename from airflow/utils/db.py rename to airflow-core/src/airflow/utils/db.py index 7055a1c76012f..fc36fd6e5b799 100644 --- a/airflow/utils/db.py +++ b/airflow-core/src/airflow/utils/db.py @@ -1344,8 +1344,7 @@ def compare_server_default( In SQLite: task_instance.map_index & task_reschedule.map_index are not comparing accurately. Sometimes they are equal, sometimes they are not. Alembic warned that this feature has varied accuracy depending on backends. - See: (https://alembic.sqlalchemy.org/en/latest/api/runtime.html#alembic.runtime. - environment.EnvironmentContext.configure.params.compare_server_default) + See: (https://alembic.sqlalchemy.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params.compare_server_default) """ dialect_name = context.connection.dialect.name if dialect_name in ["sqlite"]: diff --git a/airflow/utils/db_cleanup.py b/airflow-core/src/airflow/utils/db_cleanup.py similarity index 100% rename from airflow/utils/db_cleanup.py rename to airflow-core/src/airflow/utils/db_cleanup.py diff --git a/airflow/utils/db_manager.py b/airflow-core/src/airflow/utils/db_manager.py similarity index 100% rename from airflow/utils/db_manager.py rename to airflow-core/src/airflow/utils/db_manager.py diff --git a/airflow/utils/decorators.py b/airflow-core/src/airflow/utils/decorators.py similarity index 100% rename from airflow/utils/decorators.py rename to airflow-core/src/airflow/utils/decorators.py diff --git a/airflow/utils/deprecation_tools.py b/airflow-core/src/airflow/utils/deprecation_tools.py similarity index 100% rename from airflow/utils/deprecation_tools.py rename to airflow-core/src/airflow/utils/deprecation_tools.py diff --git a/airflow/utils/docs.py b/airflow-core/src/airflow/utils/docs.py similarity index 100% rename from airflow/utils/docs.py rename to airflow-core/src/airflow/utils/docs.py diff --git a/airflow/utils/dot_renderer.py b/airflow-core/src/airflow/utils/dot_renderer.py similarity index 100% rename from airflow/utils/dot_renderer.py rename to airflow-core/src/airflow/utils/dot_renderer.py diff --git a/airflow/utils/edgemodifier.py b/airflow-core/src/airflow/utils/edgemodifier.py similarity index 100% rename from airflow/utils/edgemodifier.py rename to airflow-core/src/airflow/utils/edgemodifier.py diff --git a/airflow/utils/email.py b/airflow-core/src/airflow/utils/email.py similarity index 100% rename from airflow/utils/email.py rename to airflow-core/src/airflow/utils/email.py diff --git a/airflow/utils/entry_points.py b/airflow-core/src/airflow/utils/entry_points.py similarity index 100% rename from airflow/utils/entry_points.py rename to airflow-core/src/airflow/utils/entry_points.py diff --git a/airflow/utils/event_scheduler.py b/airflow-core/src/airflow/utils/event_scheduler.py similarity index 100% rename from airflow/utils/event_scheduler.py rename to airflow-core/src/airflow/utils/event_scheduler.py diff --git a/airflow/utils/file.py b/airflow-core/src/airflow/utils/file.py similarity index 100% rename from airflow/utils/file.py rename to airflow-core/src/airflow/utils/file.py diff --git a/airflow/utils/hashlib_wrapper.py b/airflow-core/src/airflow/utils/hashlib_wrapper.py similarity index 100% rename from airflow/utils/hashlib_wrapper.py rename to airflow-core/src/airflow/utils/hashlib_wrapper.py diff --git a/airflow/utils/helpers.py b/airflow-core/src/airflow/utils/helpers.py similarity index 98% rename from airflow/utils/helpers.py rename to airflow-core/src/airflow/utils/helpers.py index d2fc13eaa1975..1f1bcac4b0e4f 100644 --- a/airflow/utils/helpers.py +++ b/airflow-core/src/airflow/utils/helpers.py @@ -307,7 +307,7 @@ def render_template_as_native(template: jinja2.Template, context: Context) -> An def exactly_one(*args) -> bool: """ - Return True if exactly one of *args is "truthy", and False otherwise. + Return True if exactly one of args is "truthy", and False otherwise. If user supplies an iterable, we raise ValueError and force them to unpack. """ @@ -320,7 +320,7 @@ def exactly_one(*args) -> bool: def at_most_one(*args) -> bool: """ - Return True if at most one of *args is "truthy", and False otherwise. + Return True if at most one of args is "truthy", and False otherwise. NOTSET is treated the same as None. diff --git a/airflow/utils/json.py b/airflow-core/src/airflow/utils/json.py similarity index 100% rename from airflow/utils/json.py rename to airflow-core/src/airflow/utils/json.py diff --git a/airflow/utils/log/__init__.py b/airflow-core/src/airflow/utils/log/__init__.py similarity index 100% rename from airflow/utils/log/__init__.py rename to airflow-core/src/airflow/utils/log/__init__.py diff --git a/airflow/utils/log/action_logger.py b/airflow-core/src/airflow/utils/log/action_logger.py similarity index 100% rename from airflow/utils/log/action_logger.py rename to airflow-core/src/airflow/utils/log/action_logger.py diff --git a/airflow/utils/log/colored_log.py b/airflow-core/src/airflow/utils/log/colored_log.py similarity index 100% rename from airflow/utils/log/colored_log.py rename to airflow-core/src/airflow/utils/log/colored_log.py diff --git a/airflow/utils/log/file_processor_handler.py b/airflow-core/src/airflow/utils/log/file_processor_handler.py similarity index 100% rename from airflow/utils/log/file_processor_handler.py rename to airflow-core/src/airflow/utils/log/file_processor_handler.py diff --git a/airflow/utils/log/file_task_handler.py b/airflow-core/src/airflow/utils/log/file_task_handler.py similarity index 100% rename from airflow/utils/log/file_task_handler.py rename to airflow-core/src/airflow/utils/log/file_task_handler.py diff --git a/airflow/utils/log/json_formatter.py b/airflow-core/src/airflow/utils/log/json_formatter.py similarity index 100% rename from airflow/utils/log/json_formatter.py rename to airflow-core/src/airflow/utils/log/json_formatter.py diff --git a/airflow/utils/log/log_reader.py b/airflow-core/src/airflow/utils/log/log_reader.py similarity index 100% rename from airflow/utils/log/log_reader.py rename to airflow-core/src/airflow/utils/log/log_reader.py diff --git a/airflow/utils/log/logging_mixin.py b/airflow-core/src/airflow/utils/log/logging_mixin.py similarity index 100% rename from airflow/utils/log/logging_mixin.py rename to airflow-core/src/airflow/utils/log/logging_mixin.py diff --git a/airflow/utils/log/non_caching_file_handler.py b/airflow-core/src/airflow/utils/log/non_caching_file_handler.py similarity index 100% rename from airflow/utils/log/non_caching_file_handler.py rename to airflow-core/src/airflow/utils/log/non_caching_file_handler.py diff --git a/airflow/utils/log/task_handler_with_custom_formatter.py b/airflow-core/src/airflow/utils/log/task_handler_with_custom_formatter.py similarity index 100% rename from airflow/utils/log/task_handler_with_custom_formatter.py rename to airflow-core/src/airflow/utils/log/task_handler_with_custom_formatter.py diff --git a/airflow/utils/log/timezone_aware.py b/airflow-core/src/airflow/utils/log/timezone_aware.py similarity index 100% rename from airflow/utils/log/timezone_aware.py rename to airflow-core/src/airflow/utils/log/timezone_aware.py diff --git a/airflow/utils/mixins.py b/airflow-core/src/airflow/utils/mixins.py similarity index 100% rename from airflow/utils/mixins.py rename to airflow-core/src/airflow/utils/mixins.py diff --git a/airflow/utils/module_loading.py b/airflow-core/src/airflow/utils/module_loading.py similarity index 100% rename from airflow/utils/module_loading.py rename to airflow-core/src/airflow/utils/module_loading.py diff --git a/airflow/utils/net.py b/airflow-core/src/airflow/utils/net.py similarity index 100% rename from airflow/utils/net.py rename to airflow-core/src/airflow/utils/net.py diff --git a/airflow/utils/operator_helpers.py b/airflow-core/src/airflow/utils/operator_helpers.py similarity index 100% rename from airflow/utils/operator_helpers.py rename to airflow-core/src/airflow/utils/operator_helpers.py diff --git a/airflow/utils/operator_resources.py b/airflow-core/src/airflow/utils/operator_resources.py similarity index 100% rename from airflow/utils/operator_resources.py rename to airflow-core/src/airflow/utils/operator_resources.py diff --git a/airflow/utils/orm_event_handlers.py b/airflow-core/src/airflow/utils/orm_event_handlers.py similarity index 100% rename from airflow/utils/orm_event_handlers.py rename to airflow-core/src/airflow/utils/orm_event_handlers.py diff --git a/airflow/utils/platform.py b/airflow-core/src/airflow/utils/platform.py similarity index 100% rename from airflow/utils/platform.py rename to airflow-core/src/airflow/utils/platform.py diff --git a/airflow/utils/process_utils.py b/airflow-core/src/airflow/utils/process_utils.py similarity index 100% rename from airflow/utils/process_utils.py rename to airflow-core/src/airflow/utils/process_utils.py diff --git a/airflow/utils/providers_configuration_loader.py b/airflow-core/src/airflow/utils/providers_configuration_loader.py similarity index 100% rename from airflow/utils/providers_configuration_loader.py rename to airflow-core/src/airflow/utils/providers_configuration_loader.py diff --git a/airflow/utils/retries.py b/airflow-core/src/airflow/utils/retries.py similarity index 100% rename from airflow/utils/retries.py rename to airflow-core/src/airflow/utils/retries.py diff --git a/airflow/utils/scheduler_health.py b/airflow-core/src/airflow/utils/scheduler_health.py similarity index 100% rename from airflow/utils/scheduler_health.py rename to airflow-core/src/airflow/utils/scheduler_health.py diff --git a/airflow/utils/serve_logs.py b/airflow-core/src/airflow/utils/serve_logs.py similarity index 100% rename from airflow/utils/serve_logs.py rename to airflow-core/src/airflow/utils/serve_logs.py diff --git a/airflow/utils/session.py b/airflow-core/src/airflow/utils/session.py similarity index 100% rename from airflow/utils/session.py rename to airflow-core/src/airflow/utils/session.py diff --git a/airflow/utils/setup_teardown.py b/airflow-core/src/airflow/utils/setup_teardown.py similarity index 100% rename from airflow/utils/setup_teardown.py rename to airflow-core/src/airflow/utils/setup_teardown.py diff --git a/airflow/utils/singleton.py b/airflow-core/src/airflow/utils/singleton.py similarity index 100% rename from airflow/utils/singleton.py rename to airflow-core/src/airflow/utils/singleton.py diff --git a/airflow/utils/sqlalchemy.py b/airflow-core/src/airflow/utils/sqlalchemy.py similarity index 100% rename from airflow/utils/sqlalchemy.py rename to airflow-core/src/airflow/utils/sqlalchemy.py diff --git a/airflow/utils/state.py b/airflow-core/src/airflow/utils/state.py similarity index 100% rename from airflow/utils/state.py rename to airflow-core/src/airflow/utils/state.py diff --git a/airflow/utils/strings.py b/airflow-core/src/airflow/utils/strings.py similarity index 100% rename from airflow/utils/strings.py rename to airflow-core/src/airflow/utils/strings.py diff --git a/airflow/utils/task_group.py b/airflow-core/src/airflow/utils/task_group.py similarity index 100% rename from airflow/utils/task_group.py rename to airflow-core/src/airflow/utils/task_group.py diff --git a/airflow/utils/task_instance_session.py b/airflow-core/src/airflow/utils/task_instance_session.py similarity index 100% rename from airflow/utils/task_instance_session.py rename to airflow-core/src/airflow/utils/task_instance_session.py diff --git a/airflow/utils/timeout.py b/airflow-core/src/airflow/utils/timeout.py similarity index 100% rename from airflow/utils/timeout.py rename to airflow-core/src/airflow/utils/timeout.py diff --git a/airflow/utils/timezone.py b/airflow-core/src/airflow/utils/timezone.py similarity index 100% rename from airflow/utils/timezone.py rename to airflow-core/src/airflow/utils/timezone.py diff --git a/airflow/utils/trigger_rule.py b/airflow-core/src/airflow/utils/trigger_rule.py similarity index 100% rename from airflow/utils/trigger_rule.py rename to airflow-core/src/airflow/utils/trigger_rule.py diff --git a/airflow/utils/types.py b/airflow-core/src/airflow/utils/types.py similarity index 100% rename from airflow/utils/types.py rename to airflow-core/src/airflow/utils/types.py diff --git a/airflow/utils/warnings.py b/airflow-core/src/airflow/utils/warnings.py similarity index 100% rename from airflow/utils/warnings.py rename to airflow-core/src/airflow/utils/warnings.py diff --git a/airflow/utils/weight_rule.py b/airflow-core/src/airflow/utils/weight_rule.py similarity index 100% rename from airflow/utils/weight_rule.py rename to airflow-core/src/airflow/utils/weight_rule.py diff --git a/airflow/utils/xcom.py b/airflow-core/src/airflow/utils/xcom.py similarity index 100% rename from airflow/utils/xcom.py rename to airflow-core/src/airflow/utils/xcom.py diff --git a/airflow/utils/yaml.py b/airflow-core/src/airflow/utils/yaml.py similarity index 99% rename from airflow/utils/yaml.py rename to airflow-core/src/airflow/utils/yaml.py index 22402757401c1..f13f429202292 100644 --- a/airflow/utils/yaml.py +++ b/airflow-core/src/airflow/utils/yaml.py @@ -22,6 +22,7 @@ This module delegates all other properties to the yaml module, so it can be used as: .. code-block:: python + import airflow.utils.yaml as yaml And then be used directly in place of the normal python module. diff --git a/airflow/version.py b/airflow-core/src/airflow/version.py similarity index 100% rename from airflow/version.py rename to airflow-core/src/airflow/version.py diff --git a/tests/conftest.py b/airflow-core/tests/conftest.py similarity index 95% rename from tests/conftest.py rename to airflow-core/tests/conftest.py index c1502e319f488..c5affb469f496 100644 --- a/tests/conftest.py +++ b/airflow-core/tests/conftest.py @@ -38,10 +38,10 @@ # Ignore files that are really test dags to be ignored by pytest collect_ignore = [ - "tests/dags/subdir1/test_ignore_this.py", - "tests/dags/test_invalid_dup_task.py", - "tests/dags_corrupted/test_impersonation_custom.py", - "tests_common.test_utils/perf/dags/elastic_dag.py", + "tests/unit/dags/subdir1/test_ignore_this.py", + "tests/unit/dags/test_invalid_dup_task.py", + "tests/unit/dags_corrupted/test_impersonation_custom.py", + "tests_common/test_utils/perf/dags/elastic_dag.py", ] @@ -109,7 +109,6 @@ def _config_bundles(bundles: dict[str, Path | str]): @pytest.fixture def configure_dag_bundles(): """Configure arbitrary DAG bundles with the provided paths""" - return _config_bundles @@ -127,7 +126,7 @@ def _config_bundle(path_to_parse: Path | str): @pytest.fixture def test_zip_path(tmp_path: Path): - TEST_DAGS_FOLDER = Path(__file__).parent / "dags" + TEST_DAGS_FOLDER = Path(__file__).parent / "unit" / "dags" test_zip_folder = TEST_DAGS_FOLDER / "test_zip" zipped = tmp_path / "test_zip.zip" with zipfile.ZipFile(zipped, "w") as zf: diff --git a/tests/deprecations_ignore.yml b/airflow-core/tests/deprecations_ignore.yml similarity index 100% rename from tests/deprecations_ignore.yml rename to airflow-core/tests/deprecations_ignore.yml diff --git a/tests/__init__.py b/airflow-core/tests/integration/__init__.py similarity index 88% rename from tests/__init__.py rename to airflow-core/tests/integration/__init__.py index 6d87031140df6..e8fd22856438c 100644 --- a/tests/__init__.py +++ b/airflow-core/tests/integration/__init__.py @@ -1,4 +1,3 @@ -# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -15,8 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from __future__ import annotations - -from pathlib import Path - -REPO_ROOT = Path(__file__).parent.parent +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/tests/api/common/__init__.py b/airflow-core/tests/integration/cli/__init__.py similarity index 100% rename from tests/api/common/__init__.py rename to airflow-core/tests/integration/cli/__init__.py diff --git a/tests/api_fastapi/__init__.py b/airflow-core/tests/integration/cli/commands/__init__.py similarity index 100% rename from tests/api_fastapi/__init__.py rename to airflow-core/tests/integration/cli/commands/__init__.py diff --git a/tests/integration/cli/commands/test_celery_command.py b/airflow-core/tests/integration/cli/commands/test_celery_command.py similarity index 100% rename from tests/integration/cli/commands/test_celery_command.py rename to airflow-core/tests/integration/cli/commands/test_celery_command.py diff --git a/tests/api_fastapi/auth/__init__.py b/airflow-core/tests/integration/executors/__init__.py similarity index 100% rename from tests/api_fastapi/auth/__init__.py rename to airflow-core/tests/integration/executors/__init__.py diff --git a/tests/integration/executors/test_celery_executor.py b/airflow-core/tests/integration/executors/test_celery_executor.py similarity index 100% rename from tests/integration/executors/test_celery_executor.py rename to airflow-core/tests/integration/executors/test_celery_executor.py diff --git a/tests/api_fastapi/auth/managers/__init__.py b/airflow-core/tests/integration/security/__init__.py similarity index 100% rename from tests/api_fastapi/auth/managers/__init__.py rename to airflow-core/tests/integration/security/__init__.py diff --git a/tests/integration/security/test_kerberos.py b/airflow-core/tests/integration/security/test_kerberos.py similarity index 100% rename from tests/integration/security/test_kerberos.py rename to airflow-core/tests/integration/security/test_kerberos.py diff --git a/scripts/ci/pre_commit/lint_www.py b/airflow-core/tests/system/__init__.py old mode 100755 new mode 100644 similarity index 53% rename from scripts/ci/pre_commit/lint_www.py rename to airflow-core/tests/system/__init__.py index 6d389b17999ab..e8fd22856438c --- a/scripts/ci/pre_commit/lint_www.py +++ b/airflow-core/tests/system/__init__.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -15,20 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from __future__ import annotations - -import subprocess -from pathlib import Path - -if __name__ not in ("__main__", "__mp_main__"): - raise SystemExit( - "This file is intended to be executed as an executable program. You cannot use it as a module." - f"To run this script, run the ./{__file__} command" - ) - -if __name__ == "__main__": - dir = Path("airflow") / "www" - subprocess.check_call(["yarn", "--frozen-lockfile", "--non-interactive"], cwd=dir) - subprocess.check_call(["yarn", "run", "generate-api-types"], cwd=dir) - subprocess.check_call(["yarn", "run", "format"], cwd=dir) - subprocess.check_call(["yarn", "run", "lint:fix"], cwd=dir) +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/tests/system/conftest.py b/airflow-core/tests/system/conftest.py similarity index 100% rename from tests/system/conftest.py rename to airflow-core/tests/system/conftest.py diff --git a/tests/api_fastapi/auth/managers/simple/__init__.py b/airflow-core/tests/system/core/__init__.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/__init__.py rename to airflow-core/tests/system/core/__init__.py diff --git a/tests/system/core/example_external_task_child_deferrable.py b/airflow-core/tests/system/core/example_external_task_child_deferrable.py similarity index 100% rename from tests/system/core/example_external_task_child_deferrable.py rename to airflow-core/tests/system/core/example_external_task_child_deferrable.py diff --git a/tests/system/core/example_external_task_parent_deferrable.py b/airflow-core/tests/system/core/example_external_task_parent_deferrable.py similarity index 100% rename from tests/system/core/example_external_task_parent_deferrable.py rename to airflow-core/tests/system/core/example_external_task_parent_deferrable.py diff --git a/tests/system/example_empty.py b/airflow-core/tests/system/example_empty.py similarity index 100% rename from tests/system/example_empty.py rename to airflow-core/tests/system/example_empty.py diff --git a/airflow-core/tests/unit/__init__.py b/airflow-core/tests/unit/__init__.py new file mode 100644 index 0000000000000..e8fd22856438c --- /dev/null +++ b/airflow-core/tests/unit/__init__.py @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/tests/api_fastapi/auth/managers/simple/routes/__init__.py b/airflow-core/tests/unit/always/__init__.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/routes/__init__.py rename to airflow-core/tests/unit/always/__init__.py diff --git a/tests/always/test_connection.py b/airflow-core/tests/unit/always/test_connection.py similarity index 99% rename from tests/always/test_connection.py rename to airflow-core/tests/unit/always/test_connection.py index 86037bcd4b825..696e9dd1c6508 100644 --- a/tests/always/test_connection.py +++ b/airflow-core/tests/unit/always/test_connection.py @@ -544,7 +544,7 @@ def test_connection_from_with_auth_info(self, uri, uri_parts): ], ) def test_from_json_extra(self, extra, expected): - """json serialization should support extra stored as object _or_ as object string representation""" + """Json serialization should support extra stored as object _or_ as object string representation""" assert Connection.from_json(extra).extra == expected @pytest.mark.parametrize( @@ -556,7 +556,7 @@ def test_from_json_extra(self, extra, expected): ], ) def test_from_json_conn_type(self, val, expected): - """two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" + """Two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" assert Connection.from_json(val).conn_type == expected @pytest.mark.parametrize( @@ -568,7 +568,7 @@ def test_from_json_conn_type(self, val, expected): ], ) def test_from_json_port(self, val, expected): - """two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" + """Two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" assert Connection.from_json(val).port == expected @pytest.mark.parametrize( @@ -580,7 +580,7 @@ def test_from_json_port(self, val, expected): ], ) def test_from_json_special_characters(self, val, expected): - """two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" + """Two conn_type normalizations are applied: replace - with _ and postgresql with postgres""" json_val = json.dumps(dict(password=val)) assert Connection.from_json(json_val).password == expected diff --git a/tests/always/test_example_dags.py b/airflow-core/tests/unit/always/test_example_dags.py similarity index 91% rename from tests/always/test_example_dags.py rename to airflow-core/tests/unit/always/test_example_dags.py index 043d853aec380..c1280699a5af5 100644 --- a/tests/always/test_example_dags.py +++ b/airflow-core/tests/unit/always/test_example_dags.py @@ -21,7 +21,6 @@ import sys from glob import glob from importlib import metadata as importlib_metadata -from pathlib import Path from unittest.mock import patch import pytest @@ -33,9 +32,8 @@ from airflow.utils import yaml from tests_common.test_utils.asserts import assert_queries_count +from tests_common.test_utils.paths import AIRFLOW_PROVIDERS_ROOT_PATH, AIRFLOW_ROOT_PATH -AIRFLOW_SOURCES_ROOT = Path(__file__).resolve().parents[2] -AIRFLOW_PROVIDERS_ROOT = AIRFLOW_SOURCES_ROOT / "airflow" / "providers" CURRENT_PYTHON_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}" PROVIDERS_PREFIXES = ["providers/"] OPTIONAL_PROVIDERS_DEPENDENCIES: dict[str, dict[str, str | None]] = { @@ -85,11 +83,11 @@ def get_suspended_providers_folders() -> list[str]: skipped when running tests (without any prefix - for example apache/beam, yandex, google etc.). """ suspended_providers = [] - for provider_path in AIRFLOW_PROVIDERS_ROOT.rglob("provider.yaml"): + for provider_path in AIRFLOW_PROVIDERS_ROOT_PATH.rglob("provider.yaml"): provider_yaml = yaml.safe_load(provider_path.read_text()) if provider_yaml["state"] == "suspended": suspended_providers.append( - provider_path.parent.relative_to(AIRFLOW_SOURCES_ROOT) + provider_path.parent.relative_to(AIRFLOW_ROOT_PATH) .as_posix() # TODO(potiuk): check .replace("providers/src/airflow/providers/", "") @@ -103,12 +101,12 @@ def get_python_excluded_providers_folders() -> list[str]: skipped when running tests (without any prefix - for example apache/beam, yandex, google etc.). """ excluded_providers = [] - for provider_path in AIRFLOW_PROVIDERS_ROOT.rglob("provider.yaml"): + for provider_path in AIRFLOW_PROVIDERS_ROOT_PATH.rglob("provider.yaml"): provider_yaml = yaml.safe_load(provider_path.read_text()) excluded_python_versions = provider_yaml.get("excluded-python-versions", []) if CURRENT_PYTHON_VERSION in excluded_python_versions: excluded_providers.append( - provider_path.parent.relative_to(AIRFLOW_SOURCES_ROOT) + provider_path.parent.relative_to(AIRFLOW_ROOT_PATH) .as_posix() # TODO(potiuk): check .replace("providers/src/airflow/providers/", "") @@ -129,18 +127,18 @@ def example_not_excluded_dags(xfail_db_exception: bool = False): suspended_providers_folders = get_suspended_providers_folders() current_python_excluded_providers_folders = get_python_excluded_providers_folders() suspended_providers_folders = [ - AIRFLOW_SOURCES_ROOT.joinpath(prefix, provider).as_posix() + AIRFLOW_ROOT_PATH.joinpath(prefix, provider).as_posix() for prefix in PROVIDERS_PREFIXES for provider in suspended_providers_folders ] current_python_excluded_providers_folders = [ - AIRFLOW_SOURCES_ROOT.joinpath(prefix, provider).as_posix() + AIRFLOW_ROOT_PATH.joinpath(prefix, provider).as_posix() for prefix in PROVIDERS_PREFIXES for provider in current_python_excluded_providers_folders ] - providers_folders = tuple([AIRFLOW_SOURCES_ROOT.joinpath(pp).as_posix() for pp in PROVIDERS_PREFIXES]) + providers_folders = tuple([AIRFLOW_ROOT_PATH.joinpath(pp).as_posix() for pp in PROVIDERS_PREFIXES]) for example_dir in example_dirs: - candidates = glob(f"{AIRFLOW_SOURCES_ROOT.as_posix()}/{example_dir}", recursive=True) + candidates = glob(f"{AIRFLOW_ROOT_PATH.as_posix()}/{example_dir}", recursive=True) for candidate in sorted(candidates): param_marks = [] @@ -182,7 +180,7 @@ def example_not_excluded_dags(xfail_db_exception: bool = False): def relative_path(path): - return os.path.relpath(path, AIRFLOW_SOURCES_ROOT.as_posix()) + return os.path.relpath(path, AIRFLOW_ROOT_PATH.as_posix()) @pytest.mark.db_test diff --git a/tests/always/test_pandas.py b/airflow-core/tests/unit/always/test_pandas.py similarity index 100% rename from tests/always/test_pandas.py rename to airflow-core/tests/unit/always/test_pandas.py diff --git a/tests/always/test_project_structure.py b/airflow-core/tests/unit/always/test_project_structure.py similarity index 97% rename from tests/always/test_project_structure.py rename to airflow-core/tests/unit/always/test_project_structure.py index 626d69a6d46e6..95d87e2f2b494 100644 --- a/tests/always/test_project_structure.py +++ b/airflow-core/tests/unit/always/test_project_structure.py @@ -24,17 +24,20 @@ import pytest -AIRFLOW_SOURCES_ROOT = pathlib.Path(__file__).parents[2] -PROVIDERS_ROOT_PATH = AIRFLOW_SOURCES_ROOT / "providers" +from tests_common.test_utils.paths import ( + AIRFLOW_CORE_SOURCES_PATH, + AIRFLOW_PROVIDERS_ROOT_PATH, + AIRFLOW_ROOT_PATH, +) class TestProjectStructure: def test_reference_to_providers_from_core(self): - for filename in AIRFLOW_SOURCES_ROOT.glob("example_dags/**/*.py"): + for filename in AIRFLOW_CORE_SOURCES_PATH.glob("example_dags/**/*.py"): self.assert_file_not_contains(filename, "providers") def test_deprecated_packages(self): - for filename in AIRFLOW_SOURCES_ROOT.glob("airflow/contrib/**/*.py"): + for filename in AIRFLOW_CORE_SOURCES_PATH.glob("airflow/contrib/**/*.py"): if filename.name == "__init__.py": self.assert_file_contains(filename, "This package is deprecated.") else: @@ -208,7 +211,7 @@ def test_providers_modules_should_have_tests(self): "providers/trino/tests/unit/trino/test_version_compat.py", ] modules_files: list[pathlib.Path] = list( - AIRFLOW_SOURCES_ROOT.glob("providers/**/src/airflow/providers/**/*.py") + AIRFLOW_PROVIDERS_ROOT_PATH.glob("**/src/airflow/providers/**/*.py") ) # Exclude .build files modules_files = (f for f in modules_files if ".build" not in f.parts) @@ -229,10 +232,10 @@ def test_providers_modules_should_have_tests(self): # Exclude get_provider_info files modules_files = (f for f in modules_files if "get_provider_info.py" not in f.parts) # Make path relative - modules_files = list(f.relative_to(AIRFLOW_SOURCES_ROOT) for f in modules_files) - current_test_files = list(PROVIDERS_ROOT_PATH.rglob("**/tests/**/*.py")) + modules_files = list(f.relative_to(AIRFLOW_ROOT_PATH) for f in modules_files) + current_test_files = list(AIRFLOW_PROVIDERS_ROOT_PATH.rglob("**/tests/**/*.py")) # Make path relative - current_test_files = list(f.relative_to(AIRFLOW_SOURCES_ROOT) for f in current_test_files) + current_test_files = list(f.relative_to(AIRFLOW_ROOT_PATH) for f in current_test_files) # Exclude __init__.py current_test_files = set(f for f in current_test_files if not f.name == "__init__.py") # Exclude node_modules @@ -299,7 +302,7 @@ class ProjectStructureTest: def new_class_paths(self): for resource_type in self.CLASS_DIRS: - python_files = PROVIDERS_ROOT_PATH.glob( + python_files = AIRFLOW_PROVIDERS_ROOT_PATH.glob( f"{self.PROVIDER}/**/{resource_type}/**/*.py", ) # Make path relative @@ -309,7 +312,7 @@ def new_class_paths(self): def list_of_classes(self): classes = {} for file in self.new_class_paths(): - operators_paths = self.get_classes_from_file(file, PROVIDERS_ROOT_PATH) + operators_paths = self.get_classes_from_file(file, AIRFLOW_PROVIDERS_ROOT_PATH) classes.update(operators_paths) return classes @@ -350,12 +353,12 @@ class ExampleCoverageTest(ProjectStructureTest): def example_paths(self): """Override this method if your example dags are located elsewhere""" yield from glob.glob( - f"{AIRFLOW_SOURCES_ROOT}/providers/{self.PROVIDER}/tests/system/{self.PROVIDER}/**/example_*.py", + f"{AIRFLOW_ROOT_PATH}/providers/{self.PROVIDER}/tests/system/{self.PROVIDER}/**/example_*.py", recursive=True, ) yield from glob.glob( - f"{AIRFLOW_SOURCES_ROOT}/providers/{self.PROVIDER}/src/airflow/providers/{self.PROVIDER}/**/example_*.py", + f"{AIRFLOW_ROOT_PATH}/providers/{self.PROVIDER}/src/airflow/providers/{self.PROVIDER}/**/example_*.py", recursive=True, ) @@ -654,7 +657,7 @@ class TestOperatorsHooks: def test_no_illegal_suffixes(self): illegal_suffixes = ["_operator.py", "_hook.py", "_sensor.py"] files = itertools.chain.from_iterable( - glob.glob(f"{AIRFLOW_SOURCES_ROOT}/{part}/providers/**/{resource_type}/*.py", recursive=True) + glob.glob(f"{AIRFLOW_ROOT_PATH}/{part}/providers/**/{resource_type}/*.py", recursive=True) for resource_type in ["operators", "hooks", "sensors", "example_dags"] for part in ["airflow", "tests"] ) diff --git a/tests/always/test_providers_manager.py b/airflow-core/tests/unit/always/test_providers_manager.py similarity index 99% rename from tests/always/test_providers_manager.py rename to airflow-core/tests/unit/always/test_providers_manager.py index 39637c6ea513b..32ff5bb233098 100644 --- a/tests/always/test_providers_manager.py +++ b/airflow-core/tests/unit/always/test_providers_manager.py @@ -22,7 +22,6 @@ import re import sys import warnings -from pathlib import Path from unittest.mock import patch import pytest @@ -40,7 +39,7 @@ ProvidersManager, ) -AIRFLOW_SOURCES_ROOT = Path(__file__).resolve().parents[2] +from tests_common.test_utils.paths import AIRFLOW_ROOT_PATH def test_cleanup_providers_manager(cleanup_providers_manager): @@ -233,7 +232,7 @@ def test_hooks(self): @pytest.mark.execution_timeout(150) def test_hook_values(self): provider_dependencies = json.loads( - (AIRFLOW_SOURCES_ROOT / "generated" / "provider_dependencies.json").read_text() + (AIRFLOW_ROOT_PATH / "generated" / "provider_dependencies.json").read_text() ) python_version = f"{sys.version_info.major}.{sys.version_info.minor}" excluded_providers: list[str] = [] diff --git a/tests/always/test_secrets.py b/airflow-core/tests/unit/always/test_secrets.py similarity index 100% rename from tests/always/test_secrets.py rename to airflow-core/tests/unit/always/test_secrets.py diff --git a/tests/always/test_secrets_backends.py b/airflow-core/tests/unit/always/test_secrets_backends.py similarity index 100% rename from tests/always/test_secrets_backends.py rename to airflow-core/tests/unit/always/test_secrets_backends.py diff --git a/tests/always/test_secrets_local_filesystem.py b/airflow-core/tests/unit/always/test_secrets_local_filesystem.py similarity index 100% rename from tests/always/test_secrets_local_filesystem.py rename to airflow-core/tests/unit/always/test_secrets_local_filesystem.py diff --git a/tests/api_fastapi/auth/managers/simple/services/__init__.py b/airflow-core/tests/unit/api/__init__.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/services/__init__.py rename to airflow-core/tests/unit/api/__init__.py diff --git a/tests/api_fastapi/common/__init__.py b/airflow-core/tests/unit/api/common/__init__.py similarity index 100% rename from tests/api_fastapi/common/__init__.py rename to airflow-core/tests/unit/api/common/__init__.py diff --git a/tests/api/common/test_airflow_health.py b/airflow-core/tests/unit/api/common/test_airflow_health.py similarity index 100% rename from tests/api/common/test_airflow_health.py rename to airflow-core/tests/unit/api/common/test_airflow_health.py diff --git a/tests/api/common/test_mark_tasks.py b/airflow-core/tests/unit/api/common/test_mark_tasks.py similarity index 100% rename from tests/api/common/test_mark_tasks.py rename to airflow-core/tests/unit/api/common/test_mark_tasks.py diff --git a/tests/api_fastapi/core_api/__init__.py b/airflow-core/tests/unit/api_fastapi/__init__.py similarity index 100% rename from tests/api_fastapi/core_api/__init__.py rename to airflow-core/tests/unit/api_fastapi/__init__.py diff --git a/tests/api_fastapi/core_api/routes/__init__.py b/airflow-core/tests/unit/api_fastapi/auth/__init__.py similarity index 100% rename from tests/api_fastapi/core_api/routes/__init__.py rename to airflow-core/tests/unit/api_fastapi/auth/__init__.py diff --git a/tests/api_fastapi/core_api/routes/public/__init__.py b/airflow-core/tests/unit/api_fastapi/auth/managers/__init__.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/__init__.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/__init__.py diff --git a/tests/api_fastapi/core_api/routes/ui/__init__.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/__init__.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/__init__.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/__init__.py diff --git a/tests/api_fastapi/auth/managers/simple/conftest.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/conftest.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/conftest.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/conftest.py diff --git a/tests/api_fastapi/execution_api/__init__.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/routes/__init__.py similarity index 100% rename from tests/api_fastapi/execution_api/__init__.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/routes/__init__.py diff --git a/tests/api_fastapi/auth/managers/simple/routes/test_login.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/routes/test_login.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/routes/test_login.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/routes/test_login.py diff --git a/tests/api_fastapi/execution_api/routes/__init__.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/services/__init__.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/__init__.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/services/__init__.py diff --git a/tests/api_fastapi/auth/managers/simple/services/test_login.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/services/test_login.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/services/test_login.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/services/test_login.py diff --git a/tests/api_fastapi/auth/managers/simple/test_simple_auth_manager.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/test_simple_auth_manager.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/test_simple_auth_manager.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/test_simple_auth_manager.py diff --git a/tests/api_fastapi/auth/managers/simple/test_user.py b/airflow-core/tests/unit/api_fastapi/auth/managers/simple/test_user.py similarity index 100% rename from tests/api_fastapi/auth/managers/simple/test_user.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/simple/test_user.py diff --git a/tests/api_fastapi/auth/managers/test_base_auth_manager.py b/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py similarity index 100% rename from tests/api_fastapi/auth/managers/test_base_auth_manager.py rename to airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py diff --git a/tests/api_fastapi/auth/test_tokens.py b/airflow-core/tests/unit/api_fastapi/auth/test_tokens.py similarity index 100% rename from tests/api_fastapi/auth/test_tokens.py rename to airflow-core/tests/unit/api_fastapi/auth/test_tokens.py diff --git a/tests/assets/__init__.py b/airflow-core/tests/unit/api_fastapi/common/__init__.py similarity index 100% rename from tests/assets/__init__.py rename to airflow-core/tests/unit/api_fastapi/common/__init__.py diff --git a/tests/api_fastapi/common/test_exceptions.py b/airflow-core/tests/unit/api_fastapi/common/test_exceptions.py similarity index 100% rename from tests/api_fastapi/common/test_exceptions.py rename to airflow-core/tests/unit/api_fastapi/common/test_exceptions.py diff --git a/tests/api_fastapi/conftest.py b/airflow-core/tests/unit/api_fastapi/conftest.py similarity index 99% rename from tests/api_fastapi/conftest.py rename to airflow-core/tests/unit/api_fastapi/conftest.py index 0b26b11ed10f8..0b4310eda60fc 100644 --- a/tests/api_fastapi/conftest.py +++ b/airflow-core/tests/unit/api_fastapi/conftest.py @@ -132,7 +132,6 @@ def make_dag_with_multiple_versions(dag_maker, configure_git_connection_for_dag_ Configure the associated dag_bundles. """ - dag_id = "dag_with_multiple_versions" for version_number in range(1, 4): with dag_maker(dag_id) as dag: diff --git a/tests/callbacks/__init__.py b/airflow-core/tests/unit/api_fastapi/core_api/__init__.py similarity index 100% rename from tests/callbacks/__init__.py rename to airflow-core/tests/unit/api_fastapi/core_api/__init__.py diff --git a/tests/charts/__init__.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/__init__.py similarity index 100% rename from tests/charts/__init__.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/__init__.py diff --git a/tests/cli/commands/local_commands/__init__.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/__init__.py similarity index 100% rename from tests/cli/commands/local_commands/__init__.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/__init__.py diff --git a/tests/api_fastapi/core_api/routes/public/test_assets.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_assets.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py diff --git a/tests/api_fastapi/core_api/routes/public/test_auth.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_auth.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_auth.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_auth.py diff --git a/tests/api_fastapi/core_api/routes/public/test_backfills.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_backfills.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py diff --git a/tests/api_fastapi/core_api/routes/public/test_config.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_config.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_config.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_config.py diff --git a/tests/api_fastapi/core_api/routes/public/test_connections.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_connections.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_connections.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_connections.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_parsing.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_parsing.py similarity index 88% rename from tests/api_fastapi/core_api/routes/public/test_dag_parsing.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_parsing.py index 1e80d245e14b2..a0095f13b6a10 100644 --- a/tests/api_fastapi/core_api/routes/public/test_dag_parsing.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_parsing.py @@ -16,8 +16,6 @@ # under the License. from __future__ import annotations -import os - import pytest from sqlalchemy import select @@ -26,17 +24,17 @@ from tests_common.test_utils.api_fastapi import _check_last_log from tests_common.test_utils.db import clear_db_dag_parsing_requests, clear_db_logs, parse_and_sync_to_db +from tests_common.test_utils.paths import AIRFLOW_CORE_SOURCES_PATH pytestmark = pytest.mark.db_test +EXAMPLE_DAG_FILE = AIRFLOW_CORE_SOURCES_PATH / "airflow" / "example_dags" / "example_bash_operator.py" +TEST_DAG_ID = "example_bash_operator" +NOT_READABLE_DAG_ID = "latest_only_with_trigger" +TEST_MULTIPLE_DAGS_ID = "asset_produces_1" -class TestDagParsingEndpoint: - ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) - EXAMPLE_DAG_FILE = os.path.join("airflow", "example_dags", "example_bash_operator.py") - TEST_DAG_ID = "example_bash_operator" - NOT_READABLE_DAG_ID = "latest_only_with_trigger" - TEST_MULTIPLE_DAGS_ID = "asset_produces_1" +class TestDagParsingEndpoint: @staticmethod def clear_db(): clear_db_dag_parsing_requests() @@ -47,9 +45,9 @@ def setup(self, session) -> None: clear_db_logs() def test_201_and_400_requests(self, url_safe_serializer, session, test_client): - parse_and_sync_to_db(self.EXAMPLE_DAG_FILE) + parse_and_sync_to_db(EXAMPLE_DAG_FILE) dagbag = DagBag(read_dags_from_db=True) - test_dag = dagbag.get_dag(self.TEST_DAG_ID) + test_dag = dagbag.get_dag(TEST_DAG_ID) url = f"/api/v2/parseDagFile/{url_safe_serializer.dumps(test_dag.fileloc)}" response = test_client.put(url, headers={"Accept": "application/json"}) diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_report.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_report.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dag_report.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_report.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_run.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py similarity index 99% rename from tests/api_fastapi/core_api/routes/public/test_dag_run.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py index f9f2cae44a44c..853b0ad985b81 100644 --- a/tests/api_fastapi/core_api/routes/public/test_dag_run.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py @@ -1019,7 +1019,7 @@ def clean_listener_manager(self): ) @pytest.mark.usefixtures("configure_git_connection_for_dag_bundle") def test_patch_dag_run_notifies_listeners(self, test_client, state, listener_state): - from tests.listeners.class_listener import ClassBasedListener + from unit.listeners.class_listener import ClassBasedListener listener = ClassBasedListener() get_listener_manager().add_listener(listener) diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_sources.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_sources.py similarity index 96% rename from tests/api_fastapi/core_api/routes/public/test_dag_sources.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_sources.py index 325265d282402..58b93a3129288 100644 --- a/tests/api_fastapi/core_api/routes/public/test_dag_sources.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_sources.py @@ -18,7 +18,6 @@ from __future__ import annotations import json -import os import pendulum import pytest @@ -32,13 +31,16 @@ from airflow.utils.types import DagRunTriggeredByType, DagRunType from tests_common.test_utils.db import clear_db_dags, clear_db_runs, parse_and_sync_to_db +from unit.serialization.test_dag_serialization import AIRFLOW_REPO_ROOT_PATH pytestmark = pytest.mark.db_test API_PREFIX = "/api/v2/dagSources" # Example bash operator located here: airflow/example_dags/example_bash_operator.py -EXAMPLE_DAG_FILE = os.path.join("airflow", "example_dags", "example_bash_operator.py") +EXAMPLE_DAG_FILE = ( + AIRFLOW_REPO_ROOT_PATH / "airflow-core" / "src" / "airflow" / "example_dags" / "example_bash_operator.py" +) TEST_DAG_ID = "example_bash_operator" diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_stats.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dag_stats.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_tags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dag_tags.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_versions.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_versions.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dag_versions.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_versions.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dag_warning.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_warning.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dag_warning.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_warning.py diff --git a/tests/api_fastapi/core_api/routes/public/test_dags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_dags.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py diff --git a/tests/api_fastapi/core_api/routes/public/test_event_logs.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_event_logs.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_event_logs.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_event_logs.py diff --git a/tests/api_fastapi/core_api/routes/public/test_extra_links.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_extra_links.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_extra_links.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_extra_links.py diff --git a/tests/api_fastapi/core_api/routes/public/test_import_error.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_import_error.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_import_error.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_import_error.py diff --git a/tests/api_fastapi/core_api/routes/public/test_job.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_job.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py diff --git a/tests/api_fastapi/core_api/routes/public/test_log.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_log.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_log.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_log.py diff --git a/tests/api_fastapi/core_api/routes/public/test_monitor.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_monitor.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_monitor.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_monitor.py diff --git a/tests/api_fastapi/core_api/routes/public/test_plugins.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_plugins.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_plugins.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_plugins.py diff --git a/tests/api_fastapi/core_api/routes/public/test_pools.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_pools.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py diff --git a/tests/api_fastapi/core_api/routes/public/test_providers.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_providers.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_providers.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_providers.py diff --git a/tests/api_fastapi/core_api/routes/public/test_task_instances.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py similarity index 99% rename from tests/api_fastapi/core_api/routes/public/test_task_instances.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py index 0ae9fdee65850..f72bc18a54902 100644 --- a/tests/api_fastapi/core_api/routes/public/test_task_instances.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py @@ -99,7 +99,6 @@ def create_task_instances( with_ti_history=False, ): """Method to create task instances using kwargs and default arguments""" - dag = self.dagbag.get_dag(dag_id) tasks = dag.tasks counter = len(tasks) diff --git a/tests/api_fastapi/core_api/routes/public/test_tasks.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_tasks.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_tasks.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_tasks.py diff --git a/tests/api_fastapi/core_api/routes/public/test_variables.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_variables.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_variables.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_variables.py diff --git a/tests/api_fastapi/core_api/routes/public/test_version.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_version.py similarity index 100% rename from tests/api_fastapi/core_api/routes/public/test_version.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_version.py diff --git a/tests/api_fastapi/core_api/routes/public/test_xcom.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_xcom.py similarity index 99% rename from tests/api_fastapi/core_api/routes/public/test_xcom.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_xcom.py index 7e3d46084ed94..61ff52b6bb272 100644 --- a/tests/api_fastapi/core_api/routes/public/test_xcom.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_xcom.py @@ -193,7 +193,7 @@ def test_should_raise_404_for_non_existent_xcom(self, test_client): ), ], ) - @conf_vars({("core", "xcom_backend"): "tests.api_fastapi.core_api.routes.public.test_xcom.CustomXCom"}) + @conf_vars({("core", "xcom_backend"): "unit.api_fastapi.core_api.routes.public.test_xcom.CustomXCom"}) def test_custom_xcom_deserialize( self, support_deserialize: bool, params: str, expected_status_or_value: int | str, test_client ): diff --git a/tests/api_fastapi/core_api/routes/test_routes.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/test_routes.py similarity index 99% rename from tests/api_fastapi/core_api/routes/test_routes.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/test_routes.py index 805b5815987b2..9ec7b384864a9 100644 --- a/tests/api_fastapi/core_api/routes/test_routes.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/test_routes.py @@ -32,7 +32,6 @@ def test_no_auth_routes(): Verify that only the routes with NO_AUTH_PATHS are excluded from the `authenticated_router`. This test ensures that a router is not added to the non-authenticated router by mistake. """ - paths_in_public_router = {route.path for route in public_router.routes} paths_in_authenticated_router = { f"{public_router.prefix}{route.path}" for route in authenticated_router.routes @@ -42,7 +41,6 @@ def test_no_auth_routes(): def test_routes_with_responses(): """Verify that each route in `public_router` has appropriate responses configured.""" - for route in public_router.routes: if route.path in NO_AUTH_PATHS: # Routes in NO_AUTH_PATHS should not have 401 or 403 response codes diff --git a/tests/cli/commands/remote_commands/__init__.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/__init__.py similarity index 100% rename from tests/cli/commands/remote_commands/__init__.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/__init__.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_assets.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_assets.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_assets.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_assets.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_auth.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_auth.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_backfills.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_backfills.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_config.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py similarity index 99% rename from tests/api_fastapi/core_api/routes/ui/test_config.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py index d6cd698901603..b67a647a7b06f 100644 --- a/tests/api_fastapi/core_api/routes/ui/test_config.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py @@ -110,7 +110,6 @@ def test_should_response_200(self, mock_config_data, test_client): """ Test the /ui/config endpoint to verify response matches mock data. """ - response = test_client.get("/ui/config") assert response.status_code == 200 diff --git a/tests/api_fastapi/core_api/routes/ui/test_connections.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_connections.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_connections.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_connections.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_dags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py similarity index 98% rename from tests/api_fastapi/core_api/routes/ui/test_dags.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py index 3e98e2fcba9bd..f72a43cc1be42 100644 --- a/tests/api_fastapi/core_api/routes/ui/test_dags.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py @@ -26,7 +26,7 @@ from airflow.utils.state import DagRunState from airflow.utils.types import DagRunTriggeredByType, DagRunType -from tests.api_fastapi.core_api.routes.public.test_dags import ( +from unit.api_fastapi.core_api.routes.public.test_dags import ( DAG1_ID, DAG2_ID, DAG3_ID, diff --git a/tests/api_fastapi/core_api/routes/ui/test_dashboard.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dashboard.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_dashboard.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dashboard.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_dependencies.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dependencies.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_dependencies.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dependencies.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_grid.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_grid.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py diff --git a/tests/api_fastapi/core_api/routes/ui/test_structure.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_structure.py similarity index 100% rename from tests/api_fastapi/core_api/routes/ui/test_structure.py rename to airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_structure.py diff --git a/tests/api_fastapi/core_api/test_security.py b/airflow-core/tests/unit/api_fastapi/core_api/test_security.py similarity index 100% rename from tests/api_fastapi/core_api/test_security.py rename to airflow-core/tests/unit/api_fastapi/core_api/test_security.py diff --git a/tests/config_templates/__init__.py b/airflow-core/tests/unit/api_fastapi/execution_api/__init__.py similarity index 100% rename from tests/config_templates/__init__.py rename to airflow-core/tests/unit/api_fastapi/execution_api/__init__.py diff --git a/tests/api_fastapi/execution_api/conftest.py b/airflow-core/tests/unit/api_fastapi/execution_api/conftest.py similarity index 100% rename from tests/api_fastapi/execution_api/conftest.py rename to airflow-core/tests/unit/api_fastapi/execution_api/conftest.py diff --git a/tests/core/__init__.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/__init__.py similarity index 100% rename from tests/core/__init__.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/__init__.py diff --git a/tests/api_fastapi/execution_api/routes/test_asset_events.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_asset_events.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_asset_events.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_asset_events.py diff --git a/tests/api_fastapi/execution_api/routes/test_assets.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_assets.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_assets.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_assets.py diff --git a/tests/api_fastapi/execution_api/routes/test_connections.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_connections.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_connections.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_connections.py diff --git a/tests/api_fastapi/execution_api/routes/test_dag_runs.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_dag_runs.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_dag_runs.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_dag_runs.py diff --git a/tests/api_fastapi/execution_api/routes/test_health.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_health.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_health.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_health.py diff --git a/tests/api_fastapi/execution_api/routes/test_task_instances.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_task_instances.py similarity index 99% rename from tests/api_fastapi/execution_api/routes/test_task_instances.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_task_instances.py index 6cd74f856abac..b66b1a898b52d 100644 --- a/tests/api_fastapi/execution_api/routes/test_task_instances.py +++ b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_task_instances.py @@ -542,7 +542,6 @@ def test_ti_update_state_running_errors(self, client, session, create_task_insta Task should be set to Running state via the /execution/task-instances/{task_instance_id}/run endpoint. """ - ti = create_task_instance( task_id="test_ti_update_state_running_errors", state=State.QUEUED, @@ -592,7 +591,6 @@ def test_ti_update_state_to_deferred(self, client, session, create_task_instance """ Test that tests if the transition to deferred state is handled correctly. """ - ti = create_task_instance( task_id="test_ti_update_state_to_deferred", state=State.RUNNING, @@ -650,7 +648,6 @@ def test_ti_update_state_to_reschedule(self, client, session, create_task_instan """ Test that tests if the transition to reschedule state is handled correctly. """ - instant = timezone.datetime(2024, 10, 30) time_machine.move_to(instant, tick=False) @@ -977,7 +974,6 @@ def test_ti_heartbeat( def test_ti_heartbeat_non_existent_task(self, client, session, create_task_instance): """Test that a 404 error is returned when the Task Instance does not exist.""" - task_instance_id = "0182e924-0f1e-77e6-ab50-e977118bc139" # Pre-condition: the Task Instance does not exist @@ -1000,7 +996,6 @@ def test_ti_heartbeat_non_existent_task(self, client, session, create_task_insta ) def test_ti_heartbeat_when_task_not_running(self, client, session, create_task_instance, ti_state): """Test that a 409 error is returned when the Task Instance is not in RUNNING state.""" - ti = create_task_instance( task_id="test_ti_heartbeat_when_task_not_running", state=ti_state, @@ -1025,7 +1020,6 @@ def test_ti_heartbeat_when_task_not_running(self, client, session, create_task_i def test_ti_heartbeat_update(self, client, session, create_task_instance, time_machine): """Test that the Task Instance heartbeat is updated when the Task Instance is running.""" - # Set initial time for the test time_now = timezone.parse("2024-10-31T12:00:00Z") time_machine.move_to(time_now, tick=False) diff --git a/tests/api_fastapi/execution_api/routes/test_variables.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_variables.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_variables.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_variables.py diff --git a/tests/api_fastapi/execution_api/routes/test_xcoms.py b/airflow-core/tests/unit/api_fastapi/execution_api/routes/test_xcoms.py similarity index 100% rename from tests/api_fastapi/execution_api/routes/test_xcoms.py rename to airflow-core/tests/unit/api_fastapi/execution_api/routes/test_xcoms.py diff --git a/tests/api_fastapi/execution_api/test_app.py b/airflow-core/tests/unit/api_fastapi/execution_api/test_app.py similarity index 99% rename from tests/api_fastapi/execution_api/test_app.py rename to airflow-core/tests/unit/api_fastapi/execution_api/test_app.py index 6eeeec393a874..1baa9487ce6ce 100644 --- a/tests/api_fastapi/execution_api/test_app.py +++ b/airflow-core/tests/unit/api_fastapi/execution_api/test_app.py @@ -25,7 +25,6 @@ def test_custom_openapi_includes_extra_schemas(client): """Test to ensure that extra schemas are correctly included in the OpenAPI schema.""" - response = client.get("/execution/openapi.json?version=2025-03-19") assert response.status_code == 200 diff --git a/tests/api_fastapi/test_app.py b/airflow-core/tests/unit/api_fastapi/test_app.py similarity index 100% rename from tests/api_fastapi/test_app.py rename to airflow-core/tests/unit/api_fastapi/test_app.py diff --git a/tests/dag_processing/__init__.py b/airflow-core/tests/unit/assets/__init__.py similarity index 100% rename from tests/dag_processing/__init__.py rename to airflow-core/tests/unit/assets/__init__.py diff --git a/tests/assets/test_evaluation.py b/airflow-core/tests/unit/assets/test_evaluation.py similarity index 100% rename from tests/assets/test_evaluation.py rename to airflow-core/tests/unit/assets/test_evaluation.py diff --git a/tests/assets/test_manager.py b/airflow-core/tests/unit/assets/test_manager.py similarity index 99% rename from tests/assets/test_manager.py rename to airflow-core/tests/unit/assets/test_manager.py index 3ffd14643eadd..3daa6b7361b4e 100644 --- a/tests/assets/test_manager.py +++ b/airflow-core/tests/unit/assets/test_manager.py @@ -36,7 +36,7 @@ from airflow.models.dag import DagModel from airflow.sdk.definitions.asset import Asset -from tests.listeners import asset_listener +from unit.listeners import asset_listener pytestmark = pytest.mark.db_test diff --git a/tests/dag_processing/bundles/__init__.py b/airflow-core/tests/unit/callbacks/__init__.py similarity index 100% rename from tests/dag_processing/bundles/__init__.py rename to airflow-core/tests/unit/callbacks/__init__.py diff --git a/tests/callbacks/test_callback_requests.py b/airflow-core/tests/unit/callbacks/test_callback_requests.py similarity index 100% rename from tests/callbacks/test_callback_requests.py rename to airflow-core/tests/unit/callbacks/test_callback_requests.py diff --git a/tests/dags/__init__.py b/airflow-core/tests/unit/charts/__init__.py similarity index 100% rename from tests/dags/__init__.py rename to airflow-core/tests/unit/charts/__init__.py diff --git a/tests/charts/conftest.py b/airflow-core/tests/unit/charts/conftest.py similarity index 100% rename from tests/charts/conftest.py rename to airflow-core/tests/unit/charts/conftest.py diff --git a/tests/charts/helm_template_generator.py b/airflow-core/tests/unit/charts/helm_template_generator.py similarity index 98% rename from tests/charts/helm_template_generator.py rename to airflow-core/tests/unit/charts/helm_template_generator.py index 0fb7a847d0575..45a406c85349b 100644 --- a/tests/charts/helm_template_generator.py +++ b/airflow-core/tests/unit/charts/helm_template_generator.py @@ -32,7 +32,7 @@ api_client = ApiClient() -CHART_DIR = Path(__file__).resolve().parents[2] / "chart" +CHART_DIR = Path(__file__).resolve().parents[4] / "chart" DEFAULT_KUBERNETES_VERSION = "1.29.1" BASE_URL_SPEC = ( diff --git a/tests/charts/log_groomer.py b/airflow-core/tests/unit/charts/log_groomer.py similarity index 99% rename from tests/charts/log_groomer.py rename to airflow-core/tests/unit/charts/log_groomer.py index 4e07a598301a6..80930b3c1ecc2 100644 --- a/tests/charts/log_groomer.py +++ b/airflow-core/tests/unit/charts/log_groomer.py @@ -19,7 +19,7 @@ import jmespath import pytest -from tests.charts.helm_template_generator import render_chart +from unit.charts.helm_template_generator import render_chart class LogGroomerTestBase: diff --git a/tests/cli/__init__.py b/airflow-core/tests/unit/cli/__init__.py similarity index 100% rename from tests/cli/__init__.py rename to airflow-core/tests/unit/cli/__init__.py diff --git a/tests/dags/subdir1/__init__.py b/airflow-core/tests/unit/cli/api/__init__.py similarity index 100% rename from tests/dags/subdir1/__init__.py rename to airflow-core/tests/unit/cli/api/__init__.py diff --git a/tests/cli/commands/__init__.py b/airflow-core/tests/unit/cli/commands/__init__.py similarity index 100% rename from tests/cli/commands/__init__.py rename to airflow-core/tests/unit/cli/commands/__init__.py diff --git a/tests/cli/commands/_common_cli_classes.py b/airflow-core/tests/unit/cli/commands/_common_cli_classes.py similarity index 100% rename from tests/cli/commands/_common_cli_classes.py rename to airflow-core/tests/unit/cli/commands/_common_cli_classes.py diff --git a/tests/dags/subdir2/__init__.py b/airflow-core/tests/unit/cli/commands/local_commands/__init__.py similarity index 100% rename from tests/dags/subdir2/__init__.py rename to airflow-core/tests/unit/cli/commands/local_commands/__init__.py diff --git a/tests/cli/commands/local_commands/test_api_server_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py similarity index 98% rename from tests/cli/commands/local_commands/test_api_server_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py index 022505b710f0e..29678b463122c 100644 --- a/tests/cli/commands/local_commands/test_api_server_command.py +++ b/airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py @@ -24,7 +24,7 @@ from airflow.cli.commands.local_commands import api_server_command from airflow.exceptions import AirflowConfigException -from tests.cli.commands._common_cli_classes import _CommonCLIGunicornTestClass +from unit.cli.commands._common_cli_classes import _CommonCLIGunicornTestClass console = Console(width=400, color_system="standard") diff --git a/tests/cli/commands/local_commands/test_cheat_sheet_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_cheat_sheet_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_cheat_sheet_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_cheat_sheet_command.py diff --git a/tests/cli/commands/local_commands/test_dag_processor_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_dag_processor_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_dag_processor_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_dag_processor_command.py diff --git a/tests/cli/commands/local_commands/test_db_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py similarity index 99% rename from tests/cli/commands/local_commands/test_db_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py index 7b3a5deb010e6..d1821f37dc12f 100644 --- a/tests/cli/commands/local_commands/test_db_command.py +++ b/airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py @@ -285,7 +285,6 @@ def test_cli_shell_invalid(self): @mock.patch("airflow.utils.db.downgrade") def test_cli_downgrade_invalid(self, mock_dg, args, match): """We test some options that should produce an error""" - with pytest.raises(SystemExit, match=match): db_command.downgrade(self.parser.parse_args(["db", "downgrade", *args])) diff --git a/tests/cli/commands/local_commands/test_info_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_info_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_info_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_info_command.py diff --git a/tests/cli/commands/local_commands/test_kerberos_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_kerberos_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_kerberos_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_kerberos_command.py diff --git a/tests/cli/commands/local_commands/test_plugins_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py similarity index 86% rename from tests/cli/commands/local_commands/test_plugins_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py index d780d5886320e..2621e39b9d332 100644 --- a/tests/cli/commands/local_commands/test_plugins_command.py +++ b/airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py @@ -29,8 +29,8 @@ from airflow.plugins_manager import AirflowPlugin from airflow.sdk import BaseOperatorLink -from tests.plugins.test_plugin import AirflowTestPlugin as ComplexAirflowPlugin from tests_common.test_utils.mock_plugins import mock_plugin_manager +from unit.plugins.test_plugin import AirflowTestPlugin as ComplexAirflowPlugin pytestmark = pytest.mark.db_test @@ -72,10 +72,10 @@ def test_should_display_one_plugin(self): { "name": "test_plugin", "admin_views": [], - "macros": ["tests.plugins.test_plugin.plugin_macro"], + "macros": ["unit.plugins.test_plugin.plugin_macro"], "menu_links": [], "flask_blueprints": [ - "" + "" ], "fastapi_apps": [ { @@ -89,14 +89,14 @@ def test_should_display_one_plugin(self): "name": "Test View", "category": "Test Plugin", "label": "Test Label", - "view": "tests.plugins.test_plugin.PluginTestAppBuilderBaseView", + "view": "unit.plugins.test_plugin.PluginTestAppBuilderBaseView", } ], "global_operator_extra_links": [ "", "", ], - "timetables": ["tests.plugins.test_plugin.CustomCronDataIntervalTimetable"], + "timetables": ["unit.plugins.test_plugin.CustomCronDataIntervalTimetable"], "operator_extra_links": [ "", "", @@ -104,8 +104,8 @@ def test_should_display_one_plugin(self): "", ], "listeners": [ - "tests.listeners.empty_listener", - "tests.listeners.class_listener.ClassBasedListener", + "unit.listeners.empty_listener", + "unit.listeners.class_listener.ClassBasedListener", ], "source": None, "appbuilder_menu_items": [ @@ -116,7 +116,7 @@ def test_should_display_one_plugin(self): "label": "The Apache Software Foundation", }, ], - "priority_weight_strategies": ["tests.plugins.test_plugin.CustomPriorityWeightStrategy"], + "priority_weight_strategies": ["unit.plugins.test_plugin.CustomPriorityWeightStrategy"], } ] get_listener_manager().clear() @@ -133,8 +133,8 @@ def test_should_display_one_plugins_as_table(self): expected_output = textwrap.dedent( """\ name | global_operator_extra_links - ================+=============================================================================== - test-plugin-cli | + ================+============================================================================== + test-plugin-cli | """ ) assert stdout == expected_output diff --git a/tests/cli/commands/local_commands/test_rotate_fernet_key_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_rotate_fernet_key_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_rotate_fernet_key_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_rotate_fernet_key_command.py diff --git a/tests/cli/commands/local_commands/test_scheduler_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_scheduler_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_scheduler_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_scheduler_command.py diff --git a/tests/cli/commands/local_commands/test_standalone_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_standalone_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_standalone_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_standalone_command.py diff --git a/tests/cli/commands/local_commands/test_triggerer_command.py b/airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py similarity index 100% rename from tests/cli/commands/local_commands/test_triggerer_command.py rename to airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py diff --git a/tests/dags/subdir2/subdir3/__init__.py b/airflow-core/tests/unit/cli/commands/remote_commands/__init__.py similarity index 100% rename from tests/dags/subdir2/subdir3/__init__.py rename to airflow-core/tests/unit/cli/commands/remote_commands/__init__.py diff --git a/tests/cli/commands/remote_commands/test_asset_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_asset_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_asset_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_asset_command.py diff --git a/tests/cli/commands/remote_commands/test_backfill_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_backfill_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_backfill_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_backfill_command.py diff --git a/tests/cli/commands/remote_commands/test_config_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_config_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_config_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_config_command.py diff --git a/tests/cli/commands/remote_commands/test_connection_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py similarity index 99% rename from tests/cli/commands/remote_commands/test_connection_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py index 478b72fda7c15..ccfe38880b3f4 100644 --- a/tests/cli/commands/remote_commands/test_connection_command.py +++ b/airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py @@ -599,7 +599,7 @@ def test_cli_connections_add_delete_with_missing_parameters(self): connection_command.connections_add(self.parser.parse_args(["connections", "add", "new1"])) def test_cli_connections_add_json_invalid_args(self): - """can't supply extra and json""" + """Can't supply extra and json""" with pytest.raises( SystemExit, match=r"The following args are not compatible with the --conn-json flag: \['--conn-extra'\]", @@ -611,7 +611,7 @@ def test_cli_connections_add_json_invalid_args(self): ) def test_cli_connections_add_json_and_uri(self): - """can't supply both uri and json""" + """Can't supply both uri and json""" with pytest.raises( SystemExit, match="Cannot supply both conn-uri and conn-json", diff --git a/tests/cli/commands/remote_commands/test_dag_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py similarity index 99% rename from tests/cli/commands/remote_commands/test_dag_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py index 411868d38896b..9b6c231e62fd7 100644 --- a/tests/cli/commands/remote_commands/test_dag_command.py +++ b/airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py @@ -48,7 +48,6 @@ from airflow.utils.state import DagRunState from airflow.utils.types import DagRunType -from tests.models import TEST_DAGS_FOLDER from tests_common.test_utils.config import conf_vars from tests_common.test_utils.db import ( clear_db_dags, @@ -56,6 +55,7 @@ clear_db_runs, parse_and_sync_to_db, ) +from unit.models import TEST_DAGS_FOLDER DEFAULT_DATE = timezone.make_aware(datetime(2015, 1, 1), timezone=timezone.utc) if pendulum.__version__.startswith("3"): @@ -322,7 +322,6 @@ def test_cli_list_import_errors(self, get_test_dag, configure_testing_dag_bundle args = self.parser.parse_args( ["dags", "list-import-errors", "--output", "yaml", "--bundle-name", "testing"] ) - with configure_testing_dag_bundle(path_to_parse): with pytest.raises(SystemExit) as err_ctx: with caplog.at_level(logging.ERROR): diff --git a/tests/cli/commands/remote_commands/test_jobs_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_jobs_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_jobs_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_jobs_command.py diff --git a/tests/cli/commands/remote_commands/test_pool_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_pool_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_pool_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_pool_command.py diff --git a/tests/cli/commands/remote_commands/test_task_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py similarity index 99% rename from tests/cli/commands/remote_commands/test_task_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py index 50f2acd59742b..2ed3a60b3b6d0 100644 --- a/tests/cli/commands/remote_commands/test_task_command.py +++ b/airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py @@ -167,7 +167,8 @@ def test_test_with_existing_dag_run(self, caplog): @pytest.mark.enable_redact def test_test_filters_secrets(self, capsys): - """Test ``airflow test`` does not print secrets to stdout. + """ + Test ``airflow test`` does not print secrets to stdout. Output should be filtered by SecretsMasker. """ diff --git a/tests/cli/commands/remote_commands/test_variable_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_variable_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_variable_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_variable_command.py diff --git a/tests/cli/commands/remote_commands/test_version_command.py b/airflow-core/tests/unit/cli/commands/remote_commands/test_version_command.py similarity index 100% rename from tests/cli/commands/remote_commands/test_version_command.py rename to airflow-core/tests/unit/cli/commands/remote_commands/test_version_command.py diff --git a/tests/cli/commands/test_legacy_commands.py b/airflow-core/tests/unit/cli/commands/test_legacy_commands.py similarity index 100% rename from tests/cli/commands/test_legacy_commands.py rename to airflow-core/tests/unit/cli/commands/test_legacy_commands.py diff --git a/tests/cli/conftest.py b/airflow-core/tests/unit/cli/conftest.py similarity index 100% rename from tests/cli/conftest.py rename to airflow-core/tests/unit/cli/conftest.py diff --git a/tests/cli/test_cli_parser.py b/airflow-core/tests/unit/cli/test_cli_parser.py similarity index 98% rename from tests/cli/test_cli_parser.py rename to airflow-core/tests/unit/cli/test_cli_parser.py index 427460c9336bf..3b748aa2b0598 100644 --- a/tests/cli/test_cli_parser.py +++ b/airflow-core/tests/unit/cli/test_cli_parser.py @@ -206,8 +206,10 @@ def test_hybrid_executor_get_cli_commands( def test_hybrid_executor_get_cli_commands_with_error( self, ecs_executor_cli_commands_mock, celery_executor_cli_commands_mock, caplog ): - """Test that if multiple executors are configured, then every executor loads its commands. - If the executor fails to load its commands, the CLI should log the error, and continue loading""" + """ + Test that if multiple executors are configured, then every executor loads its commands. + If the executor fails to load its commands, the CLI should log the error, and continue loading + """ caplog.set_level("ERROR") ecs_executor_command = ActionCommand( name="ecs_command", @@ -450,7 +452,7 @@ class TestCliSubprocess: """ We need to run it from sources using "__main__" and setting the PYTHONPATH, not command line tool, because we need to make sure that we have providers loaded from source provider.yaml files rather - than from provider packages which might not be installed in the test environment. + than from provider distributions which might not be installed in the test environment. """ @pytest.mark.quarantined @@ -467,7 +469,8 @@ def test_cli_run_time(self): assert timing_result < threshold def test_cli_parsing_does_not_initialize_providers_manager(self): - """Test that CLI parsing does not initialize providers manager. + """ + Test that CLI parsing does not initialize providers manager. This test is here to make sure that we do not initialize providers manager - it is run as a separate subprocess, to make sure we do not have providers manager initialized in the main @@ -484,7 +487,8 @@ def test_cli_parsing_does_not_initialize_providers_manager(self): assert result.returncode == 0 def test_airflow_config_contains_providers(self): - """Test that airflow config has providers included by default. + """ + Test that airflow config has providers included by default. This test is run as a separate subprocess, to make sure we do not have providers manager initialized in the main process from other tests. diff --git a/tests/cluster_policies/__init__.py b/airflow-core/tests/unit/cluster_policies/__init__.py similarity index 100% rename from tests/cluster_policies/__init__.py rename to airflow-core/tests/unit/cluster_policies/__init__.py diff --git a/tests/dags/test_zip/test_zip_module/__init__.py b/airflow-core/tests/unit/config_templates/__init__.py similarity index 100% rename from tests/dags/test_zip/test_zip_module/__init__.py rename to airflow-core/tests/unit/config_templates/__init__.py diff --git a/tests/config_templates/deprecated.cfg b/airflow-core/tests/unit/config_templates/deprecated.cfg similarity index 100% rename from tests/config_templates/deprecated.cfg rename to airflow-core/tests/unit/config_templates/deprecated.cfg diff --git a/tests/config_templates/deprecated_cmd.cfg b/airflow-core/tests/unit/config_templates/deprecated_cmd.cfg similarity index 100% rename from tests/config_templates/deprecated_cmd.cfg rename to airflow-core/tests/unit/config_templates/deprecated_cmd.cfg diff --git a/tests/config_templates/deprecated_secret.cfg b/airflow-core/tests/unit/config_templates/deprecated_secret.cfg similarity index 100% rename from tests/config_templates/deprecated_secret.cfg rename to airflow-core/tests/unit/config_templates/deprecated_secret.cfg diff --git a/tests/config_templates/empty.cfg b/airflow-core/tests/unit/config_templates/empty.cfg similarity index 100% rename from tests/config_templates/empty.cfg rename to airflow-core/tests/unit/config_templates/empty.cfg diff --git a/tests/config_templates/requirements.txt b/airflow-core/tests/unit/config_templates/requirements.txt similarity index 100% rename from tests/config_templates/requirements.txt rename to airflow-core/tests/unit/config_templates/requirements.txt diff --git a/tests/dags_corrupted/__init__.py b/airflow-core/tests/unit/core/__init__.py similarity index 100% rename from tests/dags_corrupted/__init__.py rename to airflow-core/tests/unit/core/__init__.py diff --git a/tests/core/test_airflow_module.py b/airflow-core/tests/unit/core/test_airflow_module.py similarity index 100% rename from tests/core/test_airflow_module.py rename to airflow-core/tests/unit/core/test_airflow_module.py diff --git a/tests/core/test_configuration.py b/airflow-core/tests/unit/core/test_configuration.py similarity index 99% rename from tests/core/test_configuration.py rename to airflow-core/tests/unit/core/test_configuration.py index f712682b3e601..4345db5b59239 100644 --- a/tests/core/test_configuration.py +++ b/airflow-core/tests/unit/core/test_configuration.py @@ -45,14 +45,14 @@ from airflow.providers_manager import ProvidersManager from airflow.secrets import DEFAULT_SECRETS_SEARCH_PATH_WORKERS -from tests.utils.test_config import ( +from tests_common.test_utils.config import conf_vars +from tests_common.test_utils.reset_warning_registry import reset_warning_registry +from unit.utils.test_config import ( remove_all_configurations, set_deprecated_options, set_sensitive_config_values, use_config, ) -from tests_common.test_utils.config import conf_vars -from tests_common.test_utils.reset_warning_registry import reset_warning_registry HOME_DIR = os.path.expanduser("~") @@ -132,8 +132,10 @@ def test_set_and_get_with_upper_case(self): assert conf.get("Core", "Key") == "new_test_value" def test_config_as_dict(self): - """Test that getting config as dict works even if - environment has non-legal env vars""" + """ + Test that getting config as dict works even if + environment has non-legal env vars + """ with mock.patch.dict("os.environ"): os.environ["AIRFLOW__VAR__broken"] = "not_ok" asdict = conf.as_dict(raw=True, display_sensitive=True) @@ -343,7 +345,6 @@ def test_hidding_of_sensitive_config_values(self): ) def test_config_raise_exception_from_secret_backend_connection_error(self, mock_hvac): """Get Config Value from a Secret Backend""" - mock_client = mock.MagicMock() # mock_client.side_effect = AirflowConfigException mock_hvac.Client.return_value = mock_client diff --git a/tests/core/test_core.py b/airflow-core/tests/unit/core/test_core.py similarity index 100% rename from tests/core/test_core.py rename to airflow-core/tests/unit/core/test_core.py diff --git a/tests/core/test_example_dags_system.py b/airflow-core/tests/unit/core/test_example_dags_system.py similarity index 100% rename from tests/core/test_example_dags_system.py rename to airflow-core/tests/unit/core/test_example_dags_system.py diff --git a/tests/core/test_exceptions.py b/airflow-core/tests/unit/core/test_exceptions.py similarity index 100% rename from tests/core/test_exceptions.py rename to airflow-core/tests/unit/core/test_exceptions.py diff --git a/tests/core/test_impersonation_tests.py b/airflow-core/tests/unit/core/test_impersonation_tests.py similarity index 100% rename from tests/core/test_impersonation_tests.py rename to airflow-core/tests/unit/core/test_impersonation_tests.py diff --git a/tests/core/test_logging_config.py b/airflow-core/tests/unit/core/test_logging_config.py similarity index 100% rename from tests/core/test_logging_config.py rename to airflow-core/tests/unit/core/test_logging_config.py diff --git a/tests/core/test_otel_logger.py b/airflow-core/tests/unit/core/test_otel_logger.py similarity index 100% rename from tests/core/test_otel_logger.py rename to airflow-core/tests/unit/core/test_otel_logger.py diff --git a/tests/core/test_otel_tracer.py b/airflow-core/tests/unit/core/test_otel_tracer.py similarity index 100% rename from tests/core/test_otel_tracer.py rename to airflow-core/tests/unit/core/test_otel_tracer.py diff --git a/tests/core/test_policies.py b/airflow-core/tests/unit/core/test_policies.py similarity index 100% rename from tests/core/test_policies.py rename to airflow-core/tests/unit/core/test_policies.py diff --git a/tests/core/test_sentry.py b/airflow-core/tests/unit/core/test_sentry.py similarity index 94% rename from tests/core/test_sentry.py rename to airflow-core/tests/unit/core/test_sentry.py index 5bf79bb6d6d33..33305c64a3940 100644 --- a/tests/core/test_sentry.py +++ b/airflow-core/tests/unit/core/test_sentry.py @@ -103,7 +103,7 @@ def sentry(self): { ("sentry", "sentry_on"): "True", ("sentry", "default_integrations"): "False", - ("sentry", "before_send"): "tests.core.test_sentry.before_send", + ("sentry", "before_send"): "unit.core.test_sentry.before_send", }, ): from airflow import sentry @@ -119,7 +119,7 @@ def sentry_custom_transport(self): { ("sentry", "sentry_on"): "True", ("sentry", "default_integrations"): "False", - ("sentry", "transport"): "tests.core.test_sentry.CustomTransport", + ("sentry", "transport"): "unit.core.test_sentry.CustomTransport", }, ): from airflow import sentry @@ -177,7 +177,7 @@ def test_before_send(self, sentry_sdk, sentry): """ assert sentry called = sentry_sdk.call_args.kwargs["before_send"] - expected = import_string("tests.core.test_sentry.before_send") + expected = import_string("unit.core.test_sentry.before_send") assert called == expected def test_custom_transport(self, sentry_sdk, sentry_custom_transport): @@ -186,7 +186,7 @@ def test_custom_transport(self, sentry_sdk, sentry_custom_transport): """ assert sentry_custom_transport called = sentry_sdk.call_args.kwargs["transport"] - expected = import_string("tests.core.test_sentry.CustomTransport") + expected = import_string("unit.core.test_sentry.CustomTransport") assert called == expected def test_minimum_config(self, sentry_sdk, sentry_minimum): diff --git a/tests/core/test_settings.py b/airflow-core/tests/unit/core/test_settings.py similarity index 100% rename from tests/core/test_settings.py rename to airflow-core/tests/unit/core/test_settings.py diff --git a/tests/core/test_sqlalchemy_config.py b/airflow-core/tests/unit/core/test_sqlalchemy_config.py similarity index 98% rename from tests/core/test_sqlalchemy_config.py rename to airflow-core/tests/unit/core/test_sqlalchemy_config.py index bbf5974e621d2..befdac0f485ba 100644 --- a/tests/core/test_sqlalchemy_config.py +++ b/airflow-core/tests/unit/core/test_sqlalchemy_config.py @@ -77,7 +77,7 @@ def test_sql_alchemy_connect_args( ( "database", "sql_alchemy_connect_args", - ): "tests.core.test_sqlalchemy_config.SQL_ALCHEMY_CONNECT_ARGS", + ): "unit.core.test_sqlalchemy_config.SQL_ALCHEMY_CONNECT_ARGS", ("database", "sql_alchemy_engine_args"): '{"arg": 1}', ("database", "sql_alchemy_pool_enabled"): "False", } diff --git a/tests/core/test_stats.py b/airflow-core/tests/unit/core/test_stats.py similarity index 98% rename from tests/core/test_stats.py rename to airflow-core/tests/unit/core/test_stats.py index dc2d6095fc3d9..a297492dbf8a8 100644 --- a/tests/core/test_stats.py +++ b/airflow-core/tests/unit/core/test_stats.py @@ -496,7 +496,7 @@ class TestCustomStatsName: @conf_vars( { ("metrics", "statsd_on"): "True", - ("metrics", "stat_name_handler"): "tests.core.test_stats.always_invalid", + ("metrics", "stat_name_handler"): "unit.core.test_stats.always_invalid", } ) @mock.patch("statsd.StatsClient") @@ -508,7 +508,7 @@ def test_does_not_send_stats_using_statsd_when_the_name_is_not_valid(self, mock_ @conf_vars( { ("metrics", "statsd_datadog_enabled"): "True", - ("metrics", "stat_name_handler"): "tests.core.test_stats.always_invalid", + ("metrics", "stat_name_handler"): "unit.core.test_stats.always_invalid", } ) @mock.patch("datadog.DogStatsd") @@ -520,7 +520,7 @@ def test_does_not_send_stats_using_dogstatsd_when_the_name_is_not_valid(self, mo @conf_vars( { ("metrics", "statsd_on"): "True", - ("metrics", "stat_name_handler"): "tests.core.test_stats.always_valid", + ("metrics", "stat_name_handler"): "unit.core.test_stats.always_valid", } ) @mock.patch("statsd.StatsClient") @@ -532,7 +532,7 @@ def test_does_send_stats_using_statsd_when_the_name_is_valid(self, mock_statsd): @conf_vars( { ("metrics", "statsd_datadog_enabled"): "True", - ("metrics", "stat_name_handler"): "tests.core.test_stats.always_valid", + ("metrics", "stat_name_handler"): "unit.core.test_stats.always_valid", } ) @mock.patch("datadog.DogStatsd") diff --git a/tests/dags_with_system_exit/__init__.py b/airflow-core/tests/unit/dag_processing/__init__.py similarity index 100% rename from tests/dags_with_system_exit/__init__.py rename to airflow-core/tests/unit/dag_processing/__init__.py diff --git a/tests/datasets/__init__.py b/airflow-core/tests/unit/dag_processing/bundles/__init__.py similarity index 100% rename from tests/datasets/__init__.py rename to airflow-core/tests/unit/dag_processing/bundles/__init__.py diff --git a/tests/dag_processing/bundles/test_base.py b/airflow-core/tests/unit/dag_processing/bundles/test_base.py similarity index 99% rename from tests/dag_processing/bundles/test_base.py rename to airflow-core/tests/unit/dag_processing/bundles/test_base.py index 167c0e18f9131..14986486c88cb 100644 --- a/tests/dag_processing/bundles/test_base.py +++ b/airflow-core/tests/unit/dag_processing/bundles/test_base.py @@ -163,7 +163,6 @@ def lock_the_file(self): class TestBundleVersionLock: def test_that_shared_lock_doesnt_block_shared_lock(self): """Verify that two things can lock file at same time.""" - lth1 = LockTestHelper(1) t1 = threading.Thread(target=lth1.lock_the_file) lth2 = LockTestHelper(2) diff --git a/tests/dag_processing/bundles/test_dag_bundle_manager.py b/airflow-core/tests/unit/dag_processing/bundles/test_dag_bundle_manager.py similarity index 98% rename from tests/dag_processing/bundles/test_dag_bundle_manager.py rename to airflow-core/tests/unit/dag_processing/bundles/test_dag_bundle_manager.py index 15bf2dbc1d5c7..febb687690bc7 100644 --- a/tests/dag_processing/bundles/test_dag_bundle_manager.py +++ b/airflow-core/tests/unit/dag_processing/bundles/test_dag_bundle_manager.py @@ -99,7 +99,7 @@ def path(self): BASIC_BUNDLE_CONFIG = [ { "name": "my-test-bundle", - "classpath": "tests.dag_processing.bundles.test_dag_bundle_manager.BasicBundle", + "classpath": "unit.dag_processing.bundles.test_dag_bundle_manager.BasicBundle", "kwargs": {"refresh_interval": 1}, } ] @@ -107,7 +107,6 @@ def path(self): def test_get_bundle(): """Test that get_bundle builds and returns a bundle.""" - with patch.dict( os.environ, {"AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_CONFIG_LIST": json.dumps(BASIC_BUNDLE_CONFIG)} ): diff --git a/tests/dag_processing/bundles/test_git.py b/airflow-core/tests/unit/dag_processing/bundles/test_git.py similarity index 100% rename from tests/dag_processing/bundles/test_git.py rename to airflow-core/tests/unit/dag_processing/bundles/test_git.py diff --git a/tests/dag_processing/bundles/test_local.py b/airflow-core/tests/unit/dag_processing/bundles/test_local.py similarity index 100% rename from tests/dag_processing/bundles/test_local.py rename to airflow-core/tests/unit/dag_processing/bundles/test_local.py diff --git a/tests/dag_processing/test_collection.py b/airflow-core/tests/unit/dag_processing/test_collection.py similarity index 99% rename from tests/dag_processing/test_collection.py rename to airflow-core/tests/unit/dag_processing/test_collection.py index 585382631a777..1748d44f7431e 100644 --- a/tests/dag_processing/test_collection.py +++ b/airflow-core/tests/unit/dag_processing/test_collection.py @@ -253,7 +253,7 @@ def clean_db(self, session): @pytest.fixture(name="dag_import_error_listener") def _dag_import_error_listener(self): - from tests.listeners import dag_import_error_listener + from unit.listeners import dag_import_error_listener get_listener_manager().add_listener(dag_import_error_listener) yield dag_import_error_listener @@ -313,7 +313,6 @@ def test_sync_to_db_is_retried( self, mock_bulk_write_to_db, mock_s10n_write_dag, testing_dag_bundle, session ): """Test that important DB operations in db sync are retried on OperationalError""" - serialized_dags_count = session.query(func.count(SerializedDagModel.dag_id)).scalar() assert serialized_dags_count == 0 mock_dag = mock.MagicMock() diff --git a/tests/dag_processing/test_manager.py b/airflow-core/tests/unit/dag_processing/test_manager.py similarity index 99% rename from tests/dag_processing/test_manager.py rename to airflow-core/tests/unit/dag_processing/test_manager.py index c65380882c4af..027d58e6fa1a9 100644 --- a/tests/dag_processing/test_manager.py +++ b/airflow-core/tests/unit/dag_processing/test_manager.py @@ -58,7 +58,6 @@ from airflow.utils.net import get_hostname from airflow.utils.session import create_session -from tests.models import TEST_DAGS_FOLDER from tests_common.test_utils.compat import ParseImportError from tests_common.test_utils.config import conf_vars from tests_common.test_utils.db import ( @@ -70,6 +69,7 @@ clear_db_runs, clear_db_serialized_dags, ) +from unit.models import TEST_DAGS_FOLDER pytestmark = pytest.mark.db_test @@ -265,7 +265,6 @@ def test_files_in_queue_sorted_alphabetically(self): @conf_vars({("dag_processor", "file_parsing_sort_mode"): "random_seeded_by_host"}) def test_files_sorted_random_seeded_by_host(self): """Test files are randomly sorted and seeded by host name""" - f_infos = _get_file_infos(["file_3.py", "file_2.py", "file_4.py", "file_1.py"]) known_files = {"anything": f_infos} manager = DagFileProcessorManager(max_runs=1) @@ -585,7 +584,6 @@ def test_dag_with_system_exit(self, configure_testing_dag_bundle): """ Test to check that a DAG with a system.exit() doesn't break the scheduler. """ - dag_id = "exit_test_dag" dag_directory = TEST_DAG_FOLDER.parent / "dags_with_system_exit" @@ -881,7 +879,6 @@ def test_callback_queue(self, mock_get_logger, configure_testing_dag_bundle): def test_dag_with_assets(self, session, configure_testing_dag_bundle): """'Integration' test to ensure that the assets get parsed and stored correctly for parsed dags.""" - test_dag_path = str(TEST_DAG_FOLDER / "test_assets.py") with configure_testing_dag_bundle(test_dag_path): @@ -1050,7 +1047,6 @@ def test_non_versioned_bundle_get_version_not_called(self): def test_versioned_bundle_get_version_called_once(self): """Make sure in a normal "warm" loop, get_current_version is called just once after refresha""" - config = [ { "name": "bundleone", diff --git a/tests/dag_processing/test_processor.py b/airflow-core/tests/unit/dag_processing/test_processor.py similarity index 100% rename from tests/dag_processing/test_processor.py rename to airflow-core/tests/unit/dag_processing/test_processor.py diff --git a/tests/dags/.airflowignore b/airflow-core/tests/unit/dags/.airflowignore similarity index 100% rename from tests/dags/.airflowignore rename to airflow-core/tests/unit/dags/.airflowignore diff --git a/tests/dags/.airflowignore_glob b/airflow-core/tests/unit/dags/.airflowignore_glob similarity index 100% rename from tests/dags/.airflowignore_glob rename to airflow-core/tests/unit/dags/.airflowignore_glob diff --git a/tests/dags/.gitignore b/airflow-core/tests/unit/dags/.gitignore similarity index 100% rename from tests/dags/.gitignore rename to airflow-core/tests/unit/dags/.gitignore diff --git a/tests/dags/README.md b/airflow-core/tests/unit/dags/README.md similarity index 100% rename from tests/dags/README.md rename to airflow-core/tests/unit/dags/README.md diff --git a/tests/decorators/__init__.py b/airflow-core/tests/unit/dags/__init__.py similarity index 100% rename from tests/decorators/__init__.py rename to airflow-core/tests/unit/dags/__init__.py diff --git a/tests/dags/no_dags.py b/airflow-core/tests/unit/dags/no_dags.py similarity index 100% rename from tests/dags/no_dags.py rename to airflow-core/tests/unit/dags/no_dags.py diff --git a/tests/dags/subdir1/.airflowignore b/airflow-core/tests/unit/dags/subdir1/.airflowignore similarity index 100% rename from tests/dags/subdir1/.airflowignore rename to airflow-core/tests/unit/dags/subdir1/.airflowignore diff --git a/tests/integration/__init__.py b/airflow-core/tests/unit/dags/subdir1/__init__.py similarity index 100% rename from tests/integration/__init__.py rename to airflow-core/tests/unit/dags/subdir1/__init__.py diff --git a/tests/dags/subdir1/test_ignore_this.py b/airflow-core/tests/unit/dags/subdir1/test_ignore_this.py similarity index 100% rename from tests/dags/subdir1/test_ignore_this.py rename to airflow-core/tests/unit/dags/subdir1/test_ignore_this.py diff --git a/tests/dags/subdir2/.airflowignore_glob b/airflow-core/tests/unit/dags/subdir2/.airflowignore_glob similarity index 100% rename from tests/dags/subdir2/.airflowignore_glob rename to airflow-core/tests/unit/dags/subdir2/.airflowignore_glob diff --git a/tests/integration/cli/__init__.py b/airflow-core/tests/unit/dags/subdir2/__init__.py similarity index 100% rename from tests/integration/cli/__init__.py rename to airflow-core/tests/unit/dags/subdir2/__init__.py diff --git a/tests/integration/cli/commands/__init__.py b/airflow-core/tests/unit/dags/subdir2/subdir3/__init__.py similarity index 100% rename from tests/integration/cli/commands/__init__.py rename to airflow-core/tests/unit/dags/subdir2/subdir3/__init__.py diff --git a/tests/dags/subdir2/subdir3/test_nested_dag.py b/airflow-core/tests/unit/dags/subdir2/subdir3/test_nested_dag.py similarity index 100% rename from tests/dags/subdir2/subdir3/test_nested_dag.py rename to airflow-core/tests/unit/dags/subdir2/subdir3/test_nested_dag.py diff --git a/tests/dags/subdir2/test_dont_ignore_this.py b/airflow-core/tests/unit/dags/subdir2/test_dont_ignore_this.py similarity index 100% rename from tests/dags/subdir2/test_dont_ignore_this.py rename to airflow-core/tests/unit/dags/subdir2/test_dont_ignore_this.py diff --git a/tests/dags/test_assets.py b/airflow-core/tests/unit/dags/test_assets.py similarity index 100% rename from tests/dags/test_assets.py rename to airflow-core/tests/unit/dags/test_assets.py diff --git a/tests/dags/test_backfill_with_upstream_failed_task.py b/airflow-core/tests/unit/dags/test_backfill_with_upstream_failed_task.py similarity index 100% rename from tests/dags/test_backfill_with_upstream_failed_task.py rename to airflow-core/tests/unit/dags/test_backfill_with_upstream_failed_task.py diff --git a/tests/dags/test_cli_triggered_dags.py b/airflow-core/tests/unit/dags/test_cli_triggered_dags.py similarity index 100% rename from tests/dags/test_cli_triggered_dags.py rename to airflow-core/tests/unit/dags/test_cli_triggered_dags.py diff --git a/tests/dags/test_dag_for_db_queries_counter.py b/airflow-core/tests/unit/dags/test_dag_for_db_queries_counter.py similarity index 100% rename from tests/dags/test_dag_for_db_queries_counter.py rename to airflow-core/tests/unit/dags/test_dag_for_db_queries_counter.py diff --git a/tests/dags/test_dag_parsing_context.py b/airflow-core/tests/unit/dags/test_dag_parsing_context.py similarity index 100% rename from tests/dags/test_dag_parsing_context.py rename to airflow-core/tests/unit/dags/test_dag_parsing_context.py diff --git a/tests/dags/test_dag_warnings.py b/airflow-core/tests/unit/dags/test_dag_warnings.py similarity index 100% rename from tests/dags/test_dag_warnings.py rename to airflow-core/tests/unit/dags/test_dag_warnings.py diff --git a/tests/dags/test_dag_with_no_tags.py b/airflow-core/tests/unit/dags/test_dag_with_no_tags.py similarity index 100% rename from tests/dags/test_dag_with_no_tags.py rename to airflow-core/tests/unit/dags/test_dag_with_no_tags.py diff --git a/tests/dags/test_dag_xcom_openlineage.py b/airflow-core/tests/unit/dags/test_dag_xcom_openlineage.py similarity index 100% rename from tests/dags/test_dag_xcom_openlineage.py rename to airflow-core/tests/unit/dags/test_dag_xcom_openlineage.py diff --git a/tests/dags/test_dagrun_fast_follow.py b/airflow-core/tests/unit/dags/test_dagrun_fast_follow.py similarity index 100% rename from tests/dags/test_dagrun_fast_follow.py rename to airflow-core/tests/unit/dags/test_dagrun_fast_follow.py diff --git a/tests/dags/test_default_impersonation.py b/airflow-core/tests/unit/dags/test_default_impersonation.py similarity index 100% rename from tests/dags/test_default_impersonation.py rename to airflow-core/tests/unit/dags/test_default_impersonation.py diff --git a/tests/dags/test_double_trigger.py b/airflow-core/tests/unit/dags/test_double_trigger.py similarity index 100% rename from tests/dags/test_double_trigger.py rename to airflow-core/tests/unit/dags/test_double_trigger.py diff --git a/tests/dags/test_example_bash_operator.py b/airflow-core/tests/unit/dags/test_example_bash_operator.py similarity index 100% rename from tests/dags/test_example_bash_operator.py rename to airflow-core/tests/unit/dags/test_example_bash_operator.py diff --git a/tests/dags/test_external_task_sensor_check_existense.py b/airflow-core/tests/unit/dags/test_external_task_sensor_check_existense.py similarity index 97% rename from tests/dags/test_external_task_sensor_check_existense.py rename to airflow-core/tests/unit/dags/test_external_task_sensor_check_existense.py index 002a1c79631fb..ed869e7b2f50d 100644 --- a/tests/dags/test_external_task_sensor_check_existense.py +++ b/airflow-core/tests/unit/dags/test_external_task_sensor_check_existense.py @@ -21,7 +21,7 @@ from airflow.providers.standard.operators.empty import EmptyOperator from airflow.providers.standard.sensors.external_task import ExternalTaskSensor -from tests.models import DEFAULT_DATE +from unit.models import DEFAULT_DATE with DAG( dag_id="test_external_task_sensor_check_existence_ext", diff --git a/tests/dags/test_failing.py b/airflow-core/tests/unit/dags/test_failing.py similarity index 100% rename from tests/dags/test_failing.py rename to airflow-core/tests/unit/dags/test_failing.py diff --git a/tests/dags/test_future_start_date.py b/airflow-core/tests/unit/dags/test_future_start_date.py similarity index 100% rename from tests/dags/test_future_start_date.py rename to airflow-core/tests/unit/dags/test_future_start_date.py diff --git a/tests/dags/test_heartbeat_failed_fast.py b/airflow-core/tests/unit/dags/test_heartbeat_failed_fast.py similarity index 100% rename from tests/dags/test_heartbeat_failed_fast.py rename to airflow-core/tests/unit/dags/test_heartbeat_failed_fast.py diff --git a/tests/dags/test_impersonation.py b/airflow-core/tests/unit/dags/test_impersonation.py similarity index 100% rename from tests/dags/test_impersonation.py rename to airflow-core/tests/unit/dags/test_impersonation.py diff --git a/tests/dags/test_imports.py b/airflow-core/tests/unit/dags/test_imports.py similarity index 92% rename from tests/dags/test_imports.py rename to airflow-core/tests/unit/dags/test_imports.py index 0802eec3c28a7..d46204c4726ec 100644 --- a/tests/dags/test_imports.py +++ b/airflow-core/tests/unit/dags/test_imports.py @@ -23,17 +23,17 @@ from __future__ import annotations # multiline import -import \ - datetime, \ -enum,time +import \ + datetime, \ + enum,time """ import airflow.in_comment """ # from import from airflow.utils import file # multiline airflow import -import airflow.decorators, airflow.models\ -, airflow.sensors +import airflow.decorators, airflow.models \ + , airflow.sensors if prod: # type: ignore[name-defined] import airflow.if_branch diff --git a/tests/dags/test_invalid_cron.py b/airflow-core/tests/unit/dags/test_invalid_cron.py similarity index 100% rename from tests/dags/test_invalid_cron.py rename to airflow-core/tests/unit/dags/test_invalid_cron.py diff --git a/tests/dags/test_invalid_dup_task.py b/airflow-core/tests/unit/dags/test_invalid_dup_task.py similarity index 100% rename from tests/dags/test_invalid_dup_task.py rename to airflow-core/tests/unit/dags/test_invalid_dup_task.py diff --git a/tests/dags/test_invalid_param.py b/airflow-core/tests/unit/dags/test_invalid_param.py similarity index 100% rename from tests/dags/test_invalid_param.py rename to airflow-core/tests/unit/dags/test_invalid_param.py diff --git a/tests/dags/test_invalid_param2.py b/airflow-core/tests/unit/dags/test_invalid_param2.py similarity index 97% rename from tests/dags/test_invalid_param2.py rename to airflow-core/tests/unit/dags/test_invalid_param2.py index 5678f46090c89..dff59551d287e 100644 --- a/tests/dags/test_invalid_param2.py +++ b/airflow-core/tests/unit/dags/test_invalid_param2.py @@ -18,7 +18,7 @@ from datetime import datetime -from airflow import DAG +from airflow.models import DAG from airflow.providers.standard.operators.python import PythonOperator from airflow.sdk.definitions.param import Param diff --git a/tests/dags/test_invalid_param3.py b/airflow-core/tests/unit/dags/test_invalid_param3.py similarity index 97% rename from tests/dags/test_invalid_param3.py rename to airflow-core/tests/unit/dags/test_invalid_param3.py index ea3bfa202a319..8c5a71bde30de 100644 --- a/tests/dags/test_invalid_param3.py +++ b/airflow-core/tests/unit/dags/test_invalid_param3.py @@ -18,7 +18,7 @@ from datetime import datetime -from airflow import DAG +from airflow.models import DAG from airflow.providers.standard.operators.python import PythonOperator from airflow.sdk.definitions.param import Param diff --git a/tests/dags/test_invalid_param4.py b/airflow-core/tests/unit/dags/test_invalid_param4.py similarity index 97% rename from tests/dags/test_invalid_param4.py rename to airflow-core/tests/unit/dags/test_invalid_param4.py index 0156072ba11cf..7cfd7feb21b19 100644 --- a/tests/dags/test_invalid_param4.py +++ b/airflow-core/tests/unit/dags/test_invalid_param4.py @@ -18,7 +18,7 @@ from datetime import datetime -from airflow import DAG +from airflow.models import DAG from airflow.providers.standard.operators.python import PythonOperator from airflow.sdk.definitions.param import Param diff --git a/tests/dags/test_latest_runs.py b/airflow-core/tests/unit/dags/test_latest_runs.py similarity index 100% rename from tests/dags/test_latest_runs.py rename to airflow-core/tests/unit/dags/test_latest_runs.py diff --git a/tests/dags/test_logging_in_dag.py b/airflow-core/tests/unit/dags/test_logging_in_dag.py similarity index 97% rename from tests/dags/test_logging_in_dag.py rename to airflow-core/tests/unit/dags/test_logging_in_dag.py index e56c4d4a74316..484181688c96b 100644 --- a/tests/dags/test_logging_in_dag.py +++ b/airflow-core/tests/unit/dags/test_logging_in_dag.py @@ -27,7 +27,8 @@ def test_logging_fn(**kwargs): - """Tests DAG logging. + """ + Tests DAG logging. :param kwargs: """ diff --git a/tests/dags/test_mapped_classic.py b/airflow-core/tests/unit/dags/test_mapped_classic.py similarity index 100% rename from tests/dags/test_mapped_classic.py rename to airflow-core/tests/unit/dags/test_mapped_classic.py diff --git a/tests/dags/test_mapped_taskflow.py b/airflow-core/tests/unit/dags/test_mapped_taskflow.py similarity index 100% rename from tests/dags/test_mapped_taskflow.py rename to airflow-core/tests/unit/dags/test_mapped_taskflow.py diff --git a/tests/dags/test_mark_state.py b/airflow-core/tests/unit/dags/test_mark_state.py similarity index 100% rename from tests/dags/test_mark_state.py rename to airflow-core/tests/unit/dags/test_mark_state.py diff --git a/tests/dags/test_miscellaneous.py b/airflow-core/tests/unit/dags/test_miscellaneous.py similarity index 100% rename from tests/dags/test_miscellaneous.py rename to airflow-core/tests/unit/dags/test_miscellaneous.py diff --git a/tests/dags/test_missing_owner.py b/airflow-core/tests/unit/dags/test_missing_owner.py similarity index 100% rename from tests/dags/test_missing_owner.py rename to airflow-core/tests/unit/dags/test_missing_owner.py diff --git a/tests/dags/test_multiple_dags.py b/airflow-core/tests/unit/dags/test_multiple_dags.py similarity index 100% rename from tests/dags/test_multiple_dags.py rename to airflow-core/tests/unit/dags/test_multiple_dags.py diff --git a/tests/dags/test_no_impersonation.py b/airflow-core/tests/unit/dags/test_no_impersonation.py similarity index 100% rename from tests/dags/test_no_impersonation.py rename to airflow-core/tests/unit/dags/test_no_impersonation.py diff --git a/tests/dags/test_on_failure_callback.py b/airflow-core/tests/unit/dags/test_on_failure_callback.py similarity index 100% rename from tests/dags/test_on_failure_callback.py rename to airflow-core/tests/unit/dags/test_on_failure_callback.py diff --git a/tests/dags/test_on_kill.py b/airflow-core/tests/unit/dags/test_on_kill.py similarity index 100% rename from tests/dags/test_on_kill.py rename to airflow-core/tests/unit/dags/test_on_kill.py diff --git a/tests/dags/test_only_empty_tasks.py b/airflow-core/tests/unit/dags/test_only_empty_tasks.py similarity index 100% rename from tests/dags/test_only_empty_tasks.py rename to airflow-core/tests/unit/dags/test_only_empty_tasks.py diff --git a/tests/dags/test_openlineage_execution.py b/airflow-core/tests/unit/dags/test_openlineage_execution.py similarity index 100% rename from tests/dags/test_openlineage_execution.py rename to airflow-core/tests/unit/dags/test_openlineage_execution.py diff --git a/tests/dags/test_parsing_context.py b/airflow-core/tests/unit/dags/test_parsing_context.py similarity index 100% rename from tests/dags/test_parsing_context.py rename to airflow-core/tests/unit/dags/test_parsing_context.py diff --git a/tests/dags/test_scheduler_dags.py b/airflow-core/tests/unit/dags/test_scheduler_dags.py similarity index 100% rename from tests/dags/test_scheduler_dags.py rename to airflow-core/tests/unit/dags/test_scheduler_dags.py diff --git a/tests/dags/test_sensor.py b/airflow-core/tests/unit/dags/test_sensor.py similarity index 100% rename from tests/dags/test_sensor.py rename to airflow-core/tests/unit/dags/test_sensor.py diff --git a/tests/dags/test_task_view_type_check.py b/airflow-core/tests/unit/dags/test_task_view_type_check.py similarity index 100% rename from tests/dags/test_task_view_type_check.py rename to airflow-core/tests/unit/dags/test_task_view_type_check.py diff --git a/tests/dags/test_valid_param.py b/airflow-core/tests/unit/dags/test_valid_param.py similarity index 98% rename from tests/dags/test_valid_param.py rename to airflow-core/tests/unit/dags/test_valid_param.py index ddb858a9acc1e..4c083b348e70c 100644 --- a/tests/dags/test_valid_param.py +++ b/airflow-core/tests/unit/dags/test_valid_param.py @@ -18,7 +18,7 @@ from datetime import datetime -from airflow import DAG +from airflow.models import DAG from airflow.providers.standard.operators.python import PythonOperator from airflow.sdk.definitions.param import Param diff --git a/tests/dags/test_valid_param2.py b/airflow-core/tests/unit/dags/test_valid_param2.py similarity index 98% rename from tests/dags/test_valid_param2.py rename to airflow-core/tests/unit/dags/test_valid_param2.py index ee6920bd92ee7..baf48358da0a5 100644 --- a/tests/dags/test_valid_param2.py +++ b/airflow-core/tests/unit/dags/test_valid_param2.py @@ -18,7 +18,7 @@ from datetime import datetime -from airflow import DAG +from airflow.models import DAG from airflow.providers.standard.operators.python import PythonOperator from airflow.sdk.definitions.param import Param diff --git a/tests/dags/test_with_non_default_owner.py b/airflow-core/tests/unit/dags/test_with_non_default_owner.py similarity index 100% rename from tests/dags/test_with_non_default_owner.py rename to airflow-core/tests/unit/dags/test_with_non_default_owner.py diff --git a/tests/dags/test_zip/file_no_airflow_dag.py b/airflow-core/tests/unit/dags/test_zip/file_no_airflow_dag.py similarity index 100% rename from tests/dags/test_zip/file_no_airflow_dag.py rename to airflow-core/tests/unit/dags/test_zip/file_no_airflow_dag.py diff --git a/tests/dags/test_zip/test_zip.py b/airflow-core/tests/unit/dags/test_zip/test_zip.py similarity index 100% rename from tests/dags/test_zip/test_zip.py rename to airflow-core/tests/unit/dags/test_zip/test_zip.py diff --git a/tests/integration/executors/__init__.py b/airflow-core/tests/unit/dags/test_zip/test_zip_module/__init__.py similarity index 100% rename from tests/integration/executors/__init__.py rename to airflow-core/tests/unit/dags/test_zip/test_zip_module/__init__.py diff --git a/tests/dags/test_zip/test_zip_module/test.py b/airflow-core/tests/unit/dags/test_zip/test_zip_module/test.py similarity index 100% rename from tests/dags/test_zip/test_zip_module/test.py rename to airflow-core/tests/unit/dags/test_zip/test_zip_module/test.py diff --git a/tests/dags_corrupted/README.md b/airflow-core/tests/unit/dags_corrupted/README.md similarity index 100% rename from tests/dags_corrupted/README.md rename to airflow-core/tests/unit/dags_corrupted/README.md diff --git a/tests/integration/security/__init__.py b/airflow-core/tests/unit/dags_corrupted/__init__.py similarity index 100% rename from tests/integration/security/__init__.py rename to airflow-core/tests/unit/dags_corrupted/__init__.py diff --git a/tests/dags_corrupted/test_impersonation_custom.py b/airflow-core/tests/unit/dags_corrupted/test_impersonation_custom.py similarity index 100% rename from tests/dags_corrupted/test_impersonation_custom.py rename to airflow-core/tests/unit/dags_corrupted/test_impersonation_custom.py diff --git a/tests/dags_corrupted/test_nonstring_owner.py b/airflow-core/tests/unit/dags_corrupted/test_nonstring_owner.py similarity index 100% rename from tests/dags_corrupted/test_nonstring_owner.py rename to airflow-core/tests/unit/dags_corrupted/test_nonstring_owner.py diff --git a/tests/io/__init__.py b/airflow-core/tests/unit/dags_with_system_exit/__init__.py similarity index 100% rename from tests/io/__init__.py rename to airflow-core/tests/unit/dags_with_system_exit/__init__.py diff --git a/tests/dags_with_system_exit/a_system_exit.py b/airflow-core/tests/unit/dags_with_system_exit/a_system_exit.py similarity index 100% rename from tests/dags_with_system_exit/a_system_exit.py rename to airflow-core/tests/unit/dags_with_system_exit/a_system_exit.py diff --git a/tests/dags_with_system_exit/b_test_scheduler_dags.py b/airflow-core/tests/unit/dags_with_system_exit/b_test_scheduler_dags.py similarity index 100% rename from tests/dags_with_system_exit/b_test_scheduler_dags.py rename to airflow-core/tests/unit/dags_with_system_exit/b_test_scheduler_dags.py diff --git a/tests/dags_with_system_exit/c_system_exit.py b/airflow-core/tests/unit/dags_with_system_exit/c_system_exit.py similarity index 100% rename from tests/dags_with_system_exit/c_system_exit.py rename to airflow-core/tests/unit/dags_with_system_exit/c_system_exit.py diff --git a/tests/notifications/__init__.py b/airflow-core/tests/unit/datasets/__init__.py similarity index 100% rename from tests/notifications/__init__.py rename to airflow-core/tests/unit/datasets/__init__.py diff --git a/tests/datasets/test_dataset.py b/airflow-core/tests/unit/datasets/test_dataset.py similarity index 100% rename from tests/datasets/test_dataset.py rename to airflow-core/tests/unit/datasets/test_dataset.py diff --git a/tests/secrets/__init__.py b/airflow-core/tests/unit/decorators/__init__.py similarity index 100% rename from tests/secrets/__init__.py rename to airflow-core/tests/unit/decorators/__init__.py diff --git a/tests/decorators/test_bash.py b/airflow-core/tests/unit/decorators/test_bash.py similarity index 99% rename from tests/decorators/test_bash.py rename to airflow-core/tests/unit/decorators/test_bash.py index cc31032de3f35..3dfbf2cc4e933 100644 --- a/tests/decorators/test_bash.py +++ b/airflow-core/tests/unit/decorators/test_bash.py @@ -73,7 +73,6 @@ def validate_bash_command_rtif(ti, expected_command): def test_bash_decorator_init(self): """Test the initialization of the @task.bash decorator.""" - with self.dag: @task.bash @@ -101,7 +100,6 @@ def bash(): ... ) def test_bash_command(self, command, expected_command, expected_return_val): """Test the runtime bash_command is the function's return string, rendered if needed.""" - with self.dag: @task.bash @@ -121,7 +119,6 @@ def bash(): def test_op_args_kwargs(self): """Test op_args and op_kwargs are passed to the bash_command.""" - with self.dag: @task.bash @@ -202,7 +199,6 @@ def bash(): ) def test_exit_code_behavior(self, exit_code, expected): """Test @task.bash tasks behave appropriately relative the exit code from the bash_command.""" - with self.dag: @task.bash @@ -247,7 +243,6 @@ def bash(code): ) def test_skip_on_exit_code_behavior(self, skip_on_exit_code, exit_code, expected): """Ensure tasks behave appropriately relative to defined skip exit code from the bash_command.""" - with self.dag: @task.bash(**skip_on_exit_code if skip_on_exit_code else {}) @@ -375,7 +370,6 @@ def bash(): def test_command_not_found(self): """Fail task if executed command is not found on path.""" - with self.dag: @task.bash @@ -396,7 +390,6 @@ def bash(): def test_multiple_outputs_true(self): """Verify setting `multiple_outputs` for a @task.bash-decorated function is ignored.""" - with self.dag: @task.bash(multiple_outputs=True) @@ -420,7 +413,6 @@ def bash(): ) def test_multiple_outputs(self, multiple_outputs): """Verify setting `multiple_outputs` for a @task.bash-decorated function is ignored.""" - decorator_kwargs = {} if multiple_outputs is not NOTSET: decorator_kwargs["multiple_outputs"] = multiple_outputs @@ -458,7 +450,6 @@ def bash(): ) def test_callable_return_is_string(self, return_val, expected): """Ensure the returned value from the decorated callable is a non-empty string.""" - with self.dag: @task.bash diff --git a/tests/decorators/test_branch_external_python.py b/airflow-core/tests/unit/decorators/test_branch_external_python.py similarity index 100% rename from tests/decorators/test_branch_external_python.py rename to airflow-core/tests/unit/decorators/test_branch_external_python.py diff --git a/tests/decorators/test_branch_python.py b/airflow-core/tests/unit/decorators/test_branch_python.py similarity index 100% rename from tests/decorators/test_branch_python.py rename to airflow-core/tests/unit/decorators/test_branch_python.py diff --git a/tests/decorators/test_branch_virtualenv.py b/airflow-core/tests/unit/decorators/test_branch_virtualenv.py similarity index 100% rename from tests/decorators/test_branch_virtualenv.py rename to airflow-core/tests/unit/decorators/test_branch_virtualenv.py diff --git a/tests/decorators/test_condition.py b/airflow-core/tests/unit/decorators/test_condition.py similarity index 100% rename from tests/decorators/test_condition.py rename to airflow-core/tests/unit/decorators/test_condition.py diff --git a/tests/decorators/test_external_python.py b/airflow-core/tests/unit/decorators/test_external_python.py similarity index 100% rename from tests/decorators/test_external_python.py rename to airflow-core/tests/unit/decorators/test_external_python.py diff --git a/tests/decorators/test_mapped.py b/airflow-core/tests/unit/decorators/test_mapped.py similarity index 98% rename from tests/decorators/test_mapped.py rename to airflow-core/tests/unit/decorators/test_mapped.py index 4b3faf119fd81..cd5fe478b9fac 100644 --- a/tests/decorators/test_mapped.py +++ b/airflow-core/tests/unit/decorators/test_mapped.py @@ -23,7 +23,7 @@ from airflow.models.dag import DAG from airflow.utils.task_group import TaskGroup -from tests.models import DEFAULT_DATE +from unit.models import DEFAULT_DATE def test_mapped_task_group_id_prefix_task_id(): diff --git a/tests/decorators/test_python_virtualenv.py b/airflow-core/tests/unit/decorators/test_python_virtualenv.py similarity index 100% rename from tests/decorators/test_python_virtualenv.py rename to airflow-core/tests/unit/decorators/test_python_virtualenv.py diff --git a/tests/decorators/test_sensor.py b/airflow-core/tests/unit/decorators/test_sensor.py similarity index 100% rename from tests/decorators/test_sensor.py rename to airflow-core/tests/unit/decorators/test_sensor.py diff --git a/tests/decorators/test_setup_teardown.py b/airflow-core/tests/unit/decorators/test_setup_teardown.py similarity index 100% rename from tests/decorators/test_setup_teardown.py rename to airflow-core/tests/unit/decorators/test_setup_teardown.py diff --git a/tests/decorators/test_short_circuit.py b/airflow-core/tests/unit/decorators/test_short_circuit.py similarity index 100% rename from tests/decorators/test_short_circuit.py rename to airflow-core/tests/unit/decorators/test_short_circuit.py diff --git a/tests/decorators/test_task_group.py b/airflow-core/tests/unit/decorators/test_task_group.py similarity index 100% rename from tests/decorators/test_task_group.py rename to airflow-core/tests/unit/decorators/test_task_group.py diff --git a/tests/executors/.gitignore b/airflow-core/tests/unit/executors/.gitignore similarity index 100% rename from tests/executors/.gitignore rename to airflow-core/tests/unit/executors/.gitignore diff --git a/tests/executors/__init__.py b/airflow-core/tests/unit/executors/__init__.py similarity index 100% rename from tests/executors/__init__.py rename to airflow-core/tests/unit/executors/__init__.py diff --git a/tests/executors/test_base_executor.py b/airflow-core/tests/unit/executors/test_base_executor.py similarity index 100% rename from tests/executors/test_base_executor.py rename to airflow-core/tests/unit/executors/test_base_executor.py diff --git a/tests/executors/test_debug_executor.py b/airflow-core/tests/unit/executors/test_debug_executor.py similarity index 100% rename from tests/executors/test_debug_executor.py rename to airflow-core/tests/unit/executors/test_debug_executor.py diff --git a/tests/executors/test_executor_loader.py b/airflow-core/tests/unit/executors/test_executor_loader.py similarity index 88% rename from tests/executors/test_executor_loader.py rename to airflow-core/tests/unit/executors/test_executor_loader.py index ebe5ae6c40975..57428440c8d2a 100644 --- a/tests/executors/test_executor_loader.py +++ b/airflow-core/tests/unit/executors/test_executor_loader.py @@ -62,12 +62,12 @@ def test_should_support_executor_from_core(self, executor_name): assert executor.name.connector_source == ConnectorSource.CORE def test_should_support_custom_path(self): - with conf_vars({("core", "executor"): "tests.executors.test_executor_loader.FakeExecutor"}): + with conf_vars({("core", "executor"): "unit.executors.test_executor_loader.FakeExecutor"}): executor = executor_loader.ExecutorLoader.get_default_executor() assert executor is not None assert executor.__class__.__name__ == "FakeExecutor" assert executor.name is not None - assert executor.name == ExecutorName("tests.executors.test_executor_loader.FakeExecutor") + assert executor.name == ExecutorName("unit.executors.test_executor_loader.FakeExecutor") assert executor.name.connector_source == ConnectorSource.CUSTOM_PATH @pytest.mark.parametrize( @@ -109,7 +109,7 @@ def test_should_support_custom_path(self): id="one_executor_per_team", ), pytest.param( - "CeleryExecutor, LocalExecutor, tests.executors.test_executor_loader.FakeExecutor", + "CeleryExecutor, LocalExecutor, unit.executors.test_executor_loader.FakeExecutor", [], [ ExecutorName( @@ -121,17 +121,17 @@ def test_should_support_custom_path(self): "LocalExecutor", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", None, ), ], id="core_executors_and_custom_module_path_executor", ), pytest.param( - "CeleryExecutor, LocalExecutor, tests.executors.test_executor_loader.FakeExecutor", + "CeleryExecutor, LocalExecutor, unit.executors.test_executor_loader.FakeExecutor", [ - ("team_a", ["CeleryExecutor", "tests.executors.test_executor_loader.FakeExecutor"]), - ("team_b", ["tests.executors.test_executor_loader.FakeExecutor"]), + ("team_a", ["CeleryExecutor", "unit.executors.test_executor_loader.FakeExecutor"]), + ("team_b", ["unit.executors.test_executor_loader.FakeExecutor"]), ], [ ExecutorName( @@ -143,7 +143,7 @@ def test_should_support_custom_path(self): "LocalExecutor", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", None, ), ExecutorName( @@ -152,12 +152,12 @@ def test_should_support_custom_path(self): "team_a", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", None, "team_a", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", None, "team_b", ), @@ -165,9 +165,7 @@ def test_should_support_custom_path(self): id="core_executors_and_custom_module_path_executor_per_team", ), pytest.param( - ( - "CeleryExecutor, LocalExecutor, fake_exec:tests.executors.test_executor_loader.FakeExecutor" - ), + ("CeleryExecutor, LocalExecutor, fake_exec:unit.executors.test_executor_loader.FakeExecutor"), [], [ ExecutorName( @@ -179,22 +177,20 @@ def test_should_support_custom_path(self): "LocalExecutor", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", "fake_exec", ), ], id="core_executors_and_custom_module_path_executor_with_aliases", ), pytest.param( - ( - "CeleryExecutor, LocalExecutor, fake_exec:tests.executors.test_executor_loader.FakeExecutor" - ), + ("CeleryExecutor, LocalExecutor, fake_exec:unit.executors.test_executor_loader.FakeExecutor"), [ ( "team_a", - ["CeleryExecutor", "fake_exec:tests.executors.test_executor_loader.FakeExecutor"], + ["CeleryExecutor", "fake_exec:unit.executors.test_executor_loader.FakeExecutor"], ), - ("team_b", ["fake_exec:tests.executors.test_executor_loader.FakeExecutor"]), + ("team_b", ["fake_exec:unit.executors.test_executor_loader.FakeExecutor"]), ], [ ExecutorName( @@ -206,7 +202,7 @@ def test_should_support_custom_path(self): "LocalExecutor", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", "fake_exec", ), ExecutorName( @@ -215,12 +211,12 @@ def test_should_support_custom_path(self): "team_a", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", "fake_exec", "team_a", ), ExecutorName( - "tests.executors.test_executor_loader.FakeExecutor", + "unit.executors.test_executor_loader.FakeExecutor", "fake_exec", "team_b", ), @@ -302,9 +298,9 @@ def test_should_support_import_executor_from_core(self, executor_config, expecte @pytest.mark.parametrize( "executor_config", [ - ("tests.executors.test_executor_loader.FakeExecutor"), - ("tests.executors.test_executor_loader.FakeExecutor, CeleryExecutor"), - ("my_cool_alias:tests.executors.test_executor_loader.FakeExecutor, CeleryExecutor"), + ("unit.executors.test_executor_loader.FakeExecutor"), + ("unit.executors.test_executor_loader.FakeExecutor, CeleryExecutor"), + ("my_cool_alias:unit.executors.test_executor_loader.FakeExecutor, CeleryExecutor"), ], ) def test_should_support_import_custom_path(self, executor_config): diff --git a/tests/executors/test_executor_utils.py b/airflow-core/tests/unit/executors/test_executor_utils.py similarity index 100% rename from tests/executors/test_executor_utils.py rename to airflow-core/tests/unit/executors/test_executor_utils.py diff --git a/tests/executors/test_local_executor.py b/airflow-core/tests/unit/executors/test_local_executor.py similarity index 100% rename from tests/executors/test_local_executor.py rename to airflow-core/tests/unit/executors/test_local_executor.py diff --git a/tests/executors/test_sequential_executor.py b/airflow-core/tests/unit/executors/test_sequential_executor.py similarity index 100% rename from tests/executors/test_sequential_executor.py rename to airflow-core/tests/unit/executors/test_sequential_executor.py diff --git a/tests/hooks/__init__.py b/airflow-core/tests/unit/hooks/__init__.py similarity index 100% rename from tests/hooks/__init__.py rename to airflow-core/tests/unit/hooks/__init__.py diff --git a/tests/hooks/test_base.py b/airflow-core/tests/unit/hooks/test_base.py similarity index 100% rename from tests/hooks/test_base.py rename to airflow-core/tests/unit/hooks/test_base.py diff --git a/tests/system/core/__init__.py b/airflow-core/tests/unit/io/__init__.py similarity index 100% rename from tests/system/core/__init__.py rename to airflow-core/tests/unit/io/__init__.py diff --git a/tests/io/test_path.py b/airflow-core/tests/unit/io/test_path.py similarity index 100% rename from tests/io/test_path.py rename to airflow-core/tests/unit/io/test_path.py diff --git a/tests/io/test_wrapper.py b/airflow-core/tests/unit/io/test_wrapper.py similarity index 100% rename from tests/io/test_wrapper.py rename to airflow-core/tests/unit/io/test_wrapper.py diff --git a/tests/jobs/__init__.py b/airflow-core/tests/unit/jobs/__init__.py similarity index 100% rename from tests/jobs/__init__.py rename to airflow-core/tests/unit/jobs/__init__.py diff --git a/tests/jobs/test_base_job.py b/airflow-core/tests/unit/jobs/test_base_job.py similarity index 98% rename from tests/jobs/test_base_job.py rename to airflow-core/tests/unit/jobs/test_base_job.py index f5f60605ca143..6afa48081559f 100644 --- a/tests/jobs/test_base_job.py +++ b/airflow-core/tests/unit/jobs/test_base_job.py @@ -32,9 +32,9 @@ from airflow.utils.session import create_session from airflow.utils.state import State -from tests.listeners import lifecycle_listener -from tests.utils.test_helpers import MockJobRunner, SchedulerJobRunner, TriggererJobRunner from tests_common.test_utils.config import conf_vars +from unit.listeners import lifecycle_listener +from unit.utils.test_helpers import MockJobRunner, SchedulerJobRunner, TriggererJobRunner pytestmark = pytest.mark.db_test diff --git a/tests/jobs/test_scheduler_job.py b/airflow-core/tests/unit/jobs/test_scheduler_job.py similarity index 99% rename from tests/jobs/test_scheduler_job.py rename to airflow-core/tests/unit/jobs/test_scheduler_job.py index e35b4fb8df002..026c755608cb2 100644 --- a/tests/jobs/test_scheduler_job.py +++ b/airflow-core/tests/unit/jobs/test_scheduler_job.py @@ -72,10 +72,6 @@ from airflow.utils.state import DagRunState, State, TaskInstanceState from airflow.utils.types import DagRunTriggeredByType, DagRunType -from tests.listeners import dag_listener -from tests.listeners.test_listeners import get_listener_manager -from tests.models import TEST_DAGS_FOLDER -from tests.utils.test_timezone import UTC from tests_common.test_utils.asserts import assert_queries_count from tests_common.test_utils.config import conf_vars, env_vars from tests_common.test_utils.db import ( @@ -91,6 +87,10 @@ ) from tests_common.test_utils.mock_executor import MockExecutor from tests_common.test_utils.mock_operators import CustomOperator +from unit.listeners import dag_listener +from unit.listeners.test_listeners import get_listener_manager +from unit.models import TEST_DAGS_FOLDER +from unit.utils.test_timezone import UTC pytestmark = pytest.mark.db_test @@ -805,7 +805,6 @@ def test_find_executable_task_instances_executor(self, dag_maker, mock_executors """ Test that tasks for all executors are set to queued, if space allows it """ - scheduler_job = Job() self.job_runner = SchedulerJobRunner(job=scheduler_job) session = settings.Session() @@ -845,7 +844,6 @@ def test_find_executable_task_instances_order_priority_with_pools(self, dag_make The scheduler job should pick tasks with higher priority for execution even if different pools are involved. """ - scheduler_job = Job() self.job_runner = SchedulerJobRunner(job=scheduler_job) session = settings.Session() @@ -1111,8 +1109,10 @@ def test_tis_for_queued_dagruns_are_not_run(self, dag_maker): @pytest.mark.parametrize("active_state", [TaskInstanceState.RUNNING, TaskInstanceState.QUEUED]) def test_find_executable_task_instances_concurrency(self, dag_maker, active_state, session): - """We verify here that, with varying amounts of queued / running / scheduled tasks, - the correct number of TIs are queued""" + """ + We verify here that, with varying amounts of queued / running / scheduled tasks, + the correct number of TIs are queued + """ dag_id = "check_MAT_dag" with dag_maker(dag_id=dag_id, max_active_tasks=2, session=session): EmptyOperator(task_id="task_1") @@ -1824,7 +1824,6 @@ def _create_dagruns(): def test_execute_task_instances_unlimited(self, dag_maker, mock_executor): """Test that max_tis_per_query=0 is unlimited""" - dag_id = "SchedulerJobTest.test_execute_task_instances_unlimited" task_id_1 = "dummy_task" task_id_2 = "dummy_task_2" @@ -1875,7 +1874,6 @@ def test_execute_task_instances_unlimited_multiple_executors( self, task1_exec, task2_exec, dag_maker, mock_executors ): """Test that max_tis_per_query=0 is unlimited""" - dag_id = "SchedulerJobTest.test_execute_task_instances_unlimited" task_id_1 = "dummy_task" task_id_2 = "dummy_task_2" @@ -1936,7 +1934,6 @@ def test_execute_task_instances_unlimited_parallelism_multiple_executors( self, task1_exec, task2_exec, dag_maker, mock_executors ): """Test core.parallelism leads to unlimited scheduling, but queries limited by max_tis""" - dag_id = "SchedulerJobTest.test_execute_task_instances_unlimited" task_id_1 = "dummy_task" task_id_2 = "dummy_task_2" @@ -1997,7 +1994,6 @@ def test_execute_task_instances_unlimited_parallelism_unlimited_max_tis_multiple self, task1_exec, task2_exec, dag_maker, mock_executors ): """Test core.parallelism leads to unlimited scheduling""" - dag_id = "SchedulerJobTest.test_execute_task_instances_unlimited" task_id_1 = "dummy_task" task_id_2 = "dummy_task_2" @@ -2075,8 +2071,10 @@ def test_adopt_or_reset_orphaned_tasks(self, dag_maker, session): assert ti2.state == State.NONE, "Tasks run by Backfill Jobs should be treated the same" def test_adopt_or_reset_orphaned_tasks_multiple_executors(self, dag_maker, mock_executors): - """Test that with multiple executors configured tasks are sorted correctly and handed off to the - correct executor for adoption.""" + """ + Test that with multiple executors configured tasks are sorted correctly and handed off to the + correct executor for adoption. + """ session = settings.Session() with dag_maker("test_execute_helper_reset_orphaned_tasks_multiple_executors"): op1 = EmptyOperator(task_id="op1") @@ -3430,7 +3428,6 @@ def test_dag_get_active_runs(self, dag_maker): """ Test to check that a DAG returns its active runs """ - now = timezone.utcnow() six_hours_ago_to_the_hour = (now - datetime.timedelta(hours=6)).replace( minute=0, second=0, microsecond=0 @@ -3855,7 +3852,6 @@ def test_create_dag_runs_assets(self, session, dag_maker): - That the run created is on QUEUED State - That dag_model has next_dagrun """ - asset1 = Asset(uri="test://asset1", name="test_asset", group="test_group") asset2 = Asset(uri="test://asset2", name="test_asset_2", group="test_group") @@ -4205,7 +4201,6 @@ def test_scheduler_create_dag_runs_check_existing_run(self, dag_maker): @conf_vars({("scheduler", "use_job_schedule"): "false"}) def test_do_schedule_max_active_runs_dag_timed_out(self, dag_maker, session): """Test that tasks are set to a finished state when their DAG times out""" - with dag_maker( dag_id="test_max_active_run_with_dag_timed_out", schedule="@once", @@ -5608,7 +5603,6 @@ def test_timeout_triggers(self, dag_maker): has expired, are correctly failed. """ - session = settings.Session() # Create the test DAG and task with dag_maker( @@ -6144,7 +6138,6 @@ def test_catchup_works_correctly(self, dag_maker, testing_dag_bundle): def test_update_dagrun_state_for_paused_dag(self, dag_maker, session): """Test that _update_dagrun_state_for_paused_dag puts DagRuns in terminal states""" - with dag_maker("testdag") as dag: EmptyOperator(task_id="task1") @@ -6189,7 +6182,6 @@ def test_update_dagrun_state_for_paused_dag(self, dag_maker, session): def test_update_dagrun_state_for_paused_dag_not_for_backfill(self, dag_maker, session): """Test that the _update_dagrun_state_for_paused_dag does not affect backfilled dagruns""" - with dag_maker("testdag") as dag: EmptyOperator(task_id="task1") @@ -6314,7 +6306,6 @@ def test_asset_orphaning_ignore_orphaned_assets(self, dag_maker, session): def test_misconfigured_dags_doesnt_crash_scheduler(self, session, dag_maker, caplog): """Test that if dagrun creation throws an exception, the scheduler doesn't crash""" - with dag_maker("testdag1", serialized=True): BashOperator(task_id="task", bash_command="echo 1") diff --git a/tests/jobs/test_triggerer_job.py b/airflow-core/tests/unit/jobs/test_triggerer_job.py similarity index 100% rename from tests/jobs/test_triggerer_job.py rename to airflow-core/tests/unit/jobs/test_triggerer_job.py diff --git a/tests/lineage/__init__.py b/airflow-core/tests/unit/lineage/__init__.py similarity index 100% rename from tests/lineage/__init__.py rename to airflow-core/tests/unit/lineage/__init__.py diff --git a/tests/lineage/test_hook.py b/airflow-core/tests/unit/lineage/test_hook.py similarity index 100% rename from tests/lineage/test_hook.py rename to airflow-core/tests/unit/lineage/test_hook.py diff --git a/tests/lineage/test_lineage.py b/airflow-core/tests/unit/lineage/test_lineage.py similarity index 98% rename from tests/lineage/test_lineage.py rename to airflow-core/tests/unit/lineage/test_lineage.py index bc88119016910..a45ec783b3d27 100644 --- a/tests/lineage/test_lineage.py +++ b/airflow-core/tests/unit/lineage/test_lineage.py @@ -196,7 +196,7 @@ def test_empty_lineage_backend(self): backend = get_backend() assert backend is None - @conf_vars({("lineage", "backend"): "tests.lineage.test_lineage.CustomLineageBackend"}) + @conf_vars({("lineage", "backend"): "unit.lineage.test_lineage.CustomLineageBackend"}) def test_resolve_lineage_class(self): backend = get_backend() assert issubclass(backend.__class__, LineageBackend) diff --git a/tests/listeners/__init__.py b/airflow-core/tests/unit/listeners/__init__.py similarity index 100% rename from tests/listeners/__init__.py rename to airflow-core/tests/unit/listeners/__init__.py diff --git a/tests/listeners/asset_listener.py b/airflow-core/tests/unit/listeners/asset_listener.py similarity index 100% rename from tests/listeners/asset_listener.py rename to airflow-core/tests/unit/listeners/asset_listener.py diff --git a/tests/listeners/class_listener.py b/airflow-core/tests/unit/listeners/class_listener.py similarity index 100% rename from tests/listeners/class_listener.py rename to airflow-core/tests/unit/listeners/class_listener.py diff --git a/tests/listeners/dag_import_error_listener.py b/airflow-core/tests/unit/listeners/dag_import_error_listener.py similarity index 100% rename from tests/listeners/dag_import_error_listener.py rename to airflow-core/tests/unit/listeners/dag_import_error_listener.py diff --git a/tests/listeners/dag_listener.py b/airflow-core/tests/unit/listeners/dag_listener.py similarity index 100% rename from tests/listeners/dag_listener.py rename to airflow-core/tests/unit/listeners/dag_listener.py diff --git a/tests/listeners/empty_listener.py b/airflow-core/tests/unit/listeners/empty_listener.py similarity index 100% rename from tests/listeners/empty_listener.py rename to airflow-core/tests/unit/listeners/empty_listener.py diff --git a/tests/listeners/file_write_listener.py b/airflow-core/tests/unit/listeners/file_write_listener.py similarity index 100% rename from tests/listeners/file_write_listener.py rename to airflow-core/tests/unit/listeners/file_write_listener.py diff --git a/tests/listeners/full_listener.py b/airflow-core/tests/unit/listeners/full_listener.py similarity index 100% rename from tests/listeners/full_listener.py rename to airflow-core/tests/unit/listeners/full_listener.py diff --git a/tests/listeners/lifecycle_listener.py b/airflow-core/tests/unit/listeners/lifecycle_listener.py similarity index 100% rename from tests/listeners/lifecycle_listener.py rename to airflow-core/tests/unit/listeners/lifecycle_listener.py diff --git a/tests/listeners/partial_listener.py b/airflow-core/tests/unit/listeners/partial_listener.py similarity index 100% rename from tests/listeners/partial_listener.py rename to airflow-core/tests/unit/listeners/partial_listener.py diff --git a/tests/listeners/slow_listener.py b/airflow-core/tests/unit/listeners/slow_listener.py similarity index 100% rename from tests/listeners/slow_listener.py rename to airflow-core/tests/unit/listeners/slow_listener.py diff --git a/tests/listeners/test_asset_listener.py b/airflow-core/tests/unit/listeners/test_asset_listener.py similarity index 98% rename from tests/listeners/test_asset_listener.py rename to airflow-core/tests/unit/listeners/test_asset_listener.py index 94cb452559359..3b5e933f7d806 100644 --- a/tests/listeners/test_asset_listener.py +++ b/airflow-core/tests/unit/listeners/test_asset_listener.py @@ -24,7 +24,7 @@ from airflow.sdk.definitions.asset import Asset from airflow.utils.session import provide_session -from tests.listeners import asset_listener +from unit.listeners import asset_listener @pytest.fixture(autouse=True) diff --git a/tests/listeners/test_listeners.py b/airflow-core/tests/unit/listeners/test_listeners.py similarity index 98% rename from tests/listeners/test_listeners.py rename to airflow-core/tests/unit/listeners/test_listeners.py index 98cf1a92499eb..ac09d3e70ac56 100644 --- a/tests/listeners/test_listeners.py +++ b/airflow-core/tests/unit/listeners/test_listeners.py @@ -30,14 +30,14 @@ from airflow.utils.session import provide_session from airflow.utils.state import DagRunState, TaskInstanceState -from tests.listeners import ( +from unit.listeners import ( class_listener, full_listener, lifecycle_listener, partial_listener, throwing_listener, ) -from tests.utils.test_helpers import MockJobRunner +from unit.utils.test_helpers import MockJobRunner pytestmark = pytest.mark.db_test diff --git a/tests/listeners/throwing_listener.py b/airflow-core/tests/unit/listeners/throwing_listener.py similarity index 100% rename from tests/listeners/throwing_listener.py rename to airflow-core/tests/unit/listeners/throwing_listener.py diff --git a/tests/listeners/very_slow_listener.py b/airflow-core/tests/unit/listeners/very_slow_listener.py similarity index 100% rename from tests/listeners/very_slow_listener.py rename to airflow-core/tests/unit/listeners/very_slow_listener.py diff --git a/tests/listeners/xcom_listener.py b/airflow-core/tests/unit/listeners/xcom_listener.py similarity index 100% rename from tests/listeners/xcom_listener.py rename to airflow-core/tests/unit/listeners/xcom_listener.py diff --git a/tests/macros/__init__.py b/airflow-core/tests/unit/macros/__init__.py similarity index 100% rename from tests/macros/__init__.py rename to airflow-core/tests/unit/macros/__init__.py diff --git a/tests/models/__init__.py b/airflow-core/tests/unit/models/__init__.py similarity index 100% rename from tests/models/__init__.py rename to airflow-core/tests/unit/models/__init__.py diff --git a/tests/models/test_asset.py b/airflow-core/tests/unit/models/test_asset.py similarity index 100% rename from tests/models/test_asset.py rename to airflow-core/tests/unit/models/test_asset.py diff --git a/tests/models/test_backfill.py b/airflow-core/tests/unit/models/test_backfill.py similarity index 100% rename from tests/models/test_backfill.py rename to airflow-core/tests/unit/models/test_backfill.py diff --git a/tests/models/test_base.py b/airflow-core/tests/unit/models/test_base.py similarity index 100% rename from tests/models/test_base.py rename to airflow-core/tests/unit/models/test_base.py diff --git a/tests/models/test_baseoperator.py b/airflow-core/tests/unit/models/test_baseoperator.py similarity index 99% rename from tests/models/test_baseoperator.py rename to airflow-core/tests/unit/models/test_baseoperator.py index c3e7b3bd32a1e..0fbaadad5ae29 100644 --- a/tests/models/test_baseoperator.py +++ b/airflow-core/tests/unit/models/test_baseoperator.py @@ -39,8 +39,8 @@ from airflow.utils.trigger_rule import TriggerRule from airflow.utils.types import DagRunType -from tests.models import DEFAULT_DATE from tests_common.test_utils.mock_operators import MockOperator +from unit.models import DEFAULT_DATE class ClassWithCustomAttributes: @@ -246,7 +246,6 @@ def test_teardown_and_fail_fast(dag_maker): when fail_fast enabled, teardowns should run according to their setups. in this case, the second teardown skips because its setup skips. """ - with dag_maker(fail_fast=True) as dag: for num in (1, 2): with TaskGroup(f"tg_{num}"): diff --git a/tests/models/test_cleartasks.py b/airflow-core/tests/unit/models/test_cleartasks.py similarity index 99% rename from tests/models/test_cleartasks.py rename to airflow-core/tests/unit/models/test_cleartasks.py index 71da90ce17042..f6626c3d7816b 100644 --- a/tests/models/test_cleartasks.py +++ b/airflow-core/tests/unit/models/test_cleartasks.py @@ -35,8 +35,8 @@ from airflow.utils.state import DagRunState, State, TaskInstanceState from airflow.utils.types import DagRunTriggeredByType, DagRunType -from tests.models import DEFAULT_DATE from tests_common.test_utils import db +from unit.models import DEFAULT_DATE pytestmark = pytest.mark.db_test @@ -152,7 +152,8 @@ def test_clear_task_instances_next_method(self, dag_maker, session): ["state", "last_scheduling"], [(DagRunState.QUEUED, None), (DagRunState.RUNNING, DEFAULT_DATE)] ) def test_clear_task_instances_dr_state(self, state, last_scheduling, dag_maker): - """Test that DR state is set to None after clear. + """ + Test that DR state is set to None after clear. And that DR.last_scheduling_decision is handled OK. start_date is also set to None """ @@ -195,7 +196,8 @@ def test_clear_task_instances_dr_state(self, state, last_scheduling, dag_maker): @pytest.mark.parametrize("state", [DagRunState.QUEUED, DagRunState.RUNNING]) def test_clear_task_instances_on_running_dr(self, state, dag_maker): - """Test that DagRun state, start_date and last_scheduling_decision + """ + Test that DagRun state, start_date and last_scheduling_decision are not changed after clearing TI in an unfinished DagRun. """ # Explicitly needs catchup as True as test is creating history runs @@ -245,7 +247,8 @@ def test_clear_task_instances_on_running_dr(self, state, dag_maker): ], ) def test_clear_task_instances_on_finished_dr(self, state, last_scheduling, dag_maker): - """Test that DagRun state, start_date and last_scheduling_decision + """ + Test that DagRun state, start_date and last_scheduling_decision are changed after clearing TI in a finished DagRun. """ # Explicitly needs catchup as True as test is creating history runs diff --git a/tests/models/test_connection.py b/airflow-core/tests/unit/models/test_connection.py similarity index 100% rename from tests/models/test_connection.py rename to airflow-core/tests/unit/models/test_connection.py diff --git a/tests/models/test_dag.py b/airflow-core/tests/unit/models/test_dag.py similarity index 99% rename from tests/models/test_dag.py rename to airflow-core/tests/unit/models/test_dag.py index 0dca94cf703af..689996ecbbe45 100644 --- a/tests/models/test_dag.py +++ b/airflow-core/tests/unit/models/test_dag.py @@ -89,12 +89,6 @@ from airflow.utils.types import DagRunTriggeredByType, DagRunType from airflow.utils.weight_rule import WeightRule -from tests.models import DEFAULT_DATE -from tests.plugins.priority_weight_strategy import ( - FactorPriorityWeightStrategy, - StaticTestPriorityWeightStrategy, - TestPriorityWeightStrategyPlugin, -) from tests_common.test_utils.asserts import assert_queries_count from tests_common.test_utils.db import ( clear_db_assets, @@ -106,6 +100,12 @@ from tests_common.test_utils.mapping import expand_mapped_task from tests_common.test_utils.mock_plugins import mock_plugin_manager from tests_common.test_utils.timetables import cron_timetable, delta_timetable +from unit.models import DEFAULT_DATE +from unit.plugins.priority_weight_strategy import ( + FactorPriorityWeightStrategy, + StaticTestPriorityWeightStrategy, + TestPriorityWeightStrategyPlugin, +) if TYPE_CHECKING: from sqlalchemy.orm import Session @@ -2639,7 +2639,6 @@ def test_count_number_queries(self, tasks_count): ) def test_set_task_instance_state(run_id, session, dag_maker): """Test that set_task_instance_state updates the TaskInstance state and clear downstream failed""" - start_date = datetime_tz(2020, 1, 1) with dag_maker("test_set_task_instance_state", start_date=start_date, session=session) as dag: task_1 = EmptyOperator(task_id="task_1") @@ -2778,7 +2777,6 @@ def consumer(value): def test_set_task_group_state(session, dag_maker): """Test that set_task_group_state updates the TaskGroup state and clear downstream failed""" - start_date = datetime_tz(2020, 1, 1) with dag_maker("test_set_task_group_state", start_date=start_date, session=session) as dag: start = EmptyOperator(task_id="start") @@ -3372,7 +3370,8 @@ def test_get_flat_relative_ids_one_task_multiple_setup_teardowns(self): assert self.cleared_downstream(w2) == {s2, s3, w2, t2, t3a, t3b} def test_get_flat_relative_ids_with_setup_and_groups(self): - """This is a dag with a setup / teardown at dag level and two task groups that have + """ + This is a dag with a setup / teardown at dag level and two task groups that have their own setups / teardowns. When we do tg >> dag_teardown, teardowns should be excluded from tg leaves. diff --git a/tests/models/test_dag_version.py b/airflow-core/tests/unit/models/test_dag_version.py similarity index 100% rename from tests/models/test_dag_version.py rename to airflow-core/tests/unit/models/test_dag_version.py diff --git a/tests/models/test_dagbag.py b/airflow-core/tests/unit/models/test_dagbag.py similarity index 99% rename from tests/models/test_dagbag.py rename to airflow-core/tests/unit/models/test_dagbag.py index b394654642466..4f52d3019b512 100644 --- a/tests/models/test_dagbag.py +++ b/airflow-core/tests/unit/models/test_dagbag.py @@ -43,11 +43,11 @@ from airflow.utils import timezone as tz from airflow.utils.session import create_session -from tests import cluster_policies -from tests.models import TEST_DAGS_FOLDER from tests_common.test_utils import db from tests_common.test_utils.asserts import assert_queries_count from tests_common.test_utils.config import conf_vars +from unit import cluster_policies +from unit.models import TEST_DAGS_FOLDER pytestmark = pytest.mark.db_test @@ -118,7 +118,8 @@ def test_dont_load_example(self, tmp_path): assert dagbag.size() == 0 def test_safe_mode_heuristic_match(self, tmp_path): - """With safe mode enabled, a file matching the discovery heuristics + """ + With safe mode enabled, a file matching the discovery heuristics should be discovered. """ path = tmp_path / "testfile.py" @@ -131,7 +132,8 @@ def test_safe_mode_heuristic_match(self, tmp_path): assert dagbag.dagbag_stats[0].file == f"/{path.name}" def test_safe_mode_heuristic_mismatch(self, tmp_path): - """With safe mode enabled, a file not matching the discovery heuristics + """ + With safe mode enabled, a file not matching the discovery heuristics should not be discovered. """ path = tmp_path / "testfile.py" @@ -284,7 +286,7 @@ def invalid_cron_zipped_dag(self, invalid_cron_dag: str, tmp_path: pathlib.Path) def test_process_file_cron_validity_check( self, request: pytest.FixtureRequest, invalid_dag_name: str, tmp_path ): - """test if an invalid cron expression as schedule interval can be identified""" + """Test if an invalid cron expression as schedule interval can be identified""" dagbag = DagBag(dag_folder=os.fspath(tmp_path), include_examples=False) assert len(dagbag.import_errors) == 0 dagbag.process_file(request.getfixturevalue(invalid_dag_name)) @@ -417,7 +419,6 @@ def test_refresh_py_dag(self, mock_dagmodel, tmp_path): """ Test that we can refresh an ordinary .py DAG """ - dag_id = "example_bash_operator" fileloc = str(example_dags_folder / "example_bash_operator.py") @@ -678,7 +679,6 @@ def test_get_dag_with_dag_serialization(self): Test that Serialized DAG is updated in DagBag when it is updated in Serialized DAG table after 'min_serialized_dag_fetch_interval' seconds are passed. """ - with time_machine.travel((tz.datetime(2020, 1, 5, 0, 0, 0)), tick=False): example_bash_op_dag = DagBag(include_examples=True).dags.get("example_bash_operator") example_bash_op_dag.sync_to_db() diff --git a/tests/models/test_dagcode.py b/airflow-core/tests/unit/models/test_dagcode.py similarity index 99% rename from tests/models/test_dagcode.py rename to airflow-core/tests/unit/models/test_dagcode.py index f5d1f4fbc66d9..f604037ffe79b 100644 --- a/tests/models/test_dagcode.py +++ b/airflow-core/tests/unit/models/test_dagcode.py @@ -192,7 +192,6 @@ def test_has_dag(self, dag_maker): def test_update_source_code(self, dag_maker, session): """Test that dag code can be updated.""" - with dag_maker("dag1") as dag: @task_decorator diff --git a/tests/models/test_dagrun.py b/airflow-core/tests/unit/models/test_dagrun.py similarity index 99% rename from tests/models/test_dagrun.py rename to airflow-core/tests/unit/models/test_dagrun.py index e61200ca24bfc..1157815a0a0be 100644 --- a/tests/models/test_dagrun.py +++ b/airflow-core/tests/unit/models/test_dagrun.py @@ -51,10 +51,10 @@ from airflow.utils.trigger_rule import TriggerRule from airflow.utils.types import DagRunTriggeredByType, DagRunType -from tests.models import DEFAULT_DATE as _DEFAULT_DATE from tests_common.test_utils import db from tests_common.test_utils.config import conf_vars from tests_common.test_utils.mock_operators import MockOperator +from unit.models import DEFAULT_DATE as _DEFAULT_DATE pytestmark = [pytest.mark.db_test, pytest.mark.need_serialized_dag] @@ -866,7 +866,6 @@ def test_next_dagruns_to_examine_only_unpaused(self, session, state): Check that "next_dagruns_to_examine" ignores runs from paused/inactive DAGs and gets running/queued dagruns """ - dag = DAG(dag_id="test_dags", schedule=datetime.timedelta(days=1), start_date=DEFAULT_DATE) EmptyOperator(task_id="dummy", dag=dag, owner="airflow") @@ -1095,7 +1094,6 @@ def test_dag_run_version_number(self, dag_maker, session): @mock.patch.object(Stats, "incr") def test_verify_integrity_task_start_and_end_date(Stats_incr, dag_maker, session, run_type, expected_tis): """Test that tasks with specific dates are only created for backfill runs""" - with dag_maker("test", schedule=datetime.timedelta(days=1), start_date=DEFAULT_DATE) as dag: EmptyOperator(task_id="without") EmptyOperator(task_id="with_start_date", start_date=DEFAULT_DATE + datetime.timedelta(1)) @@ -1430,7 +1428,6 @@ def test_mapped_literal_faulty_state_in_db(dag_maker, session): The state that happens is that there exists mapped task instances and the unmapped task instance. So we have instances with map_index [-1, 0, 1]. The -1 task instances should be removed in this case. """ - with dag_maker(session=session) as dag: @task @@ -1586,7 +1583,6 @@ def test_mapped_task_group_empty_operator(dag_maker, session): Test that dynamic task inside a dynamic task group only marks the corresponding downstream EmptyOperator as success. """ - literal = [1, 2, 3] with dag_maker(session=session) as dag: @@ -1805,7 +1801,6 @@ def test_schedule_tis_empty_operator_try_number(dag_maker, session: Session): When empty operator is not actually run, then we need to increment the try_number, since ordinarily it's incremented when scheduled, but empty operator is generally not scheduled. """ - with dag_maker(session=session): BashOperator(task_id="real_task", bash_command="echo 1") EmptyOperator(task_id="empty_task") @@ -2233,7 +2228,6 @@ def test_clearing_task_and_moving_from_non_mapped_to_mapped(dag_maker, session): RenderedTaskInstanceFields. To be able to test this, RenderedTaskInstanceFields was not used in the test since it would require that the task is expanded first. """ - from airflow.models.xcom import XComModel @task diff --git a/tests/models/test_dagwarning.py b/airflow-core/tests/unit/models/test_dagwarning.py similarity index 99% rename from tests/models/test_dagwarning.py rename to airflow-core/tests/unit/models/test_dagwarning.py index 443a4e620335a..7819a4bf416bc 100644 --- a/tests/models/test_dagwarning.py +++ b/airflow-core/tests/unit/models/test_dagwarning.py @@ -39,7 +39,6 @@ def test_purge_inactive_dag_warnings(self, session): """ Test that the purge_inactive_dag_warnings method deletes inactive dag warnings """ - dags = [DagModel(dag_id="dag_1", is_active=False), DagModel(dag_id="dag_2", is_active=True)] session.add_all(dags) session.commit() diff --git a/tests/models/test_deadline.py b/airflow-core/tests/unit/models/test_deadline.py similarity index 100% rename from tests/models/test_deadline.py rename to airflow-core/tests/unit/models/test_deadline.py diff --git a/tests/models/test_mappedoperator.py b/airflow-core/tests/unit/models/test_mappedoperator.py similarity index 99% rename from tests/models/test_mappedoperator.py rename to airflow-core/tests/unit/models/test_mappedoperator.py index ad3288ca4b38e..8fd6ca45508d8 100644 --- a/tests/models/test_mappedoperator.py +++ b/airflow-core/tests/unit/models/test_mappedoperator.py @@ -37,9 +37,9 @@ from airflow.utils.task_group import TaskGroup from airflow.utils.trigger_rule import TriggerRule -from tests.models import DEFAULT_DATE from tests_common.test_utils.mapping import expand_mapped_task from tests_common.test_utils.mock_operators import MockOperator +from unit.models import DEFAULT_DATE pytestmark = pytest.mark.db_test @@ -1093,7 +1093,8 @@ def file_transforms(filename): @pytest.mark.parametrize("type_", ["taskflow", "classic"]) def test_teardown_many_one_explicit(self, type_, dag_maker): - """-- passing + """ + -- passing one mapped setup going to one unmapped work 3 diff states for setup: success / failed / skipped teardown still runs, and receives the xcom from the single successful setup diff --git a/tests/models/test_pool.py b/airflow-core/tests/unit/models/test_pool.py similarity index 100% rename from tests/models/test_pool.py rename to airflow-core/tests/unit/models/test_pool.py diff --git a/tests/models/test_renderedtifields.py b/airflow-core/tests/unit/models/test_renderedtifields.py similarity index 100% rename from tests/models/test_renderedtifields.py rename to airflow-core/tests/unit/models/test_renderedtifields.py diff --git a/tests/models/test_serialized_dag.py b/airflow-core/tests/unit/models/test_serialized_dag.py similarity index 99% rename from tests/models/test_serialized_dag.py rename to airflow-core/tests/unit/models/test_serialized_dag.py index 84fee3cb0a362..c68be9eea059d 100644 --- a/tests/models/test_serialized_dag.py +++ b/airflow-core/tests/unit/models/test_serialized_dag.py @@ -371,7 +371,6 @@ def test_example_dag_sorting_serialised_dag(self, session): """ This test asserts if different dag ids -- simple or complex, can be sorted """ - example_dags = self._write_example_dags() for _, dag in example_dags.items(): diff --git a/tests/models/test_taskinstance.py b/airflow-core/tests/unit/models/test_taskinstance.py similarity index 99% rename from tests/models/test_taskinstance.py rename to airflow-core/tests/unit/models/test_taskinstance.py index ffa0753e5f5fb..35bc0bca07341 100644 --- a/tests/models/test_taskinstance.py +++ b/airflow-core/tests/unit/models/test_taskinstance.py @@ -101,11 +101,11 @@ from airflow.utils.types import DagRunTriggeredByType, DagRunType from airflow.utils.xcom import XCOM_RETURN_KEY -from tests.models import DEFAULT_DATE, TEST_DAGS_FOLDER from tests_common.test_utils import db from tests_common.test_utils.config import conf_vars from tests_common.test_utils.db import clear_db_connections, clear_db_runs from tests_common.test_utils.mock_operators import MockOperator +from unit.models import DEFAULT_DATE, TEST_DAGS_FOLDER pytestmark = [pytest.mark.db_test] @@ -424,7 +424,6 @@ def test_pool_slots_property(self): """ test that try to create a task with pool_slots less than 1 """ - dag = DAG(dag_id="test_run_pooling_task", schedule=None) with pytest.raises(ValueError, match="pool slots .* cannot be less than 1"): EmptyOperator( @@ -1832,7 +1831,7 @@ def test_check_and_change_state_before_execution_dep_not_met( def test_check_and_change_state_before_execution_dep_not_met_already_running( self, create_task_instance, testing_dag_bundle ): - """return False if the task instance state is running""" + """Return False if the task instance state is running""" ti = create_task_instance(dag_id="test_check_and_change_state_before_execution") with create_session() as _: ti.state = State.RUNNING @@ -1849,7 +1848,7 @@ def test_check_and_change_state_before_execution_dep_not_met_already_running( def test_check_and_change_state_before_execution_dep_not_met_not_runnable_state( self, create_task_instance, testing_dag_bundle ): - """return False if the task instance state is failed""" + """Return False if the task instance state is failed""" ti = create_task_instance(dag_id="test_check_and_change_state_before_execution") with create_session() as _: ti.state = State.FAILED @@ -2221,8 +2220,8 @@ def test_outlet_assets_failed(self, create_task_instance, testing_dag_bundle): failed, an AssetDagRunQueue is not logged, and an AssetEvent is not generated """ - from tests.dags import test_assets - from tests.dags.test_assets import dag_with_fail_task + from unit.dags import test_assets + from unit.dags.test_assets import dag_with_fail_task session = settings.Session() dagbag = DagBag(dag_folder=test_assets.__file__) @@ -2281,8 +2280,8 @@ def test_outlet_assets_skipped(self, testing_dag_bundle): is skipped, an AssetDagRunQueue is not logged, and an AssetEvent is not generated """ - from tests.dags import test_assets - from tests.dags.test_assets import dag_with_skip_task + from unit.dags import test_assets + from unit.dags.test_assets import dag_with_skip_task session = settings.Session() dagbag = DagBag(dag_folder=test_assets.__file__) diff --git a/tests/models/test_taskmap.py b/airflow-core/tests/unit/models/test_taskmap.py similarity index 100% rename from tests/models/test_taskmap.py rename to airflow-core/tests/unit/models/test_taskmap.py diff --git a/tests/models/test_timestamp.py b/airflow-core/tests/unit/models/test_timestamp.py similarity index 100% rename from tests/models/test_timestamp.py rename to airflow-core/tests/unit/models/test_timestamp.py diff --git a/tests/models/test_trigger.py b/airflow-core/tests/unit/models/test_trigger.py similarity index 99% rename from tests/models/test_trigger.py rename to airflow-core/tests/unit/models/test_trigger.py index c07c8f5acbf91..1c53d0f4b9c08 100644 --- a/tests/models/test_trigger.py +++ b/airflow-core/tests/unit/models/test_trigger.py @@ -502,7 +502,7 @@ def __init__(self, param1: str, param2: str): def serialize(self) -> tuple[str, dict[str, Any]]: return ( - "tests.models.test_trigger.SensitiveKwargsTrigger", + "unit.models.test_trigger.SensitiveKwargsTrigger", { "param1": self.param1, "param2": self.param2, diff --git a/tests/models/test_variable.py b/airflow-core/tests/unit/models/test_variable.py similarity index 99% rename from tests/models/test_variable.py rename to airflow-core/tests/unit/models/test_variable.py index 2c7e9d2763403..3a4cb66266d8f 100644 --- a/tests/models/test_variable.py +++ b/airflow-core/tests/unit/models/test_variable.py @@ -239,7 +239,6 @@ def test_variable_delete(self, session): def test_masking_from_db(self, session): """Test secrets are masked when loaded directly from the DB""" - # Normally people will use `Variable.get`, but just in case, catch direct DB access too try: var = Variable( diff --git a/tests/models/test_xcom.py b/airflow-core/tests/unit/models/test_xcom.py similarity index 99% rename from tests/models/test_xcom.py rename to airflow-core/tests/unit/models/test_xcom.py index ce407d1fc69f9..a7c6d7845d2ab 100644 --- a/tests/models/test_xcom.py +++ b/airflow-core/tests/unit/models/test_xcom.py @@ -106,7 +106,7 @@ def task_instances(session, task_instance): class TestXCom: - @conf_vars({("core", "xcom_backend"): "tests.models.test_xcom.CustomXCom"}) + @conf_vars({("core", "xcom_backend"): "unit.models.test_xcom.CustomXCom"}) def test_resolve_xcom_class(self): cls = resolve_xcom_backend() assert issubclass(cls, CustomXCom) diff --git a/tests/models/test_xcom_arg.py b/airflow-core/tests/unit/models/test_xcom_arg.py similarity index 100% rename from tests/models/test_xcom_arg.py rename to airflow-core/tests/unit/models/test_xcom_arg.py diff --git a/tests/testconfig/__init__.py b/airflow-core/tests/unit/notifications/__init__.py similarity index 100% rename from tests/testconfig/__init__.py rename to airflow-core/tests/unit/notifications/__init__.py diff --git a/tests/notifications/test_basenotifier.py b/airflow-core/tests/unit/notifications/test_basenotifier.py similarity index 100% rename from tests/notifications/test_basenotifier.py rename to airflow-core/tests/unit/notifications/test_basenotifier.py diff --git a/tests/notifications/test_notifier.txt b/airflow-core/tests/unit/notifications/test_notifier.txt similarity index 100% rename from tests/notifications/test_notifier.txt rename to airflow-core/tests/unit/notifications/test_notifier.txt diff --git a/tests/plugins/__init__.py b/airflow-core/tests/unit/plugins/__init__.py similarity index 100% rename from tests/plugins/__init__.py rename to airflow-core/tests/unit/plugins/__init__.py diff --git a/tests/plugins/priority_weight_strategy.py b/airflow-core/tests/unit/plugins/priority_weight_strategy.py similarity index 97% rename from tests/plugins/priority_weight_strategy.py rename to airflow-core/tests/unit/plugins/priority_weight_strategy.py index a20553635f844..ba1ff367889d0 100644 --- a/tests/plugins/priority_weight_strategy.py +++ b/airflow-core/tests/unit/plugins/priority_weight_strategy.py @@ -49,7 +49,7 @@ def get_weight(self, ti: TaskInstance): class TestPriorityWeightStrategyPlugin(AirflowPlugin): # Without this import, the qualname method will not use the correct classes names - from tests.plugins.priority_weight_strategy import ( + from unit.plugins.priority_weight_strategy import ( DecreasingPriorityStrategy, FactorPriorityWeightStrategy, StaticTestPriorityWeightStrategy, diff --git a/tests/plugins/test_plugin.py b/airflow-core/tests/unit/plugins/test_plugin.py similarity index 97% rename from tests/plugins/test_plugin.py rename to airflow-core/tests/unit/plugins/test_plugin.py index f19ba97adedee..9671a20f0f91c 100644 --- a/tests/plugins/test_plugin.py +++ b/airflow-core/tests/unit/plugins/test_plugin.py @@ -26,8 +26,6 @@ from airflow.task.priority_strategy import PriorityWeightStrategy from airflow.timetables.interval import CronDataIntervalTimetable -from tests.listeners import empty_listener -from tests.listeners.class_listener import ClassBasedListener from tests_common.test_utils.mock_operators import ( AirflowLink, AirflowLink2, @@ -36,6 +34,8 @@ GithubLink, GoogleLink, ) +from unit.listeners import empty_listener +from unit.listeners.class_listener import ClassBasedListener # Will show up under airflow.macros.test_plugin.plugin_macro diff --git a/tests/plugins/test_plugin_ignore.py b/airflow-core/tests/unit/plugins/test_plugin_ignore.py similarity index 100% rename from tests/plugins/test_plugin_ignore.py rename to airflow-core/tests/unit/plugins/test_plugin_ignore.py diff --git a/tests/plugins/test_plugins_manager.py b/airflow-core/tests/unit/plugins/test_plugins_manager.py similarity index 98% rename from tests/plugins/test_plugins_manager.py rename to airflow-core/tests/unit/plugins/test_plugins_manager.py index c3e0c15609089..0145d339d2ef5 100644 --- a/tests/plugins/test_plugins_manager.py +++ b/airflow-core/tests/unit/plugins/test_plugins_manager.py @@ -23,7 +23,6 @@ import logging import os import sys -from pathlib import Path from unittest import mock import pytest @@ -37,8 +36,6 @@ pytestmark = pytest.mark.db_test -AIRFLOW_SOURCES_ROOT = Path(__file__).parents[2].resolve() - ON_LOAD_EXCEPTION_PLUGIN = """ from airflow.plugins_manager import AirflowPlugin @@ -279,8 +276,8 @@ def test_registering_plugin_listeners(self): # sort names as order of listeners is not guaranteed assert sorted(listener_names) == [ "airflow.example_dags.plugins.event_listener", - "tests.listeners.class_listener.ClassBasedListener", - "tests.listeners.empty_listener", + "unit.listeners.class_listener.ClassBasedListener", + "unit.listeners.empty_listener", ] finally: get_listener_manager().clear() diff --git a/tests/testconfig/conf/__init__.py b/airflow-core/tests/unit/secrets/__init__.py similarity index 100% rename from tests/testconfig/conf/__init__.py rename to airflow-core/tests/unit/secrets/__init__.py diff --git a/tests/secrets/test_cache.py b/airflow-core/tests/unit/secrets/test_cache.py similarity index 100% rename from tests/secrets/test_cache.py rename to airflow-core/tests/unit/secrets/test_cache.py diff --git a/tests/security/__init__.py b/airflow-core/tests/unit/security/__init__.py similarity index 100% rename from tests/security/__init__.py rename to airflow-core/tests/unit/security/__init__.py diff --git a/tests/security/test_kerberos.py b/airflow-core/tests/unit/security/test_kerberos.py similarity index 100% rename from tests/security/test_kerberos.py rename to airflow-core/tests/unit/security/test_kerberos.py diff --git a/tests/sensors/__init__.py b/airflow-core/tests/unit/sensors/__init__.py similarity index 100% rename from tests/sensors/__init__.py rename to airflow-core/tests/unit/sensors/__init__.py diff --git a/tests/sensors/test_base.py b/airflow-core/tests/unit/sensors/test_base.py similarity index 99% rename from tests/sensors/test_base.py rename to airflow-core/tests/unit/sensors/test_base.py index 30ba877b2c02b..f1bedee703ecd 100644 --- a/tests/sensors/test_base.py +++ b/airflow-core/tests/unit/sensors/test_base.py @@ -687,7 +687,6 @@ def run_duration(): @pytest.mark.parametrize("poke_interval", [0, 0.1, 0.9, 1, 2, 3]) def test_sensor_with_exponential_backoff_on_and_small_poke_interval(self, poke_interval): """Test that sensor works correctly when poke_interval is small and exponential_backoff is on""" - sensor = DummySensor( task_id=SENSOR_OP, return_value=None, diff --git a/tests/sensors/test_external_task_sensor.py b/airflow-core/tests/unit/sensors/test_external_task_sensor.py similarity index 99% rename from tests/sensors/test_external_task_sensor.py rename to airflow-core/tests/unit/sensors/test_external_task_sensor.py index 9bce3646c00fc..b8f9b477aa83e 100644 --- a/tests/sensors/test_external_task_sensor.py +++ b/airflow-core/tests/unit/sensors/test_external_task_sensor.py @@ -53,10 +53,10 @@ from airflow.utils.timezone import coerce_datetime, datetime from airflow.utils.types import DagRunType -from tests.models import TEST_DAGS_FOLDER from tests_common.test_utils.db import clear_db_runs from tests_common.test_utils.mock_operators import MockOperator from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS +from unit.models import TEST_DAGS_FOLDER if AIRFLOW_V_3_0_PLUS: from airflow.utils.types import DagRunTriggeredByType diff --git a/tests/sensors/test_filesystem.py b/airflow-core/tests/unit/sensors/test_filesystem.py similarity index 100% rename from tests/sensors/test_filesystem.py rename to airflow-core/tests/unit/sensors/test_filesystem.py diff --git a/tests/serialization/__init__.py b/airflow-core/tests/unit/serialization/__init__.py similarity index 100% rename from tests/serialization/__init__.py rename to airflow-core/tests/unit/serialization/__init__.py diff --git a/tests/serialization/serializers/__init__.py b/airflow-core/tests/unit/serialization/serializers/__init__.py similarity index 100% rename from tests/serialization/serializers/__init__.py rename to airflow-core/tests/unit/serialization/serializers/__init__.py diff --git a/tests/serialization/serializers/test_serializers.py b/airflow-core/tests/unit/serialization/serializers/test_serializers.py similarity index 100% rename from tests/serialization/serializers/test_serializers.py rename to airflow-core/tests/unit/serialization/serializers/test_serializers.py diff --git a/tests/serialization/test_dag_serialization.py b/airflow-core/tests/unit/serialization/test_dag_serialization.py similarity index 98% rename from tests/serialization/test_dag_serialization.py rename to airflow-core/tests/unit/serialization/test_dag_serialization.py index ede6fe277cfd0..8bc0570ac7b05 100644 --- a/tests/serialization/test_dag_serialization.py +++ b/airflow-core/tests/unit/serialization/test_dag_serialization.py @@ -103,7 +103,7 @@ if TYPE_CHECKING: from airflow.sdk.definitions.context import Context -repo_root = Path(airflow.__file__).parent.parent +AIRFLOW_REPO_ROOT_PATH = Path(airflow.__file__).parents[3] executor_config_pod = k8s.V1Pod( @@ -160,7 +160,9 @@ "disable_bundle_versioning": False, "doc_md": "### DAG Tutorial Documentation", "fileloc": None, - "_processor_dags_folder": f"{repo_root}/tests/dags", + "_processor_dags_folder": ( + AIRFLOW_REPO_ROOT_PATH / "airflow-core" / "tests" / "unit" / "dags" + ).as_posix(), "tasks": [ { "__type": "operator", @@ -258,10 +260,6 @@ }, } -ROOT_FOLDER = os.path.realpath( - os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir, os.pardir) -) - CUSTOM_TIMETABLE_SERIALIZED = { "__type": "tests_common.test_utils.timetables.CustomSerializationTimetable", "__var": {"value": "foo"}, @@ -310,7 +308,8 @@ def make_simple_dag(): def make_user_defined_macro_filter_dag(): - """Make DAGs with user defined macros and filters using locally defined methods. + """ + Make DAGs with user defined macros and filters using locally defined methods. For Webserver, we do not include ``user_defined_macros`` & ``user_defined_filters``. @@ -343,7 +342,9 @@ def compute_last_dagrun(dag: DAG): def get_excluded_patterns() -> Generator[str, None, None]: python_version = f"{sys.version_info.major}.{sys.version_info.minor}" - all_providers = json.loads((repo_root / "generated" / "provider_dependencies.json").read_text()) + all_providers = json.loads( + (AIRFLOW_REPO_ROOT_PATH / "generated" / "provider_dependencies.json").read_text() + ) for provider, provider_info in all_providers.items(): if python_version in provider_info.get("excluded-python-versions"): provider_path = provider.replace(".", "/") @@ -359,7 +360,7 @@ def collect_dags(dag_folder=None): if dag_folder is None: patterns = [ - "airflow/example_dags", + "airflow-core/src/airflow/example_dags", # For now include amazon directly because they have many dags and are all serializing without error "providers/amazon/tests/system/*/*/", "providers/*/tests/system/*/", @@ -370,9 +371,11 @@ def collect_dags(dag_folder=None): patterns = dag_folder else: patterns = [dag_folder] - excluded_patterns = [f"{ROOT_FOLDER}/{excluded_pattern}" for excluded_pattern in get_excluded_patterns()] + excluded_patterns = [ + f"{AIRFLOW_REPO_ROOT_PATH}/{excluded_pattern}" for excluded_pattern in get_excluded_patterns() + ] for pattern in patterns: - for directory in glob(f"{ROOT_FOLDER}/{pattern}"): + for directory in glob(f"{AIRFLOW_REPO_ROOT_PATH}/{pattern}"): if any([directory.startswith(excluded_pattern) for excluded_pattern in excluded_patterns]): continue dagbag = DagBag(directory, include_examples=False) @@ -572,7 +575,6 @@ def sorted_serialized_dag(dag_dict: dict): @pytest.mark.db_test def test_deserialization_across_process(self): """A serialized DAG can be deserialized in another process.""" - # Since we need to parse the dags twice here (once in the subprocess, # and once here to get a DAG to compare to) we don't want to load all # dags. @@ -649,7 +651,10 @@ def validate_deserialized_dag(self, serialized_dag: DAG, dag: DAG): # _processor_dags_folder is only populated at serialization time # it's only used when relying on serialized dag to determine a dag's relative path assert dag._processor_dags_folder is None - assert serialized_dag._processor_dags_folder == str(repo_root / "tests/dags") + assert ( + serialized_dag._processor_dags_folder + == (AIRFLOW_REPO_ROOT_PATH / "airflow-core" / "tests" / "unit" / "dags").as_posix() + ) if dag.default_args: for k, v in dag.default_args.items(): if callable(v): @@ -1045,7 +1050,6 @@ def test_full_param_roundtrip(self, param: Param): """ Test to make sure that only native Param objects are being passed as dag or task params """ - dag = DAG(dag_id="simple_dag", schedule=None, params={"my_param": param}) serialized_json = SerializedDAG.to_json(dag) serialized = json.loads(serialized_json) @@ -1275,7 +1279,6 @@ def test_templated_fields_exist_in_serialized_dag(self, templated_field, expecte Since we don't want to inflate arbitrary python objects (it poses a RCE/security risk etc.) we want check that non-"basic" objects are turned in to strings after deserializing. """ - dag = DAG( "test_serialized_template_fields", schedule=None, @@ -1597,7 +1600,9 @@ def mytask(): @pytest.mark.db_test def test_basic_mapped_dag(self, dag_maker): - dagbag = DagBag("airflow/example_dags/example_dynamic_task_mapping.py", include_examples=False) + dagbag = DagBag( + "airflow-core/src/airflow/example_dags/example_dynamic_task_mapping.py", include_examples=False + ) assert not dagbag.import_errors dag = dagbag.dags["example_dynamic_task_mapping"] ser_dag = SerializedDAG.to_dict(dag) @@ -2185,7 +2190,7 @@ def test_serialized_objects_are_sorted(self, object_to_serialized, expected_outp assert serialized_obj == expected_output def test_params_upgrade(self): - """when pre-2.2.0 param (i.e. primitive) is deserialized we convert to Param""" + """When pre-2.2.0 param (i.e. primitive) is deserialized we convert to Param""" serialized = { "__version": 1, "dag": { @@ -2203,8 +2208,10 @@ def test_params_upgrade(self): assert dag.params["str"] == "str" def test_params_serialization_from_dict_upgrade(self): - """In <=2.9.2 params were serialized as a JSON object instead of a list of key-value pairs. - This test asserts that the params are still deserialized properly.""" + """ + In <=2.9.2 params were serialized as a JSON object instead of a list of key-value pairs. + This test asserts that the params are still deserialized properly. + """ serialized = { "__version": 1, "dag": { @@ -2227,9 +2234,11 @@ def test_params_serialization_from_dict_upgrade(self): assert param.value == "str" def test_params_serialize_default_2_2_0(self): - """In 2.0.0, param ``default`` was assumed to be json-serializable objects and were not run though + """ + In 2.0.0, param ``default`` was assumed to be json-serializable objects and were not run though the standard serializer function. In 2.2.2 we serialize param ``default``. We keep this - test only to ensure that params stored in 2.2.0 can still be parsed correctly.""" + test only to ensure that params stored in 2.2.0 can still be parsed correctly. + """ serialized = { "__version": 1, "dag": { @@ -3048,7 +3057,7 @@ def operator_extra_links(self): "template_fields": [], "template_fields_renderers": {}, "task_type": "_DummyOperator", - "_task_module": "tests.serialization.test_dag_serialization", + "_task_module": "unit.serialization.test_dag_serialization", "_is_empty": False, "_is_mapped": True, "_can_skip_downstream": False, diff --git a/tests/serialization/test_serde.py b/airflow-core/tests/unit/serialization/test_serde.py similarity index 91% rename from tests/serialization/test_serde.py rename to airflow-core/tests/unit/serialization/test_serde.py index 60f895e3efabb..6b716f581fcbf 100644 --- a/tests/serialization/test_serde.py +++ b/airflow-core/tests/unit/serialization/test_serde.py @@ -261,54 +261,57 @@ def test_allow_list_for_imports(self): @conf_vars( { - ("core", "allowed_deserialization_classes"): "tests.airflow.*", + ("core", "allowed_deserialization_classes"): "unit.airflow.*", } ) @pytest.mark.usefixtures("recalculate_patterns") def test_allow_list_match(self): - assert _match("tests.airflow.deep") - assert _match("tests.wrongpath") is False + assert _match("unit.airflow.deep") + assert _match("unit.wrongpath") is False @conf_vars( { - ("core", "allowed_deserialization_classes"): "tests.airflow.deep", + ("core", "allowed_deserialization_classes"): "unit.airflow.deep", } ) @pytest.mark.usefixtures("recalculate_patterns") def test_allow_list_match_class(self): - """Test the match function when passing a full classname as + """ + Test the match function when passing a full classname as allowed_deserialization_classes """ - assert _match("tests.airflow.deep") - assert _match("tests.airflow.FALSE") is False + assert _match("unit.airflow.deep") + assert _match("unit.airflow.FALSE") is False @conf_vars( { ("core", "allowed_deserialization_classes"): "", - ("core", "allowed_deserialization_classes_regexp"): r"tests\.airflow\..", + ("core", "allowed_deserialization_classes_regexp"): r"unit\.airflow\..", } ) @pytest.mark.usefixtures("recalculate_patterns") def test_allow_list_match_regexp(self): - """Test the match function when passing a path as + """ + Test the match function when passing a path as allowed_deserialization_classes_regexp with no glob pattern defined """ - assert _match("tests.airflow.deep") - assert _match("tests.wrongpath") is False + assert _match("unit.airflow.deep") + assert _match("unit.wrongpath") is False @conf_vars( { ("core", "allowed_deserialization_classes"): "", - ("core", "allowed_deserialization_classes_regexp"): r"tests\.airflow\.deep", + ("core", "allowed_deserialization_classes_regexp"): r"unit\.airflow\.deep", } ) @pytest.mark.usefixtures("recalculate_patterns") def test_allow_list_match_class_regexp(self): - """Test the match function when passing a full classname as + """ + Test the match function when passing a full classname as allowed_deserialization_classes_regexp with no glob pattern defined """ - assert _match("tests.airflow.deep") - assert _match("tests.airflow.FALSE") is False + assert _match("unit.airflow.deep") + assert _match("unit.airflow.FALSE") is False def test_incompatible_version(self): data = dict( @@ -369,7 +372,7 @@ def test_encode_asset(self): assert asset.uri == obj.uri def test_serializers_importable_and_str(self): - """test if all distributed serializers are lazy loading and can be imported""" + """Test if all distributed serializers are lazy loading and can be imported""" import airflow.serialization.serializers for _, name, _ in iter_namespace(airflow.serialization.serializers): @@ -413,14 +416,14 @@ def test_stringify(self): ( Z(10), { - "__classname__": "tests.serialization.test_serde.Z", + "__classname__": "unit.serialization.test_serde.Z", "__version__": 1, "__data__": {"x": 10}, }, ), ( W(2), - {"__classname__": "tests.serialization.test_serde.W", "__version__": 2, "__data__": {"x": 2}}, + {"__classname__": "unit.serialization.test_serde.W", "__version__": 2, "__data__": {"x": 2}}, ), ], ) @@ -441,6 +444,6 @@ def test_attr(self): def test_error_when_serializing_callable_without_name(self): i = C() with pytest.raises( - TypeError, match="cannot serialize object of type " + TypeError, match="cannot serialize object of type " ): serialize(i) diff --git a/tests/serialization/test_serialized_objects.py b/airflow-core/tests/unit/serialization/test_serialized_objects.py similarity index 97% rename from tests/serialization/test_serialized_objects.py rename to airflow-core/tests/unit/serialization/test_serialized_objects.py index 9d30f06b4d7d6..22265ba9eee5f 100644 --- a/tests/serialization/test_serialized_objects.py +++ b/airflow-core/tests/unit/serialization/test_serialized_objects.py @@ -56,16 +56,17 @@ from airflow.utils.task_group import TaskGroup from airflow.utils.types import DagRunType -from tests import REPO_ROOT - def test_recursive_serialize_calls_must_forward_kwargs(): """Any time we recurse cls.serialize, we must forward all kwargs.""" import ast + from pathlib import Path + + import airflow.serialization valid_recursive_call_count = 0 skipped_recursive_calls = 0 # when another serialize method called - file = REPO_ROOT / "airflow/serialization/serialized_objects.py" + file = Path(airflow.serialization.__path__[0]) / "serialized_objects.py" content = file.read_text() tree = ast.parse(content) @@ -391,15 +392,17 @@ def __init__(self, hi): self.hi = hi def serialize(self): - return "tests.serialization.test_serialized_objects.MyTrigger", {"hi": self.hi} + return "unit.serialization.test_serialized_objects.MyTrigger", {"hi": self.hi} async def run(self): yield def test_roundtrip_exceptions(): - """This is for AIP-44 when we need to send certain non-error exceptions - as part of an RPC call e.g. TaskDeferred or AirflowRescheduleException.""" + """ + This is for AIP-44 when we need to send certain non-error exceptions + as part of an RPC call e.g. TaskDeferred or AirflowRescheduleException. + """ some_date = pendulum.now() resched_exc = AirflowRescheduleException(reschedule_date=some_date) ser = BaseSerialization.serialize(resched_exc) diff --git a/tests/system/__init__.py b/airflow-core/tests/unit/task/__init__.py similarity index 100% rename from tests/system/__init__.py rename to airflow-core/tests/unit/task/__init__.py diff --git a/tests/task/conftest.py b/airflow-core/tests/unit/task/conftest.py similarity index 100% rename from tests/task/conftest.py rename to airflow-core/tests/unit/task/conftest.py diff --git a/tests/timetables/__init__.py b/airflow-core/tests/unit/testconfig/__init__.py similarity index 100% rename from tests/timetables/__init__.py rename to airflow-core/tests/unit/testconfig/__init__.py diff --git a/tests/utils/log/__init__.py b/airflow-core/tests/unit/testconfig/conf/__init__.py similarity index 99% rename from tests/utils/log/__init__.py rename to airflow-core/tests/unit/testconfig/conf/__init__.py index 217e5db960782..13a83393a9124 100644 --- a/tests/utils/log/__init__.py +++ b/airflow-core/tests/unit/testconfig/conf/__init__.py @@ -1,4 +1,3 @@ -# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information diff --git a/tests/testconfig/conf/core-with-trash.xml b/airflow-core/tests/unit/testconfig/conf/core-with-trash.xml similarity index 100% rename from tests/testconfig/conf/core-with-trash.xml rename to airflow-core/tests/unit/testconfig/conf/core-with-trash.xml diff --git a/tests/testconfig/conf/emr-core-site.xml b/airflow-core/tests/unit/testconfig/conf/emr-core-site.xml similarity index 100% rename from tests/testconfig/conf/emr-core-site.xml rename to airflow-core/tests/unit/testconfig/conf/emr-core-site.xml diff --git a/tests/testconfig/conf/ha-core-site.xml b/airflow-core/tests/unit/testconfig/conf/ha-core-site.xml similarity index 100% rename from tests/testconfig/conf/ha-core-site.xml rename to airflow-core/tests/unit/testconfig/conf/ha-core-site.xml diff --git a/tests/testconfig/conf/ha-noport-hdfs-site.xml b/airflow-core/tests/unit/testconfig/conf/ha-noport-hdfs-site.xml similarity index 100% rename from tests/testconfig/conf/ha-noport-hdfs-site.xml rename to airflow-core/tests/unit/testconfig/conf/ha-noport-hdfs-site.xml diff --git a/tests/testconfig/conf/ha-noport-trash-hdfs-site.xml b/airflow-core/tests/unit/testconfig/conf/ha-noport-trash-hdfs-site.xml similarity index 100% rename from tests/testconfig/conf/ha-noport-trash-hdfs-site.xml rename to airflow-core/tests/unit/testconfig/conf/ha-noport-trash-hdfs-site.xml diff --git a/tests/testconfig/conf/ha-port-hdfs-site.xml b/airflow-core/tests/unit/testconfig/conf/ha-port-hdfs-site.xml similarity index 100% rename from tests/testconfig/conf/ha-port-hdfs-site.xml rename to airflow-core/tests/unit/testconfig/conf/ha-port-hdfs-site.xml diff --git a/tests/testconfig/conf/non-ha-port-core-site.xml b/airflow-core/tests/unit/testconfig/conf/non-ha-port-core-site.xml similarity index 100% rename from tests/testconfig/conf/non-ha-port-core-site.xml rename to airflow-core/tests/unit/testconfig/conf/non-ha-port-core-site.xml diff --git a/tests/task/__init__.py b/airflow-core/tests/unit/ti_deps/__init__.py similarity index 100% rename from tests/task/__init__.py rename to airflow-core/tests/unit/ti_deps/__init__.py diff --git a/tests/ti_deps/__init__.py b/airflow-core/tests/unit/ti_deps/contexts/__init__.py similarity index 100% rename from tests/ti_deps/__init__.py rename to airflow-core/tests/unit/ti_deps/contexts/__init__.py diff --git a/tests/ti_deps/contexts/__init__.py b/airflow-core/tests/unit/ti_deps/deps/__init__.py similarity index 100% rename from tests/ti_deps/contexts/__init__.py rename to airflow-core/tests/unit/ti_deps/deps/__init__.py diff --git a/tests/ti_deps/deps/fake_models.py b/airflow-core/tests/unit/ti_deps/deps/fake_models.py similarity index 100% rename from tests/ti_deps/deps/fake_models.py rename to airflow-core/tests/unit/ti_deps/deps/fake_models.py diff --git a/tests/ti_deps/deps/test_dag_ti_slots_available_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_dag_ti_slots_available_dep.py similarity index 100% rename from tests/ti_deps/deps/test_dag_ti_slots_available_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_dag_ti_slots_available_dep.py diff --git a/tests/ti_deps/deps/test_dag_unpaused_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_dag_unpaused_dep.py similarity index 100% rename from tests/ti_deps/deps/test_dag_unpaused_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_dag_unpaused_dep.py diff --git a/tests/ti_deps/deps/test_dagrun_exists_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_dagrun_exists_dep.py similarity index 100% rename from tests/ti_deps/deps/test_dagrun_exists_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_dagrun_exists_dep.py diff --git a/tests/ti_deps/deps/test_mapped_task_upstream_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_mapped_task_upstream_dep.py similarity index 100% rename from tests/ti_deps/deps/test_mapped_task_upstream_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_mapped_task_upstream_dep.py diff --git a/tests/ti_deps/deps/test_not_in_retry_period_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_not_in_retry_period_dep.py similarity index 100% rename from tests/ti_deps/deps/test_not_in_retry_period_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_not_in_retry_period_dep.py diff --git a/tests/ti_deps/deps/test_not_previously_skipped_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_not_previously_skipped_dep.py similarity index 100% rename from tests/ti_deps/deps/test_not_previously_skipped_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_not_previously_skipped_dep.py diff --git a/tests/ti_deps/deps/test_pool_slots_available_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_pool_slots_available_dep.py similarity index 100% rename from tests/ti_deps/deps/test_pool_slots_available_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_pool_slots_available_dep.py diff --git a/tests/ti_deps/deps/test_prev_dagrun_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_prev_dagrun_dep.py similarity index 100% rename from tests/ti_deps/deps/test_prev_dagrun_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_prev_dagrun_dep.py diff --git a/tests/ti_deps/deps/test_ready_to_reschedule_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_ready_to_reschedule_dep.py similarity index 100% rename from tests/ti_deps/deps/test_ready_to_reschedule_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_ready_to_reschedule_dep.py diff --git a/tests/ti_deps/deps/test_runnable_exec_date_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_runnable_exec_date_dep.py similarity index 100% rename from tests/ti_deps/deps/test_runnable_exec_date_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_runnable_exec_date_dep.py diff --git a/tests/ti_deps/deps/test_task_concurrency.py b/airflow-core/tests/unit/ti_deps/deps/test_task_concurrency.py similarity index 100% rename from tests/ti_deps/deps/test_task_concurrency.py rename to airflow-core/tests/unit/ti_deps/deps/test_task_concurrency.py diff --git a/tests/ti_deps/deps/test_task_not_running_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_task_not_running_dep.py similarity index 100% rename from tests/ti_deps/deps/test_task_not_running_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_task_not_running_dep.py diff --git a/tests/ti_deps/deps/test_trigger_rule_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_trigger_rule_dep.py similarity index 99% rename from tests/ti_deps/deps/test_trigger_rule_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_trigger_rule_dep.py index 46a5b22574f12..a70ce12d939fd 100644 --- a/tests/ti_deps/deps/test_trigger_rule_dep.py +++ b/airflow-core/tests/unit/ti_deps/deps/test_trigger_rule_dep.py @@ -1115,7 +1115,6 @@ def test_mapped_task_upstream_removed_with_all_failed_trigger_rules( """ Test ALL_FAILED trigger rule with mapped task upstream removed """ - dr, task, _ = get_mapped_task_dagrun(trigger_rule=TriggerRule.ALL_FAILED, state=FAILED) # ti with removed upstream ti diff --git a/tests/ti_deps/deps/test_valid_state_dep.py b/airflow-core/tests/unit/ti_deps/deps/test_valid_state_dep.py similarity index 100% rename from tests/ti_deps/deps/test_valid_state_dep.py rename to airflow-core/tests/unit/ti_deps/deps/test_valid_state_dep.py diff --git a/airflow-core/tests/unit/timetables/__init__.py b/airflow-core/tests/unit/timetables/__init__.py new file mode 100644 index 0000000000000..13a83393a9124 --- /dev/null +++ b/airflow-core/tests/unit/timetables/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/timetables/test_assets_timetable.py b/airflow-core/tests/unit/timetables/test_assets_timetable.py similarity index 100% rename from tests/timetables/test_assets_timetable.py rename to airflow-core/tests/unit/timetables/test_assets_timetable.py diff --git a/tests/timetables/test_continuous_timetable.py b/airflow-core/tests/unit/timetables/test_continuous_timetable.py similarity index 100% rename from tests/timetables/test_continuous_timetable.py rename to airflow-core/tests/unit/timetables/test_continuous_timetable.py diff --git a/tests/timetables/test_events_timetable.py b/airflow-core/tests/unit/timetables/test_events_timetable.py similarity index 100% rename from tests/timetables/test_events_timetable.py rename to airflow-core/tests/unit/timetables/test_events_timetable.py diff --git a/tests/timetables/test_interval_timetable.py b/airflow-core/tests/unit/timetables/test_interval_timetable.py similarity index 99% rename from tests/timetables/test_interval_timetable.py rename to airflow-core/tests/unit/timetables/test_interval_timetable.py index 4ca79f70452ab..d6e2d56df5433 100644 --- a/tests/timetables/test_interval_timetable.py +++ b/airflow-core/tests/unit/timetables/test_interval_timetable.py @@ -275,7 +275,8 @@ def test_cron_next_dagrun_info_alignment(last_data_interval: DataInterval, expec class TestCronIntervalDst: - """Test cron interval timetable can correctly enter a DST boundary. + """ + Test cron interval timetable can correctly enter a DST boundary. Zurich (Switzerland) is chosen since it is +1/+2 DST, making it a bit easier to get my head around the mental timezone conversion. @@ -451,7 +452,8 @@ def test_exiting_fold(self) -> None: class TestCronIntervalDstNonTrivial: - """These tests are similar to TestCronIntervalDst but with a different cron. + """ + These tests are similar to TestCronIntervalDst but with a different cron. The original test cases are from apache/airflow#7999. In 2020 at Los Angeles, DST started on 8th Mar; 10am UTC was turned from 2am UTC-8 to 3am UTC-7. diff --git a/tests/timetables/test_trigger_timetable.py b/airflow-core/tests/unit/timetables/test_trigger_timetable.py similarity index 100% rename from tests/timetables/test_trigger_timetable.py rename to airflow-core/tests/unit/timetables/test_trigger_timetable.py diff --git a/tests/timetables/test_workday_timetable.py b/airflow-core/tests/unit/timetables/test_workday_timetable.py similarity index 97% rename from tests/timetables/test_workday_timetable.py rename to airflow-core/tests/unit/timetables/test_workday_timetable.py index 9a171d32d792d..d8ccf5809dbe2 100644 --- a/tests/timetables/test_workday_timetable.py +++ b/airflow-core/tests/unit/timetables/test_workday_timetable.py @@ -62,8 +62,10 @@ def test_dag_run_info_interval(start: pendulum.DateTime, end: pendulum.DateTime) def test_first_schedule(timetable: Timetable, restriction: TimeRestriction): - """Since DAG starts on Saturday, and the first Monday is a holiday, - the first ever run covers the next Tuesday and schedules on Wednesday.""" + """ + Since DAG starts on Saturday, and the first Monday is a holiday, + the first ever run covers the next Tuesday and schedules on Wednesday. + """ next_info = timetable.next_dagrun_info(last_automated_data_interval=None, restriction=restriction) assert next_info == DagRunInfo.interval(WEEK_1_WEEKDAYS[1], WEEK_1_WEEKDAYS[2]) diff --git a/tests/ti_deps/deps/__init__.py b/airflow-core/tests/unit/utils/__init__.py similarity index 100% rename from tests/ti_deps/deps/__init__.py rename to airflow-core/tests/unit/utils/__init__.py diff --git a/tests/utils/__init__.py b/airflow-core/tests/unit/utils/log/__init__.py similarity index 100% rename from tests/utils/__init__.py rename to airflow-core/tests/unit/utils/log/__init__.py diff --git a/tests/utils/log/test_colored_log.py b/airflow-core/tests/unit/utils/log/test_colored_log.py similarity index 100% rename from tests/utils/log/test_colored_log.py rename to airflow-core/tests/unit/utils/log/test_colored_log.py diff --git a/tests/utils/log/test_file_processor_handler.py b/airflow-core/tests/unit/utils/log/test_file_processor_handler.py similarity index 100% rename from tests/utils/log/test_file_processor_handler.py rename to airflow-core/tests/unit/utils/log/test_file_processor_handler.py diff --git a/tests/utils/log/test_json_formatter.py b/airflow-core/tests/unit/utils/log/test_json_formatter.py similarity index 100% rename from tests/utils/log/test_json_formatter.py rename to airflow-core/tests/unit/utils/log/test_json_formatter.py diff --git a/tests/utils/log/test_log_reader.py b/airflow-core/tests/unit/utils/log/test_log_reader.py similarity index 99% rename from tests/utils/log/test_log_reader.py rename to airflow-core/tests/unit/utils/log/test_log_reader.py index 3f9e3c67e5552..150425eb5d159 100644 --- a/tests/utils/log/test_log_reader.py +++ b/airflow-core/tests/unit/utils/log/test_log_reader.py @@ -239,7 +239,8 @@ def test_supports_external_link(self): assert task_log_reader.supports_external_link def test_task_log_filename_unique(self, dag_maker): - """Ensure the default log_filename_template produces a unique filename. + """ + Ensure the default log_filename_template produces a unique filename. See discussion in apache/airflow#19058 [1]_ for how uniqueness may change in a future Airflow release. For now, the logical date is used diff --git a/tests/utils/test_cli_util.py b/airflow-core/tests/unit/utils/test_cli_util.py similarity index 100% rename from tests/utils/test_cli_util.py rename to airflow-core/tests/unit/utils/test_cli_util.py diff --git a/tests/utils/test_config.py b/airflow-core/tests/unit/utils/test_config.py similarity index 100% rename from tests/utils/test_config.py rename to airflow-core/tests/unit/utils/test_config.py diff --git a/tests/utils/test_dag_cycle.py b/airflow-core/tests/unit/utils/test_dag_cycle.py similarity index 99% rename from tests/utils/test_dag_cycle.py rename to airflow-core/tests/unit/utils/test_dag_cycle.py index 0b3176c6ed886..ff36fddd20a07 100644 --- a/tests/utils/test_dag_cycle.py +++ b/airflow-core/tests/unit/utils/test_dag_cycle.py @@ -25,7 +25,7 @@ from airflow.utils.edgemodifier import Label from airflow.utils.task_group import TaskGroup -from tests.models import DEFAULT_DATE +from unit.models import DEFAULT_DATE class TestCycleTester: diff --git a/tests/utils/test_db.py b/airflow-core/tests/unit/utils/test_db.py similarity index 99% rename from tests/utils/test_db.py rename to airflow-core/tests/unit/utils/test_db.py index 5389abc7832cd..5d2417b32c52f 100644 --- a/tests/utils/test_db.py +++ b/airflow-core/tests/unit/utils/test_db.py @@ -193,7 +193,7 @@ def test_downgrade_sql_with_from(self, mock_om): @mock.patch("alembic.command.downgrade") def test_downgrade_invalid_combo(self, mock_om): - """can't combine `sql=False` and `from_revision`""" + """Can't combine `sql=False` and `from_revision`""" with pytest.raises(ValueError, match="can't be combined"): downgrade(to_revision="abc", from_revision="123") diff --git a/tests/utils/test_db_cleanup.py b/airflow-core/tests/unit/utils/test_db_cleanup.py similarity index 99% rename from tests/utils/test_db_cleanup.py rename to airflow-core/tests/unit/utils/test_db_cleanup.py index 5bce3e95ebc59..de78e0f938a24 100644 --- a/tests/utils/test_db_cleanup.py +++ b/airflow-core/tests/unit/utils/test_db_cleanup.py @@ -89,7 +89,7 @@ def clear_airflow_tables(self): @patch("airflow.utils.db_cleanup._cleanup_table", new=MagicMock()) @patch("airflow.utils.db_cleanup._confirm_delete") def test_run_cleanup_confirm(self, confirm_delete_mock, kwargs, called): - """test that delete confirmation input is called when appropriate""" + """Test that delete confirmation input is called when appropriate""" run_cleanup( clean_before_timestamp=None, table_names=None, @@ -112,7 +112,7 @@ def test_run_cleanup_confirm(self, confirm_delete_mock, kwargs, called): ) @patch("airflow.utils.db_cleanup._cleanup_table") def test_run_cleanup_skip_archive(self, cleanup_table_mock, kwargs, should_skip): - """test that delete confirmation input is called when appropriate""" + """Test that delete confirmation input is called when appropriate""" run_cleanup( clean_before_timestamp=None, table_names=["log"], @@ -435,7 +435,7 @@ def test_no_failure_warnings(self, caplog): def test_confirm_drop_called_when_drop_archives_is_true_and_archive_exists( self, inspect_mock, confirm_drop_mock, _dump_table_to_file_mock, drop_archive ): - """test that drop confirmation input is called when appropriate""" + """Test that drop confirmation input is called when appropriate""" inspector = inspect_mock.return_value inspector.get_table_names.return_value = [f"{ARCHIVE_TABLE_PREFIX}dag_run__233"] export_archived_records( diff --git a/tests/utils/test_db_manager.py b/airflow-core/tests/unit/utils/test_db_manager.py similarity index 100% rename from tests/utils/test_db_manager.py rename to airflow-core/tests/unit/utils/test_db_manager.py diff --git a/tests/utils/test_decorators.py b/airflow-core/tests/unit/utils/test_decorators.py similarity index 100% rename from tests/utils/test_decorators.py rename to airflow-core/tests/unit/utils/test_decorators.py diff --git a/tests/utils/test_docs.py b/airflow-core/tests/unit/utils/test_docs.py similarity index 100% rename from tests/utils/test_docs.py rename to airflow-core/tests/unit/utils/test_docs.py diff --git a/tests/utils/test_dot_renderer.py b/airflow-core/tests/unit/utils/test_dot_renderer.py similarity index 100% rename from tests/utils/test_dot_renderer.py rename to airflow-core/tests/unit/utils/test_dot_renderer.py diff --git a/tests/utils/test_edgemodifier.py b/airflow-core/tests/unit/utils/test_edgemodifier.py similarity index 100% rename from tests/utils/test_edgemodifier.py rename to airflow-core/tests/unit/utils/test_edgemodifier.py diff --git a/tests/utils/test_email.py b/airflow-core/tests/unit/utils/test_email.py similarity index 98% rename from tests/utils/test_email.py rename to airflow-core/tests/unit/utils/test_email.py index dfcae90215c56..c45e83d6e7714 100644 --- a/tests/utils/test_email.py +++ b/airflow-core/tests/unit/utils/test_email.py @@ -89,7 +89,7 @@ def test_default_backend(self, mock_send_email): def test_custom_backend(self, mock_send_email): with conf_vars( { - ("email", "email_backend"): "tests.utils.test_email.send_email_test", + ("email", "email_backend"): "unit.utils.test_email.send_email_test", ("email", "email_conn_id"): "smtp_default", } ): @@ -113,7 +113,7 @@ def test_custom_backend(self, mock_send_email): @mock.patch("airflow.utils.email.send_email_smtp") @conf_vars( { - ("email", "email_backend"): "tests.utils.test_email.send_email_test", + ("email", "email_backend"): "unit.utils.test_email.send_email_test", ("email", "email_conn_id"): "smtp_default", ("email", "from_email"): "from@test.com", } diff --git a/tests/utils/test_entry_points.py b/airflow-core/tests/unit/utils/test_entry_points.py similarity index 100% rename from tests/utils/test_entry_points.py rename to airflow-core/tests/unit/utils/test_entry_points.py diff --git a/tests/utils/test_event_scheduler.py b/airflow-core/tests/unit/utils/test_event_scheduler.py similarity index 100% rename from tests/utils/test_event_scheduler.py rename to airflow-core/tests/unit/utils/test_event_scheduler.py diff --git a/tests/utils/test_file.py b/airflow-core/tests/unit/utils/test_file.py similarity index 98% rename from tests/utils/test_file.py rename to airflow-core/tests/unit/utils/test_file.py index 411ced27dda14..ab0ae5a3f62d3 100644 --- a/tests/utils/test_file.py +++ b/airflow-core/tests/unit/utils/test_file.py @@ -32,8 +32,8 @@ open_maybe_zipped, ) -from tests.models import TEST_DAGS_FOLDER from tests_common.test_utils.config import conf_vars +from unit.models import TEST_DAGS_FOLDER TEST_DAG_FOLDER = os.environ["AIRFLOW__CORE__DAGS_FOLDER"] @@ -180,7 +180,7 @@ def test_might_contain_dag_with_default_callable(self): assert file_utils.might_contain_dag(file_path=file_path_with_dag, safe_mode=True) - @conf_vars({("core", "might_contain_dag_callable"): "tests.utils.test_file.might_contain_dag"}) + @conf_vars({("core", "might_contain_dag_callable"): "unit.utils.test_file.might_contain_dag"}) def test_might_contain_dag(self): """Test might_contain_dag_callable""" file_path_with_dag = os.path.join(TEST_DAGS_FOLDER, "test_scheduler_dags.py") diff --git a/tests/utils/test_helpers.py b/airflow-core/tests/unit/utils/test_helpers.py similarity index 99% rename from tests/utils/test_helpers.py rename to airflow-core/tests/unit/utils/test_helpers.py index 0839dab841a56..e046dcf6001d7 100644 --- a/tests/utils/test_helpers.py +++ b/airflow-core/tests/unit/utils/test_helpers.py @@ -146,7 +146,6 @@ def test_merge_dicts_recursive_overlap_l2(self): """ Test merge_dicts with recursive dict; two levels of nesting """ - dict1 = {"a": 1, "r": {"a": 1, "b": {"a": 1}}} dict2 = {"a": 1, "r": {"c": 3, "b": {"b": 1}}} merged = merge_dicts(dict1, dict2) diff --git a/tests/utils/test_json.py b/airflow-core/tests/unit/utils/test_json.py similarity index 100% rename from tests/utils/test_json.py rename to airflow-core/tests/unit/utils/test_json.py diff --git a/tests/utils/test_log_handlers.py b/airflow-core/tests/unit/utils/test_log_handlers.py similarity index 99% rename from tests/utils/test_log_handlers.py rename to airflow-core/tests/unit/utils/test_log_handlers.py index 31c663f30e904..f94c83fe92bae 100644 --- a/tests/utils/test_log_handlers.py +++ b/airflow-core/tests/unit/utils/test_log_handlers.py @@ -420,7 +420,6 @@ def test__read_when_local(self, mock_read_local, create_task_instance): def test__read_from_local(self, tmp_path): """Tests the behavior of method _read_from_local""" - path1 = tmp_path / "hello1.log" path2 = tmp_path / "hello1.log.suffix.log" path1.write_text("file1 content") diff --git a/tests/utils/test_logging_mixin.py b/airflow-core/tests/unit/utils/test_logging_mixin.py similarity index 97% rename from tests/utils/test_logging_mixin.py rename to airflow-core/tests/unit/utils/test_logging_mixin.py index 7a71b49b1669d..14e3532074b41 100644 --- a/tests/utils/test_logging_mixin.py +++ b/airflow-core/tests/unit/utils/test_logging_mixin.py @@ -91,7 +91,7 @@ def test_default_logger_name(self): class DummyClass(LoggingMixin): pass - assert DummyClass().log.name == "tests.utils.test_logging_mixin.DummyClass" + assert DummyClass().log.name == "unit.utils.test_logging_mixin.DummyClass" def test_logger_name_is_root_when_logger_name_is_empty_string(self): """ @@ -116,7 +116,7 @@ class ClassWithParentLogConfig(LoggingMixin): assert ( ClassWithParentLogConfig().log.name - == "airflow.tasks.tests.utils.test_logging_mixin.ClassWithParentLogConfig" + == "airflow.tasks.unit.utils.test_logging_mixin.ClassWithParentLogConfig" ) def teardown_method(self): diff --git a/tests/utils/test_module_loading.py b/airflow-core/tests/unit/utils/test_module_loading.py similarity index 100% rename from tests/utils/test_module_loading.py rename to airflow-core/tests/unit/utils/test_module_loading.py diff --git a/tests/utils/test_net.py b/airflow-core/tests/unit/utils/test_net.py similarity index 85% rename from tests/utils/test_net.py rename to airflow-core/tests/unit/utils/test_net.py index 4fbe774f86948..389453bc66e7c 100644 --- a/tests/utils/test_net.py +++ b/airflow-core/tests/unit/utils/test_net.py @@ -38,22 +38,22 @@ class TestGetHostname: def test_get_hostname_unset(self, mock_getfqdn): assert net.get_hostname() == "first" - @conf_vars({("core", "hostname_callable"): "tests.utils.test_net.get_hostname"}) + @conf_vars({("core", "hostname_callable"): "unit.utils.test_net.get_hostname"}) def test_get_hostname_set(self): assert net.get_hostname() == "awesomehostname" - @conf_vars({("core", "hostname_callable"): "tests.utils.test_net"}) + @conf_vars({("core", "hostname_callable"): "unit.utils.test_net"}) def test_get_hostname_set_incorrect(self): with pytest.raises(TypeError): net.get_hostname() - @conf_vars({("core", "hostname_callable"): "tests.utils.test_net.missing_func"}) + @conf_vars({("core", "hostname_callable"): "unit.utils.test_net.missing_func"}) def test_get_hostname_set_missing(self): with pytest.raises( AirflowConfigException, match=re.escape( 'The object could not be loaded. Please check "hostname_callable" key in "core" section. ' - 'Current value: "tests.utils.test_net.missing_func"' + 'Current value: "unit.utils.test_net.missing_func"' ), ): net.get_hostname() diff --git a/tests/utils/test_operator_helpers.py b/airflow-core/tests/unit/utils/test_operator_helpers.py similarity index 100% rename from tests/utils/test_operator_helpers.py rename to airflow-core/tests/unit/utils/test_operator_helpers.py diff --git a/tests/utils/test_operator_resources.py b/airflow-core/tests/unit/utils/test_operator_resources.py similarity index 100% rename from tests/utils/test_operator_resources.py rename to airflow-core/tests/unit/utils/test_operator_resources.py diff --git a/tests/utils/test_orm_event_handlers.py b/airflow-core/tests/unit/utils/test_orm_event_handlers.py similarity index 92% rename from tests/utils/test_orm_event_handlers.py rename to airflow-core/tests/unit/utils/test_orm_event_handlers.py index 7464c335aceb3..57a179cb01994 100644 --- a/tests/utils/test_orm_event_handlers.py +++ b/airflow-core/tests/unit/utils/test_orm_event_handlers.py @@ -15,7 +15,8 @@ # specific language governing permissions and limitations # under the License. -"""These tests ensure compatibility with the deprecation of `sqlalchemy.orm.mapper()` in SQLAlchemy 2.0.0.b1. +""" +These tests ensure compatibility with the deprecation of `sqlalchemy.orm.mapper()` in SQLAlchemy 2.0.0.b1. See also: https://docs.sqlalchemy.org/en/21/orm/mapping_styles.html#orm-imperative-mapping """ diff --git a/tests/utils/test_preexisting_python_virtualenv_decorator.py b/airflow-core/tests/unit/utils/test_preexisting_python_virtualenv_decorator.py similarity index 100% rename from tests/utils/test_preexisting_python_virtualenv_decorator.py rename to airflow-core/tests/unit/utils/test_preexisting_python_virtualenv_decorator.py diff --git a/tests/utils/test_process_utils.py b/airflow-core/tests/unit/utils/test_process_utils.py similarity index 100% rename from tests/utils/test_process_utils.py rename to airflow-core/tests/unit/utils/test_process_utils.py diff --git a/tests/utils/test_retries.py b/airflow-core/tests/unit/utils/test_retries.py similarity index 99% rename from tests/utils/test_retries.py rename to airflow-core/tests/unit/utils/test_retries.py index d0d422e8baf34..4c923560e0031 100644 --- a/tests/utils/test_retries.py +++ b/airflow-core/tests/unit/utils/test_retries.py @@ -80,7 +80,6 @@ def test_function(session): def test_retry_db_transaction_fails_when_used_in_function_without_retry(self): """Test that an error is raised when the decorator is used on a function without session arg""" - with pytest.raises(ValueError, match=r"has no `session` argument"): @retry_db_transaction diff --git a/tests/utils/test_scheduler_health.py b/airflow-core/tests/unit/utils/test_scheduler_health.py similarity index 100% rename from tests/utils/test_scheduler_health.py rename to airflow-core/tests/unit/utils/test_scheduler_health.py diff --git a/tests/utils/test_serve_logs.py b/airflow-core/tests/unit/utils/test_serve_logs.py similarity index 100% rename from tests/utils/test_serve_logs.py rename to airflow-core/tests/unit/utils/test_serve_logs.py diff --git a/tests/utils/test_session.py b/airflow-core/tests/unit/utils/test_session.py similarity index 100% rename from tests/utils/test_session.py rename to airflow-core/tests/unit/utils/test_session.py diff --git a/tests/utils/test_singleton.py b/airflow-core/tests/unit/utils/test_singleton.py similarity index 100% rename from tests/utils/test_singleton.py rename to airflow-core/tests/unit/utils/test_singleton.py diff --git a/tests/utils/test_sqlalchemy.py b/airflow-core/tests/unit/utils/test_sqlalchemy.py similarity index 99% rename from tests/utils/test_sqlalchemy.py rename to airflow-core/tests/unit/utils/test_sqlalchemy.py index c7400b1748536..8ddb21e0a1971 100644 --- a/tests/utils/test_sqlalchemy.py +++ b/airflow-core/tests/unit/utils/test_sqlalchemy.py @@ -170,7 +170,6 @@ def test_prohibit_commit_specific_session_only(self): Test that "prohibit_commit" applies only to the given session object, not any other session objects that may be used """ - # We _want_ another session. By default this would be the _same_ # session we already had other_session = Session.session_factory() diff --git a/tests/utils/test_state.py b/airflow-core/tests/unit/utils/test_state.py similarity index 98% rename from tests/utils/test_state.py rename to airflow-core/tests/unit/utils/test_state.py index 035740db46fec..d418fef0745f7 100644 --- a/tests/utils/test_state.py +++ b/airflow-core/tests/unit/utils/test_state.py @@ -26,7 +26,7 @@ from airflow.utils.state import DagRunState from airflow.utils.types import DagRunTriggeredByType, DagRunType -from tests.models import DEFAULT_DATE +from unit.models import DEFAULT_DATE pytestmark = pytest.mark.db_test diff --git a/tests/utils/test_task_group.py b/airflow-core/tests/unit/utils/test_task_group.py similarity index 99% rename from tests/utils/test_task_group.py rename to airflow-core/tests/unit/utils/test_task_group.py index 082d886fbc08c..ac1c1ee4cc5a9 100644 --- a/tests/utils/test_task_group.py +++ b/airflow-core/tests/unit/utils/test_task_group.py @@ -37,8 +37,8 @@ from airflow.utils.dag_edges import dag_edges from airflow.utils.task_group import TaskGroup, task_group_to_dict, task_group_to_dict_legacy -from tests.models import DEFAULT_DATE from tests_common.test_utils.compat import BashOperator, PythonOperator +from unit.models import DEFAULT_DATE def make_task(name, type_="classic"): @@ -759,7 +759,6 @@ def test_build_task_group_deco_context_manager(): 2. TaskGroup consisting Tasks created using task decorator. 3. Node Ids of dags created with taskgroup decorator. """ - from airflow.decorators import task # Creating Tasks @@ -859,7 +858,6 @@ def section_2(value2): def test_build_task_group_depended_by_task(): """A decorator-based task group should be able to be used as a relative to operators.""" - from airflow.decorators import dag as dag_decorator, task @dag_decorator(schedule=None, start_date=pendulum.now()) @@ -895,7 +893,6 @@ def section_1(): def test_build_task_group_with_operators(): """Tests DAG with Tasks created with *Operators and TaskGroup created with taskgroup decorator""" - from airflow.decorators import task def task_start(): @@ -955,7 +952,6 @@ def section_a(value): def test_task_group_context_mix(): """Test cases to check nested TaskGroup context manager with taskgroup decorator""" - from airflow.decorators import task def task_start(): @@ -1041,7 +1037,6 @@ def section_2(value): def test_default_args(): """Testing TaskGroup with default_args""" - logical_date = pendulum.parse("20201109") with DAG( dag_id="example_task_group_default_args", @@ -1061,7 +1056,6 @@ def test_default_args(): def test_duplicate_task_group_id(): """Testing automatic suffix assignment for duplicate group_id""" - from airflow.decorators import task @task(task_id="start_task") @@ -1748,7 +1742,6 @@ def test_task_group_with_invalid_arg_type_raises_error(): def test_task_group_display_name_used_as_label(): """Test that the group_display_name for TaskGroup is used as the label for display on the UI.""" - with DAG(dag_id="display_name", schedule=None, start_date=pendulum.datetime(2022, 1, 1)) as dag: with TaskGroup(group_id="tg", group_display_name="my_custom_name") as tg: task1 = BaseOperator(task_id="task1") diff --git a/tests/utils/test_task_handler_with_custom_formatter.py b/airflow-core/tests/unit/utils/test_task_handler_with_custom_formatter.py similarity index 100% rename from tests/utils/test_task_handler_with_custom_formatter.py rename to airflow-core/tests/unit/utils/test_task_handler_with_custom_formatter.py diff --git a/tests/utils/test_timezone.py b/airflow-core/tests/unit/utils/test_timezone.py similarity index 100% rename from tests/utils/test_timezone.py rename to airflow-core/tests/unit/utils/test_timezone.py diff --git a/tests/utils/test_trigger_rule.py b/airflow-core/tests/unit/utils/test_trigger_rule.py similarity index 100% rename from tests/utils/test_trigger_rule.py rename to airflow-core/tests/unit/utils/test_trigger_rule.py diff --git a/tests/utils/test_types.py b/airflow-core/tests/unit/utils/test_types.py similarity index 100% rename from tests/utils/test_types.py rename to airflow-core/tests/unit/utils/test_types.py diff --git a/tests/utils/test_warnings.py b/airflow-core/tests/unit/utils/test_warnings.py similarity index 100% rename from tests/utils/test_warnings.py rename to airflow-core/tests/unit/utils/test_warnings.py diff --git a/tests/utils/test_weight_rule.py b/airflow-core/tests/unit/utils/test_weight_rule.py similarity index 100% rename from tests/utils/test_weight_rule.py rename to airflow-core/tests/unit/utils/test_weight_rule.py diff --git a/clients/README.md b/clients/README.md index dba7bbe7009be..38735167ccfc5 100644 --- a/clients/README.md +++ b/clients/README.md @@ -30,7 +30,7 @@ Supported languages: To generate the client code using dockerized breeze environment, run (at the Airflow source root directory): ```bash -breeze release-management prepare-python-client --package-format both +breeze release-management prepare-python-client --distribution-format both ``` The client source code generation uses OpenAPI generator image, generation of packages is done using Hatch. @@ -38,7 +38,7 @@ By default, packages are generated in a dockerized Hatch environment, but you ca setting `--use-local-hatch` flag. ```bash -breeze release-management prepare-python-client --package-format both --use-local-hatch +breeze release-management prepare-python-client --distribution-format both --use-local-hatch ``` ## Browsing the generated source code diff --git a/contributing-docs/07_local_virtualenv.rst b/contributing-docs/07_local_virtualenv.rst index 18485dd57ab57..4c5eb89df46b7 100644 --- a/contributing-docs/07_local_virtualenv.rst +++ b/contributing-docs/07_local_virtualenv.rst @@ -136,6 +136,44 @@ However ``uv`` creation/re-creation of venvs is so fast that you can easily crea So usually you do not need to have more than one venv and recreate it as needed - for example when you need to change the python version. +Runtime vs. development dependencies +.................................... + +Airflow and providers when installed from .whl distribution package have "runtime" dependencies +(both required and optional dependencies). Those dependencies will be installed when you install +airflow from ``PyPI`` - required dependencies when you install bare package, +and "optional" dependencies when you provide extra. + +For example: + +.. code-block::bash + + pip install apache-airflow # <- installs airflow with all required dependencies + pip install apache-airflow[s3fs] # <- install airflow with extra "s3fs" dependencies needed for object storage in S3 + pip install apache-airflow[amazon] # <- install airflow with extra "amazon" which installs apache-airflow-providers-amazon provider (and its required dependencies) + + +However, in order to run tests, some additional dependencies are needed - for example Amazon provider requires ``moto`` to mock boto calls. +To make it easier Airflow packaging setup will automatically install development dependencies when you install +airflow project dependencies, depending on the scope of your installation. This works a bit differently with +``pip`` and ``uv`` for now, because ``uv`` (with dependency groups) already installs ``dev`` dependencies for +the current package it is installing automatically, while ``pip`` does not have - yet - support for ``dev`` +dependencies and we need to emulate it with injecting development dependencies into ``extras`` in editable +mode - and we can do it only in the top-level metadata project of airflow, not in ``airflow-core`` that has +fixed set of dependencies. For example you need to run ``pip install .[all-core]`` to +install all development dependencies of airflow-core dynamically when installed with ``pip``. + +.. code-block::bash + + pip install -e . # <- installs airflow with all required dependencies and it's development dependencies + pip install -e ".[all-core]" # <- install airflow with all core development dependencies - including those needed to run extra tests + pip install -e ".[amazon]" # <- install airflow with extra "amazon" which installs amazon provider dependencies (including development ones) + +This situation might change in April 2025 when ``pip`` will bring dependency-group support (already merged) in +which case we will be able to get rid of some dynamic extras we have now + +The below scenarios of syncing the project with ``uv`` or using ``pip`` depending what you want to work on. + Syncing project (including providers) with uv ............................................. @@ -148,17 +186,18 @@ airflow, all providers dependencies. uv sync -This will synchronize core dependencies and provider extras that you need for development and testing of -Airflow and provider dependencies - including their dependencies. But it will not -install dependencies for development of some providers (like amazon) that need -additional dependencies to be installed. For example this is how you install additional dependencies for -amazon provider: +This will synchronize core dependencies of airflow including all optional core dependencies as well as +installs sources for all preinstalled providers and their dependencies. + +For example this is how you install dependencies for amazon provider, amazon provider sources, +all provider sources that amazon provider depends on and all development dependencies of the provider: .. code:: bash - uv sync --extra amazon + uv sync --package apache-airflow-providers-amazon -You can also synchronize all extras including development dependencies of all providers by running: +You can also synchronize all extras including development dependencies of all providers, task-sdk and other +packages by running: .. code:: bash @@ -167,6 +206,27 @@ You can also synchronize all extras including development dependencies of all pr This will synchronize all development extras of airflow and all packages (this might require some additional system dependencies to be installed - depending on your OS requirements). +Working on airflow-core only +............................ + +When you only want to work on airflow-core, you can run ``uv sync`` in the ``airflow-core`` folder. This +will install all dependencies needed to run tests for airflow-core. + +.. code:: bash + + cd airflow-core + uv sync + + +TODO(potiuk): This will not work yet - until we move some remaining provider tests from airflow-core. For +now you need to add ``--all-package`` to install all providers and their dependencies. + +.. code:: bash + + cd airflow-core + uv sync --all-packages + + Working on individual provider dependencies ........................................... @@ -212,11 +272,14 @@ package. .. code:: bash - pip install -e "." + pip install -e ".[all-core]" + pip install -e "./airflow-core" pip install -e "./devel-common" -This will install airflow in ``editable`` mode and ``devel-common`` dependencies needed to run airflow -tests. +This will install: +* the "metadata" project with all core extra development dependencies for airflow tests including extras +* ``airflow-core`` project in ``editable`` mode +* the ``devel-common`` dependencies needed to run airflow tests. You need to run this command in the virtualenv you want to install Airflow in and you need to have the virtualenv activated to run any command. @@ -227,6 +290,7 @@ dependencies. For example, to install Amazon provider you need to install ``amaz .. code:: bash + pip install -e "./airflow-core" pip install -e "./task-sdk" pip install -e "./devel-common" pip install -e "./providers/amazon" @@ -235,10 +299,11 @@ dependencies. For example, to install Amazon provider you need to install ``amaz This will install: +* airflow in ``editable`` mode with development dependencies * task sdk library for providers * common test dependencies -* airflow in ``editable`` mode with development dependencies of amazon * amazon provider in ``editable`` mode +* development dependencies of the amazon provider Note that installing extras will not be needed (similarly as in case of ``uv``) when dependency groups (see https://peps.python.org/pep-0735/) will be implemented in ``pip`` - around April 2025. @@ -276,19 +341,19 @@ providers, you also need to install them in the virtualenv you work on (after in the extras in airflow, that correspond to the provider you want to develop). This is something you need to do manually if not using ``uv sync`` to synchronize the whole Airflow workspace. - If you use ``pip`` it is quite a bit more: You can run the following command in the venv that you have installed airflow in (also in editable mode): .. code:: bash - pip install -e ".[google]" + pip install -e "./airflow-core" pip install -e "./task-sdk" pip install -e "./devel-common" pip install -e "./providers/google" + pip install -e ".[google]" -The first command installs airflow, it's development dependencies, test dependencies and +The first command installs airflow core, it's development dependencies, test dependencies and both runtime and development dependencies of the google provider (Note that in the future, when dependency groups will be implemented in ``pip`` - April 2025) - it will not be needed to use ``google`` extra when installing airflow - currently with ``pip`` it is the only way to install development dependencies diff --git a/contributing-docs/08_static_code_checks.rst b/contributing-docs/08_static_code_checks.rst index 10309d41fefa0..aa92f76ac8810 100644 --- a/contributing-docs/08_static_code_checks.rst +++ b/contributing-docs/08_static_code_checks.rst @@ -379,7 +379,7 @@ require Breeze Docker image to be built locally. +-----------------------------------------------------------+--------------------------------------------------------+---------+ | update-providers-build-files | Update providers build files | | +-----------------------------------------------------------+--------------------------------------------------------+---------+ -| update-providers-dependencies | Update dependencies for provider packages | | +| update-providers-dependencies | Update dependencies for providers | | +-----------------------------------------------------------+--------------------------------------------------------+---------+ | update-reproducible-source-date-epoch | Update Source Date Epoch for reproducible builds | | +-----------------------------------------------------------+--------------------------------------------------------+---------+ diff --git a/contributing-docs/09_testing.rst b/contributing-docs/09_testing.rst index 18a43e9d6b21c..6538b9e185d92 100644 --- a/contributing-docs/09_testing.rst +++ b/contributing-docs/09_testing.rst @@ -46,8 +46,8 @@ includes: You can also run other kinds of tests when you are developing airflow packages: -* `Testing packages `__ is a document that describes how to - manually build and test pre-release candidate packages of airflow and providers. +* `Testing distributions `__ is a document that describes how to + manually build and test pre-release candidate distributions of airflow and providers. * `Python client tests `__ are tests we run to check if the Python API client works correctly. diff --git a/contributing-docs/10_working_with_git.rst b/contributing-docs/10_working_with_git.rst index 6ac8ba3436100..9239b164ccfdd 100644 --- a/contributing-docs/10_working_with_git.rst +++ b/contributing-docs/10_working_with_git.rst @@ -220,4 +220,4 @@ Useful when you understand the flow but don't remember the steps and want a quic ------- Now, once you know it all you can read more about how Airflow repository is a monorepo containing both airflow package and -more than 80 `provider packages <11_provider_packages.rst>`__ and how to develop providers. +more than 80 `providers <11_provider_distributions.rst>`__ and how to develop providers. diff --git a/contributing-docs/11_provider_packages.rst b/contributing-docs/11_provider_distributions.rst similarity index 71% rename from contributing-docs/11_provider_packages.rst rename to contributing-docs/11_provider_distributions.rst index e20f6e3b6d7d7..7c9bb1cdf8dae 100644 --- a/contributing-docs/11_provider_packages.rst +++ b/contributing-docs/11_provider_distributions.rst @@ -15,13 +15,15 @@ specific language governing permissions and limitations under the License. -Provider packages -================= +Provider distributions +====================== -Airflow is split into core and providers. They are delivered as separate packages: +Airflow is split into core and providers. They are delivered as separate distributions: -* ``apache-airflow`` - core of Apache Airflow (there are few more sub-packages separated) -* ``apache-airflow-providers-*`` - More than 90 provider packages to communicate with external services +* ``apache-airflow`` - meta distributions of Apache Airflow installing airflow, task_sdk, providers and airflow-core together +* ``apache-airflow-core`` - core of Apache Airflow (there are few more s separated) +* ``apache-airflow-task-sdk`` - task-sdk distribution that are imported by the providers +* ``apache-airflow-providers-*`` - More than 90 providers to communicate with external services **The outline for this document in GitHub is available at top-right corner button (with 3-dots and 3 lines).** @@ -29,7 +31,7 @@ Where providers are kept in our repository ------------------------------------------ Airflow Providers are stored in a separate tree other than the Airflow Core (under ``providers`` directory). -Airflow's repository is a monorepo, that keeps multiple packages in a single repository. This has a number +Airflow's repository is a monorepo, that keeps multiple distributions in a single repository. This has a number of advantages, because code and CI infrastructure and tests can be shared. Also contributions are happening to a single repository - so no matter if you contribute to Airflow or Providers, you are contributing to the same repository and project. @@ -40,11 +42,12 @@ for the amazon provider: .. code:: bash - uv sync --extra amazon + uv sync --package apache-airflow-providers-amazon This will synchronize all extras that you need for development and testing of Airflow and the Amazon provider -dependencies including runtime dependencies. See `local virtualenv <../07_local_virtualenv.rst>`_ or the uv project -for more information. +dependencies including runtime dependencies and all providers it depends on and its dependencies. + +See `local virtualenv <../07_local_virtualenv.rst>`_ or the uv project for more information. Each provider is a separate python project, with its own ``pyproject.toml`` file and similar structure: @@ -68,7 +71,7 @@ Each provider is a separate python project, with its own ``pyproject.toml`` file | PROVIDER \ # here system test code is present -PROVIDER is the name of the provider package. It might be single directory (google, amazon, smtp) or in some +PROVIDER is the name of the provider distribution. It might be single directory (google, amazon, smtp) or in some cases we have a nested structure one level down (``apache/cassandra``, ``apache/druid``, ``microsoft/winrm``, ``common.io`` for example). @@ -80,9 +83,9 @@ we have ``provider.yaml`` file in the provider's module of the ``providers``. This file contains: -* user-facing name of the provider package -* description of the package that is available in the documentation -* list of versions of package that have been released so far +* user-facing name of the provider distribution +* description of the distribution that is available in the documentation +* list of versions of distribution that have been released so far * list of integrations, operators, hooks, sensors, transfers provided by the provider (useful for documentation generation) * list of connection types, extra-links, secret backends, auth backends, and logging handlers (useful to both register them as they are needed by Airflow and to include them in documentation automatically). @@ -115,13 +118,14 @@ image for the new dependencies to be used in the Breeze CI environment. Provider's cross-dependencies ----------------------------- -Some of the packages have cross-dependencies with other providers packages. This typically happens for -transfer operators where operators use hooks from the other providers in case they are transferring -data between the providers. The list of dependencies is maintained (automatically with the -``update-providers-dependencies`` pre-commit) in the ``generated/provider_dependencies.json``. +Some of the providers have cross-dependencies with other providers distributions. +This typically happens for transfer operators where operators use hooks from the other providers +in case they are transferring data between the providers. The list of dependencies is maintained +(automatically with the ``update-providers-dependencies`` pre-commit) in the +``generated/provider_dependencies.json``. -Cross-dependencies between provider packages are converted into optional dependencies (extras) - if -you need functionality from the other provider package you can install it adding [extra] after the +Cross-dependencies between providers are converted into optional dependencies (extras) - if +you need functionality from the other provider distribution you can install it adding [extra] after the ``apache-airflow-providers-PROVIDER`` for example: ``pip install apache-airflow-providers-google[amazon]`` in case you want to use GCP transfer operators from Amazon ECS. @@ -140,30 +144,30 @@ Sometimes, when a provider depends on another provider, and you want to add a ne two providers, you might need to add a new feature to the "dependent" provider, you need to add a new feature to the "dependency" provider as well. This is a chicken-egg problem and by default some CI jobs (like generating PyPI constraints) will fail because they cannot use the source version of -the provider package. This is handled by adding the "dependent" provider to the chicken-egg list of +the provider distribution. This is handled by adding the "dependent" provider to the chicken-egg list of "providers" in ``dev/breeze/src/airflow_breeze/global_constants.py``. By doing this, the provider is build locally from sources rather than downloaded from PyPI when generating constraints. More information about the chicken-egg providers and how release is handled can be found in -the `Release Provider Packages documentation <../dev/README_RELEASE_PROVIDER_PACKAGES.md#chicken-egg-providers>`_ +the `Release providers documentation <../dev/README_RELEASE_PROVIDERS.md#chicken-egg-providers>`_ -Developing community managed provider packages ----------------------------------------------- +Developing community managed providers +-------------------------------------- While you can develop your own providers, Apache Airflow has 60+ providers that are managed by the community. They are part of the same repository as Apache Airflow (we use monorepo approach where different parts of the system are developed in the same repository but then they are packaged and released separately). -All the community-managed providers are in ``providers`` folder and their code is placed as sub-packages of -``airflow.providers`` package. +All the community-managed providers are in ``providers`` folder and their code is placed as sub-directories of +``providers`` directory. -In order to allow the same packages to be present in different parts of the source tree, we are heavily -utilising `namespace packages `_. +In order to allow the same Python airflow sub-packages to be present in different distributions of the source tree, +we are heavily utilising `namespace packages `_. For now we have a bit of mixture of native (no ``__init__.py`` namespace packages) and pkgutil-style namespace packages (with ``__init__.py`` and path extension) but we are moving towards using only native namespace packages. All the providers are available as ``apache-airflow-providers-`` -packages when installed by users, but when you contribute to providers you can work on airflow main +distributions when installed by users, but when you contribute to providers you can work on airflow main and install provider dependencies via ``editable`` extras (using uv workspace) - without having to manage and install providers separately, you can easily run tests for the providers and when you run airflow from the ``main`` sources, all community providers are @@ -182,97 +186,56 @@ The ``provider.yaml`` file is compliant with the schema that is available in `json-schema specification `_. Thanks to that mechanism, you can develop community managed providers in a seamless way directly from -Airflow sources, without preparing and releasing them as packages separately, which would be rather +Airflow sources, without preparing and releasing them as distributions separately, which would be rather complicated. Regardless if you plan to contribute your provider, when you are developing your own, custom providers, you can use the above functionality to make your development easier. You can add your provider -as a sub-folder of the ``airflow.providers`` package, add the ``provider.yaml`` file and install airflow +as a sub-folder of the ``airflow.providers`` Python package, add the ``provider.yaml`` file and install airflow in development mode - then capabilities of your provider will be discovered by airflow and you will see the provider among other providers in ``airflow providers`` command output. Local Release of a Specific Provider -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When you develop a provider, you can release it locally and test it in your Airflow environment. This should -be accomplished using breeze. Choose a suffix for the release such as "patch.asb.1" and run the breeze build for -that provider. Remember Provider IDs use a dot ('.') for directory separators so the Provider ID for the -Microsoft Azure provider is 'microsoft.azure'. The provider IDs to build can be provided in the PACKAGE_LIST -environment variable or passed on the command line. - -.. code-block:: bash - - export PACKAGE_LIST=microsoft.azure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Then build the provider (you don't need to pass the package ID if you set the environment variable above): +When you develop a provider, you can release it locally and test it in your Airflow environment. Each provider +distribution is a standard Python distribution with its own ``pyproject.toml`` file and it should be as easy +as getting into the provider's distribution top directory and running the following command (you can +use any PEP-517 compliant build tool, but we recommend using ``flit`` for providers as it has very small +number of dependencies and is very fast. You can install flit for example with ``uv tool install flit``): .. code-block:: bash - breeze release-management prepare-provider-packages \ - --package-format both \ - --version-suffix-for-local=patch.asb.1 \ - microsoft.azure - - -Finally, copy the wheel file from the dist directory to the a directory your airflow deployment can use. -If this is ~/airflow/test-airflow/local_providers, you can use the following command: - -``cp dist/apache_airflow_providers_microsoft_azure-10.5.2+patch.asb.1-none-any.whl ~/airflow/test-airflow/local_providers/`` - -If you want to build a local version of a version already released to PyPI, such as rc1, then you can combine -the PyPI suffix flag --version-suffix-for-pypi with the local suffix flag --version-suffix-for-local. For example: - -.. code-block:: bash - - breeze release-management prepare-provider-packages \ - --package-format both \ - --version-suffix-for-pypi rc1 \ - --version-suffix-for-local=patch.asb.1 \ - microsoft.azure - - -The above would result in a wheel file - - apache_airflow_providers_microsoft_azure-10.5.2rc1+patch.asb.1-py3-none-any.whl - -Builds using a local suffix will not check to see if a release has already been made. This is useful for testing. - -Local versions can also be built using the version-suffix-for-pypi flag although using the version-suffix-for-local -flag is preferred. To build with the version-suffix-for-pypi flag, use the following command: - -.. code-block:: bash - - breeze release-management prepare-provider-packages \ - --package-format both --version-suffix-for-pypi=dev1 \ - --skip-tag-check microsoft.azure - + flit build -Naming Conventions for provider packages ----------------------------------------- +Naming Conventions for providers +-------------------------------- -In Airflow we standardized and enforced naming for provider packages, modules and classes. +In Airflow we standardized and enforced naming for providers, modules and classes. those rules (introduced as AIP-21) were not only introduced but enforced using automated checks that verify if the naming conventions are followed. Here is a brief summary of the rules, for detailed discussion you can go to `AIP-21 Changes in import paths `_ The rules are as follows: -* Provider packages are all placed in 'airflow.providers' +* Provider distributions are all placed in ``providers`` folder and each provider provides +``airflow.providers.`` Python namespace package. -* Providers are usually direct sub-packages of the 'airflow.providers' package but in some cases they can be - further split into sub-packages (for example 'apache' package has 'cassandra', 'druid' ... providers ) out - of which several different provider packages are produced (apache.cassandra, apache.druid). This is +* Providers are usually direct sub-folders of the 'providers' directory but in some cases they can be + further split into sub-folders (for example 'apache' folder has 'cassandra', 'druid' ... provider folders ) out + of which several different providers are produced (apache.cassandra, apache.druid). This is case when the providers are connected under common umbrella but very loosely coupled on the code level. - Please note the separator of the provider-package ID is a period, not a dash like the package names in PyPI(microsoft.azure vs apache-airflow-providers-microsoft-azure). + Please note the separator of the provider distribution ID is a period, not a dash like the distribution + names in PyPI ( ``microsoft.azure`` vs ``apache-airflow-providers-microsoft-azure``). -* In some cases the package can have sub-packages but they are all delivered as single provider - package (for example 'google' package contains 'ads', 'cloud' etc. sub-packages). This is in case +* In some cases the providers can have Python sub-packages but they are all delivered as single provider + distributions (for example 'google' package contains 'ads', 'cloud' etc. sub-packages). This is in case the providers are connected under common umbrella and they are also tightly coupled on the code level. -* Typical structure of provider package: +* Typical structure of provider sources: * src - * airflow.providers.PROVIDER + * airflow.providers.PROVIDER_ID * hooks -> hooks are stored here * operators -> operators are stored here * sensors -> sensors are stored here @@ -289,8 +252,8 @@ The rules are as follows: * example_dags -> example DAGs are stored here (used for documentation and System Tests) * Module names do not contain word "hooks", "operators" etc. The right type comes from - the package. For example 'hooks.datastore' module contains DataStore hook and 'operators.datastore' - contains DataStore operators. + the python package. For example 'hooks.datastore' module contains DataStore hook and + 'operators.datastore' contains DataStore operators. * Class names contain 'Operator', 'Hook', 'Sensor' - for example DataStoreHook, DataStoreExportOperator @@ -302,7 +265,7 @@ The rules are as follows: for those ``ToOperator``. They are not named *TransferOperator nor *Transfer. * Operators that use external service to perform transfer (for example CloudDataTransferService operators - are not placed in "transfers" package and do not have to follow the naming convention for + are not placed in "transfers" Python package and do not have to follow the naming convention for transfer operators. * It is often debatable where to put transfer operators but we agreed to the following criteria: @@ -315,11 +278,11 @@ The rules are as follows: * Secret Backend name follows the convention: ``Backend``. -* Init Tests are grouped in parallel packages under "tests.providers" top level package. Module name is usually - ``test_.py``, +* Init Tests are grouped in parallel Python packages under "tests.providers" top level package. + Module name is usually ``test_.py``, -* System tests (not yet fully automated but allowing to run e2e testing of particular provider) are - named with ``example_*`` prefix. +* System tests (not yet fully automatically run in CI but allowing to run e2e testing of particular provider) + are named with ``example_*`` prefix. Documentation for the community managed providers ------------------------------------------------- @@ -335,7 +298,7 @@ also take a look at the other ``provider.yaml`` files as examples. Well documented provider contains those: -* index.rst with references to packages, API used and example dags +* index.rst with references to providers, Python package API used and example dags * configuration reference * class documentation generated from PyDoc in the code * example dags @@ -379,13 +342,13 @@ and we have to make sure that we communicate those changes properly. Generally speaking breaking change in provider is not a huge problem for our users. They can individually downgrade the providers to lower version if they are not ready to upgrade to the new version and then incrementally upgrade to the new versions of providers. This is because providers are installed as -separate packages and they are not tightly coupled with the core of Airflow and because we have a very +separate providers and they are not tightly coupled with the core of Airflow and because we have a very generous policy of supporting multiple versions of providers at the same time. All providers are in theory backward compatible with future versions of Airflow, so you can upgrade Airflow and keep the providers at the same version. When you introduce a breaking change in the provider, you have to make sure that you communicate it -properly. You have to update ``changelog.rst`` file in the ``docs`` folder of the provider package. +properly. You have to update ``changelog.rst`` file in the ``docs`` folder of the provider distribution. Ideally you should provide a migration path for the users to follow in the``changelog.rst``. If in doubt, you can always look at ``changelog.rst`` in other providers to see how we communicate diff --git a/contributing-docs/12_airflow_dependencies_and_extras.rst b/contributing-docs/12_airflow_dependencies_and_extras.rst index f7dcec51bfb9c..ee373bb726eef 100644 --- a/contributing-docs/12_airflow_dependencies_and_extras.rst +++ b/contributing-docs/12_airflow_dependencies_and_extras.rst @@ -172,7 +172,7 @@ auth, graphviz, kerberos, ldap, leveldb, otel, pandas, password, rabbitmq, s3fs, Provider extras ............... -Those extras are available as regular Airflow extras, they install provider packages in standard builds +Those extras are available as regular Airflow extras, they install providers in standard builds or dependencies that are necessary to enable the feature in editable build. .. START PROVIDER EXTRAS HERE @@ -198,7 +198,7 @@ The ``doc`` extras are not available in the released packages. They are only ava Airflow from sources in ``editable`` installation - i.e. one that you are usually using to contribute to Airflow. They provide tools needed when you want to build Airflow documentation (note that you also need ``devel`` extras installed for airflow and providers in order to build documentation for airflow and -provider packages respectively). The ``doc`` package is enough to build regular documentation, where +providers respectively). The ``doc`` package is enough to build regular documentation, where ``doc_gen`` is needed to generate ER diagram we have describing our database. .. START DOC EXTRAS HERE diff --git a/contributing-docs/README.rst b/contributing-docs/README.rst index 8a405b8519e4d..21a8293c10ef0 100644 --- a/contributing-docs/README.rst +++ b/contributing-docs/README.rst @@ -91,10 +91,10 @@ Advanced Topics Developing Providers ..................... -You can learn how Airflow repository is a monorepo split into airflow and provider packages, +You can learn how Airflow repository is a monorepo split into airflow and providers, and how to contribute to the providers: -* `Provider packages <11_provider_packages.rst>`__ describes the provider packages and how they +* `Provider distributions <11_provider_distributions.rst>`__ describes the providers and how they are used in Airflow. diff --git a/contributing-docs/testing/helm_unit_tests.rst b/contributing-docs/testing/helm_unit_tests.rst index 06c35addf05d6..2afcc70cdebdb 100644 --- a/contributing-docs/testing/helm_unit_tests.rst +++ b/contributing-docs/testing/helm_unit_tests.rst @@ -37,7 +37,7 @@ Example test here: .. code-block:: python - from tests.charts.common.helm_template_generator import render_chart, render_k8s_object + from unit.charts.common.helm_template_generator import render_chart, render_k8s_object git_sync_basic = """ dags: diff --git a/contributing-docs/testing/python_client_tests.rst b/contributing-docs/testing/python_client_tests.rst index 5bc492734bff3..f86b7d0e153e9 100644 --- a/contributing-docs/testing/python_client_tests.rst +++ b/contributing-docs/testing/python_client_tests.rst @@ -43,5 +43,5 @@ To build the package, you can run the following command: .. code-block:: bash - breeze release-management prepare-python-client --package-format both + breeze release-management prepare-python-client --distribution-format both --version-suffix-for-pypi dev0 --python-client-repo ./airflow-client-python diff --git a/contributing-docs/testing/system_tests.rst b/contributing-docs/testing/system_tests.rst index 91c9a9548fc17..298eac36c4c15 100644 --- a/contributing-docs/testing/system_tests.rst +++ b/contributing-docs/testing/system_tests.rst @@ -84,7 +84,7 @@ For core: .. code-block:: bash - pytest --system tests/system/example_empty.py + pytest --system airflow-core/tests/system/example_empty.py For providers: @@ -102,7 +102,7 @@ For core: .. code-block:: bash - breeze testing system-tests tests/system/example_empty.py + breeze testing system-tests airflow-core/tests/system/example_empty.py If you need to add some initialization of environment variables when entering Breeze, you can add a diff --git a/contributing-docs/testing/testing_packages.rst b/contributing-docs/testing/testing_packages.rst index 07bd8176f99f6..c9024b07896a8 100644 --- a/contributing-docs/testing/testing_packages.rst +++ b/contributing-docs/testing/testing_packages.rst @@ -15,11 +15,11 @@ specific language governing permissions and limitations under the License. -Manually building and testing release candidate packages -======================================================== +Manually building and testing release candidate distributions +============================================================= -Breeze can be used to test new release candidates of packages - both Airflow and providers. You can easily -configure the CI image of Breeze to install and start Airflow for both Airflow and provider packages, whether they +Breeze can be used to test new release candidates of distributions - both Airflow and providers. You can easily +configure the CI image of Breeze to install and start Airflow for both Airflow and providers, whether they are built from sources or downloaded from PyPI as release candidates. **The outline for this document in GitHub is available at top-right corner button (with 3-dots and 3 lines).** @@ -29,57 +29,57 @@ Prerequisites The way to test it is rather straightforward: -1) Make sure that the packages - both ``airflow`` and ``providers`` are placed in the ``dist`` folder +1) Make sure that the distributions - both ``airflow`` and ``providers`` are placed in the ``dist`` folder of your Airflow source tree. You can either build them there or download from PyPI (see the next chapter). 2) You can run ``breeze shell`` or ``breeze start-airflow`` commands with adding the following flags - - ``--mount-sources remove``, ``--use-packages-from-dist``, and ``--use-airflow-version wheel/sdist``. The first one + ``--mount-sources remove``, ``--use-distributions-from-dist``, and ``--use-airflow-version wheel/sdist``. The first one removes the ``airflow`` source tree from the container when starting it, the second one installs ``airflow`` and - ``providers`` packages from the ``dist`` folder when entering breeze, and the third one specifies the package's + ``providers`` distributions from the ``dist`` folder when entering breeze, and the third one specifies the distribution's format (either ``wheel`` or ``sdist``). Omitting the latter will result in skipping the installation of the - package(s), and a consequent error when later importing them. + distribution(s), and a consequent error when later importing them. -Testing pre-release packages ----------------------------- +Testing pre-release distributions +--------------------------------- -There are two ways how you can get Airflow packages in ``dist`` folder - by building them from sources or +There are two ways how you can get Airflow distributions in ``dist`` folder - by building them from sources or downloading them from PyPI. .. note :: - Make sure you run ``rm dist/*`` before you start building packages or downloading them from PyPI because - the packages built there already are not removed manually. + Make sure you run ``rm dist/*`` before you start building distributions or downloading them from PyPI because + the distributions built there already are not removed manually. In order to build apache-airflow from sources, you need to run the following command: .. code-block:: bash - breeze release-management prepare-airflow-package + breeze release-management prepare-airflow-distributions In order to build providers from sources, you need to run the following command: .. code-block:: bash - breeze release-management prepare-provider-packages ... + breeze release-management prepare-provider-distributions ... -The packages are built in ``dist`` folder and the command will summarise what packages are available in the +The distributions are built in ``dist`` folder and the command will summarise what distributions are available in the ``dist`` folder after it finishes. -If you want to download the packages from PyPI, you need to run the following command: +If you want to download the distributions from PyPI, you need to run the following command: .. code-block:: bash pip download apache-airflow-providers-==X.Y.Zrc1 --dest dist --no-deps -You can use it for both release and pre-release packages. +You can use it for both release and pre-release distributions. -Examples of testing pre-release packages ----------------------------------------- +Examples of testing pre-release distributions +--------------------------------------------- -Few examples below explain how you can test pre-release packages, and combine them with locally build -and released packages. +Few examples below explain how you can test pre-release distributions, and combine them with locally build +and released distributions. -The following example downloads ``apache-airflow`` and ``celery`` and ``kubernetes`` provider packages from PyPI and +The following example downloads ``apache-airflow`` and ``celery`` and ``kubernetes`` providers from PyPI and eventually starts Airflow with the Celery Executor. It also loads example dags and default connections: .. code:: bash @@ -88,33 +88,33 @@ eventually starts Airflow with the Celery Executor. It also loads example dags a pip download apache-airflow==2.9.0rc1 --dest dist --no-deps pip download apache-airflow-providers-celery==3.6.2rc1 --dest dist --no-deps pip download apache-airflow-providers-cncf-kubernetes==8.1.0rc1 --dest dist --no-deps - breeze start-airflow --mount-sources remove --use-packages-from-dist --use-airflow-version sdist --executor CeleryExecutor --backend postgres --load-default-connections --load-example-dags + breeze start-airflow --mount-sources remove --use-distributions-from-dist --use-airflow-version sdist --executor CeleryExecutor --backend postgres --load-default-connections --load-example-dags -The following example downloads ``celery`` and ``kubernetes`` provider packages from PyPI, builds -``apache-airflow`` package from the main sources and eventually starts Airflow with the Celery Executor. +The following example downloads ``celery`` and ``kubernetes`` providers from PyPI, builds +``apache-airflow`` distribution from the main sources and eventually starts Airflow with the Celery Executor. It also loads example dags and default connections: .. code:: bash rm dist/* - breeze release-management prepare-airflow-package + breeze release-management prepare-airflow-distributions pip download apache-airflow-providers-celery==3.6.2rc1 --dest dist --no-deps pip download apache-airflow-providers-cncf-kubernetes==8.1.0rc1 --dest dist --no-deps - breeze start-airflow --mount-sources remove --use-packages-from-dist --use-airflow-version sdist --executor CeleryExecutor --backend postgres --load-default-connections --load-example-dags + breeze start-airflow --mount-sources remove --use-distributions-from-dist --use-airflow-version sdist --executor CeleryExecutor --backend postgres --load-default-connections --load-example-dags -The following example builds ``celery``, ``kubernetes`` provider packages from the main sources, downloads 2.9.0 version -of ``apache-airflow`` package from PyPI and eventually starts Airflow using default executor +The following example builds ``celery``, ``kubernetes`` providers from the main sources, downloads 2.9.0 version +of ``apache-airflow`` distribution from PyPI and eventually starts Airflow using default executor for the backend chosen (no example dags, no default connections): .. code:: bash rm dist/* - breeze release-management prepare-provider-packages celery cncf.kubernetes + breeze release-management prepare-provider-distributions celery cncf.kubernetes pip download apache-airflow==2.9.0 --dest dist --no-deps - breeze start-airflow --mount-sources remove --use-packages-from-dist --use-airflow-version sdist + breeze start-airflow --mount-sources remove --use-distributions-from-dist --use-airflow-version sdist -You can mix and match packages from PyPI (final or pre-release candidates) with locally build packages. You +You can mix and match distributions from PyPI (final or pre-release candidates) with locally build distributions. You can also choose which providers to install this way since the ``--mount-sources remove`` flag makes sure that Airflow installed does not contain all the providers - only those that you explicitly downloaded or built in the ``dist`` folder. This way you can test all the combinations of Airflow and Providers you might need. diff --git a/contributing-docs/testing/unit_tests.rst b/contributing-docs/testing/unit_tests.rst index 09dfe0ecca9d7..744383ef22247 100644 --- a/contributing-docs/testing/unit_tests.rst +++ b/contributing-docs/testing/unit_tests.rst @@ -1134,7 +1134,7 @@ are not part of the public API. We deal with it in one of the following ways: raise AirflowOptionalProviderFeatureException. In such case you should wrap the imports in ``ignore_provider_compatibility_error`` context manager adding the ``__file__`` module name as parameter. This will stop failing pytest collection and automatically skip the whole - module from tests. + module from unit. For example: @@ -1150,7 +1150,7 @@ Running provider compatibility tests in CI .......................................... In CI those tests are run in a slightly more complex way because we want to run them against the build -provider packages, rather than mounted from sources. +providers, rather than mounted from sources. In case of canary runs we add ``--clean-airflow-installation`` flag that removes all packages before installing older airflow version, and then installs development dependencies @@ -1174,8 +1174,8 @@ Herr id how to reproduce it. .. code-block:: bash rm dist/* - breeze release-management prepare-provider-packages --include-not-ready-providers \ - --version-suffix-for-pypi dev0 --package-format wheel + breeze release-management prepare-provider-distributions --include-not-ready-providers \ + --version-suffix-for-pypi dev0 --distribution-format wheel 3. Prepare provider constraints @@ -1187,18 +1187,18 @@ Herr id how to reproduce it. the incompatible providers in the ``PROVIDERS_COMPATIBILITY_TESTS_MATRIX`` constant in the ``./dev/breeze/src/airflow_breeze/global_constants.py`` file. -5. Enter breeze environment, installing selected airflow version and the provider packages prepared from main +5. Enter breeze environment, installing selected airflow version and the providers prepared from main .. code-block:: bash - breeze shell --use-packages-from-dist --package-format wheel --use-airflow-version 2.9.1 \ + breeze shell --use-distributions-from-dist --distribution-format wheel --use-airflow-version 2.9.1 \ --install-airflow-with-constraints --providers-skip-constraints --mount-sources tests In case you want to reproduce canary run, you need to add ``--clean-airflow-installation`` flag: .. code-block:: bash - breeze shell --use-packages-from-dist --package-format wheel --use-airflow-version 2.9.1 \ + breeze shell --use-distributions-from-dist --distribution-format wheel --use-airflow-version 2.9.1 \ --install-airflow-with-constraints --providers-skip-constraints --mount-sources tests --clean-airflow-installation @@ -1214,7 +1214,7 @@ The tests are run using: * airflow installed from PyPI * tests coming from the current airflow sources (they are mounted inside the breeze image) -* provider packages built from the current airflow sources and placed in dist +* providers built from the current airflow sources and placed in dist This means that you can modify and run tests and re-run them because sources are mounted from the host, but if you want to modify provider code you need to exit breeze, rebuild the provider package and @@ -1224,8 +1224,8 @@ Rebuilding single provider package can be done using this command: .. code-block:: bash - breeze release-management prepare-provider-packages \ - --version-suffix-for-pypi dev0 --package-format wheel + breeze release-management prepare-provider-distributions \ + --version-suffix-for-pypi dev0 --distribution-format wheel Lowest direct dependency resolution tests ----------------------------------------- diff --git a/dev/PROVIDER_PACKAGE_DETAILS.md b/dev/PROVIDER_DISTRIBUTIONS_DETAILS.md similarity index 80% rename from dev/PROVIDER_PACKAGE_DETAILS.md rename to dev/PROVIDER_DISTRIBUTIONS_DETAILS.md index fbb44de1c2dff..4fa7acafb871c 100644 --- a/dev/PROVIDER_PACKAGE_DETAILS.md +++ b/dev/PROVIDER_DISTRIBUTIONS_DETAILS.md @@ -33,8 +33,8 @@ # Overview -This document describes the process of preparing provider packages for release and releasing them. -The provider packages are packages (per `provider`) that are not part of the core Airflow. +This document describes the process of preparing provider distributions for release and releasing them. +The provider distributions are distributions (one per `provider`) that are not part of the core Airflow. Once you release the packages, you can simply install them with: @@ -43,8 +43,8 @@ pip install apache-airflow-providers-[] ``` Where `` is the provider id and `` are optional extra packages to install. -You can find the provider packages dependencies and extras in the README.md files in each provider -package (in `airflow/providers/` folder) as well as in the PyPI installation page. +You can find the provider distributions dependencies and extras in the README.md files in each provider +distribution (in `airflow/providers/` folder) as well as in the PyPI installation page. Backport providers are a great way to migrate your DAGs to Airflow-2.0 compatible DAGs. You can switch to the new Airflow-2.0 packages in your DAGs, long before you attempt to migrate @@ -56,7 +56,7 @@ use a dot ('.') as the separator. So the package for microsoft azure is # Deciding when to release -Each provider package has its own version maintained separately when contributors implement changes, +Each provider distribution has its own version maintained separately when contributors implement changes, marking those as patches/features/backwards incompatible changes. Details to be hashed out in [the related issue](https://github.com/apache/airflow/issues/11425) @@ -67,13 +67,13 @@ Details to be hashed out in [the related issue](https://github.com/apache/airflo You can verify if all providers are properly named and importable. ```bash -breeze release-management verify-provider-packages +breeze release-management verify-provider-distributions ``` You can also run the verification with an earlier airflow version to check for compatibility. ```bash -breeze release-management verify-provider-packages --use-airflow-version 2.1.0 +breeze release-management verify-provider-distributions --use-airflow-version 2.1.0 ``` @@ -119,14 +119,14 @@ The script generates all the necessary information: The information is placed in README.rst which is regenerated every time you run the script. -Note that our CI system builds the release notes for provider packages automatically with every build and +Note that our CI system builds the release notes for provider distributions automatically with every build and current date - this way you might be sure the automated generation of the release notes continues to work. You can also preview the generated readme files (by downloading artifacts from GitHub Actions). The script does not modify the README files if there is no change in the repo for that provider. # Preparing packages -Airflow 2.0 is released as separate core package and separate set of provider packages. +Airflow 2.0 is released as separate core package and separate set of provider distributions. You can build those packages in the breeze environment, so you do not have to worry about common environment. @@ -139,7 +139,7 @@ the folders (for example Apache Hive's PACKAGE_ID is `apache.hive` ). You can se providers by running: ```bash -breeze release-management prepare-provider-packages --help +breeze release-management prepare-provider-distributions --help ``` The examples below show how you can build selected packages, but you can also build all packages by @@ -148,25 +148,25 @@ omitting the package ids altogether. * To build the release candidate packages for PyPI upload run the following command: ```bash -breeze release-management prepare-provider-packages --package-format both --version-suffix-for-pypi=rc1 [PACKAGE_ID] ... +breeze release-management prepare-provider-distributions --distribution-format both --version-suffix-for-pypi=rc1 [PACKAGE_ID] ... ``` for example: ```bash -breeze release-management prepare-provider-packages --package-format both --version-suffix-for-pypi=rc1 http ... +breeze release-management prepare-provider-distributions --distribution-format both --version-suffix-for-pypi=rc1 http ... ``` * To build the final release packages run the following command: ```bash -breeze release-management prepare-provider-packages --package-format both [PACKAGE_ID] ... +breeze release-management prepare-provider-distributions --distribution-format both [PACKAGE_ID] ... ``` for example: ```bash -breeze release-management prepare-provider-packages --package-format both http ... +breeze release-management prepare-provider-distributions --distribution-format both http ... ``` * For each package, this creates a wheel package and source distribution package in your `dist` folder with @@ -179,4 +179,4 @@ Where ``MAJOR.MINOR.PATCHLEVEL`` is the semver version of the packages. * You can install the .whl packages with `pip install ` -Releasing the packages is described in [README_RELEASE_PROVIDER_PACKAGES.md](README_RELEASE_PROVIDER_PACKAGES.md) +Releasing the packages is described in [README_RELEASE_PROVIDERS.md](README_RELEASE_PROVIDERS.md) diff --git a/dev/README.md b/dev/README.md index 2d6b88ec8dcc2..7d9f20ca0a266 100644 --- a/dev/README.md +++ b/dev/README.md @@ -22,7 +22,7 @@ - [Apache Airflow source releases](#apache-airflow-source-releases) - [Apache Airflow Package](#apache-airflow-package) - - [Provider packages](#provider-packages) + - [Provider distributions](#provider-distributions) - [Preinstalled providers](#preinstalled-providers) - [Prerequisites for the release manager preparing the release](#prerequisites-for-the-release-manager-preparing-the-release) - [Upload Public keys to id.apache.org and GitHub](#upload-public-keys-to-idapacheorg-and-github) @@ -48,7 +48,7 @@ They contain sources for: * Dockerfile and corresponding scripts that build and use an official DockerImage * Breeze development environment that helps with building images and testing locally apache airflow built from sources - * Provider packages - containing Airflow's providers - separate package per each service Airflow integrates + * Provider distributions - containing Airflow's providers - separate package per each service Airflow integrates with. We also plan to release the official Helm Chart sources that will allow the user to install Apache Airflow @@ -67,13 +67,14 @@ cannot or do not want to build the packages themselves can use them as a conveni Apache Airflow, however they are not considered as "official source releases". You can read more details about it in the [ASF Release Policy](http://www.apache.org/legal/release-policy.html). -Detailed instruction of releasing Provider Packages can be found in the +Detailed instruction of releasing provider distributions can be found in the [README_RELEASE_AIRFLOW.md](README_RELEASE_AIRFLOW.md) -## Provider packages +## Provider distributions -The Provider packages are packages (per provider) that make it possible to easily install Hooks, -Operators, Sensors, and Secrets for different providers (external services used by Airflow). +The Provider distributions are distributions (separate one per provider) that make it possible to +easily install Hooks, Operators, Sensors, and Secrets for different providers +(external services used by Airflow). Once you release the packages, you can simply install them with: @@ -82,16 +83,16 @@ pip install apache-airflow-providers-[] ``` Where `` is the provider id and `` are optional extra packages to install. -You can find the provider packages dependencies and extras in the README.md files in each provider +You can find the provider distributions dependencies and extras in the README.md files in each provider package (in `airflow/providers/` folder) as well as in the PyPI installation page. -The sources released in SVN allow to build all the provider packages by the user, following the +The sources released in SVN allow to build all the provider distributions by the user, following the instructions and scripts provided. Those are also "official_source releases" as described in the [ASF Release Policy](http://www.apache.org/legal/release-policy.html) and they are available via [Official Apache Download for providers](https://downloads.apache.org/airflow/providers/). The full provider's list can be found here: -[Provider Packages Reference](https://s.apache.org/airflow-docs) +[Provider distributions reference](https://s.apache.org/airflow-docs) There are also convenience packages released as "apache-airflow-providers"separately in PyPI. [PyPI query for providers](https://pypi.org/search/?q=apache-airflow-providers) @@ -102,8 +103,8 @@ And available in PyPI: Note that Backport Providers for Airflow 1.10.* series are not released any more. The last release of Backport Providers was done on March 17, 2021. -Detailed instruction of releasing Provider Packages can be found in the -[README_RELEASE_PROVIDER_PACKAGES.md](README_RELEASE_PROVIDER_PACKAGES.md) +Detailed instruction of releasing provider distributions can be found in the +[README_RELEASE_PROVIDERS.md](README_RELEASE_PROVIDERS.md) # Preinstalled providers @@ -112,7 +113,7 @@ Those providers are dynamically added to generated standard wheel packages that Those packages are not present in pyproject.toml as dependencies, and they are not installed when you install Airflow for editable installation for development. This way, when you develop Airflow you can work on Airflow and Providers together from the same -Source tree - without polluting your editable installation with installed provider packages. +Source tree - without polluting your editable installation with installed provider distributions. # Prerequisites for the release manager preparing the release diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md index f9dbc945e67e0..5bd9dac3bd407 100644 --- a/dev/README_RELEASE_AIRFLOW.md +++ b/dev/README_RELEASE_AIRFLOW.md @@ -387,8 +387,10 @@ Airflow ${VERSION} is available at: https://dist.apache.org/repos/dist/dev/airflow/$VERSION/ *apache-airflow-${VERSION_WITHOUT_RC}-source.tar.gz* is a source release that comes with INSTALL instructions. -*apache-airflow-${VERSION_WITHOUT_RC}.tar.gz* is the binary Python "sdist" release. -*apache_airflow-${VERSION_WITHOUT_RC}-py3-none-any.whl* is the binary Python wheel "binary" release. +*apache-airflow-${VERSION_WITHOUT_RC}.tar.gz* is the binary Python "sdist" release fore airflow meta distribution. +*apache_airflow-${VERSION_WITHOUT_RC}-py3-none-any.whl* is the binary Python wheel "binary" release for airflow meta distribution. +*apache-airflow_core-${VERSION_WITHOUT_RC}.tar.gz* is the binary Python "sdist" release for airflow core distribution. +*apache_airflow_core-${VERSION_WITHOUT_RC}-py3-none-any.whl* is the binary Python wheel "binary" release for airflow core distribution. Public keys are available at: https://dist.apache.org/repos/dist/release/airflow/KEYS @@ -477,16 +479,16 @@ VERSION=X.Y.Zrc1 git checkout ${VERSION} export AIRFLOW_REPO_ROOT=$(pwd) rm -rf dist/* -breeze release-management prepare-airflow-package --package-format both +breeze release-management prepare-airflow-distributions --distribution-format both breeze release-management prepare-airflow-tarball --version ${VERSION} ``` -The `prepare-airflow-package` by default will use Dockerized approach and building of the packages +The `prepare-airflow-distributions` by default will use Dockerized approach and building of the packages will be done in a docker container. However, if you have `hatch` installed locally you can use `--use-local-hatch` flag and it will build and use docker image that has `hatch` installed. ```bash -breeze release-management prepare-airflow-package --package-format both --use-local-hatch +breeze release-management prepare-airflow-distributions --distribution-format both --use-local-hatch breeze release-management prepare-airflow-tarball --version ${VERSION} ``` @@ -494,7 +496,7 @@ This is generally faster and requires less resources/network bandwidth. Note tha do it before preparing the tarball as preparing packages cleans up dist folder from apache-airflow artifacts as it uses hatch's `-c` build flag. -The `prepare-airflow-package` command (no matter if docker or local hatch is used) should produce the +The `prepare-airflow-distributions` command (no matter if docker or local hatch is used) should produce the reproducible `.whl`, `.tar.gz` packages in the dist folder. The tarball command should produce reproducible `-source.tar.gz` tarball of sources. diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDERS.md similarity index 93% rename from dev/README_RELEASE_PROVIDER_PACKAGES.md rename to dev/README_RELEASE_PROVIDERS.md index 88d8a5e8ee8f6..b81132ac8e425 100644 --- a/dev/README_RELEASE_PROVIDER_PACKAGES.md +++ b/dev/README_RELEASE_PROVIDERS.md @@ -20,20 +20,20 @@ **Table of contents** -- [What the provider packages are](#what-the-provider-packages-are) -- [Provider packages](#provider-packages) +- [What the provider distributions are](#what-the-provider-distributions-are) +- [Provider distributions](#provider-distributions) - [Bump min Airflow version for providers](#bump-min-airflow-version-for-providers) - [Decide when to release](#decide-when-to-release) -- [Provider packages versioning](#provider-packages-versioning) -- [Possible states of provider packages](#possible-states-of-provider-packages) +- [Provider distributions versioning](#provider-distributions-versioning) +- [Possible states of Provider distributions](#possible-states-of-provider-distributions) - [Chicken-egg providers](#chicken-egg-providers) -- [Prepare Regular Provider packages (RC)](#prepare-regular-provider-packages-rc) +- [Prepare Regular Provider distributions (RC)](#prepare-regular-provider-distributions-rc) - [Move provider into remove state](#move-provider-into-remove-state) - [Increasing version number](#increasing-version-number) - [Generate release notes](#generate-release-notes) - [(Optional) Apply template updates](#optional-apply-template-updates) - [Open PR with suggested version releases](#open-pr-with-suggested-version-releases) - - [Build provider packages for SVN apache upload](#build-provider-packages-for-svn-apache-upload) + - [Build Provider distributions for SVN apache upload](#build-provider-distributions-for-svn-apache-upload) - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages) - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo) - [Publish the Regular convenience package to PyPI](#publish-the-regular-convenience-package-to-pypi) @@ -55,15 +55,15 @@ - [Announce about the release in social media](#announce-about-the-release-in-social-media) - [Add release data to Apache Committee Report Helper](#add-release-data-to-apache-committee-report-helper) - [Close the testing status issue](#close-the-testing-status-issue) - - [Remove provider packages scheduled for removal](#remove-provider-packages-scheduled-for-removal) + - [Remove Provider distributions scheduled for removal](#remove-provider-distributions-scheduled-for-removal) ------------------------------------------------------------------------------------------------------------ -# What the provider packages are +# What the provider distributions are -The Provider packages are separate packages (one package per provider) that implement +The Provider distributions are separate packages (one package per provider) that implement integrations with external services for Airflow in the form of installable Python packages. The Release Manager prepares packages separately from the main Airflow Release, using @@ -74,12 +74,12 @@ NOTE!! When you have problems with any of those commands that run inside `breeze can run the command with `--debug` flag that will drop you in the shell inside the image and will print the command that you should run. -# Provider packages +# Provider distributions The prerequisites to release Apache Airflow are described in [README.md](README.md). You can read more about the command line tools used to generate the packages in the -[Provider packages](PROVIDER_PACKAGE_DETAILS.md). +[Provider details](PROVIDER_PACKAGE_DETAILS.md). # Bump min Airflow version for providers @@ -101,13 +101,13 @@ This will only update the min version in the `__init__.py` files and package do Note: Sometimes we are releasing a subset of providers and would not want to add the list of these providers to every breeze command we run, specifically: -`prepare-provider-packages`, `build-docs` , `publish-docs`, and, `add-back-references`. In this -case, we can instead export an environment variable: `PACKAGE_LIST`, and it will work for every breeze -command involved in the release process. The value can also be passed as the `--package-list` argument. +`prepare-provider-distributions`, `build-docs` , `publish-docs`, and, `add-back-references`. In this +case, we can instead export an environment variable: `DISTRIBUTIONS_LIST`, and it will work for every breeze +command involved in the release process. The value can also be passed as the `--distributions-list` argument. Follow the steps below to set the environment variable: ```shell script - export PACKAGE_LIST=PACKAGE1,PACKAGE2 + export DISTRIBUTIONS_LIST=PACKAGE1,PACKAGE2 ``` ```shell script @@ -128,23 +128,23 @@ when the time to update min airflow version has come. # Decide when to release -You can release provider packages separately from the main Airflow on an ad-hoc basis, whenever we find that +You can release Provider distributions separately from the main Airflow on an ad-hoc basis, whenever we find that a given provider needs to be released - due to new features or due to bug fixes. You can release each provider package separately, but due to voting and release overhead we try to group -releases of provider packages together. +releases of Provider distributions together. -# Provider packages versioning +# Provider distributions versioning -We are using the [SEMVER](https://semver.org/) versioning scheme for the provider packages. This is in order +We are using the [SEMVER](https://semver.org/) versioning scheme for the Provider distributions. This is in order to give the users confidence about maintaining backwards compatibility in the new releases of those packages. Details about maintaining the SEMVER version are going to be discussed and implemented in [the related issue](https://github.com/apache/airflow/issues/11425) -# Possible states of provider packages +# Possible states of Provider distributions -The provider packages can be in one of several states. +The Provider distributions can be in one of several states. * The `not-ready` state is used when the provider has some in-progress changes (usually API changes) that we do not want to release yet as part of the regular release cycle. Providers in this state are excluded @@ -211,7 +211,7 @@ in the PR by author of the PR that adds both the functionality. This will make s provider is build in CI from sources, when CI jobs are run rather than latest version downloaded from PyPI when constraints are generated. -# Prepare Regular Provider packages (RC) +# Prepare Regular Provider distributions (RC) ## Move provider into remove state @@ -246,7 +246,7 @@ The new version should be first on the list. ## Generate release notes -Each of the provider packages contains Release notes in the form of the `CHANGELOG.rst` file that is +Each of the Provider distributions contains Release notes in the form of the `CHANGELOG.rst` file that is automatically generated from history of the changes and code of the provider. They are stored in the documentation directory. The `README.md` file generated during package preparation is not stored anywhere in the repository - it contains however link to the Changelog @@ -345,7 +345,7 @@ In the PR we will verify if we want to release a specific package or if the vers Only after PR is merged you should proceed to next steps. -## Build provider packages for SVN apache upload +## Build Provider distributions for SVN apache upload Those packages might get promoted to "final" packages by just renaming the files, so internally they should keep the final version number without the rc suffix, even if they are rc1/rc2/... candidates. @@ -366,14 +366,14 @@ rm -rf ${AIRFLOW_REPO_ROOT}/dist/* * Release candidate packages: ```shell script -breeze release-management prepare-provider-packages --include-removed-providers --package-format both +breeze release-management prepare-provider-distributions --include-removed-providers --distribution-format both ``` if you only build few packages, run: ```shell script -breeze release-management prepare-provider-packages --include-removed-providers \ ---package-format both PACKAGE PACKAGE .... +breeze release-management prepare-provider-distributions --include-removed-providers \ +--distribution-format both PACKAGE PACKAGE .... ``` In case you want to also release a pre-installed provider that is in ``not-ready`` state (i.e. when @@ -441,27 +441,27 @@ you should clean up dist folder before generating the packages, so you will only ```shell script rm -rf ${AIRFLOW_REPO_ROOT}/dist/* -breeze release-management prepare-provider-packages --include-removed-providers \ - --version-suffix-for-pypi rc1 --package-format both +breeze release-management prepare-provider-distributions --include-removed-providers \ + --version-suffix-for-pypi rc1 --distribution-format both ``` If you only build few packages, run: ```shell script -breeze release-management prepare-provider-packages \ ---version-suffix-for-pypi rc1 --package-format both PACKAGE PACKAGE .... +breeze release-management prepare-provider-distributions \ +--version-suffix-for-pypi rc1 --distribution-format both PACKAGE PACKAGE .... ``` -Alternatively, if you have set the environment variable: `PACKAGE_LIST` above, just run the command: +Alternatively, if you have set the environment variable: `DISTRIBUTIONS_LIST` above, just run the command: ```shell script -breeze release-management prepare-provider-packages +breeze release-management prepare-provider-distributions ``` -Or using `--package-list` argument: +Or using `--distributions-list` argument: ```shell script -breeze release-management prepare-provider-packages --package-list PACKAGE1,PACKAGE2 +breeze release-management prepare-provider-distributions --distributions-list PACKAGE1,PACKAGE2 ``` In case some packages already had rc1 suffix prepared and released, and they still need to be released, they @@ -508,7 +508,7 @@ the two repositories to be able to build the documentation. Documentation for providers can be found in the `/docs/apache-airflow-providers` directory and the `/docs/apache-airflow-providers-*/` directory. The first directory contains the package contents -lists and should be updated every time a new version of provider packages is released. +lists and should be updated every time a new version of Provider distributions is released. - First, copy the airflow-site repository and set the environment variable ``AIRFLOW_SITE_DIRECTORY``. @@ -535,7 +535,7 @@ breeze build-docs --clean-build apache-airflow-providers all-providers --include Usually when we release packages we also build documentation for the "documentation-only" packages. This means that unless we release just few selected packages or if we need to deliberately skip some packages -we should release documentation for all provider packages and the above command is the one to use. +we should release documentation for all Provider distributions and the above command is the one to use. If we want to just release some providers you can release them using package names: @@ -544,17 +544,17 @@ cd "${AIRFLOW_REPO_ROOT}" breeze build-docs apache-airflow-providers cncf.kubernetes sftp --clean-build ``` -Alternatively, if you have set the environment variable: `PACKAGE_LIST` above, just run the command: +Alternatively, if you have set the environment variable: `DISTRIBUTIONS_LIST` above, just run the command: ```shell script cd "${AIRFLOW_REPO_ROOT}" breeze build-docs --clean-build ``` -Or using `--package-list` argument: +Or using `--distributions-list` argument: ```shell script -breeze build-docs --package-list PACKAGE1,PACKAGE2 +breeze build-docs --distributions-list PACKAGE1,PACKAGE2 ``` - Now you can preview the documentation. @@ -597,17 +597,17 @@ breeze release-management publish-docs amazon apache.beam google .... breeze release-management add-back-references all-providers ``` -Alternatively, if you have set the environment variable: `PACKAGE_LIST` above, just run the command: +Alternatively, if you have set the environment variable: `DISTRIBUTIONS_LIST` above, just run the command: ```shell script breeze release-management publish-docs breeze release-management add-back-references all-providers ``` -Or using `--package-list` argument: +Or using `--distributions-list` argument: ```shell script -breeze release-management publish-docs --package-list PACKAGE1,PACKAGE2 +breeze release-management publish-docs --distributions-list PACKAGE1,PACKAGE2 breeze release-management add-back-references all-providers ``` @@ -718,16 +718,16 @@ Airflow Providers are available at: https://dist.apache.org/repos/dist/dev/airflow/providers/ *apache-airflow-providers--*.tar.gz* are the binary - Python "sdist" release - they are also official "sources" for the provider packages. + Python "sdist" release - they are also official "sources" for the Provider distributions. *apache_airflow_providers_-*.whl are the binary Python "wheel" release. The test procedure for PMC members is described in -https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PROVIDER_PACKAGES.md#verify-the-release-candidate-by-pmc-members +https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PROVIDERS.md#verify-the-release-candidate-by-pmc-members The test procedure for and Contributors who would like to test this RC is described in: -https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PROVIDER_PACKAGES.md#verify-the-release-candidate-by-contributors +https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PROVIDERS.md#verify-the-release-candidate-by-contributors Public keys are available at: @@ -816,7 +816,7 @@ docker image rm local/airflow ### Reproducible package builds checks -For provider packages we introduced a reproducible build mechanism - which means that whoever wants +For Provider distributions we introduced a reproducible build mechanism - which means that whoever wants to use sources of Airflow from the release tag, can reproducibly build the same "wheel" and "sdist" packages as the release manager and they will be byte-by-byte identical, which makes them easy to verify - if they came from the same sources. This build is only done using released dependencies @@ -850,7 +850,7 @@ rm -rf dist/* 4) Build the packages using checked out sources ```shell -breeze release-management prepare-provider-packages --include-removed-providers --package-format both +breeze release-management prepare-provider-distributions --include-removed-providers --distribution-format both ``` 5) Switch to the folder where you checked out the SVN dev files @@ -1057,12 +1057,12 @@ pip install apache-airflow-providers-==rc ``` NOTE! You should `Ctrl-C` and restart the connections to restart airflow components and make sure new -provider packages is used. +Provider distributions is used. ### Building your own docker image If you prefer to build your own image, you can also use the official image and PyPI packages to test -provider packages. This is especially helpful when you want to test integrations, but you need to install +Provider distributions. This is especially helpful when you want to test integrations, but you need to install additional tools. Below is an example Dockerfile, which installs providers for Google/ ```dockerfile @@ -1410,9 +1410,9 @@ Thank you everyone. Providers are released. I invite everyone to help improve providers for the next release, a list of open issues can be found [here](https://github.com/apache/airflow/issues?q=is%3Aopen+is%3Aissue+label%3Aarea%3Aproviders). ``` -## Remove provider packages scheduled for removal +## Remove Provider distributions scheduled for removal -If there are provider packages scheduler for removal, create PR and merge it to remove them. +If there are Provider distributions scheduler for removal, create PR and merge it to remove them. The following places should be checked: diff --git a/dev/README_RELEASE_PYTHON_CLIENT.md b/dev/README_RELEASE_PYTHON_CLIENT.md index a6c6460d7fedc..5d941042da2ce 100644 --- a/dev/README_RELEASE_PYTHON_CLIENT.md +++ b/dev/README_RELEASE_PYTHON_CLIENT.md @@ -120,7 +120,7 @@ git log 2.8.0..HEAD --pretty=oneline -- clients/python/openapi_v1.yaml ```shell script cd ${AIRFLOW_REPO_ROOT} rm dist/* -breeze release-management prepare-python-client --package-format both --python-client-repo "${CLIENT_REPO_ROOT}" +breeze release-management prepare-python-client --distribution-format both --python-client-repo "${CLIENT_REPO_ROOT}" ``` - This should generate both sdist and .whl package in `dist` folder of the Airflow repository. It should @@ -203,7 +203,7 @@ To do this we need to: ```shell script rm dist/* -breeze release-management prepare-python-client --package-format both --version-suffix-for-pypi "${VERSION_SUFFIX}" +breeze release-management prepare-python-client --distribution-format both --version-suffix-for-pypi "${VERSION_SUFFIX}" ``` - Verify the artifacts that would be uploaded: @@ -333,7 +333,7 @@ VERSION=X.Y.Zrc1 git checkout python-client-${VERSION} export AIRFLOW_REPO_ROOT=$(pwd) rm -rf dist/* -breeze release-management prepare-python-client --package-format both +breeze release-management prepare-python-client --distribution-format both ``` The last - build step - by default will use Dockerized build and building of Python client packages @@ -341,7 +341,7 @@ will be done in a docker container. However, if you have `hatch` installed loc `--use-local-hatch` flag and it will build and use docker image that has `hatch` installed. ```bash -breeze release-management prepare-python-client --package-format both --use-local-hatch +breeze release-management prepare-python-client --distribution-format both --use-local-hatch ``` This is generally faster and requires less resources/network bandwidth. diff --git a/dev/airflow-github b/dev/airflow-github index 0963c4a2224c0..94a218d04b95d 100755 --- a/dev/airflow-github +++ b/dev/airflow-github @@ -133,7 +133,6 @@ def is_core_commit(files: list[str]) -> bool: # Providers "airflow/providers/", "airflow/provider.yaml.schema.json", - "provider_packages/", "docs/apache-airflow-providers-", # chart "chart/", diff --git a/dev/breeze/README.md b/dev/breeze/README.md index 122f779f36499..692a4bcd335e3 100644 --- a/dev/breeze/README.md +++ b/dev/breeze/README.md @@ -135,6 +135,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY UPDATED BY PRE-COMMIT. --------------------------------------------------------------------------------------------------------- -Package config hash: 90b17b407c28dc0aad4520f837ebfd770c363064127b9e5698d71bedf31a6d68034282c01495b92d79ae791f85b0360d9ac2e1caa84fb5084611aa68336f1c10 +Package config hash: afd9da2026a8ef459e604a86236da3295475a883c9479a87746635b9790aa2eaa2e678aa06ea3522d9e3f93c88b172ba4914d707800c060c6d003eb68ea1e415 --------------------------------------------------------------------------------------------------------- diff --git a/dev/breeze/doc/02_customizing.rst b/dev/breeze/doc/02_customizing.rst index abcb46b0a71be..a6cf3905aeb60 100644 --- a/dev/breeze/doc/02_customizing.rst +++ b/dev/breeze/doc/02_customizing.rst @@ -57,7 +57,7 @@ will be evaluated at entering the environment. The ``files`` folder from your local sources is automatically mounted to the container under ``/files`` path and you can put there any files you want to make available for the Breeze container. -You can also copy any .whl or ``sdist`` packages to dist and when you pass ``--use-packages-from-dist`` flag +You can also copy any .whl or ``sdist`` packages to dist and when you pass ``--use-distributions-from-dist`` flag as ``wheel`` or ``sdist`` line parameter, breeze will automatically install the packages found there when you enter Breeze. diff --git a/dev/breeze/doc/05_test_commands.rst b/dev/breeze/doc/05_test_commands.rst index d9eb0856bbd76..8ebc77a4579c2 100644 --- a/dev/breeze/doc/05_test_commands.rst +++ b/dev/breeze/doc/05_test_commands.rst @@ -226,7 +226,7 @@ To package the client, clone the airflow-python-client repository and run the fo .. code-block:: bash - breeze release-management prepare-python-client --package-format both + breeze release-management prepare-python-client --distribution-format both --version-suffix-for-pypi dev0 --python-client-repo ./airflow-client-python .. code-block:: bash @@ -253,7 +253,7 @@ For example this will only run example_external_task_child_deferrable tests: .. code-block:: bash - breeze testing system-tests tests/system/example_empty.py + breeze testing system-tests airflow-core/tests/system/example_empty.py Here is the detailed set of options for the ``breeze testing system-tests`` command. diff --git a/dev/breeze/doc/09_release_management_tasks.rst b/dev/breeze/doc/09_release_management_tasks.rst index 792d1cb84ea7b..60632a4ef527c 100644 --- a/dev/breeze/doc/09_release_management_tasks.rst +++ b/dev/breeze/doc/09_release_management_tasks.rst @@ -43,21 +43,21 @@ You can prepare airflow packages using Breeze: .. code-block:: bash - breeze release-management prepare-airflow-package + breeze release-management prepare-airflow-distributions This prepares airflow .whl package in the dist folder. -Again, you can specify optional ``--package-format`` flag to build selected formats of airflow packages, +Again, you can specify optional ``--distribution-format`` flag to build selected formats of airflow packages, default is to build ``both`` type of packages ``sdist`` and ``wheel``. .. code-block:: bash - breeze release-management prepare-airflow-package --package-format=wheel + breeze release-management prepare-airflow-distributions --distribution-format=wheel -.. image:: ./images/output_release-management_prepare-airflow-package.svg - :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg +.. image:: ./images/output_release-management_prepare-airflow-distributions.svg + :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.svg :width: 100% - :alt: Breeze release-management prepare-airflow-package + :alt: Breeze release-management prepare-airflow-distributions Preparing airflow tarball @@ -275,14 +275,14 @@ Provider release commands ......................... Preparing provider release is part of the release procedure by the release managers -and it is described in detail in `dev `_ . +and it is described in detail in `dev `_ . Preparing provider documentation """""""""""""""""""""""""""""""" You can use Breeze to prepare provider documentation. -The below example perform documentation preparation for provider packages. +The below example perform documentation preparation for providers. .. code-block:: bash @@ -296,86 +296,86 @@ You can also add ``--answer yes`` to perform non-interactive build. :width: 100% :alt: Breeze prepare-provider-documentation -Preparing provider packages -""""""""""""""""""""""""""" +Preparing providers +""""""""""""""""""" -You can use Breeze to prepare provider packages. +You can use Breeze to prepare providers. The packages are prepared in ``dist`` folder. Note, that this command cleans up the ``dist`` folder before running, so you should run it before generating airflow package below as it will be removed. -The below example builds provider packages in the wheel format. +The below example builds providers in the wheel format. .. code-block:: bash - breeze release-management prepare-provider-packages + breeze release-management prepare-provider-distributions If you run this command without packages, you will prepare all packages, you can however specify providers that you would like to build. By default ``both`` types of packages are prepared ( -``wheel`` and ``sdist``, but you can change it providing optional --package-format flag. +``wheel`` and ``sdist``, but you can change it providing optional --distribution-format flag. .. code-block:: bash - breeze release-management prepare-provider-packages google amazon + breeze release-management prepare-provider-distributions google amazon You can see all providers available by running this command: .. code-block:: bash - breeze release-management prepare-provider-packages --help + breeze release-management prepare-provider-distributions --help -.. image:: ./images/output_release-management_prepare-provider-packages.svg - :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-provider-packages.svg +.. image:: ./images/output_release-management_prepare-provider-distributions.svg + :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.svg :width: 100% - :alt: Breeze prepare-provider-packages + :alt: Breeze prepare-provider-distributions -Installing provider packages -"""""""""""""""""""""""""""" +Installing providers +"""""""""""""""""""" -In some cases we want to just see if the provider packages generated can be installed with airflow without +In some cases we want to just see if the providers generated can be installed with airflow without verifying them. This happens automatically on CI for sdist pcackages but you can also run it manually if you -just prepared provider packages and they are present in ``dist`` folder. +just prepared providers and they are present in ``dist`` folder. .. code-block:: bash - breeze release-management install-provider-packages + breeze release-management install-provider-distributions You can also run the verification with an earlier airflow version to check for compatibility. .. code-block:: bash - breeze release-management install-provider-packages --use-airflow-version 2.4.0 + breeze release-management install-provider-distributions --use-airflow-version 2.4.0 All the command parameters are here: -.. image:: ./images/output_release-management_install-provider-packages.svg - :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_install-provider-packages.svg +.. image:: ./images/output_release-management_install-provider-distributions.svg + :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg :width: 100% - :alt: Breeze install-provider-packages + :alt: Breeze install-provider-distributions -Verifying provider packages -""""""""""""""""""""""""""" +Verifying providers +""""""""""""""""""" Breeze can also be used to verify if provider classes are importable and if they are following the right naming conventions. This happens automatically on CI but you can also run it manually if you -just prepared provider packages and they are present in ``dist`` folder. +just prepared providers and they are present in ``dist`` folder. .. code-block:: bash - breeze release-management verify-provider-packages + breeze release-management verify-provider-distributions You can also run the verification with an earlier airflow version to check for compatibility. .. code-block:: bash - breeze release-management verify-provider-packages --use-airflow-version 2.4.0 + breeze release-management verify-provider-distributions --use-airflow-version 2.4.0 All the command parameters are here: -.. image:: ./images/output_release-management_verify-provider-packages.svg - :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_verify-provider-packages.svg +.. image:: ./images/output_release-management_verify-provider-distributions.svg + :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_verify-provider-distributions.svg :width: 100% - :alt: Breeze verify-provider-packages + :alt: Breeze verify-provider-distributions Generating Providers Metadata """"""""""""""""""""""""""""" @@ -586,7 +586,7 @@ Also for helm-chart package: You can also manually specify (it's auto-completable) list of packages to run the command for including individual -providers - you can mix apache-airflow, helm-chart and provider packages this way: +providers - you can mix apache-airflow, helm-chart and providers this way: .. code-block:: bash @@ -674,18 +674,18 @@ You can prepare airflow packages using Breeze: .. code-block:: bash - breeze release-management prepare-task-sdk-package + breeze release-management prepare-task-sdk-distributions This prepares airflow Task SDK .whl package in the dist folder. -Again, you can specify optional ``--package-format`` flag to build selected formats of the Task SDK packages, +Again, you can specify optional ``--distribution-format`` flag to build selected formats of the Task SDK packages, default is to build ``both`` type of packages ``sdist`` and ``wheel``. .. code-block:: bash - breeze release-management prepare-task-sdk-package --package-format=wheel + breeze release-management prepare-task-sdk-distributions --distribution-format=wheel -.. image:: ./images/output_release-management_prepare-task-sdk-package.svg - :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg +.. image:: ./images/output_release-management_prepare-task-sdk-distributions.svg + :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.svg :width: 100% - :alt: Breeze release-management prepare-task-sdk-package + :alt: Breeze release-management prepare-task-sdk-distributions diff --git a/dev/breeze/doc/10_advanced_breeze_topics.rst b/dev/breeze/doc/10_advanced_breeze_topics.rst index b8354fddf8e93..1f770410e8969 100644 --- a/dev/breeze/doc/10_advanced_breeze_topics.rst +++ b/dev/breeze/doc/10_advanced_breeze_topics.rst @@ -116,7 +116,7 @@ After you run Breeze for the first time, you will have empty directory ``files`` which will be mapped to ``/files`` in your Docker container. You can pass there any files you need to configure and run Docker. They will not be removed between Docker runs. -By default ``/files/dags`` folder is mounted from your local ``/files/dags`` and this is +By default ``/files/dags`` folder is mounted from your local ``/files/dags`` and this is the directory used by airflow scheduler and webserver to scan dags for. You can use it to test your dags from local sources in Airflow. If you wish to add local DAGs that can be run by Breeze. diff --git a/dev/breeze/doc/ci/02_images.md b/dev/breeze/doc/ci/02_images.md index 840eacbcf0793..32aa6a80bd255 100644 --- a/dev/breeze/doc/ci/02_images.md +++ b/dev/breeze/doc/ci/02_images.md @@ -203,11 +203,11 @@ pip install "https://github.com/apache/airflow/archive/.tar.gz#egg=apache-a ``` You can also skip installing airflow and install it from locally -provided files by using `--install-packages-from-context` parameter to +provided files by using `--install-distributions-from-context` parameter to Breeze: ``` bash -breeze prod-image build --python 3.9 --additional-airflow-extras=trino --install-packages-from-context +breeze prod-image build --python 3.9 --additional-airflow-extras=trino --install-distributions-from-context ``` In this case you airflow and all packages (.whl files) should be placed diff --git a/dev/breeze/doc/ci/05_workflows.md b/dev/breeze/doc/ci/05_workflows.md index 0c66505508f02..8db97a96a8dea 100644 --- a/dev/breeze/doc/ci/05_workflows.md +++ b/dev/breeze/doc/ci/05_workflows.md @@ -146,41 +146,41 @@ the table below. This workflow is a regular workflow that performs all checks of Airflow code. The `main` and `v*-*-test` pushes are `canary` runs. -| Job | Description | PR | main | v*-*-test | -|---------------------------------|----------------------------------------------------------|---------|---------|-----------| -| Build info | Prints detailed information about the build | Yes | Yes | Yes | -| Push early cache & images | Pushes early cache/images to GitHub Registry | | Yes (2) | Yes (2) | -| Check that image builds quickly | Checks that image builds quickly | | Yes | Yes | -| Build CI images | Builds images | Yes | Yes | Yes | -| Generate constraints/CI verify | Generate constraints for the build and verify CI image | Yes | Yes | Yes | -| Build PROD images | Builds images | Yes | Yes | Yes (3) | -| Run breeze tests | Run unit tests for Breeze | Yes | Yes | Yes | -| Test OpenAPI client gen | Tests if OpenAPIClient continues to generate | Yes | Yes | Yes | -| React WWW tests | React UI tests for new Airflow UI | Yes | Yes | Yes | -| Test examples image building | Tests if PROD image build examples work | Yes | Yes | Yes | -| Test git clone on Windows | Tests if Git clone for for Windows | Yes (4) | Yes (4) | Yes (4) | -| Upgrade checks | Performs checks if there are some pending upgrades | | Yes | Yes | -| Static checks | Performs full static checks | Yes (5) | Yes | Yes (6) | -| Basic static checks | Performs basic static checks (no image) | Yes (5) | | | -| Build and publish docs | Builds and tests publishing of the documentation | Yes (8) | Yes (8) | Yes (8) | -| Spellcheck docs | Spellcheck docs | Yes | Yes | Yes (7) | -| Tests wheel provider packages | Tests if provider packages can be built and released | Yes | Yes | | -| Tests Airflow compatibility | Compatibility of provider packages with older Airflow | Yes | Yes | | -| Tests dist provider packages | Tests if dist provider packages can be built | | Yes | | -| Tests airflow release commands | Tests if airflow release command works | | Yes | Yes | -| DB tests matrix | Run the Pytest unit DB tests | Yes | Yes | Yes (7) | -| No DB tests | Run the Pytest unit Non-DB tests (with pytest-xdist) | Yes | Yes | Yes (7) | -| Integration tests | Runs integration tests (Postgres/Mysql) | Yes | Yes | Yes (7) | -| Quarantined tests | Runs quarantined tests (with flakiness and side-effects) | Yes | Yes | Yes (7) | -| Test airflow packages | Tests that Airflow package can be built and released | Yes | Yes | Yes | -| Helm tests | Run the Helm integration tests | Yes | Yes | | -| Helm release tests | Run the tests for Helm releasing | Yes | Yes | | -| Summarize warnings | Summarizes warnings from all other tests | Yes | Yes | Yes | -| Docker Compose test/PROD verify | Tests quick-start Docker Compose and verify PROD image | Yes | Yes | Yes | -| Tests Kubernetes | Run Kubernetes test | Yes | Yes | | -| Update constraints | Upgrade constraints to latest ones | Yes | Yes (2) | Yes (2) | -| Push cache & images | Pushes cache/images to GitHub Registry (3) | | Yes (3) | | -| Build CI ARM images | Builds CI images for ARM | Yes (9) | | | +| Job | Description | PR | main | v*-*-test | +|------------------------------------|------------------------------------------------------------|---------|---------|-----------| +| Build info | Prints detailed information about the build | Yes | Yes | Yes | +| Push early cache & images | Pushes early cache/images to GitHub Registry | | Yes (2) | Yes (2) | +| Check that image builds quickly | Checks that image builds quickly | | Yes | Yes | +| Build CI images | Builds images | Yes | Yes | Yes | +| Generate constraints/CI verify | Generate constraints for the build and verify CI image | Yes | Yes | Yes | +| Build PROD images | Builds images | Yes | Yes | Yes (3) | +| Run breeze tests | Run unit tests for Breeze | Yes | Yes | Yes | +| Test OpenAPI client gen | Tests if OpenAPIClient continues to generate | Yes | Yes | Yes | +| React WWW tests | React UI tests for new Airflow UI | Yes | Yes | Yes | +| Test examples image building | Tests if PROD image build examples work | Yes | Yes | Yes | +| Test git clone on Windows | Tests if Git clone for for Windows | Yes (4) | Yes (4) | Yes (4) | +| Upgrade checks | Performs checks if there are some pending upgrades | | Yes | Yes | +| Static checks | Performs full static checks | Yes (5) | Yes | Yes (6) | +| Basic static checks | Performs basic static checks (no image) | Yes (5) | | | +| Build and publish docs | Builds and tests publishing of the documentation | Yes (8) | Yes (8) | Yes (8) | +| Spellcheck docs | Spellcheck docs | Yes | Yes | Yes (7) | +| Tests wheel provider distributions | Tests if provider distributions can be built and released | Yes | Yes | | +| Tests Airflow compatibility | Compatibility of provider distributions with older Airflow | Yes | Yes | | +| Tests dist provider distributions | Tests if dist provider distributions can be built | | Yes | | +| Tests airflow release commands | Tests if airflow release command works | | Yes | Yes | +| DB tests matrix | Run the Pytest unit DB tests | Yes | Yes | Yes (7) | +| No DB tests | Run the Pytest unit Non-DB tests (with pytest-xdist) | Yes | Yes | Yes (7) | +| Integration tests | Runs integration tests (Postgres/Mysql) | Yes | Yes | Yes (7) | +| Quarantined tests | Runs quarantined tests (with flakiness and side-effects) | Yes | Yes | Yes (7) | +| Test airflow packages | Tests that Airflow package can be built and released | Yes | Yes | Yes | +| Helm tests | Run the Helm integration tests | Yes | Yes | | +| Helm release tests | Run the tests for Helm releasing | Yes | Yes | | +| Summarize warnings | Summarizes warnings from all other tests | Yes | Yes | Yes | +| Docker Compose test/PROD verify | Tests quick-start Docker Compose and verify PROD image | Yes | Yes | Yes | +| Tests Kubernetes | Run Kubernetes test | Yes | Yes | | +| Update constraints | Upgrade constraints to latest ones | Yes | Yes (2) | Yes (2) | +| Push cache & images | Pushes cache/images to GitHub Registry (3) | | Yes (3) | | +| Build CI ARM images | Builds CI images for ARM | Yes (9) | | | `(1)` Scheduled jobs builds images from scratch - to test if everything works properly for clean builds diff --git a/dev/breeze/doc/images/output-commands-hash.txt b/dev/breeze/doc/images/output-commands-hash.txt index 5d1f0642ef7ba..5313a2f98201a 100644 --- a/dev/breeze/doc/images/output-commands-hash.txt +++ b/dev/breeze/doc/images/output-commands-hash.txt @@ -41,16 +41,16 @@ release-management:create-minor-branch:a3834afc4aa5d1e98002c9e9e7a9931d release-management:generate-constraints:01aef235b11e59ed7f10c970a5cdaba7 release-management:generate-issue-content-providers:cda108e7f2506c2816af8f2a6c24070c release-management:generate-providers-metadata:d4e8e5cfaa024e3963af02d7a873048d -release-management:install-provider-packages:34c38aca17d23dbb454fe7a6bfd8e630 -release-management:prepare-airflow-package:85d01c57e5b5ee0fb9e5f9d9706ed3b5 +release-management:install-provider-distributions:34c38aca17d23dbb454fe7a6bfd8e630 +release-management:prepare-airflow-distributions:85d01c57e5b5ee0fb9e5f9d9706ed3b5 release-management:prepare-provider-documentation:eb861d68b8d72cd98dc8732fc5393796 -release-management:prepare-provider-packages:908e2c826f7b4959dfd8bc693f3857a7 +release-management:prepare-provider-distributions:908e2c826f7b4959dfd8bc693f3857a7 release-management:publish-docs:51ee9bf1268529513996a14bd5350c19 release-management:release-prod-images:cfbfe8b19fee91fd90718f98ef2fd078 release-management:start-rc-process:b27bd524dd3c89f50a747b60a7e892c1 release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef -release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a +release-management:verify-provider-distributions:96dce5644aad6b37080acf77b3d8de3a release-management:59d956e45fccf55e47f16e33cfc5d04a sbom:build-all-airflow-images:32f8acade299c2b112e986bae99846db sbom:generate-providers-requirements:3926848718283cf2ef00310a0892e867 diff --git a/dev/breeze/doc/images/output_build-docs.svg b/dev/breeze/doc/images/output_build-docs.svg index 115920257c9d6..25dd164a0ba91 100644 --- a/dev/breeze/doc/images/output_build-docs.svg +++ b/dev/breeze/doc/images/output_build-docs.svg @@ -220,7 +220,7 @@ │--one-pass-onlyBuilds documentation in one pass only. This is useful for debugging sphinx       â”‚ │errors.                                                                          â”‚ │--skip-deletionSkip deletion of generated new packages documentation in                         â”‚ -│`docs/apache-airflow-providers-*`.                                               â”‚ +│`docs/apache-airflow-providers-*` anddocs/apache-airflow/.                       â”‚ │--package-filterFilter(s) to use more than one can be specified. You can use glob pattern        â”‚ │matching the full package name, for example `apache-airflow-providers-*`. Useful â”‚ │when you want to selectseveral similarly named packages together.                â”‚ @@ -230,7 +230,7 @@ │--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ │--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)│ │[default: autodetect]                                         â”‚ -│--package-listOptional, contains comma-separated list of package ids that are processed for    â”‚ +│--distributions-listOptional, contains comma-separated list of package ids that are processed for    â”‚ │documentation building, and document publishing. It is an easier alternative to  â”‚ │adding individual packages as arguments to every command. This overrides the     â”‚ │packages passed as arguments.                                                    â”‚ diff --git a/dev/breeze/doc/images/output_build-docs.txt b/dev/breeze/doc/images/output_build-docs.txt index 4c31f473d8600..a2bfaac971fcd 100644 --- a/dev/breeze/doc/images/output_build-docs.txt +++ b/dev/breeze/doc/images/output_build-docs.txt @@ -1 +1 @@ -1464900883acc757de0795666f0f6e7f +8c3469cb20447510da111e0e59c97ae2 diff --git a/dev/breeze/doc/images/output_prod-image_build.svg b/dev/breeze/doc/images/output_prod-image_build.svg index f074b122bbe04..5cbe76d6213c9 100644 --- a/dev/breeze/doc/images/output_prod-image_build.svg +++ b/dev/breeze/doc/images/output_prod-image_build.svg @@ -1,4 +1,4 @@ - + │--additional-runtime-apt-envAdditional environment variables set when adding runtime dependencies.(TEXT)│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Advanced customization options (for specific customization needs) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--installation-methodInstall Airflow from: sources or PyPI.(. | apache-airflow)[default: .]│ -│--install-airflow-referenceInstall Airflow using GitHub tag or branch.(TEXT)│ -│--install-packages-from-contextInstall wheels from local docker-context-files when building image.       â”‚ -│Implies --disable-airflow-repo-cache.                                     â”‚ -│--install-mysql-client-typeWhich client to choose when installing.(mariadb | mysql)│ -│--cleanup-contextClean up docker context files before running build (cannot be used        â”‚ -│together with --install-packages-from-context).                           â”‚ -│--use-constraints-for-context-packagesUses constraints for context packages installation - either from          â”‚ -│constraints store in docker-context-files or from github.                 â”‚ -│--disable-airflow-repo-cacheDisable cache from Airflow repository during building.│ -│--disable-mysql-client-installationDo not install MySQL client.│ -│--disable-mssql-client-installationDo not install MsSQl client.│ -│--disable-postgres-client-installationDo not install Postgres client.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Preparing cache and push (for maintainers and CI) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)│ -│[default: autodetect]                                         â”‚ -│--platformPlatform for Airflow image.(linux/amd64 | linux/arm64 | linux/amd64,linux/arm64)│ -│--pushPush image after building it.│ -│--prepare-buildx-cachePrepares build cache (this is done as separate per-platform steps instead of building the â”‚ -│image).                                                                                   â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Github authentication â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ -│--github-tokenThe token used to authenticate to GitHub.(TEXT)│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--answer-aForce answer to questions.(y | n | q | yes | no | quit)│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--verbose-vPrint verbose information about performed steps.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +│--installation-methodInstall Airflow from: sources or PyPI.(. | apache-airflow)│ +│[default: .]                          â”‚ +│--install-airflow-referenceInstall Airflow using GitHub tag or branch.(TEXT)│ +│--install-distributions-from-contextInstall distributions from local docker-context-files when building  â”‚ +│image. Implies --disable-airflow-repo-cache│ +│--install-mysql-client-typeWhich client to choose when installing.(mariadb | mysql)│ +│--cleanup-contextClean up docker context files before running build (cannot be used   â”‚ +│together with --install-distributions-from-context).                 â”‚ +│--use-constraints-for-context-distributionsUses constraints for context distributions installation - either from│ +│constraints store in docker-context-files or from github.            â”‚ +│--disable-airflow-repo-cacheDisable cache from Airflow repository during building.│ +│--disable-mysql-client-installationDo not install MySQL client.│ +│--disable-mssql-client-installationDo not install MsSQl client.│ +│--disable-postgres-client-installationDo not install Postgres client.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Preparing cache and push (for maintainers and CI) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)│ +│[default: autodetect]                                         â”‚ +│--platformPlatform for Airflow image.(linux/amd64 | linux/arm64 | linux/amd64,linux/arm64)│ +│--pushPush image after building it.│ +│--prepare-buildx-cachePrepares build cache (this is done as separate per-platform steps instead of building the â”‚ +│image).                                                                                   â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Github authentication â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ +│--github-tokenThe token used to authenticate to GitHub.(TEXT)│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--answer-aForce answer to questions.(y | n | q | yes | no | quit)│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--verbose-vPrint verbose information about performed steps.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/dev/breeze/doc/images/output_prod-image_build.txt b/dev/breeze/doc/images/output_prod-image_build.txt index 3b29aa41b4f44..ec53866b2f369 100644 --- a/dev/breeze/doc/images/output_prod-image_build.txt +++ b/dev/breeze/doc/images/output_prod-image_build.txt @@ -1 +1 @@ -7ae94b08487a2f3aa25324f0ca46967c +ecf08e6444121e48f145c0ef0c14ec10 diff --git a/dev/breeze/doc/images/output_release-management.svg b/dev/breeze/doc/images/output_release-management.svg index 2798700d8e26e..d9add4d027362 100644 --- a/dev/breeze/doc/images/output_release-management.svg +++ b/dev/breeze/doc/images/output_release-management.svg @@ -188,13 +188,13 @@ │--help-hShow this message and exit.│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Airflow release commands â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│create-minor-branch              Create a new version branch and update the default branches in main              â”‚ -│prepare-airflow-package          Prepare sdist/whl package of Airflow.                                            â”‚ -│prepare-airflow-tarball          Prepare airflow's source tarball.                                                â”‚ -│start-rc-process                 Start RC process                                                                 â”‚ -│start-release                    Start Airflow release process                                                    â”‚ -│release-prod-images              Release production images to DockerHub (needs DockerHub permissions).            â”‚ -│generate-issue-content-core      Generates content for issue to test the core release.                            â”‚ +│create-minor-branch               Create a new version branch and update the default branches in main             â”‚ +│prepare-airflow-distributions     Prepare sdist/whl package of Airflow.                                           â”‚ +│prepare-airflow-tarball           Prepare airflow's source tarball.                                               â”‚ +│start-rc-process                  Start RC process                                                                â”‚ +│start-release                     Start Airflow release process                                                   â”‚ +│release-prod-images               Release production images to DockerHub (needs DockerHub permissions).           â”‚ +│generate-issue-content-core       Generates content for issue to test the core release.                           â”‚ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Helm release commands â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® │prepare-helm-chart-tarball               Prepares helm chart tarball.                                             â”‚ @@ -203,9 +203,9 @@ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Providers release commands â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® │prepare-provider-documentation      Prepare CHANGELOG, README and COMMITS information for providers.              â”‚ -│prepare-provider-packages           Prepare sdist/whl packages of Airflow Providers.                              â”‚ -│install-provider-packages           Installs provider packages that can be found in dist.                         â”‚ -│verify-provider-packages            Verifies if all provider code is following expectations for providers.        â”‚ +│prepare-provider-distributions      Prepare sdist/whl distributions of Airflow Providers.                         â”‚ +│install-provider-distributions      Installs provider distributiobs that can be found in dist.                    â”‚ +│verify-provider-distributions       Verifies if all provider code is following expectations for providers.        â”‚ │generate-providers-metadata         Generates metadata for providers.                                             â”‚ │generate-issue-content-providers    Generates content for issue to test the release.                              â”‚ │clean-old-provider-artifacts        Cleans the old provider artifacts                                             â”‚ @@ -219,7 +219,7 @@ │update-constraints      Update released constraints with manual changes.                                          â”‚ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│prepare-task-sdk-package                Prepare sdist/whl package of Airflow Task SDK.                            â”‚ +│prepare-task-sdk-distributions            Prepare sdist/whl distributions of Airflow Task SDK.                    â”‚ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/dev/breeze/doc/images/output_release-management.txt b/dev/breeze/doc/images/output_release-management.txt index a186de953f690..260d4f57d3568 100644 --- a/dev/breeze/doc/images/output_release-management.txt +++ b/dev/breeze/doc/images/output_release-management.txt @@ -1 +1 @@ -dbd26a6fc8d708bcbbe450896906bef6 +5b9d8d0d2217ae133c1ed2d006855fd9 diff --git a/dev/breeze/doc/images/output_release-management_generate-constraints.svg b/dev/breeze/doc/images/output_release-management_generate-constraints.svg index e0ff7f632c746..7e59f4ef47663 100644 --- a/dev/breeze/doc/images/output_release-management_generate-constraints.svg +++ b/dev/breeze/doc/images/output_release-management_generate-constraints.svg @@ -165,7 +165,7 @@ │--airflow-constraints-modeMode of constraints for Airflow for CI image building.                 â”‚ │(constraints-source-providers | constraints | constraints-no-providers)│ │[default: constraints-source-providers]                                â”‚ -│--chicken-egg-providersList of chicken-egg provider packages - those that have airflow_version >=          â”‚ +│--chicken-egg-providersList of chicken-egg provider distributions - those that have airflow_version >=     â”‚ │current_version and should be installed in CI from locally built packages with >=   â”‚ │current_version.dev0                                                                â”‚ │(TEXT)                                                                              â”‚ diff --git a/dev/breeze/doc/images/output_release-management_generate-constraints.txt b/dev/breeze/doc/images/output_release-management_generate-constraints.txt index 2cefef2a88e82..2b103d4a6e36c 100644 --- a/dev/breeze/doc/images/output_release-management_generate-constraints.txt +++ b/dev/breeze/doc/images/output_release-management_generate-constraints.txt @@ -1 +1 @@ -255ad61b290f7ec3bf4f607d8e1509bf +10a76e16ce8bc323c3f4af9c72c39b76 diff --git a/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt b/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt index 5d794b803309c..fa041cdd567e1 100644 --- a/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt +++ b/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt @@ -1 +1 @@ -c36ba7b31e3cb5be446651562b7903b4 +4774c20e193219d29c16360cde0665ea diff --git a/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg b/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg new file mode 100644 index 0000000000000..cc6acdc9ee45e --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_install-provider-distributions.svg @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Command: release-management install-provider-distributions + + + + + + + + + + +Usage:breeze release-management install-provider-distributions[OPTIONS] + +Installs provider distributiobs that can be found in dist. + +╭─ Provider installation flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--python-pPython major/minor version used in Airflow image for images.(>3.9< | 3.10 | 3.11 | 3.12)│ +│[default: 3.9]                                              â”‚ +│--mount-sourcesChoose scope of local sources that should be mounted, skipped, or removed (default =       â”‚ +│selected).                                                                                 â”‚ +│(selected | all | skip | remove | tests | providers-and-tests)                             â”‚ +│[default: selected]                                                                        â”‚ +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Installing packages after entering shell â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--airflow-constraints-locationLocation of airflow constraints to use (remote URL or local context file).│ +│(TEXT)                                                                    â”‚ +│--airflow-constraints-modeMode of constraints for Airflow for CI image building.                 â”‚ +│(constraints-source-providers | constraints | constraints-no-providers)│ +│[default: constraints-source-providers]                                â”‚ +│--airflow-constraints-referenceConstraint reference to use for airflow installation (used in calculated       â”‚ +│constraints URL).                                                              â”‚ +│(TEXT)                                                                         â”‚ +│--airflow-extrasAirflow extras to install when --use-airflow-version is used(TEXT)│ +│[default: ""]                                               â”‚ +│--airflow-skip-constraintsDo not use constraints when installing airflow.│ +│--clean-airflow-installationClean the airflow installation before installing version specified by          â”‚ +│--use-airflow-version.                                                         â”‚ +│--install-selected-providersComma-separated list of providers selected to be installed (implies            â”‚ +│--use-distributions-from-dist).                                                â”‚ +│(TEXT)                                                                         â”‚ +│--distribution-formatFormat of packages that should be installed from dist.(wheel | sdist)│ +│[default: wheel]                                      â”‚ +│--providers-constraints-locationLocation of providers constraints to use (remote URL or local context file).│ +│(TEXT)                                                                      â”‚ +│--providers-constraints-modeMode of constraints for Providers for CI image building.               â”‚ +│(constraints-source-providers | constraints | constraints-no-providers)│ +│[default: constraints-source-providers]                                â”‚ +│--providers-constraints-referenceConstraint reference to use for providers installation (used in calculated     â”‚ +│constraints URL). Can be 'default' in which case the default                   â”‚ +│constraints-reference is used.                                                 â”‚ +│(TEXT)                                                                         â”‚ +│--providers-skip-constraintsDo not use constraints when installing providers.│ +│--use-airflow-versionUse (reinstall at entry) Airflow version from PyPI. It can also be version (to â”‚ +│install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, â”‚ +│or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).│ +│Implies --mount-sources `remove`.                                              â”‚ +│(none | wheel | sdist | <airflow_version>)                                     â”‚ +│--use-distributions-from-distInstall all found distributions (--distribution-format determines type) from   â”‚ +│'dist' folder when entering breeze.                                            â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Parallel running â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--run-in-parallelRun the operation in parallel on all or selected subset of parameters.│ +│--parallelismMaximum number of processes to use while running the operation in parallel.│ +│(INTEGER RANGE)                                                            â”‚ +│[default: 4; 1<=x<=8]                                                      â”‚ +│--skip-cleanupSkip cleanup of temporary files created during parallel run.│ +│--include-success-outputsWhether to include outputs of successful parallel runs (skipped by default).│ +│--debug-resourcesWhether to show resource information while running in parallel.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--verbose-vPrint verbose information about performed steps.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + diff --git a/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt b/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt new file mode 100644 index 0000000000000..f3e16dfb8eee5 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt @@ -0,0 +1 @@ +909874eb2c67c469f0d1e80050016ef4 diff --git a/dev/breeze/doc/images/output_release-management_install-provider-packages.svg b/dev/breeze/doc/images/output_release-management_install-provider-packages.svg deleted file mode 100644 index 594dc76523b6d..0000000000000 --- a/dev/breeze/doc/images/output_release-management_install-provider-packages.svg +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Command: release-management install-provider-packages - - - - - - - - - - -Usage:breeze release-management install-provider-packages[OPTIONS] - -Installs provider packages that can be found in dist. - -╭─ Provider installation flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--python-pPython major/minor version used in Airflow image for images.(>3.9< | 3.10 | 3.11 | 3.12)│ -│[default: 3.9]                                              â”‚ -│--mount-sourcesChoose scope of local sources that should be mounted, skipped, or removed (default =       â”‚ -│selected).                                                                                 â”‚ -│(selected | all | skip | remove | tests | providers-and-tests)                             â”‚ -│[default: selected]                                                                        â”‚ -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Installing packages after entering shell â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--airflow-constraints-locationLocation of airflow constraints to use (remote URL or local context file).│ -│(TEXT)                                                                    â”‚ -│--airflow-constraints-modeMode of constraints for Airflow for CI image building.                 â”‚ -│(constraints-source-providers | constraints | constraints-no-providers)│ -│[default: constraints-source-providers]                                â”‚ -│--airflow-constraints-referenceConstraint reference to use for airflow installation (used in calculated       â”‚ -│constraints URL).                                                              â”‚ -│(TEXT)                                                                         â”‚ -│--airflow-extrasAirflow extras to install when --use-airflow-version is used(TEXT)│ -│[default: ""]                                               â”‚ -│--airflow-skip-constraintsDo not use constraints when installing airflow.│ -│--clean-airflow-installationClean the airflow installation before installing version specified by          â”‚ -│--use-airflow-version.                                                         â”‚ -│--install-selected-providersComma-separated list of providers selected to be installed (implies            â”‚ -│--use-packages-from-dist).                                                     â”‚ -│(TEXT)                                                                         â”‚ -│--package-formatFormat of packages that should be installed from dist.(wheel | sdist)│ -│[default: wheel]                                      â”‚ -│--providers-constraints-locationLocation of providers constraints to use (remote URL or local context file).│ -│(TEXT)                                                                      â”‚ -│--providers-constraints-modeMode of constraints for Providers for CI image building.               â”‚ -│(constraints-source-providers | constraints | constraints-no-providers)│ -│[default: constraints-source-providers]                                â”‚ -│--providers-constraints-referenceConstraint reference to use for providers installation (used in calculated     â”‚ -│constraints URL). Can be 'default' in which case the default                   â”‚ -│constraints-reference is used.                                                 â”‚ -│(TEXT)                                                                         â”‚ -│--providers-skip-constraintsDo not use constraints when installing providers.│ -│--use-airflow-versionUse (reinstall at entry) Airflow version from PyPI. It can also be version (to â”‚ -│install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, â”‚ -│or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).│ -│Implies --mount-sources `remove`.                                              â”‚ -│(none | wheel | sdist | <airflow_version>)                                     â”‚ -│--use-packages-from-distInstall all found packages (--package-format determines type) from 'dist'      â”‚ -│folder when entering breeze.                                                   â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Parallel running â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--run-in-parallelRun the operation in parallel on all or selected subset of parameters.│ -│--parallelismMaximum number of processes to use while running the operation in parallel.│ -│(INTEGER RANGE)                                                            â”‚ -│[default: 4; 1<=x<=8]                                                      â”‚ -│--skip-cleanupSkip cleanup of temporary files created during parallel run.│ -│--include-success-outputsWhether to include outputs of successful parallel runs (skipped by default).│ -│--debug-resourcesWhether to show resource information while running in parallel.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--verbose-vPrint verbose information about performed steps.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - - - - diff --git a/dev/breeze/doc/images/output_release-management_install-provider-packages.txt b/dev/breeze/doc/images/output_release-management_install-provider-packages.txt deleted file mode 100644 index 03c8d13cb294f..0000000000000 --- a/dev/breeze/doc/images/output_release-management_install-provider-packages.txt +++ /dev/null @@ -1 +0,0 @@ -d268aa8d56617f065ff8049e37ac60f9 diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.svg b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.svg new file mode 100644 index 0000000000000..b62d88d9a2460 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Command: release-management prepare-airflow-distributions + + + + + + + + + + +Usage:breeze release-management prepare-airflow-distributions[OPTIONS] + +Prepare sdist/whl package of Airflow. + +╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--distribution-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ +│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ +│--use-local-hatchUse local hatch instead of docker to build the package. You need to have hatch         â”‚ +│installed.                                                                             â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--verbose-vPrint verbose information about performed steps.│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt new file mode 100644 index 0000000000000..26c92b065d1e8 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt @@ -0,0 +1 @@ +052b523bdfbc1e76a06f4d102d12079c diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg b/dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg deleted file mode 100644 index d33af59946c2d..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-airflow-package.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Command: release-management prepare-airflow-package - - - - - - - - - - -Usage:breeze release-management prepare-airflow-package[OPTIONS] - -Prepare sdist/whl package of Airflow. - -╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--package-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ -│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ -│--use-local-hatchUse local hatch instead of docker to build the package. You need to have hatch         â”‚ -│installed.                                                                             â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--verbose-vPrint verbose information about performed steps.│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - - - - diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-package.txt b/dev/breeze/doc/images/output_release-management_prepare-airflow-package.txt deleted file mode 100644 index 16cf127f553ac..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-airflow-package.txt +++ /dev/null @@ -1 +0,0 @@ -fe93d72f5d749f318b0a13294ea95d08 diff --git a/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.svg b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.svg new file mode 100644 index 0000000000000..6e017b5c3d67c --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Command: release-management prepare-provider-distributions + + + + + + + + + + +Usage:                                                                                                                 +breeze release-management prepare-provider-distributions                                                               +[OPTIONS] [airbyte | alibaba | amazon | apache.beam | apache.cassandra | apache.drill | apache.druid | apache.flink |  +apache.hdfs | apache.hive | apache.iceberg | apache.impala | apache.kafka | apache.kylin | apache.livy | apache.pig |  +apache.pinot | apache.spark | apprise | arangodb | asana | atlassian.jira | celery | cloudant | cncf.kubernetes |      +cohere | common.compat | common.io | common.sql | databricks | datadog | dbt.cloud | dingding | discord | docker |     +elasticsearch | exasol | facebook | ftp | github | google | grpc | hashicorp | http | imap | influxdb | jdbc | jenkins +microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |       +openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     +presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    +sqlite | ssh | standard | tableau | telegram | teradata | trino | vertica | weaviate | yandex | ydb | zendesk]...      + +Prepare sdist/whl distributions of Airflow Providers. + +╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--clean-distClean dist directory before building packages. Useful when you want to build   â”‚ +│multiple packages  in a clean environment                                      â”‚ +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)│ +│[default: apache/airflow]                       â”‚ +│--include-not-ready-providersWhether to include providers that are not yet ready to be released.│ +│--include-removed-providersWhether to include providers that are removed.│ +│--distribution-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ +│--distributions-list-fileRead list of packages from text file (one package per line).(FILENAME)│ +│--skip-deleting-generated-filesSkip deleting files that were used to generate provider package. Useful for    â”‚ +│debugging and developing changes to the build process.                         â”‚ +│--skip-tag-checkSkip checking if the tag already exists in the remote repository│ +│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ +│--version-suffix-for-localVersion suffix for local builds. Do not provide the leading plus sign ('+').   â”‚ +│The suffix must contain only ascii letters, numbers, and periods. The first    â”‚ +│character must be an ascii letter or number and the last character must be an  â”‚ +│ascii letter or number. Note: the local suffix will be appended after the PyPi â”‚ +│suffix if both are provided.                                                   â”‚ +│(TEXT)                                                                         â”‚ +│--distributions-listOptional, contains comma-separated list of package ids that are processed for  â”‚ +│documentation building, and document publishing. It is an easier alternative to│ +│adding individual packages as arguments to every command. This overrides the   â”‚ +│packages passed as arguments.                                                  â”‚ +│(TEXT)                                                                         â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--verbose-vPrint verbose information about performed steps.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + diff --git a/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt new file mode 100644 index 0000000000000..dd88aa7321fa1 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt @@ -0,0 +1 @@ +9f2866148d0ee090eefb432d5b050c4e diff --git a/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt b/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt index 61406ae93a248..afcb3a71b741e 100644 --- a/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt +++ b/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt @@ -1 +1 @@ -522d2a640a064dc81cd7b53744f80349 +e15b46821ee82c9e60e7e70f340e0555 diff --git a/dev/breeze/doc/images/output_release-management_prepare-provider-packages.svg b/dev/breeze/doc/images/output_release-management_prepare-provider-packages.svg deleted file mode 100644 index 0a8d9670aa54c..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-provider-packages.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Command: release-management prepare-provider-packages - - - - - - - - - - -Usage:                                                                                                                 -breeze release-management prepare-provider-packages                                                                    -[OPTIONS] [airbyte | alibaba | amazon | apache.beam | apache.cassandra | apache.drill | apache.druid | apache.flink |  -apache.hdfs | apache.hive | apache.iceberg | apache.impala | apache.kafka | apache.kylin | apache.livy | apache.pig |  -apache.pinot | apache.spark | apprise | arangodb | asana | atlassian.jira | celery | cloudant | cncf.kubernetes |      -cohere | common.compat | common.io | common.sql | databricks | datadog | dbt.cloud | dingding | discord | docker |     -elasticsearch | exasol | facebook | ftp | github | google | grpc | hashicorp | http | imap | influxdb | jdbc | jenkins -microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |       -openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     -presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    -sqlite | ssh | standard | tableau | telegram | teradata | trino | vertica | weaviate | yandex | ydb | zendesk]...      - -Prepare sdist/whl packages of Airflow Providers. - -╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--clean-distClean dist directory before building packages. Useful when you want to build   â”‚ -│multiple packages  in a clean environment                                      â”‚ -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)│ -│[default: apache/airflow]                       â”‚ -│--include-not-ready-providersWhether to include providers that are not yet ready to be released.│ -│--include-removed-providersWhether to include providers that are removed.│ -│--package-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ -│--package-list-fileRead list of packages from text file (one package per line).(FILENAME)│ -│--skip-deleting-generated-filesSkip deleting files that were used to generate provider package. Useful for    â”‚ -│debugging and developing changes to the build process.                         â”‚ -│--skip-tag-checkSkip checking if the tag already exists in the remote repository│ -│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ -│--version-suffix-for-localVersion suffix for local builds. Do not provide the leading plus sign ('+').   â”‚ -│The suffix must contain only ascii letters, numbers, and periods. The first    â”‚ -│character must be an ascii letter or number and the last character must be an  â”‚ -│ascii letter or number. Note: the local suffix will be appended after the PyPi â”‚ -│suffix if both are provided.                                                   â”‚ -│(TEXT)                                                                         â”‚ -│--package-listOptional, contains comma-separated list of package ids that are processed for  â”‚ -│documentation building, and document publishing. It is an easier alternative to│ -│adding individual packages as arguments to every command. This overrides the   â”‚ -│packages passed as arguments.                                                  â”‚ -│(TEXT)                                                                         â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--verbose-vPrint verbose information about performed steps.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - - - - diff --git a/dev/breeze/doc/images/output_release-management_prepare-provider-packages.txt b/dev/breeze/doc/images/output_release-management_prepare-provider-packages.txt deleted file mode 100644 index 5f7a2c17dc92e..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-provider-packages.txt +++ /dev/null @@ -1 +0,0 @@ -812781cd7a51cbea4ef0c1a5fbc0edd0 diff --git a/dev/breeze/doc/images/output_release-management_prepare-python-client.svg b/dev/breeze/doc/images/output_release-management_prepare-python-client.svg index af4e17bdc8805..535ad02471d40 100644 --- a/dev/breeze/doc/images/output_release-management_prepare-python-client.svg +++ b/dev/breeze/doc/images/output_release-management_prepare-python-client.svg @@ -120,7 +120,7 @@ Prepares python client packages. ╭─ Python client preparation flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--package-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ +│--distribution-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ │--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ │--use-local-hatchUse local hatch instead of docker to build the package. You need to have hatch      â”‚ │installed.                                                                          â”‚ diff --git a/dev/breeze/doc/images/output_release-management_prepare-python-client.txt b/dev/breeze/doc/images/output_release-management_prepare-python-client.txt index bca42ed84ff63..fdf391d9a5157 100644 --- a/dev/breeze/doc/images/output_release-management_prepare-python-client.txt +++ b/dev/breeze/doc/images/output_release-management_prepare-python-client.txt @@ -1 +1 @@ -2a24df4fb60b12ac81b2fcbe151c1f8d +9d7bf20f31979206bbb30193f413f874 diff --git a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.svg b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.svg new file mode 100644 index 0000000000000..c436823dd8d19 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Command: release-management prepare-task-sdk-distributions + + + + + + + + + + +Usage:breeze release-management prepare-task-sdk-distributions[OPTIONS] + +Prepare sdist/whl distributions of Airflow Task SDK. + +╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--distribution-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ +│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ +│--use-local-hatchUse local hatch instead of docker to build the package. You need to have hatch         â”‚ +│installed.                                                                             â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--verbose-vPrint verbose information about performed steps.│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + diff --git a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt new file mode 100644 index 0000000000000..92a6e3f1fbe7d --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt @@ -0,0 +1 @@ +df2448077566fe4edb77c01d9546427e diff --git a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.svg b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.svg deleted file mode 100644 index 3237bf9a944b7..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Command: release-management prepare-task-sdk-package - - - - - - - - - - -Usage:breeze release-management prepare-task-sdk-package[OPTIONS] - -Prepare sdist/whl package of Airflow Task SDK. - -╭─ Package flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--package-formatFormat of packages.(wheel | sdist | both)[default: wheel]│ -│--version-suffix-for-pypiVersion suffix used for PyPI packages (alpha, beta, rc1, etc.).(TEXT)│ -│--use-local-hatchUse local hatch instead of docker to build the package. You need to have hatch         â”‚ -│installed.                                                                             â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--verbose-vPrint verbose information about performed steps.│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - - - - diff --git a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.txt b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.txt deleted file mode 100644 index 97bc3887612bd..0000000000000 --- a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-package.txt +++ /dev/null @@ -1 +0,0 @@ -ca9c1e0902218bfde546addae73ebaae diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.svg b/dev/breeze/doc/images/output_release-management_publish-docs.svg index 9293f2c398f87..745d0843b3e80 100644 --- a/dev/breeze/doc/images/output_release-management_publish-docs.svg +++ b/dev/breeze/doc/images/output_release-management_publish-docs.svg @@ -220,7 +220,7 @@ │matching the full package name, for example `apache-airflow-providers-*`.     â”‚ │Useful when you want to selectseveral similarly named packages together.      â”‚ │(TEXT)                                                                        â”‚ -│--package-listOptional, contains comma-separated list of package ids that are processed for â”‚ +│--distributions-listOptional, contains comma-separated list of package ids that are processed for â”‚ │documentation building, and document publishing. It is an easier alternative  â”‚ │to adding individual packages as arguments to every command. This overrides   â”‚ │the packages passed as arguments.                                             â”‚ diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.txt b/dev/breeze/doc/images/output_release-management_publish-docs.txt index f39757fa453a4..ff51ba37a552d 100644 --- a/dev/breeze/doc/images/output_release-management_publish-docs.txt +++ b/dev/breeze/doc/images/output_release-management_publish-docs.txt @@ -1 +1 @@ -923a2a604d01a06a2c76d1be9b8e2bb0 +34ecaf7e65f8beecd2086b093b4f4e1e diff --git a/dev/breeze/doc/images/output_release-management_release-prod-images.svg b/dev/breeze/doc/images/output_release-management_release-prod-images.svg index dac443f518145..f189f6e9c5ebe 100644 --- a/dev/breeze/doc/images/output_release-management_release-prod-images.svg +++ b/dev/breeze/doc/images/output_release-management_release-prod-images.svg @@ -153,7 +153,7 @@ ╭─ Release PROD IMAGE flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® │*--airflow-versionAirflow version to release (2.3.0, 2.3.0rc1 etc.)(TEXT)[required]│ -│--chicken-egg-providersList of chicken-egg provider packages - those that have airflow_version >=            â”‚ +│--chicken-egg-providersList of chicken-egg provider distributions - those that have airflow_version >=       â”‚ │current_version and should be installed in CI from locally built packages with >=     â”‚ │current_version.dev0                                                                  â”‚ │(TEXT)                                                                                â”‚ diff --git a/dev/breeze/doc/images/output_release-management_release-prod-images.txt b/dev/breeze/doc/images/output_release-management_release-prod-images.txt index 1aa692b45a781..fb3e183250ad6 100644 --- a/dev/breeze/doc/images/output_release-management_release-prod-images.txt +++ b/dev/breeze/doc/images/output_release-management_release-prod-images.txt @@ -1 +1 @@ -288240b459768445e398365736594161 +3458927ab24515697706bc892a79795d diff --git a/dev/breeze/doc/images/output_release-management_verify-provider-distributions.svg b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.svg new file mode 100644 index 0000000000000..5a76af2fa0f73 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.svg @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Command: release-management verify-provider-distributions + + + + + + + + + + +Usage:breeze release-management verify-provider-distributions[OPTIONS] + +Verifies if all provider code is following expectations for providers. + +╭─ Provider verification flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--python-pPython major/minor version used in Airflow image for images.(>3.9< | 3.10 | 3.11 | 3.12)│ +│[default: 3.9]                                              â”‚ +│--mount-sourcesChoose scope of local sources that should be mounted, skipped, or removed (default =       â”‚ +│selected).                                                                                 â”‚ +│(selected | all | skip | remove | tests | providers-and-tests)                             â”‚ +│[default: selected]                                                                        â”‚ +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Installing packages after entering shell â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--airflow-constraints-locationLocation of airflow constraints to use (remote URL or   â”‚ +│local context file).                                    â”‚ +│(TEXT)                                                  â”‚ +│--airflow-constraints-modeMode of constraints for Airflow for CI image building.  â”‚ +│(constraints-source-providers | constraints |           â”‚ +│constraints-no-providers)                               â”‚ +│[default: constraints-source-providers]                 â”‚ +│--airflow-constraints-referenceConstraint reference to use for airflow installation    â”‚ +│(used in calculated constraints URL).                   â”‚ +│(TEXT)                                                  â”‚ +│--airflow-extrasAirflow extras to install when --use-airflow-version is â”‚ +│used                                                    â”‚ +│(TEXT)                                                  â”‚ +│[default: ""]                                           â”‚ +│--airflow-skip-constraintsDo not use constraints when installing airflow.│ +│--clean-airflow-installationClean the airflow installation before installing version│ +│specified by --use-airflow-version.                     â”‚ +│--install-airflow-with-constraints/--no-install-airflow-Install airflow in a separate step, with constraints    â”‚ +│with-constraintsdetermined from package or airflow version.             â”‚ +│[default: no-install-airflow-with-constraints]          â”‚ +│--install-selected-providersComma-separated list of providers selected to be        â”‚ +│installed (implies --use-distributions-from-dist).      â”‚ +│(TEXT)                                                  â”‚ +│--distribution-formatFormat of packages that should be installed from dist.│ +│(wheel | sdist)                                       â”‚ +│[default: wheel]                                      â”‚ +│--providers-constraints-locationLocation of providers constraints to use (remote URL or â”‚ +│local context file).                                    â”‚ +│(TEXT)                                                  â”‚ +│--providers-constraints-modeMode of constraints for Providers for CI image building.│ +│(constraints-source-providers | constraints |           â”‚ +│constraints-no-providers)                               â”‚ +│[default: constraints-source-providers]                 â”‚ +│--providers-constraints-referenceConstraint reference to use for providers installation  â”‚ +│(used in calculated constraints URL). Can be 'default'  â”‚ +│in which case the default constraints-reference is used.│ +│(TEXT)                                                  â”‚ +│--providers-skip-constraintsDo not use constraints when installing providers.│ +│--use-airflow-versionUse (reinstall at entry) Airflow version from PyPI. It  â”‚ +│can also be version (to install from PyPI), `none`,     â”‚ +│`wheel`, or `sdist` to install from `dist` folder, or   â”‚ +│VCS URL to install from                                 â”‚ +│(https://pip.pypa.io/en/stable/topics/vcs-support/).    â”‚ +│Implies --mount-sources `remove`.                       â”‚ +│(none | wheel | sdist | <airflow_version>)              â”‚ +│--use-distributions-from-distInstall all found distributions (--distribution-format│ +│determines type) from 'dist' folder when entering       â”‚ +│breeze.                                                 â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--verbose-vPrint verbose information about performed steps.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + diff --git a/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt new file mode 100644 index 0000000000000..b0fc06426a691 --- /dev/null +++ b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt @@ -0,0 +1 @@ +84114290823d9a471015f1ea06dfcd32 diff --git a/dev/breeze/doc/images/output_release-management_verify-provider-packages.svg b/dev/breeze/doc/images/output_release-management_verify-provider-packages.svg deleted file mode 100644 index bb3791d68aab5..0000000000000 --- a/dev/breeze/doc/images/output_release-management_verify-provider-packages.svg +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Command: release-management verify-provider-packages - - - - - - - - - - -Usage:breeze release-management verify-provider-packages[OPTIONS] - -Verifies if all provider code is following expectations for providers. - -╭─ Provider verification flags â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--python-pPython major/minor version used in Airflow image for images.(>3.9< | 3.10 | 3.11 | 3.12)│ -│[default: 3.9]                                              â”‚ -│--mount-sourcesChoose scope of local sources that should be mounted, skipped, or removed (default =       â”‚ -│selected).                                                                                 â”‚ -│(selected | all | skip | remove | tests | providers-and-tests)                             â”‚ -│[default: selected]                                                                        â”‚ -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Installing packages after entering shell â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--airflow-constraints-locationLocation of airflow constraints to use (remote URL or   â”‚ -│local context file).                                    â”‚ -│(TEXT)                                                  â”‚ -│--airflow-constraints-modeMode of constraints for Airflow for CI image building.  â”‚ -│(constraints-source-providers | constraints |           â”‚ -│constraints-no-providers)                               â”‚ -│[default: constraints-source-providers]                 â”‚ -│--airflow-constraints-referenceConstraint reference to use for airflow installation    â”‚ -│(used in calculated constraints URL).                   â”‚ -│(TEXT)                                                  â”‚ -│--airflow-extrasAirflow extras to install when --use-airflow-version is â”‚ -│used                                                    â”‚ -│(TEXT)                                                  â”‚ -│[default: ""]                                           â”‚ -│--airflow-skip-constraintsDo not use constraints when installing airflow.│ -│--clean-airflow-installationClean the airflow installation before installing version│ -│specified by --use-airflow-version.                     â”‚ -│--install-airflow-with-constraints/--no-install-airflow…Install airflow in a separate step, with constraints    â”‚ -│determined from package or airflow version.             â”‚ -│[default: no-install-airflow-with-constraints]          â”‚ -│--install-selected-providersComma-separated list of providers selected to be        â”‚ -│installed (implies --use-packages-from-dist).           â”‚ -│(TEXT)                                                  â”‚ -│--package-formatFormat of packages that should be installed from dist.│ -│(wheel | sdist)                                       â”‚ -│[default: wheel]                                      â”‚ -│--providers-constraints-locationLocation of providers constraints to use (remote URL or â”‚ -│local context file).                                    â”‚ -│(TEXT)                                                  â”‚ -│--providers-constraints-modeMode of constraints for Providers for CI image building.│ -│(constraints-source-providers | constraints |           â”‚ -│constraints-no-providers)                               â”‚ -│[default: constraints-source-providers]                 â”‚ -│--providers-constraints-referenceConstraint reference to use for providers installation  â”‚ -│(used in calculated constraints URL). Can be 'default'  â”‚ -│in which case the default constraints-reference is used.│ -│(TEXT)                                                  â”‚ -│--providers-skip-constraintsDo not use constraints when installing providers.│ -│--use-airflow-versionUse (reinstall at entry) Airflow version from PyPI. It  â”‚ -│can also be version (to install from PyPI), `none`,     â”‚ -│`wheel`, or `sdist` to install from `dist` folder, or   â”‚ -│VCS URL to install from                                 â”‚ -│(https://pip.pypa.io/en/stable/topics/vcs-support/).    â”‚ -│Implies --mount-sources `remove`.                       â”‚ -│(none | wheel | sdist | <airflow_version>)              â”‚ -│--use-packages-from-distInstall all found packages (--package-format determines â”‚ -│type) from 'dist' folder when entering breeze.          â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--verbose-vPrint verbose information about performed steps.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - - - - diff --git a/dev/breeze/doc/images/output_release-management_verify-provider-packages.txt b/dev/breeze/doc/images/output_release-management_verify-provider-packages.txt deleted file mode 100644 index a82e8464d6980..0000000000000 --- a/dev/breeze/doc/images/output_release-management_verify-provider-packages.txt +++ /dev/null @@ -1 +0,0 @@ -e00b5b4f0bb6e565595f862730c43275 diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg index 8a09606f7865f..871490d17b532 100644 --- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg +++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg @@ -193,14 +193,14 @@ │release-management:create-minor-branch | release-management:generate-constraints |                     â”‚ │release-management:generate-issue-content-core | release-management:generate-issue-content-helm-chart |│ │release-management:generate-issue-content-providers | release-management:generate-providers-metadata | â”‚ -│release-management:install-provider-packages | release-management:prepare-airflow-package |            â”‚ +│release-management:install-provider-distributions | release-management:prepare-airflow-distributions | â”‚ │release-management:prepare-airflow-tarball | release-management:prepare-helm-chart-package |           â”‚ -│release-management:prepare-helm-chart-tarball | release-management:prepare-provider-documentation |    â”‚ -│release-management:prepare-provider-packages | release-management:prepare-python-client |              â”‚ -│release-management:prepare-task-sdk-package | release-management:publish-docs |                        â”‚ +│release-management:prepare-helm-chart-tarball | release-management:prepare-provider-distributions |    â”‚ +│release-management:prepare-provider-documentation | release-management:prepare-python-client |         â”‚ +│release-management:prepare-task-sdk-distributions | release-management:publish-docs |                  â”‚ │release-management:release-prod-images | release-management:start-rc-process |                         â”‚ │release-management:start-release | release-management:tag-providers |                                  â”‚ -│release-management:update-constraints | release-management:verify-provider-packages | sbom |           â”‚ +│release-management:update-constraints | release-management:verify-provider-distributions | sbom |      â”‚ │sbom:build-all-airflow-images | sbom:export-dependency-information |                                   â”‚ │sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |     â”‚ │setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images | setup:self-upgrade â”‚ diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt index 752237f29a627..483196dfaba3f 100644 --- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt +++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt @@ -1 +1 @@ -5cadc746ad4fbd1e583518f1ec63b0fe +7d1fb1bedb5664b7d29b0befd5dfc07f diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg index 4659a7957ffb8..8d4faa5e71e9f 100644 --- a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg +++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg @@ -1,4 +1,4 @@ - + │release-management:generate-constraints | release-management:generate-issue-content-core |          â”‚ │release-management:generate-issue-content-helm-chart |                                              â”‚ │release-management:generate-issue-content-providers | release-management:generate-providers-metadata│ -│| release-management:install-provider-packages | release-management:prepare-airflow-package |       â”‚ -│release-management:prepare-airflow-tarball | release-management:prepare-helm-chart-package |        â”‚ -│release-management:prepare-helm-chart-tarball | release-management:prepare-provider-documentation | â”‚ -│release-management:prepare-provider-packages | release-management:prepare-python-client |           â”‚ -│release-management:prepare-task-sdk-package | release-management:publish-docs |                     â”‚ -│release-management:release-prod-images | release-management:start-rc-process |                      â”‚ -│release-management:start-release | release-management:tag-providers |                               â”‚ -│release-management:update-constraints | release-management:verify-provider-packages | sbom |        â”‚ -│sbom:build-all-airflow-images | sbom:export-dependency-information |                                â”‚ -│sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |  â”‚ -│setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images |                 â”‚ -│setup:self-upgrade | setup:synchronize-local-mounts | setup:version | shell | start-airflow |       â”‚ -│static-checks | testing | testing:core-integration-tests | testing:core-tests |                     â”‚ -│testing:docker-compose-tests | testing:helm-tests | testing:providers-integration-tests |           â”‚ -│testing:providers-tests | testing:python-api-client-tests | testing:system-tests |                  â”‚ -│testing:task-sdk-tests)                                                                             â”‚ -│--check-onlyOnly check if some images need to be regenerated. Return 0 if no need or 1 if needed. Cannot be used│ -│together with --command flag or --force.                                                            â”‚ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® -│--verbose-vPrint verbose information about performed steps.│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +│| release-management:install-provider-distributions |                                               â”‚ +│release-management:prepare-airflow-distributions | release-management:prepare-airflow-tarball |     â”‚ +│release-management:prepare-helm-chart-package | release-management:prepare-helm-chart-tarball |     â”‚ +│release-management:prepare-provider-distributions |                                                 â”‚ +│release-management:prepare-provider-documentation | release-management:prepare-python-client |      â”‚ +│release-management:prepare-task-sdk-distributions | release-management:publish-docs |               â”‚ +│release-management:release-prod-images | release-management:start-rc-process |                      â”‚ +│release-management:start-release | release-management:tag-providers |                               â”‚ +│release-management:update-constraints | release-management:verify-provider-distributions | sbom |   â”‚ +│sbom:build-all-airflow-images | sbom:export-dependency-information |                                â”‚ +│sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |  â”‚ +│setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images |                 â”‚ +│setup:self-upgrade | setup:synchronize-local-mounts | setup:version | shell | start-airflow |       â”‚ +│static-checks | testing | testing:core-integration-tests | testing:core-tests |                     â”‚ +│testing:docker-compose-tests | testing:helm-tests | testing:providers-integration-tests |           â”‚ +│testing:providers-tests | testing:python-api-client-tests | testing:system-tests |                  â”‚ +│testing:task-sdk-tests)                                                                             â”‚ +│--check-onlyOnly check if some images need to be regenerated. Return 0 if no need or 1 if needed. Cannot be used│ +│together with --command flag or --force.                                                            â”‚ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â•® +│--verbose-vPrint verbose information about performed steps.│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt index 43827704d57ac..149f3130c057f 100644 --- a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt +++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt @@ -1 +1 @@ -1f1ce5118bec23a4927d1f0b4c42508b +ed7bc1f439e3d089381ca5373af89734 diff --git a/dev/breeze/doc/images/output_shell.svg b/dev/breeze/doc/images/output_shell.svg index 487340762cff2..c5eded8e1217c 100644 --- a/dev/breeze/doc/images/output_shell.svg +++ b/dev/breeze/doc/images/output_shell.svg @@ -1,4 +1,4 @@ - +