You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2025/03/30 18:06:07 UTC
(airflow) branch main updated: Upgrade ruff to latest version (#48553)
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 47002feacd8 Upgrade ruff to latest version (#48553)
47002feacd8 is described below
commit 47002feacd8aaf794b47c2dd241aa25068354a2a
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Mar 30 20:06:01 2025 +0200
Upgrade ruff to latest version (#48553)
---
.pre-commit-config.yaml | 6 +-
airflow-core/src/airflow/api_fastapi/app.py | 3 +-
.../src/airflow/api_fastapi/core_api/app.py | 2 +-
.../core_api/routes/public/dag_report.py | 2 +-
.../api_fastapi/core_api/routes/public/dag_run.py | 2 +-
.../api_fastapi/core_api/routes/public/plugins.py | 2 +-
.../core_api/routes/public/task_instances.py | 2 +-
.../api_fastapi/core_api/routes/public/tasks.py | 4 +-
.../airflow/api_fastapi/core_api/routes/ui/auth.py | 2 +-
.../core_api/services/ui/connections.py | 6 +-
.../src/airflow/cli/commands/task_command.py | 2 +-
.../src/airflow/cli/commands/variable_command.py | 3 +-
.../src/airflow/dag_processing/collection.py | 5 +-
airflow-core/src/airflow/dag_processing/manager.py | 2 +-
airflow-core/src/airflow/decorators/base.py | 8 +-
.../example_dags/example_params_ui_tutorial.py | 424 ++++++++++-----------
.../src/airflow/executors/executor_utils.py | 6 +-
airflow-core/src/airflow/io/__init__.py | 10 +-
airflow-core/src/airflow/lineage/__init__.py | 4 +-
airflow-core/src/airflow/metrics/statsd_logger.py | 2 +-
airflow-core/src/airflow/metrics/validators.py | 2 +-
airflow-core/src/airflow/models/dag.py | 8 +-
airflow-core/src/airflow/models/xcom.py | 2 +-
airflow-core/src/airflow/policies.py | 2 +-
airflow-core/src/airflow/serialization/helpers.py | 4 +-
airflow-core/src/airflow/serialization/serde.py | 2 +-
.../airflow/serialization/serialized_objects.py | 8 +-
.../airflow/serialization/serializers/builtin.py | 2 +-
.../airflow/serialization/serializers/timezone.py | 4 +-
airflow-core/src/airflow/utils/cli.py | 6 +-
airflow-core/src/airflow/utils/context.py | 2 +-
airflow-core/src/airflow/utils/helpers.py | 4 +-
.../src/airflow/utils/log/logging_mixin.py | 4 +-
airflow-core/src/airflow/utils/session.py | 9 +-
airflow-core/src/airflow/utils/setup_teardown.py | 4 +-
airflow-core/src/airflow/utils/yaml.py | 2 +-
.../auth/managers/test_base_auth_manager.py | 6 +-
.../api_fastapi/core_api/routes/ui/test_dags.py | 2 +-
airflow-core/tests/unit/assets/test_evaluation.py | 12 +-
.../tests/unit/cli/commands/test_db_command.py | 6 +-
.../unit/cli/commands/test_legacy_commands.py | 3 +-
airflow-core/tests/unit/cli/test_cli_parser.py | 6 +-
airflow-core/tests/unit/jobs/test_scheduler_job.py | 12 +-
airflow-core/tests/unit/models/test_dag.py | 6 +-
airflow-core/tests/unit/models/test_dagbag.py | 4 +-
.../tests/unit/models/test_renderedtifields.py | 4 +-
.../tests/unit/models/test_taskinstance.py | 14 +-
airflow-core/tests/unit/models/test_xcom_arg.py | 3 +-
.../unit/sensors/test_external_task_sensor.py | 18 +-
.../unit/serialization/test_dag_serialization.py | 18 +-
.../tests/unit/timetables/test_assets_timetable.py | 42 +-
airflow-ctl/src/airflowctl/api/client.py | 2 +-
clients/python/test_python_client.py | 2 +-
dev/assign_cherry_picked_prs_with_milestone.py | 4 +-
.../airflow_breeze/commands/ci_image_commands.py | 3 +-
.../commands/release_management_commands.py | 6 +-
.../src/airflow_breeze/commands/setup_commands.py | 6 +-
.../airflow_breeze/commands/testing_commands.py | 2 +-
.../src/airflow_breeze/params/shell_params.py | 3 +-
.../prepare_providers/provider_documentation.py | 3 +-
.../airflow_breeze/utils/add_back_references.py | 2 +-
.../airflow_breeze/utils/docker_command_utils.py | 3 +-
dev/breeze/src/airflow_breeze/utils/github.py | 6 +-
.../src/airflow_breeze/utils/kubernetes_utils.py | 12 +-
dev/breeze/src/airflow_breeze/utils/packages.py | 8 +-
.../airflow_breeze/utils/provider_dependencies.py | 3 +-
dev/breeze/src/airflow_breeze/utils/run_utils.py | 3 +-
dev/breeze/src/airflow_breeze/utils/versions.py | 2 +-
dev/breeze/tests/test_selective_checks.py | 6 +-
dev/prepare_bulk_issues.py | 2 +-
dev/system_tests/update_issue_status.py | 3 +-
devel-common/pyproject.toml | 2 +-
devel-common/src/tests_common/pytest_plugin.py | 4 +-
devel-common/src/tests_common/test_utils/compat.py | 3 +-
.../src/tests_common/test_utils/system_tests.py | 6 +-
docker_tests/test_prod_image.py | 10 +-
docs/exts/docs_build/package_filter.py | 2 +-
docs/exts/exampleinclude.py | 3 -
helm_tests/airflow_aux/test_airflow_common.py | 12 +-
helm_tests/airflow_aux/test_basic_helm_chart.py | 12 +-
.../performance_dag/performance_dag_utils.py | 3 +-
.../airflow/providers/alibaba/cloud/hooks/oss.py | 4 +-
.../tests/unit/alibaba/cloud/utils/test_utils.py | 2 +-
.../amazon/aws/auth_manager/aws_auth_manager.py | 26 +-
.../amazon/aws/executors/ecs/ecs_executor.py | 2 +-
.../providers/amazon/aws/hooks/athena_sql.py | 4 +-
.../providers/amazon/aws/hooks/batch_client.py | 3 +-
.../src/airflow/providers/amazon/aws/hooks/dms.py | 4 +-
.../providers/amazon/aws/hooks/redshift_data.py | 3 +-
.../providers/amazon/aws/hooks/sagemaker.py | 2 +-
.../airflow/providers/amazon/aws/links/athena.py | 3 +-
.../airflow/providers/amazon/aws/operators/eks.py | 6 +-
.../providers/amazon/aws/operators/sagemaker.py | 8 +-
.../providers/amazon/aws/sensors/glacier.py | 2 +-
.../src/airflow/providers/amazon/aws/sensors/s3.py | 2 +-
.../providers/amazon/aws/transfers/mongo_to_s3.py | 4 +-
.../providers/amazon/aws/transfers/sql_to_s3.py | 2 +-
.../amazon/tests/system/amazon/aws/example_dms.py | 2 +-
.../tests/system/amazon/aws/example_sagemaker.py | 4 +-
.../amazon/aws/example_sagemaker_endpoint.py | 2 +-
.../aws/executors/batch/test_batch_executor.py | 4 +-
.../amazon/tests/unit/amazon/aws/fs/test_s3.py | 9 +-
.../amazon/tests/unit/amazon/aws/hooks/test_s3.py | 6 +-
.../tests/unit/amazon/aws/links/test_base_aws.py | 12 +-
.../tests/unit/amazon/aws/links/test_batch.py | 3 +-
.../tests/unit/amazon/aws/links/test_sagemaker.py | 3 +-
.../tests/unit/amazon/aws/operators/test_eks.py | 12 +-
.../amazon/aws/operators/test_emr_containers.py | 6 +-
.../aws/operators/test_emr_create_job_flow.py | 6 +-
.../aws/operators/test_emr_terminate_job_flow.py | 6 +-
.../amazon/aws/operators/test_redshift_cluster.py | 24 +-
.../amazon/aws/secrets/test_systems_manager.py | 9 +-
.../unit/amazon/aws/sensors/test_emr_containers.py | 6 +-
.../unit/amazon/aws/sensors/test_emr_job_flow.py | 6 +-
.../tests/unit/amazon/aws/sensors/test_glacier.py | 2 +-
.../amazon/aws/sensors/test_redshift_cluster.py | 6 +-
.../amazon/aws/transfers/test_s3_to_dynamodb.py | 6 +-
.../amazon/aws/utils/test_connection_wrapper.py | 6 +-
.../tests/unit/apache/beam/operators/test_beam.py | 12 +-
.../airflow/providers/apache/drill/hooks/drill.py | 2 +-
.../tests/unit/apache/druid/hooks/test_druid.py | 9 +-
.../system/apache/hive/example_twitter_dag.py | 4 +-
.../unit/apache/hive/operators/test_hive_stats.py | 4 +-
.../unit/apache/hive/transfers/test_s3_to_hive.py | 18 +-
.../unit/apache/spark/hooks/test_spark_jdbc.py | 6 +-
.../apache/spark/hooks/test_spark_jdbc_script.py | 3 +-
.../unit/apache/spark/hooks/test_spark_submit.py | 15 +-
.../unit/apache/spark/operators/test_spark_jdbc.py | 3 +-
.../cncf/kubernetes/operators/spark_kubernetes.py | 2 +-
.../providers/cncf/kubernetes/triggers/pod.py | 4 +-
.../providers/cncf/kubernetes/utils/pod_manager.py | 2 +-
.../airflow/providers/common/io/xcom/__init__.py | 3 +-
.../common/io/example_file_transfer_local_to_s3.py | 2 +-
.../providers/common/sql/hooks/handlers.pyi | 4 +-
.../src/airflow/providers/common/sql/hooks/sql.py | 4 +-
.../src/airflow/providers/common/sql/hooks/sql.pyi | 4 +-
.../airflow/providers/common/sql/operators/sql.py | 13 +-
.../providers/databricks/hooks/databricks_sql.py | 9 +-
.../providers/databricks/utils/databricks.py | 2 +-
.../unit/databricks/operators/test_databricks.py | 6 +-
.../src/airflow/providers/dbt/cloud/hooks/dbt.py | 5 +-
.../airflow/providers/docker/decorators/docker.py | 10 +-
.../tests/unit/docker/operators/test_docker.py | 6 +-
.../unit/docker/operators/test_docker_swarm.py | 6 +-
.../src/airflow/providers/edge/cli/edge_command.py | 4 +-
.../providers/edge/plugins/edge_executor_plugin.py | 10 +-
.../providers/edge/worker_api/routes/logs.py | 3 +-
.../auth_manager/api/auth/backend/basic_auth.py | 7 +-
.../auth_manager/api/auth/backend/kerberos_auth.py | 6 +-
.../fab/auth_manager/api/auth/backend/session.py | 2 +-
.../api_endpoints/role_and_permission_endpoint.py | 17 +-
.../auth_manager/api_endpoints/user_endpoint.py | 15 +-
.../fab/auth_manager/api_fastapi/services/login.py | 4 +-
.../fab/auth_manager/cli_commands/utils.py | 2 +-
.../providers/fab/www/api_connexion/parameters.py | 2 +-
.../providers/fab/www/api_connexion/security.py | 6 +-
providers/fab/src/airflow/providers/fab/www/app.py | 2 +-
.../fab/src/airflow/providers/fab/www/auth.py | 12 +-
.../api_endpoints/remote_user_api_auth_backend.py | 7 +-
.../auth_manager/cli_commands/test_user_command.py | 6 +-
.../providers/google/cloud/hooks/bigquery.py | 17 +-
.../providers/google/cloud/hooks/cloud_batch.py | 3 +-
.../providers/google/cloud/hooks/dataflow.py | 4 +-
.../providers/google/cloud/hooks/dataform.py | 18 +-
.../providers/google/cloud/hooks/datafusion.py | 3 +-
.../airflow/providers/google/cloud/hooks/gcs.py | 10 +-
.../providers/google/cloud/hooks/translate.py | 2 +-
.../providers/google/cloud/openlineage/mixins.py | 4 +-
.../providers/google/cloud/operators/automl.py | 2 +-
.../providers/google/cloud/operators/dataproc.py | 3 +-
.../providers/google/cloud/operators/spanner.py | 3 +-
.../providers/google/cloud/operators/translate.py | 4 +-
.../google/cloud/transfers/gcs_to_bigquery.py | 3 +-
.../triggers/cloud_storage_transfer_service.py | 4 +-
.../google/common/auth_backend/google_openid.py | 2 +-
.../providers/google/common/hooks/base_google.py | 12 +-
.../marketing_platform/sensors/display_video.py | 2 +-
.../airflow/providers/google/suite/hooks/drive.py | 4 +-
.../google/cloud/bigquery/example_bigquery_dts.py | 4 +-
.../cloud/cloud_build/example_cloud_build.py | 20 +-
.../cloud_build/example_cloud_build_trigger.py | 2 +-
.../google/cloud/compute/example_compute_igm.py | 3 +-
.../google/cloud/gcs/example_gcs_to_gdrive.py | 5 +-
.../google/cloud/gcs/example_gcs_to_sheets.py | 6 +-
.../google/cloud/gcs/example_gdrive_to_gcs.py | 5 +-
.../system/google/cloud/gcs/example_sheets.py | 6 +-
.../google/cloud/gcs/example_sheets_to_gcs.py | 3 +-
.../cloud/sql_to_sheets/example_sql_to_sheets.py | 3 +-
.../cloud/transfers/example_gdrive_to_local.py | 5 +-
.../example_vertex_ai_custom_container.py | 3 +-
.../vertex_ai/example_vertex_ai_pipeline_job.py | 6 +-
.../google/cloud/workflows/example_workflows.py | 4 +-
.../example_datacatalog_search_catalog.py | 2 +-
.../google/datacatalog/example_datacatalog_tags.py | 2 +-
.../marketing_platform/example_campaign_manager.py | 4 +-
.../marketing_platform/example_display_video.py | 6 +-
.../tests/unit/google/cloud/hooks/test_bigquery.py | 12 +-
.../unit/google/cloud/hooks/test_bigquery_dts.py | 6 +-
.../tests/unit/google/cloud/hooks/test_dataform.py | 18 +-
.../unit/google/cloud/operators/test_bigquery.py | 36 +-
.../google/cloud/operators/test_cloud_build.py | 6 +-
.../unit/google/cloud/operators/test_compute.py | 12 +-
.../unit/google/cloud/operators/test_datafusion.py | 6 +-
.../unit/google/cloud/operators/test_dataproc.py | 9 +-
.../unit/google/cloud/operators/test_mlengine.py | 6 +-
.../unit/google/cloud/operators/test_vertex_ai.py | 18 +-
.../unit/google/cloud/sensors/test_bigquery.py | 12 +-
.../unit/google/cloud/sensors/test_dataflow.py | 24 +-
.../tests/unit/google/cloud/sensors/test_gcs.py | 12 +-
.../google/cloud/transfers/test_bigquery_to_gcs.py | 6 +-
.../unit/google/cloud/triggers/test_bigquery.py | 6 +-
.../cloud/utils/test_credentials_provider.py | 4 +-
.../unit/google/leveldb/hooks/test_leveldb.py | 6 +-
.../marketing_platform/hooks/test_display_video.py | 63 +--
.../hashicorp/_internal_client/vault_client.py | 3 +-
providers/http/tests/unit/http/hooks/test_http.py | 12 +-
.../microsoft/azure/hooks/container_instance.py | 4 +-
.../microsoft/azure/hooks/data_factory.py | 4 +-
.../providers/microsoft/azure/hooks/data_lake.py | 3 +-
.../providers/microsoft/azure/hooks/wasb.py | 3 +-
.../azure/operators/container_instances.py | 8 +-
.../microsoft/azure/example_adf_run_pipeline.py | 6 +-
.../tests/unit/microsoft/azure/hooks/test_wasb.py | 6 +-
.../microsoft/azure/operators/test_data_factory.py | 12 +-
.../microsoft/azure/sensors/test_data_factory.py | 15 +-
.../unit/microsoft/azure/sensors/test_wasb.py | 6 +-
.../providers/microsoft/mssql/dialects/mssql.py | 8 +-
.../odbc/src/airflow/providers/odbc/hooks/odbc.py | 4 +-
.../unit/openlineage/extractors/test_manager.py | 4 +-
.../qdrant/operators/test_qdrant_ingest.py | 6 +-
.../airflow/providers/smtp/notifications/smtp.py | 2 +-
.../providers/snowflake/operators/snowflake.py | 2 +-
.../unit/snowflake/operators/test_snowflake.py | 6 +-
.../airflow/providers/standard/operators/bash.py | 2 +-
.../airflow/providers/standard/operators/python.py | 6 +-
.../providers/standard/sensors/external_task.py | 3 +-
.../providers/standard/triggers/external_task.py | 2 +-
.../providers/standard/utils/sensor_helper.py | 2 +-
.../tests/unit/standard/decorators/test_python.py | 12 +-
.../tests/unit/standard/operators/test_datetime.py | 6 +-
.../teradata/operators/teradata_compute_cluster.py | 2 +-
.../airflow/providers/weaviate/hooks/weaviate.py | 8 +-
.../tests/unit/weaviate/operators/test_weaviate.py | 2 +-
pyproject.toml | 2 +-
scripts/ci/pre_commit/breeze_cmd_line.py | 3 +-
scripts/ci/pre_commit/check_deprecations.py | 3 +-
scripts/ci/pre_commit/sort_in_the_wild.py | 4 +-
scripts/ci/pre_commit/update_example_dags_paths.py | 2 +-
scripts/ci/testing/summarize_junit_failures.py | 4 +-
.../in_container/install_airflow_and_providers.py | 6 +-
.../install_development_dependencies.py | 13 +-
scripts/in_container/run_generate_constraints.py | 12 +-
.../in_container/run_provider_yaml_files_check.py | 2 +-
scripts/tools/generate-integrations-json.py | 2 +-
task-sdk/src/airflow/sdk/bases/operator.py | 6 +-
task-sdk/src/airflow/sdk/definitions/dag.py | 4 +-
.../airflow/sdk/execution_time/callback_runner.py | 2 +-
task-sdk/src/airflow/sdk/execution_time/context.py | 3 +-
.../src/airflow/sdk/execution_time/supervisor.py | 2 +-
task-sdk/tests/conftest.py | 6 +-
task-sdk/tests/task_sdk/definitions/test_asset.py | 12 +-
.../task_sdk/definitions/test_secrets_masker.py | 2 +-
262 files changed, 952 insertions(+), 1084 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5e5ddb70c59..02f934f4995 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -167,7 +167,7 @@ repos:
name: Check imports in providers
entry: ./scripts/ci/pre_commit/check_imports_in_providers.py
language: python
- additional_dependencies: ['rich>=12.4.4', "ruff==0.8.1"]
+ additional_dependencies: ['rich>=12.4.4', "ruff==0.11.2"]
files: ^providers/.*/src/airflow/providers/.*\.py$
require_serial: true
- id: update-black-version
@@ -363,7 +363,7 @@ repos:
types_or: [python, pyi]
args: [--fix]
require_serial: true
- additional_dependencies: ["ruff==0.8.1"]
+ additional_dependencies: ["ruff==0.11.2"]
exclude: ^airflow-core/tests/unit/dags/test_imports.py|^performance/tests/test_.*.py
- id: ruff-format
name: Run 'ruff format'
@@ -373,7 +373,7 @@ repos:
types_or: [python, pyi]
args: []
require_serial: true
- additional_dependencies: ["ruff==0.8.1"]
+ additional_dependencies: ["ruff==0.11.2"]
exclude: ^airflow-core/tests/unit/dags/test_imports.py$
- id: replace-bad-characters
name: Replace bad characters
diff --git a/airflow-core/src/airflow/api_fastapi/app.py b/airflow-core/src/airflow/api_fastapi/app.py
index 218664f6372..4ef7ab65113 100644
--- a/airflow-core/src/airflow/api_fastapi/app.py
+++ b/airflow-core/src/airflow/api_fastapi/app.py
@@ -123,8 +123,7 @@ def get_auth_manager_cls() -> type[BaseAuthManager]:
if not auth_manager_cls:
raise AirflowConfigException(
- "No auth manager defined in the config. "
- "Please specify one using section/key [core/auth_manager]."
+ "No auth manager defined in the config. Please specify one using section/key [core/auth_manager]."
)
return auth_manager_cls
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/app.py b/airflow-core/src/airflow/api_fastapi/core_api/app.py
index 0757d1a2851..9e62aaeae36 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/app.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/app.py
@@ -92,7 +92,7 @@ def init_plugins(app: FastAPI) -> None:
plugins_manager.initialize_fastapi_plugins()
# After calling initialize_fastapi_plugins, fastapi_apps cannot be None anymore.
- for subapp_dict in cast(list, plugins_manager.fastapi_apps):
+ for subapp_dict in cast("list", plugins_manager.fastapi_apps):
name = subapp_dict.get("name")
subapp = subapp_dict.get("app")
if subapp is None:
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py
index 7c7163ac35b..42539015b53 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_report.py
@@ -70,6 +70,6 @@ def get_dag_reports(
filtered_dagbag_stats = []
return DagReportCollectionResponse(
- dag_reports=cast(list[DagReportResponse], filtered_dagbag_stats),
+ dag_reports=cast("list[DagReportResponse]", filtered_dagbag_stats),
total_entries=len(filtered_dagbag_stats),
)
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
index 6534d80551f..20e4d5941ce 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -272,7 +272,7 @@ def clear_dag_run(
)
return TaskInstanceCollectionResponse(
- task_instances=cast(list[TaskInstanceResponse], task_instances),
+ task_instances=cast("list[TaskInstanceResponse]", task_instances),
total_entries=len(task_instances),
)
else:
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py
index d8ba1026396..04ca85be433 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/plugins.py
@@ -41,6 +41,6 @@ def get_plugins(
) -> PluginCollectionResponse:
plugins_info = sorted(get_plugin_info(), key=lambda x: x["name"])
return PluginCollectionResponse(
- plugins=cast(list[PluginResponse], plugins_info[offset.value :][: limit.value]),
+ plugins=cast("list[PluginResponse]", plugins_info[offset.value :][: limit.value]),
total_entries=len(plugins_info),
)
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
index 3e9cbc4d795..5defd2b08ff 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
@@ -307,7 +307,7 @@ def get_task_instance_tries(
f"The Task Instance with dag_id: `{dag_id}`, run_id: `{dag_run_id}`, task_id: `{task_id}` and map_index: `{map_index}` was not found",
)
return TaskInstanceHistoryCollectionResponse(
- task_instances=cast(list[TaskInstanceHistoryResponse], task_instances),
+ task_instances=cast("list[TaskInstanceHistoryResponse]", task_instances),
total_entries=len(task_instances),
)
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py
index 041e9a18de5..6cd46c4e67b 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/tasks.py
@@ -57,7 +57,7 @@ def get_tasks(
except AttributeError as err:
raise HTTPException(status.HTTP_400_BAD_REQUEST, str(err))
return TaskCollectionResponse(
- tasks=cast(list[TaskResponse], tasks),
+ tasks=cast("list[TaskResponse]", tasks),
total_entries=len(tasks),
)
@@ -81,4 +81,4 @@ def get_task(dag_id: str, task_id, request: Request) -> TaskResponse:
task = dag.get_task(task_id=task_id)
except TaskNotFound:
raise HTTPException(status.HTTP_404_NOT_FOUND, f"Task with id {task_id} was not found")
- return cast(TaskResponse, task)
+ return cast("TaskResponse", task)
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
index ec8ce49bb57..b93d9455d6a 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
@@ -34,6 +34,6 @@ def get_auth_links(
menu_items = get_auth_manager().get_extra_menu_items(user=user)
return MenuItemCollectionResponse(
- menu_items=cast(list[MenuItem], menu_items),
+ menu_items=cast("list[MenuItem]", menu_items),
total_entries=len(menu_items),
)
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py
index 482b3a6b5cb..bb0821b58c8 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/connections.py
@@ -114,9 +114,9 @@ class HookMetaService:
"""Mock any flask appbuilder widget."""
@staticmethod
- def _get_hooks_with_mocked_fab() -> (
- tuple[MutableMapping[str, HookInfo | None], dict[str, ConnectionFormWidgetInfo], dict[str, dict]]
- ):
+ def _get_hooks_with_mocked_fab() -> tuple[
+ MutableMapping[str, HookInfo | None], dict[str, ConnectionFormWidgetInfo], dict[str, dict]
+ ]:
"""Get hooks with all details w/o FAB needing to be installed."""
from unittest import mock
diff --git a/airflow-core/src/airflow/cli/commands/task_command.py b/airflow-core/src/airflow/cli/commands/task_command.py
index 0cd092626bb..1d64b084664 100644
--- a/airflow-core/src/airflow/cli/commands/task_command.py
+++ b/airflow-core/src/airflow/cli/commands/task_command.py
@@ -299,7 +299,7 @@ def _guess_debugger() -> _SupportedDebugger:
exc: Exception
for mod_name in SUPPORTED_DEBUGGER_MODULES:
try:
- return cast(_SupportedDebugger, importlib.import_module(mod_name))
+ return cast("_SupportedDebugger", importlib.import_module(mod_name))
except ImportError as e:
exc = e
raise exc
diff --git a/airflow-core/src/airflow/cli/commands/variable_command.py b/airflow-core/src/airflow/cli/commands/variable_command.py
index 5be10421830..ca78a982bde 100644
--- a/airflow-core/src/airflow/cli/commands/variable_command.py
+++ b/airflow-core/src/airflow/cli/commands/variable_command.py
@@ -114,8 +114,7 @@ def variables_import(args, session):
print(f"{fail_count} variable(s) failed to be updated.")
if skipped:
print(
- f"The variables with these keys: {list(sorted(skipped))} "
- f"were skipped because they already exists"
+ f"The variables with these keys: {list(sorted(skipped))} were skipped because they already exists"
)
diff --git a/airflow-core/src/airflow/dag_processing/collection.py b/airflow-core/src/airflow/dag_processing/collection.py
index 23fa1dea6ae..7edc10d470b 100644
--- a/airflow-core/src/airflow/dag_processing/collection.py
+++ b/airflow-core/src/airflow/dag_processing/collection.py
@@ -51,7 +51,6 @@ from airflow.models.dagwarning import DagWarningType
from airflow.models.errors import ParseImportError
from airflow.models.trigger import Trigger
from airflow.sdk.definitions.asset import Asset, AssetAlias, AssetNameRef, AssetUriRef
-from airflow.serialization.serialized_objects import SerializedAssetWatcher
from airflow.triggers.base import BaseEventTrigger
from airflow.utils.retries import MAX_DB_RETRIES, run_with_db_retries
from airflow.utils.sqlalchemy import with_row_locks
@@ -65,7 +64,7 @@ if TYPE_CHECKING:
from sqlalchemy.sql import Select
from airflow.models.dagwarning import DagWarning
- from airflow.serialization.serialized_objects import MaybeSerializedDAG
+ from airflow.serialization.serialized_objects import MaybeSerializedDAG, SerializedAssetWatcher
from airflow.typing_compat import Self
log = logging.getLogger(__name__)
@@ -799,7 +798,7 @@ class AssetModelOperation(NamedTuple):
for name_uri, asset in self.assets.items():
# If the asset belong to a DAG not active or paused, consider there is no watcher associated to it
asset_watchers: list[SerializedAssetWatcher] = (
- [cast(SerializedAssetWatcher, watcher) for watcher in asset.watchers]
+ [cast("SerializedAssetWatcher", watcher) for watcher in asset.watchers]
if name_uri in active_assets
else []
)
diff --git a/airflow-core/src/airflow/dag_processing/manager.py b/airflow-core/src/airflow/dag_processing/manager.py
index 6b84eb442d1..0f5c521df12 100644
--- a/airflow-core/src/airflow/dag_processing/manager.py
+++ b/airflow-core/src/airflow/dag_processing/manager.py
@@ -870,7 +870,7 @@ class DagFileProcessorManager(LoggingMixin):
return DagFileProcessorProcess.start(
id=id,
path=dag_file.absolute_path,
- bundle_path=cast(Path, dag_file.bundle_path),
+ bundle_path=cast("Path", dag_file.bundle_path),
callbacks=callback_to_execute_for_file,
selector=self.selector,
logger=logger,
diff --git a/airflow-core/src/airflow/decorators/base.py b/airflow-core/src/airflow/decorators/base.py
index c93f9fc2716..d5aaba420ac 100644
--- a/airflow-core/src/airflow/decorators/base.py
+++ b/airflow-core/src/airflow/decorators/base.py
@@ -492,7 +492,7 @@ class _TaskDecorator(ExpandableFactory, Generic[FParams, FReturn, OperatorSubcla
partial_kwargs.setdefault("op_kwargs", {})
# Mypy does not work well with a subclassed attrs class :(
- _MappedOperator = cast(Any, DecoratedMappedOperator)
+ _MappedOperator = cast("Any", DecoratedMappedOperator)
try:
operator_name = self.operator_class.custom_operator_name # type: ignore
@@ -665,7 +665,7 @@ def task_decorator_factory(
it's instantiated.
"""
if multiple_outputs is None:
- multiple_outputs = cast(bool, attr.NOTHING)
+ multiple_outputs = cast("bool", attr.NOTHING)
if python_callable:
decorator = _TaskDecorator(
function=python_callable,
@@ -673,7 +673,7 @@ def task_decorator_factory(
operator_class=decorated_operator_class,
kwargs=kwargs,
)
- return cast(TaskDecorator, decorator)
+ return cast("TaskDecorator", decorator)
elif python_callable is not None:
raise TypeError("No args allowed while using @task, use kwargs instead")
@@ -685,4 +685,4 @@ def task_decorator_factory(
kwargs=kwargs,
)
- return cast(TaskDecorator, decorator_factory)
+ return cast("TaskDecorator", decorator_factory)
diff --git a/airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py b/airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py
index 0b7d27ad75e..25aac4e1374 100644
--- a/airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py
+++ b/airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py
@@ -31,219 +31,217 @@ from airflow.decorators import task
from airflow.models.dag import DAG
from airflow.sdk import Param
-with (
- DAG(
- dag_id=Path(__file__).stem,
- dag_display_name="Params UI tutorial",
- description=__doc__.partition(".")[0],
- doc_md=__doc__,
- schedule=None,
- start_date=datetime.datetime(2022, 3, 4),
- catchup=False,
- tags=["example", "params", "ui"],
- # [START section_1]
- params={
- # Let's start simple: Standard dict values are detected from type and offered as entry form fields.
- # Detected types are numbers, text, boolean, lists and dicts.
- # Note that such auto-detected parameters are treated as optional (not required to contain a value)
- "number_param": 3,
- "text_param": "Hello World!",
- "bool_param": False,
- "list_param": ["one", "two", "three", "actually one value is made per line"],
- "dict_param": {"key": "value"},
- # You can arrange the entry fields in sections so that you can have a better overview for the user
- # Therefore you can add the "section" attribute.
- # But of course you might want to have it nicer! Let's add some description to parameters.
- # Note if you can add any Markdown formatting to the description, you need to use the description_md
- # attribute.
- "most_loved_number": Param(
- 42,
- type="integer",
- title="Your favorite number",
- description_md="Everybody should have a **favorite** number. Not only _math teachers_. "
- "If you can not think of any at the moment please think of the 42 which is very famous because"
- "of the book [The Hitchhiker's Guide to the Galaxy]"
- "(https://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#"
- "The_Answer_to_the_Ultimate_Question_of_Life,_the_Universe,_and_Everything_is_42).",
- minimum=0,
- maximum=128,
- section="Typed parameters with Param object",
- ),
- # If you want to have a selection list box then you can use the enum feature of JSON schema
- "pick_one": Param(
- "value 42",
- type="string",
- title="Select one Value",
- description="You can use JSON schema enum's to generate drop down selection boxes.",
- enum=[f"value {i}" for i in range(16, 64)],
- section="Typed parameters with Param object",
- ),
- # [END section_1]
- # Boolean as proper parameter with description
- "bool": Param(
- True,
- type="boolean",
- title="Please confirm",
- description="An On/Off selection with a proper description.",
- section="Typed parameters with Param object",
- ),
- # Dates and Times are also supported
- "date_time": Param(
- f"{datetime.date.today()}T{datetime.time(hour=12, minute=17, second=00)}+00:00",
- type="string",
- format="date-time",
- title="Date-Time Picker",
- description="Please select a date and time, use the button on the left for a pop-up calendar.",
- section="Typed parameters with Param object",
- ),
- "date": Param(
- f"{datetime.date.today()}",
- type="string",
- format="date",
- title="Date Picker",
- description="Please select a date, use the button on the left for a pop-up calendar. "
- "See that here are no times!",
- section="Typed parameters with Param object",
- ),
- "time": Param(
- f"{datetime.time(hour=12, minute=13, second=14)}",
- type=["string", "null"],
- format="time",
- title="Time Picker",
- description="Please select a time, use the button on the left for a pop-up tool.",
- section="Typed parameters with Param object",
- ),
- # Fields can be required or not. If the defined fields are typed they are getting required by default
- # (else they would not pass JSON schema validation) - to make typed fields optional you must
- # permit the optional "null" type.
- # You can omit a default value if the DAG is triggered manually
- # [START section_2]
- "required_field": Param(
- # In this example we have no default value
- # Form will enforce a value supplied by users to be able to trigger
- type="string",
- title="Required text field",
- minLength=10,
- maxLength=30,
- description="This field is required. You can not submit without having text in here.",
- section="Typed parameters with Param object",
- ),
- "optional_field": Param(
- "optional text, you can trigger also w/o text",
- type=["null", "string"],
- title="Optional text field",
- description_md="This field is optional. As field content is JSON schema validated you must "
- "allow the `null` type.",
- section="Typed parameters with Param object",
- ),
- # [END section_2]
- # You can also label the selected values via values_display attribute
- "pick_with_label": Param(
- 3,
- type="number",
- title="Select one Number",
- description="With drop down selections you can also have nice display labels for the values.",
- enum=[*range(1, 10)],
- values_display={
- 1: "One",
- 2: "Two",
- 3: "Three",
- 4: "Four - is like you take three and get one for free!",
- 5: "Five",
- 6: "Six",
- 7: "Seven",
- 8: "Eight",
- 9: "Nine",
- },
- section="Drop-Downs and selection lists",
- ),
- # If you want to have a list box with proposals but not enforcing a fixed list
- # then you can use the examples feature of JSON schema
- "proposals": Param(
- "Alpha",
- type="string",
- title="Field with proposals",
- description="You can use JSON schema examples's to generate drop down selection boxes "
- "but allow also to enter custom values. Try typing an 'a' and see options.",
- examples=(
- "Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,Golf,Hotel,India,Juliett,Kilo,Lima,Mike,November,Oscar,Papa,"
- "Quebec,Romeo,Sierra,Tango,Uniform,Victor,Whiskey,X-ray,Yankee,Zulu"
- ).split(","),
- section="Drop-Downs and selection lists",
- ),
- # If you want to select multiple items from a fixed list JSON schema does not allow to use enum
- # In this case the type "array" is being used together with "examples" as pick list
- "multi_select": Param(
- ["two", "three"],
- "Select from the list of options.",
- type="array",
- title="Multi Select",
- examples=["one", "two", "three", "four", "five"],
- section="Drop-Downs and selection lists",
- ),
- # A multiple options selection can also be combined with values_display
- "multi_select_with_label": Param(
- ["2", "3"],
- "Select from the list of options. See that options can have nicer text and still technical values"
- "are propagated as values during trigger to the DAG.",
- type="array",
- title="Multi Select with Labels",
- examples=["1", "2", "3", "4", "5"],
- values_display={
- "1": "One box of choccolate",
- "2": "Two bananas",
- "3": "Three apples",
- # Note: Value display mapping does not need to be complete
- },
- section="Drop-Downs and selection lists",
- ),
- # An array of numbers
- "array_of_numbers": Param(
- [1, 2, 3],
- "Only integers are accepted in this array",
- type="array",
- title="Array of numbers",
- items={"type": "number"},
- section="Special advanced stuff with form fields",
- ),
- "multiline_text": Param(
- "A multiline text Param\nthat will keep the newline\ncharacters in its value.",
- description="This field allows for multiline text input. The returned value will be a single "
- "with newline (\\n) characters kept intact.",
- title="Multiline text",
- type=["string", "null"],
- format="multiline",
- section="Special advanced stuff with form fields",
- ),
- # Some further cool stuff as advanced options are also possible
- # You can have the user entering a dict object as a JSON with validation
- "object": Param(
- {"key": "value"},
- type=["object", "null"],
- title="JSON entry field",
- section="Special advanced stuff with form fields",
- ),
- "array_of_objects": Param(
- [{"name": "account_name", "country": "country_name"}],
- description_md="Array with complex objects and validation rules. "
- "See [JSON Schema validation options in specs]"
- "(https://json-schema.org/understanding-json-schema/reference/array.html#items).",
- type="array",
- title="JSON array field",
- items={
- "type": "object",
- "properties": {"name": {"type": "string"}, "country_name": {"type": "string"}},
- "required": ["name"],
- },
- section="Special advanced stuff with form fields",
- ),
- # If you want to have static parameters which are always passed and not editable by the user
- # then you can use the JSON schema option of passing constant values. These parameters
- # will not be displayed but passed to the DAG
- "hidden_secret_field": Param("constant value", const="constant value"),
- },
- ) as dag
-):
+with DAG(
+ dag_id=Path(__file__).stem,
+ dag_display_name="Params UI tutorial",
+ description=__doc__.partition(".")[0],
+ doc_md=__doc__,
+ schedule=None,
+ start_date=datetime.datetime(2022, 3, 4),
+ catchup=False,
+ tags=["example", "params", "ui"],
+ # [START section_1]
+ params={
+ # Let's start simple: Standard dict values are detected from type and offered as entry form fields.
+ # Detected types are numbers, text, boolean, lists and dicts.
+ # Note that such auto-detected parameters are treated as optional (not required to contain a value)
+ "number_param": 3,
+ "text_param": "Hello World!",
+ "bool_param": False,
+ "list_param": ["one", "two", "three", "actually one value is made per line"],
+ "dict_param": {"key": "value"},
+ # You can arrange the entry fields in sections so that you can have a better overview for the user
+ # Therefore you can add the "section" attribute.
+ # But of course you might want to have it nicer! Let's add some description to parameters.
+ # Note if you can add any Markdown formatting to the description, you need to use the description_md
+ # attribute.
+ "most_loved_number": Param(
+ 42,
+ type="integer",
+ title="Your favorite number",
+ description_md="Everybody should have a **favorite** number. Not only _math teachers_. "
+ "If you can not think of any at the moment please think of the 42 which is very famous because"
+ "of the book [The Hitchhiker's Guide to the Galaxy]"
+ "(https://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#"
+ "The_Answer_to_the_Ultimate_Question_of_Life,_the_Universe,_and_Everything_is_42).",
+ minimum=0,
+ maximum=128,
+ section="Typed parameters with Param object",
+ ),
+ # If you want to have a selection list box then you can use the enum feature of JSON schema
+ "pick_one": Param(
+ "value 42",
+ type="string",
+ title="Select one Value",
+ description="You can use JSON schema enum's to generate drop down selection boxes.",
+ enum=[f"value {i}" for i in range(16, 64)],
+ section="Typed parameters with Param object",
+ ),
+ # [END section_1]
+ # Boolean as proper parameter with description
+ "bool": Param(
+ True,
+ type="boolean",
+ title="Please confirm",
+ description="An On/Off selection with a proper description.",
+ section="Typed parameters with Param object",
+ ),
+ # Dates and Times are also supported
+ "date_time": Param(
+ f"{datetime.date.today()}T{datetime.time(hour=12, minute=17, second=00)}+00:00",
+ type="string",
+ format="date-time",
+ title="Date-Time Picker",
+ description="Please select a date and time, use the button on the left for a pop-up calendar.",
+ section="Typed parameters with Param object",
+ ),
+ "date": Param(
+ f"{datetime.date.today()}",
+ type="string",
+ format="date",
+ title="Date Picker",
+ description="Please select a date, use the button on the left for a pop-up calendar. "
+ "See that here are no times!",
+ section="Typed parameters with Param object",
+ ),
+ "time": Param(
+ f"{datetime.time(hour=12, minute=13, second=14)}",
+ type=["string", "null"],
+ format="time",
+ title="Time Picker",
+ description="Please select a time, use the button on the left for a pop-up tool.",
+ section="Typed parameters with Param object",
+ ),
+ # Fields can be required or not. If the defined fields are typed they are getting required by default
+ # (else they would not pass JSON schema validation) - to make typed fields optional you must
+ # permit the optional "null" type.
+ # You can omit a default value if the DAG is triggered manually
+ # [START section_2]
+ "required_field": Param(
+ # In this example we have no default value
+ # Form will enforce a value supplied by users to be able to trigger
+ type="string",
+ title="Required text field",
+ minLength=10,
+ maxLength=30,
+ description="This field is required. You can not submit without having text in here.",
+ section="Typed parameters with Param object",
+ ),
+ "optional_field": Param(
+ "optional text, you can trigger also w/o text",
+ type=["null", "string"],
+ title="Optional text field",
+ description_md="This field is optional. As field content is JSON schema validated you must "
+ "allow the `null` type.",
+ section="Typed parameters with Param object",
+ ),
+ # [END section_2]
+ # You can also label the selected values via values_display attribute
+ "pick_with_label": Param(
+ 3,
+ type="number",
+ title="Select one Number",
+ description="With drop down selections you can also have nice display labels for the values.",
+ enum=[*range(1, 10)],
+ values_display={
+ 1: "One",
+ 2: "Two",
+ 3: "Three",
+ 4: "Four - is like you take three and get one for free!",
+ 5: "Five",
+ 6: "Six",
+ 7: "Seven",
+ 8: "Eight",
+ 9: "Nine",
+ },
+ section="Drop-Downs and selection lists",
+ ),
+ # If you want to have a list box with proposals but not enforcing a fixed list
+ # then you can use the examples feature of JSON schema
+ "proposals": Param(
+ "Alpha",
+ type="string",
+ title="Field with proposals",
+ description="You can use JSON schema examples's to generate drop down selection boxes "
+ "but allow also to enter custom values. Try typing an 'a' and see options.",
+ examples=(
+ "Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,Golf,Hotel,India,Juliett,Kilo,Lima,Mike,November,Oscar,Papa,"
+ "Quebec,Romeo,Sierra,Tango,Uniform,Victor,Whiskey,X-ray,Yankee,Zulu"
+ ).split(","),
+ section="Drop-Downs and selection lists",
+ ),
+ # If you want to select multiple items from a fixed list JSON schema does not allow to use enum
+ # In this case the type "array" is being used together with "examples" as pick list
+ "multi_select": Param(
+ ["two", "three"],
+ "Select from the list of options.",
+ type="array",
+ title="Multi Select",
+ examples=["one", "two", "three", "four", "five"],
+ section="Drop-Downs and selection lists",
+ ),
+ # A multiple options selection can also be combined with values_display
+ "multi_select_with_label": Param(
+ ["2", "3"],
+ "Select from the list of options. See that options can have nicer text and still technical values"
+ "are propagated as values during trigger to the DAG.",
+ type="array",
+ title="Multi Select with Labels",
+ examples=["1", "2", "3", "4", "5"],
+ values_display={
+ "1": "One box of choccolate",
+ "2": "Two bananas",
+ "3": "Three apples",
+ # Note: Value display mapping does not need to be complete
+ },
+ section="Drop-Downs and selection lists",
+ ),
+ # An array of numbers
+ "array_of_numbers": Param(
+ [1, 2, 3],
+ "Only integers are accepted in this array",
+ type="array",
+ title="Array of numbers",
+ items={"type": "number"},
+ section="Special advanced stuff with form fields",
+ ),
+ "multiline_text": Param(
+ "A multiline text Param\nthat will keep the newline\ncharacters in its value.",
+ description="This field allows for multiline text input. The returned value will be a single "
+ "with newline (\\n) characters kept intact.",
+ title="Multiline text",
+ type=["string", "null"],
+ format="multiline",
+ section="Special advanced stuff with form fields",
+ ),
+ # Some further cool stuff as advanced options are also possible
+ # You can have the user entering a dict object as a JSON with validation
+ "object": Param(
+ {"key": "value"},
+ type=["object", "null"],
+ title="JSON entry field",
+ section="Special advanced stuff with form fields",
+ ),
+ "array_of_objects": Param(
+ [{"name": "account_name", "country": "country_name"}],
+ description_md="Array with complex objects and validation rules. "
+ "See [JSON Schema validation options in specs]"
+ "(https://json-schema.org/understanding-json-schema/reference/array.html#items).",
+ type="array",
+ title="JSON array field",
+ items={
+ "type": "object",
+ "properties": {"name": {"type": "string"}, "country_name": {"type": "string"}},
+ "required": ["name"],
+ },
+ section="Special advanced stuff with form fields",
+ ),
+ # If you want to have static parameters which are always passed and not editable by the user
+ # then you can use the JSON schema option of passing constant values. These parameters
+ # will not be displayed but passed to the DAG
+ "hidden_secret_field": Param("constant value", const="constant value"),
+ },
+) as dag:
# [START section_3]
@task(task_display_name="Show used parameters")
def show_params(**kwargs) -> None:
diff --git a/airflow-core/src/airflow/executors/executor_utils.py b/airflow-core/src/airflow/executors/executor_utils.py
index 4d34a414488..11934970edb 100644
--- a/airflow-core/src/airflow/executors/executor_utils.py
+++ b/airflow-core/src/airflow/executors/executor_utils.py
@@ -41,11 +41,7 @@ class ExecutorName(LoggingMixin):
if self.alias in CORE_EXECUTOR_NAMES:
# This is a "core executor" we can refer to it by its known short name
return f"{self.team_id if self.team_id else ''}:{self.alias}:"
- return (
- f"{self.team_id if self.team_id else ''}:"
- f"{self.alias if self.alias else ''}:"
- f"{self.module_path}"
- )
+ return f"{self.team_id if self.team_id else ''}:{self.alias if self.alias else ''}:{self.module_path}"
def __eq__(self, other) -> bool:
"""Implement eq."""
diff --git a/airflow-core/src/airflow/io/__init__.py b/airflow-core/src/airflow/io/__init__.py
index 7ae083ab451..01e0cfaabe2 100644
--- a/airflow-core/src/airflow/io/__init__.py
+++ b/airflow-core/src/airflow/io/__init__.py
@@ -52,12 +52,10 @@ _BUILTIN_SCHEME_TO_FS: dict[str, Callable[[str | None, Properties], AbstractFile
@cache
-def _register_filesystems() -> (
- Mapping[
- str,
- Callable[[str | None, Properties], AbstractFileSystem] | Callable[[str | None], AbstractFileSystem],
- ]
-):
+def _register_filesystems() -> Mapping[
+ str,
+ Callable[[str | None, Properties], AbstractFileSystem] | Callable[[str | None], AbstractFileSystem],
+]:
scheme_to_fs = _BUILTIN_SCHEME_TO_FS.copy()
with Stats.timer("airflow.io.load_filesystems") as timer:
manager = ProvidersManager()
diff --git a/airflow-core/src/airflow/lineage/__init__.py b/airflow-core/src/airflow/lineage/__init__.py
index 8e581952e69..2fedfbd57a9 100644
--- a/airflow-core/src/airflow/lineage/__init__.py
+++ b/airflow-core/src/airflow/lineage/__init__.py
@@ -92,7 +92,7 @@ def apply_lineage(func: T) -> T:
return ret_val
- return cast(T, wrapper)
+ return cast("T", wrapper)
def prepare_lineage(func: T) -> T:
@@ -155,4 +155,4 @@ def prepare_lineage(func: T) -> T:
return func(self, context, *args, **kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
diff --git a/airflow-core/src/airflow/metrics/statsd_logger.py b/airflow-core/src/airflow/metrics/statsd_logger.py
index eca62caaf54..a4babe009d5 100644
--- a/airflow-core/src/airflow/metrics/statsd_logger.py
+++ b/airflow-core/src/airflow/metrics/statsd_logger.py
@@ -61,7 +61,7 @@ def prepare_stat_with_tags(fn: T) -> T:
log.error("Dropping invalid tag: %s=%s.", k, v)
return fn(self, stat, *args, tags=tags, **kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
class SafeStatsdLogger:
diff --git a/airflow-core/src/airflow/metrics/validators.py b/airflow-core/src/airflow/metrics/validators.py
index 95d038e8044..bbbfdfdc66d 100644
--- a/airflow-core/src/airflow/metrics/validators.py
+++ b/airflow-core/src/airflow/metrics/validators.py
@@ -125,7 +125,7 @@ def validate_stat(fn: Callable) -> Callable:
log.exception("Invalid stat name: %s.", stat)
return None
- return cast(Callable, wrapper)
+ return cast("Callable", wrapper)
def stat_name_otel_handler(
diff --git a/airflow-core/src/airflow/models/dag.py b/airflow-core/src/airflow/models/dag.py
index 7261c48dee0..8ca0f338330 100644
--- a/airflow-core/src/airflow/models/dag.py
+++ b/airflow-core/src/airflow/models/dag.py
@@ -552,9 +552,9 @@ class DAG(TaskSDKDag, LoggingMixin):
return DataInterval.exact(timezone.coerce_datetime(logical_date))
start = timezone.coerce_datetime(logical_date)
if issubclass(timetable_type, CronDataIntervalTimetable):
- end = cast(CronDataIntervalTimetable, self.timetable)._get_next(start)
+ end = cast("CronDataIntervalTimetable", self.timetable)._get_next(start)
elif issubclass(timetable_type, DeltaDataIntervalTimetable):
- end = cast(DeltaDataIntervalTimetable, self.timetable)._get_next(start)
+ end = cast("DeltaDataIntervalTimetable", self.timetable)._get_next(start)
# Contributors: When the exception below is raised, you might want to
# add an 'elif' block here to handle custom timetables. Stop! The bug
# you're looking for is instead at when the DAG run (represented by
@@ -966,7 +966,7 @@ class DAG(TaskSDKDag, LoggingMixin):
exclude_run_ids=None,
session=session,
)
- return session.scalars(cast(Select, query).order_by(DagRun.logical_date)).all()
+ return session.scalars(cast("Select", query).order_by(DagRun.logical_date)).all()
@overload
def _get_task_instances(
@@ -1096,7 +1096,7 @@ class DAG(TaskSDKDag, LoggingMixin):
visited_external_tis.add(ti_key)
- task: ExternalTaskMarker = cast(ExternalTaskMarker, copy.copy(self.get_task(ti.task_id)))
+ task: ExternalTaskMarker = cast("ExternalTaskMarker", copy.copy(self.get_task(ti.task_id)))
ti.task = task
if max_recursion_depth is None:
diff --git a/airflow-core/src/airflow/models/xcom.py b/airflow-core/src/airflow/models/xcom.py
index 09bfcff7b02..f828d9b9343 100644
--- a/airflow-core/src/airflow/models/xcom.py
+++ b/airflow-core/src/airflow/models/xcom.py
@@ -228,7 +228,7 @@ class XComModel(TaskInstanceDependencies):
)
)
- new = cast(Any, cls)( # Work around Mypy complaining model not defining '__init__'.
+ new = cast("Any", cls)( # Work around Mypy complaining model not defining '__init__'.
dag_run_id=dag_run_id,
key=key,
value=value,
diff --git a/airflow-core/src/airflow/policies.py b/airflow-core/src/airflow/policies.py
index e0c48931a28..6e995733ca0 100644
--- a/airflow-core/src/airflow/policies.py
+++ b/airflow-core/src/airflow/policies.py
@@ -173,7 +173,7 @@ def make_plugin_from_local_settings(pm: pluggy.PluginManager, module, names: set
codestr = textwrap.dedent(
f"""
def {name}_name_mismatch_shim{desired_sig}:
- return __target({' ,'.join(desired_sig.parameters)})
+ return __target({" ,".join(desired_sig.parameters)})
"""
)
code = compile(codestr, "<policy-shim>", "single")
diff --git a/airflow-core/src/airflow/serialization/helpers.py b/airflow-core/src/airflow/serialization/helpers.py
index 6cea9e13415..5993dfaaf26 100644
--- a/airflow-core/src/airflow/serialization/helpers.py
+++ b/airflow-core/src/airflow/serialization/helpers.py
@@ -67,7 +67,7 @@ def serialize_template_field(template_field: Any, name: str) -> str | dict | lis
rendered = redact(serialized, name)
return (
"Truncated. You can change this behaviour in [core]max_templated_field_length. "
- f"{rendered[:max_length - 79]!r}... "
+ f"{rendered[: max_length - 79]!r}... "
)
return serialized
else:
@@ -79,6 +79,6 @@ def serialize_template_field(template_field: Any, name: str) -> str | dict | lis
rendered = redact(serialized, name)
return (
"Truncated. You can change this behaviour in [core]max_templated_field_length. "
- f"{rendered[:max_length - 79]!r}... "
+ f"{rendered[: max_length - 79]!r}... "
)
return template_field
diff --git a/airflow-core/src/airflow/serialization/serde.py b/airflow-core/src/airflow/serialization/serde.py
index cafd436a28f..7c0c1a0081a 100644
--- a/airflow-core/src/airflow/serialization/serde.py
+++ b/airflow-core/src/airflow/serialization/serde.py
@@ -178,7 +178,7 @@ def serialize(o: object, depth: int = 0) -> U | None:
# attr annotated
if attr.has(cls):
# Only include attributes which we can pass back to the classes constructor
- data = attr.asdict(cast(attr.AttrsInstance, o), recurse=False, filter=lambda a, v: a.init)
+ data = attr.asdict(cast("attr.AttrsInstance", o), recurse=False, filter=lambda a, v: a.init)
dct[DATA] = serialize(data, depth + 1)
return dct
diff --git a/airflow-core/src/airflow/serialization/serialized_objects.py b/airflow-core/src/airflow/serialization/serialized_objects.py
index b22bc6523ae..6af066c12d1 100644
--- a/airflow-core/src/airflow/serialization/serialized_objects.py
+++ b/airflow-core/src/airflow/serialization/serialized_objects.py
@@ -338,7 +338,7 @@ def encode_outlet_event_accessor(var: OutletEventAccessor) -> dict[str, Any]:
return {
"key": BaseSerialization.serialize(key),
"extra": var.extra,
- "asset_alias_events": [attrs.asdict(cast(attrs.AttrsInstance, e)) for e in var.asset_alias_events],
+ "asset_alias_events": [attrs.asdict(cast("attrs.AttrsInstance", e)) for e in var.asset_alias_events],
}
@@ -1076,7 +1076,7 @@ class DependencyDetector:
)
elif (
isinstance(task, MappedOperator)
- and issubclass(cast(type[BaseOperator], task.operator_class), TriggerDagRunOperator)
+ and issubclass(cast("type[BaseOperator]", task.operator_class), TriggerDagRunOperator)
and "trigger_dag_id" in task.partial_kwargs
):
deps.append(
@@ -1100,7 +1100,7 @@ class DependencyDetector:
)
elif (
isinstance(task, MappedOperator)
- and issubclass(cast(type[BaseOperator], task.operator_class), ExternalTaskSensor)
+ and issubclass(cast("type[BaseOperator]", task.operator_class), ExternalTaskSensor)
and "external_dag_id" in task.partial_kwargs
):
deps.append(
@@ -1471,7 +1471,7 @@ class SerializedBaseOperator(BaseOperator, BaseSerialization):
start_trigger_args = None
encoded_start_trigger_args = encoded_op.get("start_trigger_args", None)
if encoded_start_trigger_args:
- encoded_start_trigger_args = cast(dict, encoded_start_trigger_args)
+ encoded_start_trigger_args = cast("dict", encoded_start_trigger_args)
start_trigger_args = decode_start_trigger_args(encoded_start_trigger_args)
setattr(op, "start_trigger_args", start_trigger_args)
setattr(op, "start_from_trigger", bool(encoded_op.get("start_from_trigger", False)))
diff --git a/airflow-core/src/airflow/serialization/serializers/builtin.py b/airflow-core/src/airflow/serialization/serializers/builtin.py
index 52ecc282ab3..b0ee8cb713d 100644
--- a/airflow-core/src/airflow/serialization/serializers/builtin.py
+++ b/airflow-core/src/airflow/serialization/serializers/builtin.py
@@ -32,7 +32,7 @@ stringifiers = serializers
def serialize(o: object) -> tuple[U, str, int, bool]:
- return list(cast(list, o)), qualname(o), __version__, True
+ return list(cast("list", o)), qualname(o), __version__, True
def deserialize(classname: str, version: int, data: list) -> tuple | set | frozenset:
diff --git a/airflow-core/src/airflow/serialization/serializers/timezone.py b/airflow-core/src/airflow/serialization/serializers/timezone.py
index 3d2a29ea08b..53920593143 100644
--- a/airflow-core/src/airflow/serialization/serializers/timezone.py
+++ b/airflow-core/src/airflow/serialization/serializers/timezone.py
@@ -57,11 +57,11 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
return "UTC", name, __version__, True
return o.offset, name, __version__, True
- tz_name = _get_tzinfo_name(cast(datetime.tzinfo, o))
+ tz_name = _get_tzinfo_name(cast("datetime.tzinfo", o))
if tz_name is not None:
return tz_name, name, __version__, True
- if cast(datetime.tzinfo, o).utcoffset(None) == datetime.timedelta(0):
+ if cast("datetime.tzinfo", o).utcoffset(None) == datetime.timedelta(0):
return "UTC", qualname(FixedTimezone), __version__, True
return "", "", 0, False
diff --git a/airflow-core/src/airflow/utils/cli.py b/airflow-core/src/airflow/utils/cli.py
index 0815ec0ac07..0114d65e04f 100644
--- a/airflow-core/src/airflow/utils/cli.py
+++ b/airflow-core/src/airflow/utils/cli.py
@@ -116,7 +116,7 @@ def action_cli(func=None, check_db=True):
metrics["end_datetime"] = timezone.utcnow()
cli_action_loggers.on_post_execution(**metrics)
- return cast(T, wrapper)
+ return cast("T", wrapper)
if func:
return action_logging(func)
@@ -155,7 +155,7 @@ def _build_metrics(func_name, namespace):
# For cases when password is passed as "--password=xyz" (with '=' between key and value)
for sensitive_field in sensitive_fields:
if command.startswith(f"{sensitive_field}="):
- full_command[idx] = f'{sensitive_field}={"*" * 8}'
+ full_command[idx] = f"{sensitive_field}={'*' * 8}"
# handle conn-json and conn-uri separately as it requires different handling
if "--conn-json" in full_command:
@@ -401,7 +401,7 @@ def suppress_logs_and_warning(f: T) -> T:
# levels of individual loggers
logging.disable(logging.NOTSET)
- return cast(T, _wrapper)
+ return cast("T", _wrapper)
def validate_dag_bundle_arg(bundle_names: list[str]) -> None:
diff --git a/airflow-core/src/airflow/utils/context.py b/airflow-core/src/airflow/utils/context.py
index e8cfdc499cc..c27032c7c3c 100644
--- a/airflow-core/src/airflow/utils/context.py
+++ b/airflow-core/src/airflow/utils/context.py
@@ -174,4 +174,4 @@ def context_copy_partial(source: Context, keys: Container[str]) -> Context:
:meta private:
"""
new = {k: v for k, v in source.items() if k in keys}
- return cast(Context, new)
+ return cast("Context", new)
diff --git a/airflow-core/src/airflow/utils/helpers.py b/airflow-core/src/airflow/utils/helpers.py
index 1f1bcac4b0e..881379b79f9 100644
--- a/airflow-core/src/airflow/utils/helpers.py
+++ b/airflow-core/src/airflow/utils/helpers.py
@@ -297,12 +297,12 @@ def render_template(template: Any, context: MutableMapping[str, Any], *, native:
def render_template_to_string(template: jinja2.Template, context: Context) -> str:
"""Shorthand to ``render_template(native=False)`` with better typing support."""
- return render_template(template, cast(MutableMapping[str, Any], context), native=False)
+ return render_template(template, cast("MutableMapping[str, Any]", context), native=False)
def render_template_as_native(template: jinja2.Template, context: Context) -> Any:
"""Shorthand to ``render_template(native=True)`` with better typing support."""
- return render_template(template, cast(MutableMapping[str, Any], context), native=True)
+ return render_template(template, cast("MutableMapping[str, Any]", context), native=True)
def exactly_one(*args) -> bool:
diff --git a/airflow-core/src/airflow/utils/log/logging_mixin.py b/airflow-core/src/airflow/utils/log/logging_mixin.py
index d06ba0b7d34..2e22c6999cb 100644
--- a/airflow-core/src/airflow/utils/log/logging_mixin.py
+++ b/airflow-core/src/airflow/utils/log/logging_mixin.py
@@ -295,9 +295,9 @@ def set_context(logger, value):
# Don't use getatrr so we have type checking. And we don't care if handler is actually a
# FileTaskHandler, it just needs to have a set_context function!
if hasattr(handler, "set_context"):
- from airflow.utils.log.file_task_handler import FileTaskHandler
+ from airflow.utils.log.file_task_handler import FileTaskHandler # noqa: TC001
- flag = cast(FileTaskHandler, handler).set_context(value)
+ flag = cast("FileTaskHandler", handler).set_context(value)
# By default we disable propagate once we have configured the logger, unless that handler
# explicitly asks us to keep it on.
if flag is not SetContextPropagate.MAINTAIN_PROPAGATE:
diff --git a/airflow-core/src/airflow/utils/session.py b/airflow-core/src/airflow/utils/session.py
index 1ee89933805..52a7cfa8e8b 100644
--- a/airflow-core/src/airflow/utils/session.py
+++ b/airflow-core/src/airflow/utils/session.py
@@ -20,13 +20,14 @@ import contextlib
from collections.abc import Generator
from functools import wraps
from inspect import signature
-from typing import Callable, TypeVar, cast
-
-from sqlalchemy.orm import Session as SASession
+from typing import TYPE_CHECKING, Callable, TypeVar, cast
from airflow import settings
from airflow.typing_compat import ParamSpec
+if TYPE_CHECKING:
+ from sqlalchemy.orm import Session as SASession
+
@contextlib.contextmanager
def create_session(scoped: bool = True) -> Generator[SASession, None, None]:
@@ -107,4 +108,4 @@ def provide_session(func: Callable[PS, RT]) -> Callable[PS, RT]:
# the 'session' argument to be of type Session instead of Session | None,
# making it easier to type hint the function body without dealing with the None
# case that can never happen at runtime.
-NEW_SESSION: SASession = cast(SASession, None)
+NEW_SESSION: SASession = cast("SASession", None)
diff --git a/airflow-core/src/airflow/utils/setup_teardown.py b/airflow-core/src/airflow/utils/setup_teardown.py
index 32d19d31684..b62e3ab298b 100644
--- a/airflow-core/src/airflow/utils/setup_teardown.py
+++ b/airflow-core/src/airflow/utils/setup_teardown.py
@@ -129,9 +129,7 @@ class BaseSetupTeardownContext:
@classmethod
def update_context_map(cls, task: DependencyMixin):
- from airflow.models.abstractoperator import AbstractOperator
-
- task_ = cast(AbstractOperator, task)
+ task_ = cast("AbstractOperator", task)
if task_.is_setup or task_.is_teardown:
return
ctx = cls.context_map
diff --git a/airflow-core/src/airflow/utils/yaml.py b/airflow-core/src/airflow/utils/yaml.py
index f13f4292022..e1cc4d34005 100644
--- a/airflow-core/src/airflow/utils/yaml.py
+++ b/airflow-core/src/airflow/utils/yaml.py
@@ -59,7 +59,7 @@ def dump(data: Any, **kwargs) -> str:
except ImportError:
from yaml import SafeDumper # type: ignore[assignment, no-redef]
- return cast(str, orig(data, Dumper=SafeDumper, **kwargs))
+ return cast("str", orig(data, Dumper=SafeDumper, **kwargs))
def __getattr__(name):
diff --git a/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py b/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
index bd37351fd63..e6b5017c257 100644
--- a/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
+++ b/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
@@ -383,6 +383,6 @@ def test_auth_managers_have_create_token_endpoint(test_client):
"/auth/token",
json={"username": "", "password": ""},
)
- assert (
- response.status_code not in [404, 405]
- ), f"The auth manager {auth_manager_module} does not provide an endpoint to create a JWT token. This endpoint should be POST /auth/token"
+ assert response.status_code not in [404, 405], (
+ f"The auth manager {auth_manager_module} does not provide an endpoint to create a JWT token. This endpoint should be POST /auth/token"
+ )
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py
index 6b201023076..a8cf23663c2 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_dags.py
@@ -49,7 +49,7 @@ class TestRecentDagRuns(TestPublicDagEndpoint):
start_date = datetime(2021 + i, 1, 1, 0, 0, 0, tzinfo=timezone.utc)
dag_run = DagRun(
dag_id=dag_id,
- run_id=f"run_id_{i+1}",
+ run_id=f"run_id_{i + 1}",
run_type=DagRunType.MANUAL,
start_date=start_date,
logical_date=start_date,
diff --git a/airflow-core/tests/unit/assets/test_evaluation.py b/airflow-core/tests/unit/assets/test_evaluation.py
index 1c8e909eee1..e71635f402d 100644
--- a/airflow-core/tests/unit/assets/test_evaluation.py
+++ b/airflow-core/tests/unit/assets/test_evaluation.py
@@ -104,9 +104,9 @@ def test_asset_logical_conditions_evaluation_and_serialization(evaluator, inputs
condition = class_(*assets)
statuses = {AssetUniqueKey.from_asset(asset): status for asset, status in zip(assets, inputs)}
- assert (
- evaluator.run(condition, statuses) == expected
- ), f"Condition evaluation failed for inputs {inputs} and scenario '{scenario}'"
+ assert evaluator.run(condition, statuses) == expected, (
+ f"Condition evaluation failed for inputs {inputs} and scenario '{scenario}'"
+ )
# Serialize and deserialize the condition to test persistence
serialized = BaseSerialization.serialize(condition)
@@ -159,9 +159,9 @@ def test_nested_asset_conditions_with_serialization(evaluator, status_values, ex
serialized_condition = BaseSerialization.serialize(nested_condition)
deserialized_condition = BaseSerialization.deserialize(serialized_condition)
- assert (
- evaluator.run(deserialized_condition, statuses) == expected_evaluation
- ), "Post-serialization evaluation mismatch"
+ assert evaluator.run(deserialized_condition, statuses) == expected_evaluation, (
+ "Post-serialization evaluation mismatch"
+ )
class TestAssetAlias:
diff --git a/airflow-core/tests/unit/cli/commands/test_db_command.py b/airflow-core/tests/unit/cli/commands/test_db_command.py
index bc71b7b1d3d..e6d1b9bd6d9 100644
--- a/airflow-core/tests/unit/cli/commands/test_db_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_db_command.py
@@ -193,8 +193,7 @@ class TestCliDb:
db_command.shell(self.parser.parse_args(["db", "shell"]))
mock_execute_interactive.assert_called_once_with(["mysql", "--defaults-extra-file=/tmp/name"])
mock_tmp_file.return_value.__enter__.return_value.write.assert_called_once_with(
- b"[client]\nhost = mysql\nuser = root\npassword = \nport = 3306"
- b"\ndatabase = airflow"
+ b"[client]\nhost = mysql\nuser = root\npassword = \nport = 3306\ndatabase = airflow"
)
@mock.patch("airflow.cli.commands.db_command.execute_interactive")
@@ -208,8 +207,7 @@ class TestCliDb:
db_command.shell(self.parser.parse_args(["db", "shell"]))
mock_execute_interactive.assert_called_once_with(["mysql", "--defaults-extra-file=/tmp/name"])
mock_tmp_file.return_value.__enter__.return_value.write.assert_called_once_with(
- b"[client]\nhost = mysql\nuser = root\npassword = \nport = 3306"
- b"\ndatabase = airflow"
+ b"[client]\nhost = mysql\nuser = root\npassword = \nport = 3306\ndatabase = airflow"
)
@mock.patch("airflow.cli.commands.db_command.execute_interactive")
diff --git a/airflow-core/tests/unit/cli/commands/test_legacy_commands.py b/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
index f4550146e4e..e4c39b9c68e 100644
--- a/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
+++ b/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
@@ -48,7 +48,6 @@ class TestCliDeprecatedCommandsValue:
mock_action._prog_prefix = "airflow"
with pytest.raises(
ArgumentError,
- match="argument : Command `airflow webserver` has been removed. "
- "Please use `airflow api-server`",
+ match="argument : Command `airflow webserver` has been removed. Please use `airflow api-server`",
):
check_legacy_command(mock_action, "webserver")
diff --git a/airflow-core/tests/unit/cli/test_cli_parser.py b/airflow-core/tests/unit/cli/test_cli_parser.py
index 3b748aa2b05..15025354722 100644
--- a/airflow-core/tests/unit/cli/test_cli_parser.py
+++ b/airflow-core/tests/unit/cli/test_cli_parser.py
@@ -103,9 +103,9 @@ class TestCli:
for group, command in subcommand.items():
for com in command:
conflict_arg = [arg for arg, count in Counter(com.args).items() if count > 1]
- assert (
- conflict_arg == []
- ), f"Command group {group} function {com.name} have conflict args name {conflict_arg}"
+ assert conflict_arg == [], (
+ f"Command group {group} function {com.name} have conflict args name {conflict_arg}"
+ )
def test_subcommand_arg_flag_conflict(self):
"""
diff --git a/airflow-core/tests/unit/jobs/test_scheduler_job.py b/airflow-core/tests/unit/jobs/test_scheduler_job.py
index 8c9d5cd6bfe..9e917283cd8 100644
--- a/airflow-core/tests/unit/jobs/test_scheduler_job.py
+++ b/airflow-core/tests/unit/jobs/test_scheduler_job.py
@@ -2819,9 +2819,9 @@ class TestSchedulerJob:
if ti1s and ti2s:
recent_ti1 = ti1s[0]
recent_ti2 = ti2s[0]
- assert (
- recent_ti1.logical_date == recent_ti2.logical_date
- ), "Both tasks should be scheduled for the same interval"
+ assert recent_ti1.logical_date == recent_ti2.logical_date, (
+ "Both tasks should be scheduled for the same interval"
+ )
def test_scheduler_multiprocessing(self):
"""
@@ -5847,9 +5847,9 @@ class TestSchedulerJob:
return
queued_any_tis = any(val > 0 for val in num_queued_tis)
finished_any_events = any(val > 0 for val in num_finished_events)
- assert (
- queued_any_tis or finished_any_events
- ), "Scheduler has stalled without setting the DagRun state!"
+ assert queued_any_tis or finished_any_events, (
+ "Scheduler has stalled without setting the DagRun state!"
+ )
set_state_spy = mock.patch.object(DagRun, "set_state", new=watch_set_state)
heartbeat_spy = mock.patch.object(self.job_runner.job, "heartbeat", new=watch_heartbeat)
diff --git a/airflow-core/tests/unit/models/test_dag.py b/airflow-core/tests/unit/models/test_dag.py
index 689996ecbbe..602a899a064 100644
--- a/airflow-core/tests/unit/models/test_dag.py
+++ b/airflow-core/tests/unit/models/test_dag.py
@@ -1166,9 +1166,9 @@ class TestDag:
assert dag.dag_id == dag_run.dag_id
assert dag_run.run_id is not None
assert dag_run.run_id != ""
- assert (
- dag_run.logical_date == TEST_DATE
- ), f"dag_run.logical_date did not match expectation: {dag_run.logical_date}"
+ assert dag_run.logical_date == TEST_DATE, (
+ f"dag_run.logical_date did not match expectation: {dag_run.logical_date}"
+ )
assert dag_run.state == State.RUNNING
assert dag_run.run_type != DagRunType.MANUAL
dag.clear()
diff --git a/airflow-core/tests/unit/models/test_dagbag.py b/airflow-core/tests/unit/models/test_dagbag.py
index 4f52d3019b5..6d659c99c4c 100644
--- a/airflow-core/tests/unit/models/test_dagbag.py
+++ b/airflow-core/tests/unit/models/test_dagbag.py
@@ -514,11 +514,11 @@ class TestDagBag:
dag_id = expected_dag.dag_id
actual_dagbag.log.info("validating %s", dag_id)
assert (dag_id in actual_found_dag_ids) == should_be_found, (
- f"dag \"{dag_id}\" should {'' if should_be_found else 'not '}"
+ f'dag "{dag_id}" should {"" if should_be_found else "not "}'
f'have been found after processing dag "{expected_dag.dag_id}"'
)
assert (dag_id in actual_dagbag.dags) == should_be_found, (
- f"dag \"{dag_id}\" should {'' if should_be_found else 'not '}"
+ f'dag "{dag_id}" should {"" if should_be_found else "not "}'
f'be in dagbag.dags after processing dag "{expected_dag.dag_id}"'
)
diff --git a/airflow-core/tests/unit/models/test_renderedtifields.py b/airflow-core/tests/unit/models/test_renderedtifields.py
index 5a9d5705e4e..8196138e4db 100644
--- a/airflow-core/tests/unit/models/test_renderedtifields.py
+++ b/airflow-core/tests/unit/models/test_renderedtifields.py
@@ -137,12 +137,12 @@ class TestRenderedTaskInstanceFields:
),
pytest.param(
"a" * 5000,
- f"Truncated. You can change this behaviour in [core]max_templated_field_length. {('a'*5000)[:max_length-79]!r}... ",
+ f"Truncated. You can change this behaviour in [core]max_templated_field_length. {('a' * 5000)[: max_length - 79]!r}... ",
id="large_string",
),
pytest.param(
LargeStrObject(),
- f"Truncated. You can change this behaviour in [core]max_templated_field_length. {str(LargeStrObject())[:max_length-79]!r}... ",
+ f"Truncated. You can change this behaviour in [core]max_templated_field_length. {str(LargeStrObject())[: max_length - 79]!r}... ",
id="large_object",
),
],
diff --git a/airflow-core/tests/unit/models/test_taskinstance.py b/airflow-core/tests/unit/models/test_taskinstance.py
index ca99aff9d15..7bb2284dcdb 100644
--- a/airflow-core/tests/unit/models/test_taskinstance.py
+++ b/airflow-core/tests/unit/models/test_taskinstance.py
@@ -2210,9 +2210,9 @@ class TestTaskInstance:
# check that the asset event has an earlier timestamp than the ADRQ's
adrq_timestamps = session.query(AssetDagRunQueue.created_at).filter_by(asset_id=event.asset.id).all()
- assert all(
- event.timestamp < adrq_timestamp for (adrq_timestamp,) in adrq_timestamps
- ), f"Some items in {[str(t) for t in adrq_timestamps]} are earlier than {event.timestamp}"
+ assert all(event.timestamp < adrq_timestamp for (adrq_timestamp,) in adrq_timestamps), (
+ f"Some items in {[str(t) for t in adrq_timestamps]} are earlier than {event.timestamp}"
+ )
def test_outlet_assets_failed(self, create_task_instance, testing_dag_bundle):
"""
@@ -3078,7 +3078,7 @@ class TestTaskInstance:
ti.set_state(state=State.SUCCESS, session=dag_maker.session)
return ti
- date = cast(pendulum.DateTime, pendulum.parse("2019-01-01T00:00:00+00:00"))
+ date = cast("pendulum.DateTime", pendulum.parse("2019-01-01T00:00:00+00:00"))
ret = []
@@ -4012,9 +4012,9 @@ class TestTaskInstance:
for key, expected_value in expected_values.items():
assert hasattr(ti, key), f"Key {key} is missing in the TaskInstance."
if key not in hybrid_props:
- assert (
- getattr(ti, key) == expected_value
- ), f"Key: {key} had different values. Make sure it loads it in the refresh refresh_from_db()"
+ assert getattr(ti, key) == expected_value, (
+ f"Key: {key} had different values. Make sure it loads it in the refresh refresh_from_db()"
+ )
def test_operator_field_with_serialization(self, create_task_instance):
ti = create_task_instance()
diff --git a/airflow-core/tests/unit/models/test_xcom_arg.py b/airflow-core/tests/unit/models/test_xcom_arg.py
index f21a4b8c62a..4bbb8427155 100644
--- a/airflow-core/tests/unit/models/test_xcom_arg.py
+++ b/airflow-core/tests/unit/models/test_xcom_arg.py
@@ -66,8 +66,7 @@ class TestXComArgBuild:
# Asserting the overridden __eq__ method
assert actual == XComArg(python_op, "test_key")
expected_str = (
- "{{ task_instance.xcom_pull(task_ids='test_xcom_op', "
- "dag_id='test_xcom_dag', key='test_key') }}"
+ "{{ task_instance.xcom_pull(task_ids='test_xcom_op', dag_id='test_xcom_dag', key='test_key') }}"
)
assert str(actual) == expected_str
assert (
diff --git a/airflow-core/tests/unit/sensors/test_external_task_sensor.py b/airflow-core/tests/unit/sensors/test_external_task_sensor.py
index 6883c785487..1a7938cc27d 100644
--- a/airflow-core/tests/unit/sensors/test_external_task_sensor.py
+++ b/airflow-core/tests/unit/sensors/test_external_task_sensor.py
@@ -399,8 +399,7 @@ class TestExternalTaskSensor:
caplog.clear()
op.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
assert (
- f"Poking for tasks ['{TEST_TASK_ID}'] "
- f"in dag {TEST_DAG_ID} on {DEFAULT_DATE.isoformat()} ... "
+ f"Poking for tasks ['{TEST_TASK_ID}'] in dag {TEST_DAG_ID} on {DEFAULT_DATE.isoformat()} ... "
) in caplog.messages
def test_external_task_sensor_external_task_ids_param(self, caplog):
@@ -418,8 +417,7 @@ class TestExternalTaskSensor:
caplog.clear()
op.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
assert (
- f"Poking for tasks ['{TEST_TASK_ID}'] "
- f"in dag {TEST_DAG_ID} on {DEFAULT_DATE.isoformat()} ... "
+ f"Poking for tasks ['{TEST_TASK_ID}'] in dag {TEST_DAG_ID} on {DEFAULT_DATE.isoformat()} ... "
) in caplog.messages
def test_external_task_sensor_failed_states_as_success_mulitple_task_ids(self, caplog):
@@ -1437,13 +1435,13 @@ def dag_bag_cyclic():
dags.append(dag)
task_a = ExternalTaskSensor(
task_id=f"task_a_{n}",
- external_dag_id=f"dag_{n-1}",
- external_task_id=f"task_b_{n-1}",
+ external_dag_id=f"dag_{n - 1}",
+ external_task_id=f"task_b_{n - 1}",
)
task_b = ExternalTaskMarker(
task_id=f"task_b_{n}",
- external_dag_id=f"dag_{n+1}",
- external_task_id=f"task_a_{n+1}",
+ external_dag_id=f"dag_{n + 1}",
+ external_task_id=f"task_a_{n + 1}",
recursion_depth=3,
)
task_a >> task_b
@@ -1453,8 +1451,8 @@ def dag_bag_cyclic():
dags.append(dag)
task_a = ExternalTaskSensor(
task_id=f"task_a_{depth}",
- external_dag_id=f"dag_{depth-1}",
- external_task_id=f"task_b_{depth-1}",
+ external_dag_id=f"dag_{depth - 1}",
+ external_task_id=f"task_b_{depth - 1}",
)
task_b = ExternalTaskMarker(
task_id=f"task_b_{depth}",
diff --git a/airflow-core/tests/unit/serialization/test_dag_serialization.py b/airflow-core/tests/unit/serialization/test_dag_serialization.py
index c435aa436a3..98363d4eec8 100644
--- a/airflow-core/tests/unit/serialization/test_dag_serialization.py
+++ b/airflow-core/tests/unit/serialization/test_dag_serialization.py
@@ -662,9 +662,9 @@ class TestStringifiedDAGs:
# Check we stored _something_.
assert k in serialized_dag.default_args
else:
- assert (
- v == serialized_dag.default_args[k]
- ), f"{dag.dag_id}.default_args[{k}] does not match"
+ assert v == serialized_dag.default_args[k], (
+ f"{dag.dag_id}.default_args[{k}] does not match"
+ )
assert serialized_dag.timetable.summary == dag.timetable.summary
assert serialized_dag.timetable.serialize() == dag.timetable.serialize()
@@ -739,9 +739,9 @@ class TestStringifiedDAGs:
assert serialized_task.downstream_task_ids == task.downstream_task_ids
for field in fields_to_check:
- assert getattr(serialized_task, field) == getattr(
- task, field
- ), f"{task.dag.dag_id}.{task.task_id}.{field} does not match"
+ assert getattr(serialized_task, field) == getattr(task, field), (
+ f"{task.dag.dag_id}.{task.task_id}.{field} does not match"
+ )
if serialized_task.resources is None:
assert task.resources is None or task.resources == []
@@ -1320,9 +1320,9 @@ class TestStringifiedDAGs:
assert set(DAG.get_serialized_fields()) == dag_params
def test_operator_subclass_changing_base_defaults(self):
- assert (
- BaseOperator(task_id="dummy").do_xcom_push is True
- ), "Precondition check! If this fails the test won't make sense"
+ assert BaseOperator(task_id="dummy").do_xcom_push is True, (
+ "Precondition check! If this fails the test won't make sense"
+ )
class MyOperator(BaseOperator):
def __init__(self, do_xcom_push=False, **kwargs):
diff --git a/airflow-core/tests/unit/timetables/test_assets_timetable.py b/airflow-core/tests/unit/timetables/test_assets_timetable.py
index d8386bc27f5..8386f26338f 100644
--- a/airflow-core/tests/unit/timetables/test_assets_timetable.py
+++ b/airflow-core/tests/unit/timetables/test_assets_timetable.py
@@ -250,9 +250,9 @@ def test_run_ordering_inheritance(asset_timetable: AssetOrTimeSchedule) -> None:
:param asset_timetable: The AssetOrTimeSchedule instance to test.
"""
- assert hasattr(
- asset_timetable, "run_ordering"
- ), "AssetOrTimeSchedule should have 'run_ordering' attribute"
+ assert hasattr(asset_timetable, "run_ordering"), (
+ "AssetOrTimeSchedule should have 'run_ordering' attribute"
+ )
parent_run_ordering = getattr(AssetTriggeredTimetable, "run_ordering", None)
assert asset_timetable.run_ordering == parent_run_ordering, "run_ordering does not match the parent class"
@@ -318,28 +318,28 @@ class TestAssetConditionWithTimetable:
with dag_maker(schedule=AssetAny(asset1, AssetAll(asset2, asset1))) as dag:
EmptyOperator(task_id="hello")
- assert isinstance(
- dag.timetable.asset_condition, AssetAny
- ), "DAG's asset trigger should be an instance of AssetAny"
- assert any(
- isinstance(trigger, AssetAll) for trigger in dag.timetable.asset_condition.objects
- ), "DAG's asset trigger should include AssetAll"
+ assert isinstance(dag.timetable.asset_condition, AssetAny), (
+ "DAG's asset trigger should be an instance of AssetAny"
+ )
+ assert any(isinstance(trigger, AssetAll) for trigger in dag.timetable.asset_condition.objects), (
+ "DAG's asset trigger should include AssetAll"
+ )
serialized_triggers = SerializedDAG.serialize(dag.timetable.asset_condition)
deserialized_triggers = SerializedDAG.deserialize(serialized_triggers)
- assert isinstance(
- deserialized_triggers, AssetAny
- ), "Deserialized triggers should be an instance of AssetAny"
- assert any(
- isinstance(trigger, AssetAll) for trigger in deserialized_triggers.objects
- ), "Deserialized triggers should include AssetAll"
+ assert isinstance(deserialized_triggers, AssetAny), (
+ "Deserialized triggers should be an instance of AssetAny"
+ )
+ assert any(isinstance(trigger, AssetAll) for trigger in deserialized_triggers.objects), (
+ "Deserialized triggers should include AssetAll"
+ )
serialized_timetable_dict = SerializedDAG.to_dict(dag)["dag"]["timetable"]["__var"]
- assert (
- "asset_condition" in serialized_timetable_dict
- ), "Serialized timetable should contain 'asset_condition'"
- assert isinstance(
- serialized_timetable_dict["asset_condition"], dict
- ), "Serialized 'asset_condition' should be a dict"
+ assert "asset_condition" in serialized_timetable_dict, (
+ "Serialized timetable should contain 'asset_condition'"
+ )
+ assert isinstance(serialized_timetable_dict["asset_condition"], dict), (
+ "Serialized 'asset_condition' should be a dict"
+ )
diff --git a/airflow-ctl/src/airflowctl/api/client.py b/airflow-ctl/src/airflowctl/api/client.py
index 6be8ab66473..10dee8096bb 100644
--- a/airflow-ctl/src/airflowctl/api/client.py
+++ b/airflow-ctl/src/airflowctl/api/client.py
@@ -260,4 +260,4 @@ def provide_api_client(func: Callable[PS, RT]) -> Callable[PS, RT]:
return wrapper
-NEW_CLI_API_CLIENT: Client = cast(Client, None)
+NEW_CLI_API_CLIENT: Client = cast("Client", None)
diff --git a/clients/python/test_python_client.py b/clients/python/test_python_client.py
index f68028c8a54..49952818736 100644
--- a/clients/python/test_python_client.py
+++ b/clients/python/test_python_client.py
@@ -67,7 +67,7 @@ from airflow_client.client.model.dag_run import DAGRun
create_app()
-auth_manager = cast(get_auth_manager(), SimpleAuthManager)
+auth_manager = cast("get_auth_manager()", SimpleAuthManager)
users = auth_manager.get_users()
passwords = auth_manager.get_passwords(users)
username, password = next(iter(passwords.items()))
diff --git a/dev/assign_cherry_picked_prs_with_milestone.py b/dev/assign_cherry_picked_prs_with_milestone.py
index 135e944af2a..fa05455dd3e 100755
--- a/dev/assign_cherry_picked_prs_with_milestone.py
+++ b/dev/assign_cherry_picked_prs_with_milestone.py
@@ -28,12 +28,12 @@ from typing import TYPE_CHECKING, Any, NamedTuple, cast
import rich_click as click
from github import Github, UnknownObjectException
-from github.PullRequest import PullRequest
from rich.console import Console
from rich.prompt import Confirm, Prompt
if TYPE_CHECKING:
from github.Milestone import Milestone
+ from github.PullRequest import PullRequest
from github.Repository import Repository
CHANGELOG_SKIP_LABEL = "changelog:skip"
@@ -303,7 +303,7 @@ def assign_prs(
# Fallback to issue if PR not found
try:
# PR has almost the same fields as Issue
- pr = cast(PullRequest, repo.get_issue(pr_number))
+ pr = cast("PullRequest", repo.get_issue(pr_number))
except UnknownObjectException:
console.print(f"[red]The PR #{pr_number} could not be found[/]")
continue
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
index eddcd7ff875..1c525dac1c6 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -203,8 +203,7 @@ def build_timout_handler(build_process_group_id: int, signum, frame):
"started to backtrack dependency resolution.\n"
)
get_console().print(
- "[warning]Please follow the instructions in "
- "`dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md"
+ "[warning]Please follow the instructions in `dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md"
)
get_console().print(
"[warning]in the `How to figure out backtracking dependencies` "
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 0347b095e5c..99fa9955aca 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -2143,8 +2143,8 @@ def is_package_in_dist(dist_files: list[str], package: str) -> bool:
return any(
file.startswith(
(
- f'apache_airflow_providers_{package.replace(".", "_")}',
- f'apache-airflow-providers-{package.replace(".", "-")}',
+ f"apache_airflow_providers_{package.replace('.', '_')}",
+ f"apache-airflow-providers-{package.replace('.', '-')}",
)
)
for file in dist_files
@@ -2157,7 +2157,7 @@ VERSION_MATCH = re.compile(r"([0-9]+)\.([0-9]+)\.([0-9]+)(.*)")
def get_suffix_from_package_in_dist(dist_files: list[str], package: str) -> str | None:
"""Get suffix from package prepared in dist folder."""
for file in dist_files:
- if file.startswith(f'apache_airflow_providers_{package.replace(".", "_")}') and file.endswith(
+ if file.startswith(f"apache_airflow_providers_{package.replace('.', '_')}") and file.endswith(
".tar.gz"
):
file = file[: -len(".tar.gz")]
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands.py b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
index 4e485909e12..55878e5db03 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
@@ -81,8 +81,7 @@ def setup():
)
@setup.command(
name="self-upgrade",
- help="Self upgrade Breeze. By default it re-installs Breeze "
- f"from {get_installation_airflow_sources()}."
+ help=f"Self upgrade Breeze. By default it re-installs Breeze from {get_installation_airflow_sources()}."
if not generating_command_images()
else "Self upgrade Breeze.",
)
@@ -176,8 +175,7 @@ def version():
get_console().print(f"[info]Used Airflow sources : {get_used_airflow_sources()}[/]\n")
if get_verbose():
get_console().print(
- f"[info]Installation sources config hash : "
- f"{get_installation_sources_config_metadata_hash()}[/]"
+ f"[info]Installation sources config hash : {get_installation_sources_config_metadata_hash()}[/]"
)
get_console().print(
f"[info]Used sources config hash : {get_used_sources_setup_metadata_hash()}[/]"
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index 29fa758fb03..49fdfdd547b 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -1274,7 +1274,7 @@ def _run_test_command(
if skip_providers:
ignored_path_list = [
*[
- f"--ignore=providers/{provider_id.replace('.','/')}/tests"
+ f"--ignore=providers/{provider_id.replace('.', '/')}/tests"
for provider_id in skip_providers.split(" ")
],
]
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 43e623da746..ad55b4ac71a 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -426,8 +426,7 @@ class ShellParams:
broker_url = CELERY_BROKER_URLS_MAP.get(self.celery_broker)
if not broker_url:
get_console().print(
- f"[warning]The broker {self.celery_broker} should "
- f"be one of {CELERY_BROKER_URLS_MAP.keys()}"
+ f"[warning]The broker {self.celery_broker} should be one of {CELERY_BROKER_URLS_MAP.keys()}"
)
return ""
# Map from short form (rabbitmq/redis) to actual urls
diff --git a/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py b/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
index 05425ec2f11..98e297e4548 100644
--- a/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
+++ b/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
@@ -758,8 +758,7 @@ def update_release_notes(
raise PrepareReleaseDocsUserQuitException()
elif not list_of_list_of_changes:
get_console().print(
- f"\n[warning]Provider: {provider_id} - "
- f"skipping documentation generation. No changes![/]\n"
+ f"\n[warning]Provider: {provider_id} - skipping documentation generation. No changes![/]\n"
)
raise PrepareReleaseDocsNoChangesException()
else:
diff --git a/dev/breeze/src/airflow_breeze/utils/add_back_references.py b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
index 001721b5bde..cbc0369c7ce 100644
--- a/dev/breeze/src/airflow_breeze/utils/add_back_references.py
+++ b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
@@ -149,7 +149,7 @@ def start_generating_back_references(airflow_site_directory: Path, short_provide
if short_provider_ids:
for p in short_provider_ids:
slash_based_short_provider_id = p.replace(".", "/")
- full_provider_name = f"apache-airflow-providers-{p.replace('.','-')}"
+ full_provider_name = f"apache-airflow-providers-{p.replace('.', '-')}"
get_console().print(f"Processing airflow provider: {full_provider_name}")
generate_back_references(
get_github_provider_redirects_url(slash_based_short_provider_id),
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index afddad78b55..364e586731c 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -177,8 +177,7 @@ def check_docker_is_running():
)
if response.returncode != 0:
get_console().print(
- "[error]Docker is not running.[/]\n"
- "[warning]Please make sure Docker is installed and running.[/]"
+ "[error]Docker is not running.[/]\n[warning]Please make sure Docker is installed and running.[/]"
)
sys.exit(1)
diff --git a/dev/breeze/src/airflow_breeze/utils/github.py b/dev/breeze/src/airflow_breeze/utils/github.py
index 1d8fa8f79be..7023a0cfdab 100644
--- a/dev/breeze/src/airflow_breeze/utils/github.py
+++ b/dev/breeze/src/airflow_breeze/utils/github.py
@@ -225,8 +225,7 @@ def download_artifact_from_run_id(run_id: str, output_file: Path, github_reposit
if response.status_code != 200:
get_console().print(
- "[error]Downloading artifacts failed with status code "
- f"{response.status_code}: {response.text}",
+ f"[error]Downloading artifacts failed with status code {response.status_code}: {response.text}",
)
sys.exit(1)
@@ -263,8 +262,7 @@ def download_artifact_from_pr(pr: str, output_file: Path, github_repository: str
if pull_response.status_code != 200:
get_console().print(
- "[error]Fetching PR failed with status codee "
- f"{pull_response.status_code}: {pull_response.text}",
+ f"[error]Fetching PR failed with status codee {pull_response.status_code}: {pull_response.text}",
)
sys.exit(1)
diff --git a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
index ecda36f7b26..c4044c8d27a 100644
--- a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
@@ -115,8 +115,7 @@ def _download_with_retries(num_tries, path, tool, url):
get_console().print(f"[error]Failing on max retries. Error while downloading {tool}: {e}")
sys.exit(1)
get_console().print(
- f"[warning]Retrying: {num_tries} retries left on error "
- f"while downloading {tool} tool: {e}"
+ f"[warning]Retrying: {num_tries} retries left on error while downloading {tool} tool: {e}"
)
@@ -171,8 +170,7 @@ def _download_tool_if_needed(
)
except OSError as e:
get_console().print(
- f"[info]Error when running `{tool}`: {e}. "
- f"Removing and downloading {expected_version} version."
+ f"[info]Error when running `{tool}`: {e}. Removing and downloading {expected_version} version."
)
path.unlink(missing_ok=True)
get_console().print(f"[info]Downloading from:[/] {url}")
@@ -295,8 +293,7 @@ def _requirements_changed() -> bool:
return True
if CACHED_K8S_DEPS_HASH_PATH.read_text() != _get_k8s_deps_hash():
get_console().print(
- f"\n[warning]Requirements changed for the K8S venv in {K8S_ENV_PATH}. "
- f"Reinstalling the venv.\n"
+ f"\n[warning]Requirements changed for the K8S venv in {K8S_ENV_PATH}. Reinstalling the venv.\n"
)
return True
return False
@@ -586,6 +583,9 @@ def print_cluster_urls(
k8s_api_server_port, api_server_port = get_kubernetes_port_numbers(
python=python, kubernetes_version=kubernetes_version
)
+ get_console(output=output).print(
+ f"\n[info]Kubeconfig file in: {get_kubeconfig_file(python, kubernetes_version)}\n"
+ )
get_console(output=output).print(
f"\n[info]KinD Cluster API server URL: [/]http://localhost:{k8s_api_server_port}"
)
diff --git a/dev/breeze/src/airflow_breeze/utils/packages.py b/dev/breeze/src/airflow_breeze/utils/packages.py
index 8495f22c2cb..35269da2757 100644
--- a/dev/breeze/src/airflow_breeze/utils/packages.py
+++ b/dev/breeze/src/airflow_breeze/utils/packages.py
@@ -396,7 +396,7 @@ def find_matching_long_package_names(
processed_package_filters.extend(get_long_package_names(short_packages))
removed_packages: list[str] = [
- f"apache-airflow-providers-{provider.replace('.','-')}" for provider in get_removed_provider_ids()
+ f"apache-airflow-providers-{provider.replace('.', '-')}" for provider in get_removed_provider_ids()
]
all_packages_including_removed: list[str] = available_doc_packages + removed_packages
invalid_filters = [
@@ -598,8 +598,8 @@ def convert_cross_package_dependencies_to_table(
prefix = "apache-airflow-providers-"
base_url = "https://airflow.apache.org/docs/"
for dependency in cross_package_dependencies:
- pip_package_name = f"{prefix}{dependency.replace('.','-')}"
- url_suffix = f"{dependency.replace('.','-')}"
+ pip_package_name = f"{prefix}{dependency.replace('.', '-')}"
+ url_suffix = f"{dependency.replace('.', '-')}"
if markdown:
url = f"[{pip_package_name}]({base_url}{url_suffix})"
else:
@@ -773,7 +773,7 @@ def make_sure_remote_apache_exists_and_fetch(github_repository: str = "apache/ai
f"[error]Error {e}[/]\n"
f"[error]When fetching tags from remote. Your tags might not be refreshed.[/]\n\n"
f'[warning]Please refresh the tags manually via:[/]\n\n"'
- f'{" ".join(fetch_command)}\n\n'
+ f"{' '.join(fetch_command)}\n\n"
)
sys.exit(1)
diff --git a/dev/breeze/src/airflow_breeze/utils/provider_dependencies.py b/dev/breeze/src/airflow_breeze/utils/provider_dependencies.py
index 3ff7c389df8..7175e492284 100644
--- a/dev/breeze/src/airflow_breeze/utils/provider_dependencies.py
+++ b/dev/breeze/src/airflow_breeze/utils/provider_dependencies.py
@@ -92,8 +92,7 @@ def generate_providers_metadata_for_package(
}
if not provider_mentioned_in_constraints:
get_console().print(
- f"[warning]No constraints mention {provider_id} in any Airflow version. "
- f"Skipping it altogether."
+ f"[warning]No constraints mention {provider_id} in any Airflow version. Skipping it altogether."
)
return {}
return provider_metadata
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 67d4b918da2..1ff6ef30ba5 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -293,8 +293,7 @@ def instruct_build_image(python: str):
"""Print instructions to the user that they should build the image"""
get_console().print(f"[warning]\nThe CI image for Python version {python} may be outdated[/]\n")
get_console().print(
- f"\n[info]Please run at the earliest "
- f"convenience:[/]\n\nbreeze ci-image build --python {python}\n\n"
+ f"\n[info]Please run at the earliest convenience:[/]\n\nbreeze ci-image build --python {python}\n\n"
)
diff --git a/dev/breeze/src/airflow_breeze/utils/versions.py b/dev/breeze/src/airflow_breeze/utils/versions.py
index ab47b62d888..7fc2ace68e8 100644
--- a/dev/breeze/src/airflow_breeze/utils/versions.py
+++ b/dev/breeze/src/airflow_breeze/utils/versions.py
@@ -33,7 +33,7 @@ def strip_leading_zeros_from_version(version: str) -> str:
def get_version_tag(version: str, provider_id: str, version_suffix: str = ""):
if version_suffix is None:
version_suffix = ""
- return f"providers-{provider_id.replace('.','-')}/{version}{version_suffix}"
+ return f"providers-{provider_id.replace('.', '-')}/{version}{version_suffix}"
def is_pre_release(version: str) -> bool:
diff --git a/dev/breeze/tests/test_selective_checks.py b/dev/breeze/tests/test_selective_checks.py
index c45d07052d9..dfa51118855 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -95,8 +95,7 @@ def assert_outputs_are_printed(expected_outputs: dict[str, str], stderr: str):
assert received_value == expected_value, f"Correct value for {expected_key!r}"
else:
print_in_color(
- f"\n[red]ERROR: The key '{expected_key}' missing but "
- f"it is expected. Expected value:"
+ f"\n[red]ERROR: The key '{expected_key}' missing but it is expected. Expected value:"
)
print_in_color(expected_value)
print_in_color("\nOutput received:")
@@ -531,8 +530,7 @@ def assert_outputs_are_printed(expected_outputs: dict[str, str], stderr: str):
"providers/http/tests/file.py",
),
{
- "selected-providers-list-as-string": "amazon apache.livy "
- "dbt.cloud dingding discord http",
+ "selected-providers-list-as-string": "amazon apache.livy dbt.cloud dingding discord http",
"all-python-versions": "['3.9']",
"all-python-versions-list-as-string": "3.9",
"python-versions": "['3.9']",
diff --git a/dev/prepare_bulk_issues.py b/dev/prepare_bulk_issues.py
index e6c26f82f3b..708d00fe094 100755
--- a/dev/prepare_bulk_issues.py
+++ b/dev/prepare_bulk_issues.py
@@ -228,7 +228,7 @@ def prepare_bulk_issues(
except GithubException as e:
console.print(f"[red]Error!: {e}[/]")
console.print(
- f"[yellow]Restart with `--start-from {processed_issues+start_from}` to continue.[/]"
+ f"[yellow]Restart with `--start-from {processed_issues + start_from}` to continue.[/]"
)
console.print(f"Created {processed_issues} issue(s).")
diff --git a/dev/system_tests/update_issue_status.py b/dev/system_tests/update_issue_status.py
index 83ba3a73e86..e0d0f6e5003 100755
--- a/dev/system_tests/update_issue_status.py
+++ b/dev/system_tests/update_issue_status.py
@@ -202,8 +202,7 @@ def update_issue_status(
f"{len(completed_closed_issues) / num_issues:.2%}"
)
console.print(
- f" Completed files {total_count_done}/{total_count_all} = "
- f"{total_count_done / total_count_all:.2%}"
+ f" Completed files {total_count_done}/{total_count_all} = {total_count_done / total_count_all:.2%}"
)
console.print()
if not_completed_closed_issues:
diff --git a/devel-common/pyproject.toml b/devel-common/pyproject.toml
index 6815632ba05..79ab66e82bd 100644
--- a/devel-common/pyproject.toml
+++ b/devel-common/pyproject.toml
@@ -37,7 +37,7 @@ dependencies = [
"duckdb>=0.9.0; python_version < '3.12'",
# Static checks devel
"black>=23.12.0",
- "ruff==0.8.1",
+ "ruff==0.11.2",
"yamllint>=1.33.0",
# devscripts
"click>=8.1.8",
diff --git a/devel-common/src/tests_common/pytest_plugin.py b/devel-common/src/tests_common/pytest_plugin.py
index 7f7ac0c4a3f..bd79d038a27 100644
--- a/devel-common/src/tests_common/pytest_plugin.py
+++ b/devel-common/src/tests_common/pytest_plugin.py
@@ -1903,7 +1903,9 @@ def mocked_parse(spy_agency):
mocked_parse(
StartupDetails(
- ti=TaskInstance(id=uuid7(), task_id="hello", dag_id="super_basic_run", run_id="c", try_number=1),
+ ti=TaskInstance(
+ id=uuid7(), task_id="hello", dag_id="super_basic_run", run_id="c", try_number=1
+ ),
file="",
requests_fd=0,
),
diff --git a/devel-common/src/tests_common/test_utils/compat.py b/devel-common/src/tests_common/test_utils/compat.py
index 580fd723dea..1be9dcecb88 100644
--- a/devel-common/src/tests_common/test_utils/compat.py
+++ b/devel-common/src/tests_common/test_utils/compat.py
@@ -172,8 +172,7 @@ def ignore_provider_compatibility_error(minimum_version: str, module_name: str):
except RuntimeError as e:
if f"needs Apache Airflow {minimum_version}" in str(e):
pytest.skip(
- reason=f"Skip module {module_name} as "
- f"minimum Airflow version is required {minimum_version}.",
+ reason=f"Skip module {module_name} as minimum Airflow version is required {minimum_version}.",
allow_module_level=True,
)
else:
diff --git a/devel-common/src/tests_common/test_utils/system_tests.py b/devel-common/src/tests_common/test_utils/system_tests.py
index 6dffef9ff9e..daaa2639afb 100644
--- a/devel-common/src/tests_common/test_utils/system_tests.py
+++ b/devel-common/src/tests_common/test_utils/system_tests.py
@@ -69,9 +69,9 @@ def get_test_run(dag, **test_kwargs):
use_executor=os.environ.get("_AIRFLOW__SYSTEM_TEST_USE_EXECUTOR") == "1",
**test_kwargs,
)
- assert (
- dag_run.state == DagRunState.SUCCESS
- ), "The system test failed, please look at the logs to find out the underlying failed task(s)"
+ assert dag_run.state == DagRunState.SUCCESS, (
+ "The system test failed, please look at the logs to find out the underlying failed task(s)"
+ )
return test_run
diff --git a/docker_tests/test_prod_image.py b/docker_tests/test_prod_image.py
index f896f244507..6741bb3cc29 100644
--- a/docker_tests/test_prod_image.py
+++ b/docker_tests/test_prod_image.py
@@ -41,12 +41,12 @@ sys.path.insert(0, AIRFLOW_ROOT_PATH.as_posix()) # make sure airflow root is im
from hatch_build import PRE_INSTALLED_PROVIDERS # noqa: E402
SLIM_IMAGE_PROVIDERS = [
- f"apache-airflow-providers-{provider_id.split('>=')[0].replace('.','-')}"
+ f"apache-airflow-providers-{provider_id.split('>=')[0].replace('.', '-')}"
for provider_id in PRE_INSTALLED_PROVIDERS
if not provider_id.startswith("#")
]
REGULAR_IMAGE_PROVIDERS = [
- f"apache-airflow-providers-{provider_id.split('>=')[0].replace('.','-')}"
+ f"apache-airflow-providers-{provider_id.split('>=')[0].replace('.', '-')}"
for provider_id in PROD_IMAGE_PROVIDERS_FILE_PATH.read_text().splitlines()
if not provider_id.startswith("#")
]
@@ -99,9 +99,9 @@ class TestPythonPackages:
packages_installed = set(d["package_name"] for d in providers)
assert len(packages_installed) != 0
- assert (
- packages_to_install == packages_installed
- ), f"List of expected installed packages and image content mismatch. Check {package_file} file."
+ assert packages_to_install == packages_installed, (
+ f"List of expected installed packages and image content mismatch. Check {package_file} file."
+ )
def test_pip_dependencies_conflict(self, default_docker_image):
try:
diff --git a/docs/exts/docs_build/package_filter.py b/docs/exts/docs_build/package_filter.py
index 26dae9ff1c3..a0ca972a726 100644
--- a/docs/exts/docs_build/package_filter.py
+++ b/docs/exts/docs_build/package_filter.py
@@ -47,7 +47,7 @@ def process_package_filters(available_packages: list[str], package_filters: list
return available_packages
suspended_packages = [
- f"apache-airflow-providers-{provider.replace('.','-')}" for provider in get_removed_provider_ids()
+ f"apache-airflow-providers-{provider.replace('.', '-')}" for provider in get_removed_provider_ids()
]
all_packages_with_suspended = available_packages + suspended_packages
invalid_filters = [
diff --git a/docs/exts/exampleinclude.py b/docs/exts/exampleinclude.py
index 06ed4912cb2..c098aa9c506 100644
--- a/docs/exts/exampleinclude.py
+++ b/docs/exts/exampleinclude.py
@@ -1,6 +1,3 @@
-# flake8: noqa
-# Disable Flake8 because of all the sphinx imports
-#
# 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/helm_tests/airflow_aux/test_airflow_common.py b/helm_tests/airflow_aux/test_airflow_common.py
index 55d88e4eed2..9a7bf09caf6 100644
--- a/helm_tests/airflow_aux/test_airflow_common.py
+++ b/helm_tests/airflow_aux/test_airflow_common.py
@@ -345,9 +345,9 @@ class TestAirflowCommon:
for doc in docs:
component = doc["metadata"]["labels"]["component"]
variables = expected_vars_in_worker if component == "worker" else expected_vars
- assert variables == jmespath.search(
- "spec.template.spec.containers[0].env[*].name", doc
- ), f"Wrong vars in {component}"
+ assert variables == jmespath.search("spec.template.spec.containers[0].env[*].name", doc), (
+ f"Wrong vars in {component}"
+ )
def test_have_all_variables(self):
docs = render_chart(
@@ -373,9 +373,9 @@ class TestAirflowCommon:
for doc in docs:
component = doc["metadata"]["labels"]["component"]
variables = expected_vars_in_worker if component == "worker" else expected_vars
- assert variables == jmespath.search(
- "spec.template.spec.containers[0].env[*].name", doc
- ), f"Wrong vars in {component}"
+ assert variables == jmespath.search("spec.template.spec.containers[0].env[*].name", doc), (
+ f"Wrong vars in {component}"
+ )
def test_have_all_config_mounts_on_init_containers(self):
docs = render_chart(
diff --git a/helm_tests/airflow_aux/test_basic_helm_chart.py b/helm_tests/airflow_aux/test_basic_helm_chart.py
index 641cbeab704..f609110b199 100644
--- a/helm_tests/airflow_aux/test_basic_helm_chart.py
+++ b/helm_tests/airflow_aux/test_basic_helm_chart.py
@@ -169,9 +169,9 @@ class TestBaseChartTest:
if chart_name and "postgresql" in chart_name:
continue
k8s_name = k8s_object["kind"] + ":" + k8s_object["metadata"]["name"]
- assert (
- labels.get("test-label") == "TEST-VALUE"
- ), f"Missing label test-label on {k8s_name}. Current labels: {labels}"
+ assert labels.get("test-label") == "TEST-VALUE", (
+ f"Missing label test-label on {k8s_name}. Current labels: {labels}"
+ )
def test_basic_deployments_with_standard_naming(self):
k8s_objects = render_chart(
@@ -254,9 +254,9 @@ class TestBaseChartTest:
if chart_name and "postgresql" in chart_name:
continue
k8s_name = k8s_object["kind"] + ":" + k8s_object["metadata"]["name"]
- assert (
- labels.get("test-label") == "TEST-VALUE"
- ), f"Missing label test-label on {k8s_name}. Current labels: {labels}"
+ assert labels.get("test-label") == "TEST-VALUE", (
+ f"Missing label test-label on {k8s_name}. Current labels: {labels}"
+ )
@pytest.mark.parametrize("version", ["2.3.2", "2.4.0", "default"])
def test_basic_deployment_without_default_users(self, version):
diff --git a/performance/src/performance_dags/performance_dag/performance_dag_utils.py b/performance/src/performance_dags/performance_dag/performance_dag_utils.py
index a17c63e71ed..e37264a228f 100644
--- a/performance/src/performance_dags/performance_dag/performance_dag_utils.py
+++ b/performance/src/performance_dags/performance_dag/performance_dag_utils.py
@@ -598,8 +598,7 @@ def get_performance_dag_environment_variable(performance_dag_conf: dict[str, str
if env_name in MANDATORY_performance_DAG_VARIABLES:
if env_name not in performance_dag_conf:
raise ValueError(
- f"Mandatory environment variable '{env_name}' "
- f"is missing from performance dag configuration."
+ f"Mandatory environment variable '{env_name}' is missing from performance dag configuration."
)
return performance_dag_conf[env_name]
diff --git a/providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/oss.py b/providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/oss.py
index 59b68bd037d..8f752a1ca0a 100644
--- a/providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/oss.py
+++ b/providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/oss.py
@@ -49,7 +49,7 @@ def provide_bucket_name(func: T) -> T:
return func(*bound_args.args, **bound_args.kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
def unify_bucket_name_and_key(func: T) -> T:
@@ -73,7 +73,7 @@ def unify_bucket_name_and_key(func: T) -> T:
return func(*bound_args.args, **bound_args.kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
class OSSHook(BaseHook):
diff --git a/providers/alibaba/tests/unit/alibaba/cloud/utils/test_utils.py b/providers/alibaba/tests/unit/alibaba/cloud/utils/test_utils.py
index 109ec3f5eda..6908157e13e 100644
--- a/providers/alibaba/tests/unit/alibaba/cloud/utils/test_utils.py
+++ b/providers/alibaba/tests/unit/alibaba/cloud/utils/test_utils.py
@@ -39,4 +39,4 @@ def skip_test_if_no_valid_conn_id(func: T) -> T:
else:
return None
- return cast(T, wrapper)
+ return cast("T", wrapper)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py b/providers/amazon/src/airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py
index 096366c8eba..c15452a7584 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py
@@ -27,15 +27,6 @@ from fastapi import FastAPI
from airflow.api_fastapi.app import AUTH_MANAGER_FASTAPI_APP_PREFIX
from airflow.api_fastapi.auth.managers.base_auth_manager import BaseAuthManager
-from airflow.api_fastapi.auth.managers.models.resource_details import (
- AccessView,
- BackfillDetails,
- ConnectionDetails,
- DagAccessEntity,
- DagDetails,
- PoolDetails,
- VariableDetails,
-)
from airflow.cli.cli_config import CLICommand, DefaultHelpParser, GroupCommand
from airflow.configuration import conf
from airflow.exceptions import AirflowOptionalProviderFeatureException
@@ -59,9 +50,16 @@ if TYPE_CHECKING:
IsAuthorizedVariableRequest,
)
from airflow.api_fastapi.auth.managers.models.resource_details import (
+ AccessView,
AssetAliasDetails,
AssetDetails,
+ BackfillDetails,
ConfigurationDetails,
+ ConnectionDetails,
+ DagAccessEntity,
+ DagDetails,
+ PoolDetails,
+ VariableDetails,
)
from airflow.api_fastapi.common.types import MenuItem
@@ -256,7 +254,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
{
"method": request["method"],
"entity_type": AvpEntities.CONNECTION,
- "entity_id": cast(ConnectionDetails, request["details"]).conn_id
+ "entity_id": cast("ConnectionDetails", request["details"]).conn_id
if request.get("details")
else None,
}
@@ -274,10 +272,10 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
{
"method": request["method"],
"entity_type": AvpEntities.DAG,
- "entity_id": cast(DagDetails, request["details"]).id if request.get("details") else None,
+ "entity_id": cast("DagDetails", request["details"]).id if request.get("details") else None,
"context": {
"dag_entity": {
- "string": cast(DagAccessEntity, request["access_entity"]).value,
+ "string": cast("DagAccessEntity", request["access_entity"]).value,
},
}
if request.get("access_entity")
@@ -297,7 +295,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
{
"method": request["method"],
"entity_type": AvpEntities.POOL,
- "entity_id": cast(PoolDetails, request["details"]).name if request.get("details") else None,
+ "entity_id": cast("PoolDetails", request["details"]).name if request.get("details") else None,
}
for request in requests
]
@@ -313,7 +311,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
{
"method": request["method"],
"entity_type": AvpEntities.VARIABLE,
- "entity_id": cast(VariableDetails, request["details"]).key
+ "entity_id": cast("VariableDetails", request["details"]).key
if request.get("details")
else None,
}
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor.py b/providers/amazon/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor.py
index 6233d46aa29..3d9821ae257 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor.py
@@ -278,7 +278,7 @@ class AwsEcsExecutor(BaseExecutor):
if not has_exit_codes:
return ""
reasons = [
- f'{container["container_arn"]} - {container["reason"]}'
+ f"{container['container_arn']} - {container['reason']}"
for container in containers
if "reason" in container
]
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/athena_sql.py b/providers/amazon/src/airflow/providers/amazon/aws/hooks/athena_sql.py
index 8aa5b957e10..e8d8680c29c 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/athena_sql.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/athena_sql.py
@@ -146,10 +146,10 @@ class AthenaSQLHook(AwsBaseHook, DbApiHook):
creds = self.get_credentials(region_name=conn_params["region_name"])
return URL.create(
- f'awsathena+{conn_params["driver"]}',
+ f"awsathena+{conn_params['driver']}",
username=creds.access_key,
password=creds.secret_key,
- host=f'athena.{conn_params["region_name"]}.{conn_params["aws_domain"]}',
+ host=f"athena.{conn_params['region_name']}.{conn_params['aws_domain']}",
port=443,
database=conn_params["schema_name"],
query={"aws_session_token": creds.token, **self.conn.extra_dejson},
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_client.py b/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_client.py
index 6c40ad86e36..4d85898d917 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_client.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_client.py
@@ -416,8 +416,7 @@ class BatchClientHook(AwsBaseHook):
)
else:
raise AirflowException(
- f"AWS Batch job ({job_id}) description error: exceeded status_retries "
- f"({self.status_retries})"
+ f"AWS Batch job ({job_id}) description error: exceeded status_retries ({self.status_retries})"
)
@staticmethod
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/dms.py b/providers/amazon/src/airflow/providers/amazon/aws/hooks/dms.py
index e9515c8fac3..f7b91b4b572 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/dms.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/dms.py
@@ -292,7 +292,9 @@ class DmsHook(AwsBaseHook):
return arn
except ClientError as err:
- err_str = f"Error: {err.get('Error','').get('Code','')}: {err.get('Error','').get('Message','')}"
+ err_str = (
+ f"Error: {err.get('Error', '').get('Code', '')}: {err.get('Error', '').get('Message', '')}"
+ )
self.log.error("Error while creating replication config: %s", err_str)
raise err
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_data.py b/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_data.py
index 50a655ec4c4..72879fd8595 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_data.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_data.py
@@ -186,8 +186,7 @@ class RedshiftDataHook(AwsGenericHook["RedshiftDataAPIServiceClient"]):
RedshiftDataQueryFailedError if status == FAILED_STATE else RedshiftDataQueryAbortedError
)
raise exception_cls(
- f"Statement {resp['Id']} terminated with status {status}. "
- f"Response details: {pformat(resp)}"
+ f"Statement {resp['Id']} terminated with status {status}. Response details: {pformat(resp)}"
)
self.log.info("Query status: %s", status)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/sagemaker.py b/providers/amazon/src/airflow/providers/amazon/aws/hooks/sagemaker.py
index 7e02a408cb4..43df07e23bd 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/sagemaker.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/sagemaker.py
@@ -131,7 +131,7 @@ def secondary_training_status_message(
status_strs = []
for transition in transitions_to_print:
message = transition["StatusMessage"]
- time_utc = timezone.convert_to_utc(cast(datetime, job_description["LastModifiedTime"]))
+ time_utc = timezone.convert_to_utc(cast("datetime", job_description["LastModifiedTime"]))
status_strs.append(f"{time_utc:%Y-%m-%d %H:%M:%S} {transition['Status']} - {message}")
return "\n".join(status_strs)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/links/athena.py b/providers/amazon/src/airflow/providers/amazon/aws/links/athena.py
index 99950d25806..bff6b025975 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/links/athena.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/links/athena.py
@@ -25,6 +25,5 @@ class AthenaQueryResultsLink(BaseAwsLink):
name = "Query Results"
key = "_athena_query_results"
format_str = (
- BASE_AWS_CONSOLE_LINK + "/athena/home?region={region_name}#"
- "/query-editor/history/{query_execution_id}"
+ BASE_AWS_CONSOLE_LINK + "/athena/home?region={region_name}#/query-editor/history/{query_execution_id}"
)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/operators/eks.py b/providers/amazon/src/airflow/providers/amazon/aws/operators/eks.py
index f1acec9915f..40f91d4de46 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/operators/eks.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/operators/eks.py
@@ -338,7 +338,7 @@ class EksCreateClusterOperator(BaseOperator):
fargate_pod_execution_role_arn=self.fargate_pod_execution_role_arn,
fargate_selectors=self.fargate_selectors,
create_fargate_profile_kwargs=self.create_fargate_profile_kwargs,
- subnets=cast(list[str], self.resources_vpc_config.get("subnetIds")),
+ subnets=cast("list[str]", self.resources_vpc_config.get("subnetIds")),
)
def deferrable_create_cluster_next(self, context: Context, event: dict[str, Any] | None = None) -> None:
@@ -377,7 +377,7 @@ class EksCreateClusterOperator(BaseOperator):
fargate_pod_execution_role_arn=self.fargate_pod_execution_role_arn,
fargate_selectors=self.fargate_selectors,
create_fargate_profile_kwargs=self.create_fargate_profile_kwargs,
- subnets=cast(list[str], self.resources_vpc_config.get("subnetIds")),
+ subnets=cast("list[str]", self.resources_vpc_config.get("subnetIds")),
)
if self.compute == "fargate":
self.defer(
@@ -503,7 +503,7 @@ class EksCreateNodegroupOperator(BaseOperator):
nodegroup_subnets_list: list[str] = []
if self.nodegroup_subnets != "":
try:
- nodegroup_subnets_list = cast(list, literal_eval(self.nodegroup_subnets))
+ nodegroup_subnets_list = cast("list", literal_eval(self.nodegroup_subnets))
except ValueError:
self.log.warning(
"The nodegroup_subnets should be List or string representing "
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py b/providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py
index c3d74acd7bf..778816151be 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py
@@ -170,7 +170,7 @@ class SageMakerBaseOperator(BaseOperator):
timestamp = str(
time.time_ns() // 1000000000
) # only keep the relevant datetime (first 10 digits)
- name = f"{proposed_name[:max_name_len - len(timestamp) - 1]}-{timestamp}" # we subtract one to make provision for the dash between the truncated name and timestamp
+ name = f"{proposed_name[: max_name_len - len(timestamp) - 1]}-{timestamp}" # we subtract one to make provision for the dash between the truncated name and timestamp
self.log.info("Changed %s name to '%s' to avoid collision.", resource_type, name)
return name
@@ -178,8 +178,7 @@ class SageMakerBaseOperator(BaseOperator):
"""Raise exception if resource type is not 'model' or 'job'."""
if resource_type not in ("model", "job"):
raise AirflowException(
- "Argument resource_type accepts only 'model' and 'job'. "
- f"Provided value: '{resource_type}'."
+ f"Argument resource_type accepts only 'model' and 'job'. Provided value: '{resource_type}'."
)
def _check_if_job_exists(self, job_name: str, describe_func: Callable[[str], Any]) -> bool:
@@ -559,8 +558,7 @@ class SageMakerEndpointOperator(SageMakerBaseOperator):
self.operation = "update"
sagemaker_operation = self.hook.update_endpoint
self.log.warning(
- "cannot create already existing endpoint %s, "
- "updating it with the given config instead",
+ "cannot create already existing endpoint %s, updating it with the given config instead",
endpoint_info["EndpointName"],
)
if "Tags" in endpoint_info:
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/sensors/glacier.py b/providers/amazon/src/airflow/providers/amazon/aws/sensors/glacier.py
index f36a0d701f0..f52c157c938 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/sensors/glacier.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/sensors/glacier.py
@@ -95,5 +95,5 @@ class GlacierJobOperationSensor(AwsBaseSensor[GlacierHook]):
return False
else:
raise AirflowException(
- f'Sensor failed. Job status: {response["Action"]}, code status: {response["StatusCode"]}'
+ f"Sensor failed. Job status: {response['Action']}, code status: {response['StatusCode']}"
)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/sensors/s3.py b/providers/amazon/src/airflow/providers/amazon/aws/sensors/s3.py
index c59bf53ea1c..cdbe7bceff9 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/sensors/s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/sensors/s3.py
@@ -192,7 +192,7 @@ class S3KeySensor(AwsBaseSensor[S3Hook]):
self.defer(
timeout=timedelta(seconds=self.timeout),
trigger=S3KeyTrigger(
- bucket_name=cast(str, self.bucket_name),
+ bucket_name=cast("str", self.bucket_name),
bucket_key=self.bucket_key,
wildcard_match=self.wildcard_match,
aws_conn_id=self.aws_conn_id,
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/transfers/mongo_to_s3.py b/providers/amazon/src/airflow/providers/amazon/aws/transfers/mongo_to_s3.py
index 1dc32fb6ed7..d729655ae8e 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/transfers/mongo_to_s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/transfers/mongo_to_s3.py
@@ -103,7 +103,7 @@ class MongoToS3Operator(BaseOperator):
if self.is_pipeline:
results: CommandCursor[Any] | Cursor = MongoHook(self.mongo_conn_id).aggregate(
mongo_collection=self.mongo_collection,
- aggregate_query=cast(list, self.mongo_query),
+ aggregate_query=cast("list", self.mongo_query),
mongo_db=self.mongo_db,
allowDiskUse=self.allow_disk_use,
)
@@ -111,7 +111,7 @@ class MongoToS3Operator(BaseOperator):
else:
results = MongoHook(self.mongo_conn_id).find(
mongo_collection=self.mongo_collection,
- query=cast(dict, self.mongo_query),
+ query=cast("dict", self.mongo_query),
projection=self.mongo_projection,
mongo_db=self.mongo_db,
find_one=False,
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py b/providers/amazon/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py
index 8443bcaf696..327702f3e69 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py
@@ -223,7 +223,7 @@ class SqlToS3Operator(BaseOperator):
return
for group_label in (grouped_df := df.groupby(**self.groupby_kwargs)).groups:
yield (
- cast(str, group_label),
+ cast("str", group_label),
grouped_df.get_group(group_label)
.drop(random_column_name, axis=1, errors="ignore")
.reset_index(drop=True),
diff --git a/providers/amazon/tests/system/amazon/aws/example_dms.py b/providers/amazon/tests/system/amazon/aws/example_dms.py
index 54e218c8330..e23e8268de8 100644
--- a/providers/amazon/tests/system/amazon/aws/example_dms.py
+++ b/providers/amazon/tests/system/amazon/aws/example_dms.py
@@ -324,7 +324,7 @@ with DAG(
)
# [END howto_operator_dms_create_task]
- task_arn = cast(str, create_task.output)
+ task_arn = cast("str", create_task.output)
# [START howto_operator_dms_start_task]
start_task = DmsStartTaskOperator(
diff --git a/providers/amazon/tests/system/amazon/aws/example_sagemaker.py b/providers/amazon/tests/system/amazon/aws/example_sagemaker.py
index dd78212b21b..d8ad58812f8 100644
--- a/providers/amazon/tests/system/amazon/aws/example_sagemaker.py
+++ b/providers/amazon/tests/system/amazon/aws/example_sagemaker.py
@@ -141,7 +141,7 @@ def _build_and_upload_docker_image(preprocess_script, repository_uri):
dockerfile.write(
f"""
FROM public.ecr.aws/amazonlinux/amazonlinux
- COPY {preprocessing_script.name.split('/')[2]} /preprocessing.py
+ COPY {preprocessing_script.name.split("/")[2]} /preprocessing.py
RUN yum install python3 pip -y
RUN pip3 install boto3 pandas requests
CMD [ "python3", "/preprocessing.py"]
@@ -182,7 +182,7 @@ def generate_data() -> str:
"""generates a very simple csv dataset with headers"""
content = "class,x,y\n" # headers
for i in range(SAMPLE_SIZE):
- content += f"{i%100},{i},{SAMPLE_SIZE-i}\n"
+ content += f"{i % 100},{i},{SAMPLE_SIZE - i}\n"
return content
diff --git a/providers/amazon/tests/system/amazon/aws/example_sagemaker_endpoint.py b/providers/amazon/tests/system/amazon/aws/example_sagemaker_endpoint.py
index 7d97ffe83fa..149cf0e52f9 100644
--- a/providers/amazon/tests/system/amazon/aws/example_sagemaker_endpoint.py
+++ b/providers/amazon/tests/system/amazon/aws/example_sagemaker_endpoint.py
@@ -211,7 +211,7 @@ with DAG(
upload_data = S3CreateObjectOperator(
task_id="upload_data",
s3_bucket=test_setup["bucket_name"],
- s3_key=f'{test_setup["input_data_s3_key"]}/train.csv',
+ s3_key=f"{test_setup['input_data_s3_key']}/train.csv",
data=TRAIN_DATA,
)
diff --git a/providers/amazon/tests/unit/amazon/aws/executors/batch/test_batch_executor.py b/providers/amazon/tests/unit/amazon/aws/executors/batch/test_batch_executor.py
index 809187cc9cf..0561bc45357 100644
--- a/providers/amazon/tests/unit/amazon/aws/executors/batch/test_batch_executor.py
+++ b/providers/amazon/tests/unit/amazon/aws/executors/batch/test_batch_executor.py
@@ -375,7 +375,7 @@ class TestAwsBatchExecutor:
mock_executor.sync_running_jobs()
for i in range(2):
assert (
- f'Airflow task {airflow_keys[i]} failed due to {jobs[i]["statusReason"]}. Failure 1 out of {mock_executor.MAX_SUBMIT_JOB_ATTEMPTS} occurred on {jobs[i]["jobId"]}. Rescheduling.'
+ f"Airflow task {airflow_keys[i]} failed due to {jobs[i]['statusReason']}. Failure 1 out of {mock_executor.MAX_SUBMIT_JOB_ATTEMPTS} occurred on {jobs[i]['jobId']}. Rescheduling."
in caplog.messages[i]
)
@@ -384,7 +384,7 @@ class TestAwsBatchExecutor:
mock_executor.sync_running_jobs()
for i in range(2):
assert (
- f'Airflow task {airflow_keys[i]} failed due to {jobs[i]["statusReason"]}. Failure 2 out of {mock_executor.MAX_SUBMIT_JOB_ATTEMPTS} occurred on {jobs[i]["jobId"]}. Rescheduling.'
+ f"Airflow task {airflow_keys[i]} failed due to {jobs[i]['statusReason']}. Failure 2 out of {mock_executor.MAX_SUBMIT_JOB_ATTEMPTS} occurred on {jobs[i]['jobId']}. Rescheduling."
in caplog.messages[i]
)
diff --git a/providers/amazon/tests/unit/amazon/aws/fs/test_s3.py b/providers/amazon/tests/unit/amazon/aws/fs/test_s3.py
index 962f26060a6..ec633c3c792 100644
--- a/providers/amazon/tests/unit/amazon/aws/fs/test_s3.py
+++ b/providers/amazon/tests/unit/amazon/aws/fs/test_s3.py
@@ -17,13 +17,16 @@
from __future__ import annotations
import os
-from typing import cast
+from typing import TYPE_CHECKING, cast
from unittest.mock import patch
import pytest
import responses
from botocore.awsrequest import AWSRequest
+if TYPE_CHECKING:
+ import s3fs
+
pytest.importorskip("s3fs")
TEST_CONN = "aws_test_conn"
@@ -44,12 +47,10 @@ def _setup_connections():
class TestFilesystem:
def test_get_s3fs(self):
- import s3fs
-
from airflow.providers.amazon.aws.fs.s3 import get_fs
fs = get_fs(conn_id=TEST_CONN, storage_options={"key": "value"})
- fs = cast(s3fs.S3FileSystem, fs)
+ fs = cast("s3fs.S3FileSystem", fs)
assert "s3" in fs.protocol
assert fs.config_kwargs["key"] == "value"
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
index 8d1da3de743..af4b77fffcf 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
@@ -1153,9 +1153,9 @@ class TestAwsS3Hook:
# Test: `bucket_name` should use the explicitly provided value over `service_config`
test_bucket_name = fake_s3_hook.test_function(bucket_name="some_custom_bucket")
- assert (
- test_bucket_name == "some_custom_bucket"
- ), "Expected provided bucket_name to take precedence over fallback"
+ assert test_bucket_name == "some_custom_bucket", (
+ "Expected provided bucket_name to take precedence over fallback"
+ )
def test_delete_objects_key_does_not_exist(self, s3_bucket):
# The behaviour of delete changed in recent version of s3 mock libraries.
diff --git a/providers/amazon/tests/unit/amazon/aws/links/test_base_aws.py b/providers/amazon/tests/unit/amazon/aws/links/test_base_aws.py
index 7423d857977..98ebcde8c92 100644
--- a/providers/amazon/tests/unit/amazon/aws/links/test_base_aws.py
+++ b/providers/amazon/tests/unit/amazon/aws/links/test_base_aws.py
@@ -219,13 +219,13 @@ class BaseAwsLinksTestCase:
deserialized_dag = SerializedDAG.from_dict(serialized_dag)
deserialized_task = deserialized_dag.task_dict[self.task_id]
- assert (
- ti.task.operator_extra_links[0].get_link(operator=ti.task, ti_key=ti.key) == ""
- ), "Operator link should only be added if job id is available in XCom"
+ assert ti.task.operator_extra_links[0].get_link(operator=ti.task, ti_key=ti.key) == "", (
+ "Operator link should only be added if job id is available in XCom"
+ )
- assert (
- deserialized_task.get_extra_links(ti, self.link_class.name) == ""
- ), "Operator link should be empty for deserialized task with no XCom push"
+ assert deserialized_task.get_extra_links(ti, self.link_class.name) == "", (
+ "Operator link should be empty for deserialized task with no XCom push"
+ )
def test_suppress_error_on_xcom_pull(self):
"""Test ignore any error on XCom pull"""
diff --git a/providers/amazon/tests/unit/amazon/aws/links/test_batch.py b/providers/amazon/tests/unit/amazon/aws/links/test_batch.py
index fa548844c27..8ecf7022f21 100644
--- a/providers/amazon/tests/unit/amazon/aws/links/test_batch.py
+++ b/providers/amazon/tests/unit/amazon/aws/links/test_batch.py
@@ -45,8 +45,7 @@ class TestBatchJobDefinitionLink(BaseAwsLinksTestCase):
)
self.assert_extra_link_url(
expected_url=(
- "https://console.aws.amazon.com/batch/home"
- "?region=eu-west-1#job-definition/detail/arn:fake:jd"
+ "https://console.aws.amazon.com/batch/home?region=eu-west-1#job-definition/detail/arn:fake:jd"
),
region_name="eu-west-1",
aws_partition="aws",
diff --git a/providers/amazon/tests/unit/amazon/aws/links/test_sagemaker.py b/providers/amazon/tests/unit/amazon/aws/links/test_sagemaker.py
index 265e485196f..25bae4efdfa 100644
--- a/providers/amazon/tests/unit/amazon/aws/links/test_sagemaker.py
+++ b/providers/amazon/tests/unit/amazon/aws/links/test_sagemaker.py
@@ -42,8 +42,7 @@ class TestSageMakerTransformDetailsLink(BaseAwsLinksTestCase):
self.assert_extra_link_url(
expected_url=(
- "https://console.aws.amazon.com/sagemaker/home"
- "?region=us-east-1#/transform-jobs/test_job_name"
+ "https://console.aws.amazon.com/sagemaker/home?region=us-east-1#/transform-jobs/test_job_name"
),
region_name="us-east-1",
aws_partition="aws",
diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_eks.py b/providers/amazon/tests/unit/amazon/aws/operators/test_eks.py
index b557f2f0f87..bb68c6cf060 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_eks.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_eks.py
@@ -451,9 +451,9 @@ class TestEksCreateFargateProfileOperator:
)
with pytest.raises(TaskDeferred) as exc:
operator.execute({})
- assert isinstance(
- exc.value.trigger, EksCreateFargateProfileTrigger
- ), "Trigger is not a EksCreateFargateProfileTrigger"
+ assert isinstance(exc.value.trigger, EksCreateFargateProfileTrigger), (
+ "Trigger is not a EksCreateFargateProfileTrigger"
+ )
def test_template_fields(self):
op = EksCreateFargateProfileOperator(task_id=TASK_ID, **self.create_fargate_profile_params)
@@ -679,9 +679,9 @@ class TestEksDeleteFargateProfileOperator:
with pytest.raises(TaskDeferred) as exc:
self.delete_fargate_profile_operator.execute({})
- assert isinstance(
- exc.value.trigger, EksDeleteFargateProfileTrigger
- ), "Trigger is not a EksDeleteFargateProfileTrigger"
+ assert isinstance(exc.value.trigger, EksDeleteFargateProfileTrigger), (
+ "Trigger is not a EksDeleteFargateProfileTrigger"
+ )
def test_template_fields(self):
validate_template_fields(self.delete_fargate_profile_operator)
diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_containers.py b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_containers.py
index 41ecdaa6876..ec32ac72d81 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_containers.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_containers.py
@@ -142,9 +142,9 @@ class TestEmrContainerOperator:
self.emr_container.wait_for_completion = False
with pytest.raises(TaskDeferred) as exc:
self.emr_container.execute(context=None)
- assert isinstance(
- exc.value.trigger, EmrContainerTrigger
- ), f"{exc.value.trigger} is not a EmrContainerTrigger"
+ assert isinstance(exc.value.trigger, EmrContainerTrigger), (
+ f"{exc.value.trigger} is not a EmrContainerTrigger"
+ )
@mock.patch.object(EmrContainerHook, "submit_job")
@mock.patch.object(
diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_create_job_flow.py b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_create_job_flow.py
index 3fb6ef74b57..037fb443036 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_create_job_flow.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_create_job_flow.py
@@ -229,9 +229,9 @@ class TestEmrCreateJobFlowOperator:
with pytest.raises(TaskDeferred) as exc:
self.operator.execute(self.mock_context)
- assert isinstance(
- exc.value.trigger, EmrCreateJobFlowTrigger
- ), "Trigger is not a EmrCreateJobFlowTrigger"
+ assert isinstance(exc.value.trigger, EmrCreateJobFlowTrigger), (
+ "Trigger is not a EmrCreateJobFlowTrigger"
+ )
def test_template_fields(self):
validate_template_fields(self.operator)
diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_terminate_job_flow.py b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_terminate_job_flow.py
index f6797558370..90af4cbf5fc 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_emr_terminate_job_flow.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_emr_terminate_job_flow.py
@@ -56,9 +56,9 @@ class TestEmrTerminateJobFlowOperator:
with pytest.raises(TaskDeferred) as exc:
operator.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, EmrTerminateJobFlowTrigger
- ), "Trigger is not a EmrTerminateJobFlowTrigger"
+ assert isinstance(exc.value.trigger, EmrTerminateJobFlowTrigger), (
+ "Trigger is not a EmrTerminateJobFlowTrigger"
+ )
def test_template_fields(self):
operator = EmrTerminateJobFlowOperator(
diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_redshift_cluster.py b/providers/amazon/tests/unit/amazon/aws/operators/test_redshift_cluster.py
index ea89eb447f5..36ccf31217a 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_redshift_cluster.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_redshift_cluster.py
@@ -224,9 +224,9 @@ class TestRedshiftCreateClusterSnapshotOperator:
)
with pytest.raises(TaskDeferred) as exc:
create_snapshot.execute(None)
- assert isinstance(
- exc.value.trigger, RedshiftCreateClusterSnapshotTrigger
- ), "Trigger is not a RedshiftCreateClusterSnapshotTrigger"
+ assert isinstance(exc.value.trigger, RedshiftCreateClusterSnapshotTrigger), (
+ "Trigger is not a RedshiftCreateClusterSnapshotTrigger"
+ )
def test_template_fields(self):
operator = RedshiftCreateClusterSnapshotOperator(
@@ -358,9 +358,9 @@ class TestResumeClusterOperator:
with pytest.raises(TaskDeferred) as exc:
redshift_operator.execute({})
- assert isinstance(
- exc.value.trigger, RedshiftResumeClusterTrigger
- ), "Trigger is not a RedshiftResumeClusterTrigger"
+ assert isinstance(exc.value.trigger, RedshiftResumeClusterTrigger), (
+ "Trigger is not a RedshiftResumeClusterTrigger"
+ )
@mock.patch("airflow.providers.amazon.aws.operators.redshift_cluster.RedshiftResumeClusterOperator.defer")
@mock.patch.object(RedshiftHook, "cluster_status")
@@ -510,9 +510,9 @@ class TestPauseClusterOperator:
with pytest.raises(TaskDeferred) as exc:
redshift_operator.execute(context=None)
- assert isinstance(
- exc.value.trigger, RedshiftPauseClusterTrigger
- ), "Trigger is not a RedshiftPauseClusterTrigger"
+ assert isinstance(exc.value.trigger, RedshiftPauseClusterTrigger), (
+ "Trigger is not a RedshiftPauseClusterTrigger"
+ )
@mock.patch("airflow.providers.amazon.aws.operators.redshift_cluster.RedshiftPauseClusterOperator.defer")
@mock.patch.object(RedshiftHook, "cluster_status")
@@ -646,9 +646,9 @@ class TestDeleteClusterOperator:
with pytest.raises(TaskDeferred) as exc:
delete_cluster.execute(context=None)
- assert isinstance(
- exc.value.trigger, RedshiftDeleteClusterTrigger
- ), "Trigger is not a RedshiftDeleteClusterTrigger"
+ assert isinstance(exc.value.trigger, RedshiftDeleteClusterTrigger), (
+ "Trigger is not a RedshiftDeleteClusterTrigger"
+ )
@mock.patch("airflow.providers.amazon.aws.operators.redshift_cluster.RedshiftDeleteClusterOperator.defer")
@mock.patch("airflow.providers.amazon.aws.hooks.redshift_cluster.RedshiftHook.cluster_status")
diff --git a/providers/amazon/tests/unit/amazon/aws/secrets/test_systems_manager.py b/providers/amazon/tests/unit/amazon/aws/secrets/test_systems_manager.py
index 1a2a93518dd..4614ff17012 100644
--- a/providers/amazon/tests/unit/amazon/aws/secrets/test_systems_manager.py
+++ b/providers/amazon/tests/unit/amazon/aws/secrets/test_systems_manager.py
@@ -184,8 +184,7 @@ class TestSsmSecrets:
mock_ssm_client.assert_called_once_with(service_name="ssm", use_ssl=False)
@mock.patch(
- "airflow.providers.amazon.aws.secrets.systems_manager."
- "SystemsManagerParameterStoreBackend._get_secret"
+ "airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend._get_secret"
)
def test_connection_prefix_none_value(self, mock_get_secret):
"""
@@ -201,8 +200,7 @@ class TestSsmSecrets:
mock_get_secret.assert_not_called()
@mock.patch(
- "airflow.providers.amazon.aws.secrets.systems_manager."
- "SystemsManagerParameterStoreBackend._get_secret"
+ "airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend._get_secret"
)
def test_variable_prefix_none_value(self, mock_get_secret):
"""
@@ -218,8 +216,7 @@ class TestSsmSecrets:
mock_get_secret.assert_not_called()
@mock.patch(
- "airflow.providers.amazon.aws.secrets.systems_manager."
- "SystemsManagerParameterStoreBackend._get_secret"
+ "airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend._get_secret"
)
def test_config_prefix_none_value(self, mock_get_secret):
"""
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_containers.py b/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_containers.py
index d2ecd011ddd..6e737fbf7a9 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_containers.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_containers.py
@@ -84,9 +84,9 @@ class TestEmrContainerSensor:
mock_poke.return_value = False
with pytest.raises(TaskDeferred) as e:
self.sensor.execute(context=None)
- assert isinstance(
- e.value.trigger, EmrContainerTrigger
- ), f"{e.value.trigger} is not a EmrContainerTrigger"
+ assert isinstance(e.value.trigger, EmrContainerTrigger), (
+ f"{e.value.trigger} is not a EmrContainerTrigger"
+ )
@mock.patch("airflow.providers.amazon.aws.sensors.emr.EmrContainerSensor.poke")
def test_sensor_defer_with_timeout(self, mock_poke):
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_job_flow.py b/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_job_flow.py
index a0a56039fa2..74500a03c84 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_job_flow.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_emr_job_flow.py
@@ -275,6 +275,6 @@ class TestEmrJobFlowSensor:
with pytest.raises(TaskDeferred) as exc:
sensor.execute(context=None)
- assert isinstance(
- exc.value.trigger, EmrTerminateJobFlowTrigger
- ), f"{exc.value.trigger} is not a EmrTerminateJobFlowTrigger"
+ assert isinstance(exc.value.trigger, EmrTerminateJobFlowTrigger), (
+ f"{exc.value.trigger} is not a EmrTerminateJobFlowTrigger"
+ )
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_glacier.py b/providers/amazon/tests/unit/amazon/aws/sensors/test_glacier.py
index 2c93cfb58eb..3303174450e 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_glacier.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_glacier.py
@@ -79,7 +79,7 @@ class TestAmazonGlacierSensor:
def test_fail_poke(self, mocked_describe_job):
response = {"Action": "some action", "StatusCode": "Failed"}
- message = f'Sensor failed. Job status: {response["Action"]}, code status: {response["StatusCode"]}'
+ message = f"Sensor failed. Job status: {response['Action']}, code status: {response['StatusCode']}"
mocked_describe_job.return_value = response
with pytest.raises(AirflowException, match=message):
self.op.poke(context={})
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_redshift_cluster.py b/providers/amazon/tests/unit/amazon/aws/sensors/test_redshift_cluster.py
index 2ecf83c3dfd..8a3c0ea48c1 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_redshift_cluster.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_redshift_cluster.py
@@ -113,9 +113,9 @@ class TestRedshiftClusterSensor:
with pytest.raises(TaskDeferred) as exc:
deferrable_op.execute(None)
- assert isinstance(
- exc.value.trigger, RedshiftClusterTrigger
- ), "Trigger is not a RedshiftClusterTrigger"
+ assert isinstance(exc.value.trigger, RedshiftClusterTrigger), (
+ "Trigger is not a RedshiftClusterTrigger"
+ )
def test_redshift_sensor_async_execute_failure(self, deferrable_op):
"""Test RedshiftClusterSensor with an AirflowException is raised in case of error event"""
diff --git a/providers/amazon/tests/unit/amazon/aws/transfers/test_s3_to_dynamodb.py b/providers/amazon/tests/unit/amazon/aws/transfers/test_s3_to_dynamodb.py
index aa92f34507b..66e7d6ee15a 100644
--- a/providers/amazon/tests/unit/amazon/aws/transfers/test_s3_to_dynamodb.py
+++ b/providers/amazon/tests/unit/amazon/aws/transfers/test_s3_to_dynamodb.py
@@ -175,9 +175,9 @@ class TestS3ToDynamoDBOperator:
)
with pytest.raises(AirflowException) as excinfo:
new_table_op.execute(None)
- assert "S3 load into DynamoDB table failed with error" in str(
- excinfo.value
- ), "Exception message not passed correctly"
+ assert "S3 load into DynamoDB table failed with error" in str(excinfo.value), (
+ "Exception message not passed correctly"
+ )
@mock.patch("botocore.client.BaseClient._make_api_call")
def test_s3_to_dynamodb_new_table_job_startup_error(self, mock_make_api_call, new_table_op):
diff --git a/providers/amazon/tests/unit/amazon/aws/utils/test_connection_wrapper.py b/providers/amazon/tests/unit/amazon/aws/utils/test_connection_wrapper.py
index 95aff74d3b5..02275cccaea 100644
--- a/providers/amazon/tests/unit/amazon/aws/utils/test_connection_wrapper.py
+++ b/providers/amazon/tests/unit/amazon/aws/utils/test_connection_wrapper.py
@@ -355,9 +355,9 @@ class TestAwsConnectionWrapper:
# Non init fields should be same in orig_wrapper and child wrapper
wrap_non_init_fields = [f.name for f in fields(wrap_conn) if not f.init]
for field in wrap_non_init_fields:
- assert getattr(wrap_conn, field) == getattr(
- orig_wrapper, field
- ), "Expected no changes in non-init values"
+ assert getattr(wrap_conn, field) == getattr(orig_wrapper, field), (
+ "Expected no changes in non-init values"
+ )
# Test overwrite/inherit init fields
assert wrap_conn.region_name == (region_name or orig_wrapper.region_name)
diff --git a/providers/apache/beam/tests/unit/apache/beam/operators/test_beam.py b/providers/apache/beam/tests/unit/apache/beam/operators/test_beam.py
index fc567f011ce..dcb766373bf 100644
--- a/providers/apache/beam/tests/unit/apache/beam/operators/test_beam.py
+++ b/providers/apache/beam/tests/unit/apache/beam/operators/test_beam.py
@@ -939,9 +939,9 @@ class TestBeamRunPythonPipelineOperatorAsync:
with pytest.raises(TaskDeferred) as exc:
op.execute(context=mock.MagicMock())
- assert isinstance(
- exc.value.trigger, BeamPythonPipelineTrigger
- ), "Trigger is not a BeamPythonPipelineTrigger"
+ assert isinstance(exc.value.trigger, BeamPythonPipelineTrigger), (
+ "Trigger is not a BeamPythonPipelineTrigger"
+ )
@mock.patch(BEAM_OPERATOR_PATH.format("BeamHook"))
def test_async_execute_direct_runner(self, beam_hook_mock):
@@ -1046,9 +1046,9 @@ class TestBeamRunJavaPipelineOperatorAsync:
with pytest.raises(TaskDeferred) as exc:
op.execute(context=mock.MagicMock())
- assert isinstance(
- exc.value.trigger, BeamJavaPipelineTrigger
- ), "Trigger is not a BeamPJavaPipelineTrigger"
+ assert isinstance(exc.value.trigger, BeamJavaPipelineTrigger), (
+ "Trigger is not a BeamPJavaPipelineTrigger"
+ )
@mock.patch(BEAM_OPERATOR_PATH.format("BeamHook"))
def test_async_execute_direct_runner(self, beam_hook_mock):
diff --git a/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py b/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py
index fec3ae7f0f1..86bacc5836d 100644
--- a/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py
+++ b/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py
@@ -55,7 +55,7 @@ class DrillHook(DbApiHook):
database_url = (
f"{conn_md.extra_dejson.get('dialect_driver', 'drill+sadrill')}://{creds}"
f"{conn_md.host}:{conn_md.port}/"
- f'{conn_md.extra_dejson.get("storage_plugin", "dfs")}'
+ f"{conn_md.extra_dejson.get('storage_plugin', 'dfs')}"
)
if "?" in database_url:
raise ValueError("Drill database_url should not contain a '?'")
diff --git a/providers/apache/druid/tests/unit/apache/druid/hooks/test_druid.py b/providers/apache/druid/tests/unit/apache/druid/hooks/test_druid.py
index 478509480ea..b035aac3d76 100644
--- a/providers/apache/druid/tests/unit/apache/druid/hooks/test_druid.py
+++ b/providers/apache/druid/tests/unit/apache/druid/hooks/test_druid.py
@@ -119,8 +119,7 @@ class TestDruidSubmitHook:
text='{"status":{"status": "RUNNING"}}',
)
shutdown_post = requests_mock.post(
- "http://druid-overlord:8081/druid/indexer/v1/task/"
- "9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
+ "http://druid-overlord:8081/druid/indexer/v1/task/9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
text='{"task":"9f8a7359-77d4-4612-b0cd-cc2f6a3c28de"}',
)
@@ -151,8 +150,7 @@ class TestDruidSubmitHook:
text='{"status":{"status": "RUNNING"}}',
)
shutdown_post = requests_mock.post(
- "http://druid-overlord:8081/druid/indexer/v1/task/"
- "9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
+ "http://druid-overlord:8081/druid/indexer/v1/task/9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
text='{"task":"9f8a7359-77d4-4612-b0cd-cc2f6a3c28de"}',
)
@@ -222,8 +220,7 @@ class TestDruidSubmitHook:
text='{"status":{"status": "RUNNING"}}',
)
shutdown_post = requests_mock.post(
- "http://druid-overlord:8081/druid/indexer/v1/task/"
- "9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
+ "http://druid-overlord:8081/druid/indexer/v1/task/9f8a7359-77d4-4612-b0cd-cc2f6a3c28de/shutdown",
text='{"task":"9f8a7359-77d4-4612-b0cd-cc2f6a3c28de"}',
)
diff --git a/providers/apache/hive/tests/system/apache/hive/example_twitter_dag.py b/providers/apache/hive/tests/system/apache/hive/example_twitter_dag.py
index c247bf90330..11a072bdbcf 100644
--- a/providers/apache/hive/tests/system/apache/hive/example_twitter_dag.py
+++ b/providers/apache/hive/tests/system/apache/hive/example_twitter_dag.py
@@ -125,9 +125,7 @@ with DAG(
load_to_hive = HiveOperator(
task_id=f"load_{channel}_to_hive",
hql=(
- f"LOAD DATA INPATH '{hdfs_dir}{channel}/{file_name}'"
- f"INTO TABLE {channel}"
- f"PARTITION(dt='{dt}')"
+ f"LOAD DATA INPATH '{hdfs_dir}{channel}/{file_name}'INTO TABLE {channel}PARTITION(dt='{dt}')"
),
)
# [END create_hive]
diff --git a/providers/apache/hive/tests/unit/apache/hive/operators/test_hive_stats.py b/providers/apache/hive/tests/unit/apache/hive/operators/test_hive_stats.py
index b7090e1b39e..6f5504e274a 100644
--- a/providers/apache/hive/tests/unit/apache/hive/operators/test_hive_stats.py
+++ b/providers/apache/hive/tests/unit/apache/hive/operators/test_hive_stats.py
@@ -326,9 +326,7 @@ class TestHiveStatsCollectionOperator(TestHiveEnvironment):
op.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
select_count_query = (
- "SELECT COUNT(*) AS __count "
- "FROM airflow.static_babynames_partitioned "
- "WHERE ds = '2015-01-01';"
+ "SELECT COUNT(*) AS __count FROM airflow.static_babynames_partitioned WHERE ds = '2015-01-01';"
)
mock_presto_hook.get_first.assert_called_with(hql=select_count_query)
diff --git a/providers/apache/hive/tests/unit/apache/hive/transfers/test_s3_to_hive.py b/providers/apache/hive/tests/unit/apache/hive/transfers/test_s3_to_hive.py
index 4d54b6248cf..5ec2f02fca4 100644
--- a/providers/apache/hive/tests/unit/apache/hive/transfers/test_s3_to_hive.py
+++ b/providers/apache/hive/tests/unit/apache/hive/transfers/test_s3_to_hive.py
@@ -172,17 +172,17 @@ class TestS3ToHiveTransfer:
def test__match_headers(self):
self.kwargs["field_dict"] = {"Sno": "BIGINT", "Some,Text": "STRING"}
- assert S3ToHiveOperator(**self.kwargs)._match_headers(
- ["Sno", "Some,Text"]
- ), "Header row doesn't match expected value"
+ assert S3ToHiveOperator(**self.kwargs)._match_headers(["Sno", "Some,Text"]), (
+ "Header row doesn't match expected value"
+ )
# Testing with different column order
- assert not S3ToHiveOperator(**self.kwargs)._match_headers(
- ["Some,Text", "Sno"]
- ), "Header row doesn't match expected value"
+ assert not S3ToHiveOperator(**self.kwargs)._match_headers(["Some,Text", "Sno"]), (
+ "Header row doesn't match expected value"
+ )
# Testing with extra column in header
- assert not S3ToHiveOperator(**self.kwargs)._match_headers(
- ["Sno", "Some,Text", "ExtraColumn"]
- ), "Header row doesn't match expected value"
+ assert not S3ToHiveOperator(**self.kwargs)._match_headers(["Sno", "Some,Text", "ExtraColumn"]), (
+ "Header row doesn't match expected value"
+ )
def test__delete_top_row_and_compress(self):
s32hive = S3ToHiveOperator(**self.kwargs)
diff --git a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc.py b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc.py
index e3a34cfe26b..9973a56ca95 100644
--- a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc.py
+++ b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc.py
@@ -43,8 +43,7 @@ class TestSparkJDBCHook:
"partition_column": "columnMcColumnFace",
"lower_bound": "10",
"upper_bound": "20",
- "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),"
- "comments VARCHAR(1024)",
+ "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),comments VARCHAR(1024)",
}
# this config is invalid because if one of [partitionColumn, lowerBound, upperBound]
@@ -62,8 +61,7 @@ class TestSparkJDBCHook:
"num_partitions": 10,
"partition_column": "columnMcColumnFace",
"upper_bound": "20",
- "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),"
- "comments VARCHAR(1024)",
+ "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),comments VARCHAR(1024)",
}
def setup_method(self):
diff --git a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc_script.py b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc_script.py
index dcba3c67b64..5b28ae68498 100644
--- a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc_script.py
+++ b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_jdbc_script.py
@@ -96,8 +96,7 @@ class TestSparkJDBCScrip:
"partition_column": "columnMcColumnFace",
"lower_bound": "10",
"upper_bound": "20",
- "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),"
- "comments VARCHAR(1024)",
+ "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),comments VARCHAR(1024)",
}
def test_parse_arguments(self):
diff --git a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_submit.py b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_submit.py
index cf1f182b7b7..cdd24349814 100644
--- a/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_submit.py
+++ b/providers/apache/spark/tests/unit/apache/spark/hooks/test_spark_submit.py
@@ -696,9 +696,9 @@ class TestSparkSubmitHook:
}
assert connection == expected_spark_connection
assert dict_cmd["--keytab"] == "will-override"
- assert (
- not mock_create_keytab_path_from_base64_keytab.called
- ), "Should not call _create_keytab_path_from_base64_keytab"
+ assert not mock_create_keytab_path_from_base64_keytab.called, (
+ "Should not call _create_keytab_path_from_base64_keytab"
+ )
def test_resolve_spark_submit_env_vars_standalone_client_mode(self):
# Given
@@ -780,8 +780,7 @@ class TestSparkSubmitHook:
"pod uid: ba9c61f6-205f-11e8-b65f-d48564c88e42",
"creation time: 2018-03-05T10:26:55Z",
"service account name: spark",
- "volumes: spark-init-properties, download-jars-volume,"
- "download-files-volume, spark-token-2vmlm",
+ "volumes: spark-init-properties, download-jars-volume,download-files-volume, spark-token-2vmlm",
"node name: N/A",
"start time: N/A",
"container images: N/A",
@@ -873,8 +872,7 @@ class TestSparkSubmitHook:
# Given
hook = SparkSubmitHook(conn_id="spark_standalone_cluster")
log_lines = [
- "curl: Failed to connect to http://spark-standalone-master:6066"
- "This is an invalid Spark response",
+ "curl: Failed to connect to http://spark-standalone-master:6066This is an invalid Spark response",
"Timed out",
]
# When
@@ -984,8 +982,7 @@ class TestSparkSubmitHook:
"pod uid: ba9c61f6-205f-11e8-b65f-d48564c88e42",
"creation time: 2018-03-05T10:26:55Z",
"service account name: spark",
- "volumes: spark-init-properties, download-jars-volume,"
- "download-files-volume, spark-token-2vmlm",
+ "volumes: spark-init-properties, download-jars-volume,download-files-volume, spark-token-2vmlm",
"node name: N/A",
"start time: N/A",
"container images: N/A",
diff --git a/providers/apache/spark/tests/unit/apache/spark/operators/test_spark_jdbc.py b/providers/apache/spark/tests/unit/apache/spark/operators/test_spark_jdbc.py
index c1bcadc1ca2..9d313e7a6ce 100644
--- a/providers/apache/spark/tests/unit/apache/spark/operators/test_spark_jdbc.py
+++ b/providers/apache/spark/tests/unit/apache/spark/operators/test_spark_jdbc.py
@@ -53,8 +53,7 @@ class TestSparkJDBCOperator:
"partition_column": "columnMcColumnFace",
"lower_bound": "10",
"upper_bound": "20",
- "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),"
- "comments VARCHAR(1024)",
+ "create_table_column_types": "columnMcColumnFace INTEGER(100), name CHAR(64),comments VARCHAR(1024)",
"use_krb5ccache": True,
}
diff --git a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py
index 9b77a976073..75190d6bf25 100644
--- a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py
+++ b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py
@@ -192,7 +192,7 @@ class SparkKubernetesOperator(KubernetesPodOperator):
if not context:
return {}
- context_dict = cast(dict, context)
+ context_dict = cast("dict", context)
ti = context_dict["ti"]
run_id = context_dict["run_id"]
diff --git a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/triggers/pod.py b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/triggers/pod.py
index 463444675ab..52a12414f2c 100644
--- a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/triggers/pod.py
+++ b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/triggers/pod.py
@@ -25,7 +25,6 @@ from functools import cached_property
from typing import TYPE_CHECKING, Any, cast
import tenacity
-from kubernetes_asyncio.client.models import V1Pod
from airflow.providers.cncf.kubernetes.hooks.kubernetes import AsyncKubernetesHook
from airflow.providers.cncf.kubernetes.utils.pod_manager import (
@@ -36,6 +35,7 @@ from airflow.providers.cncf.kubernetes.utils.pod_manager import (
from airflow.triggers.base import BaseTrigger, TriggerEvent
if TYPE_CHECKING:
+ from kubernetes_asyncio.client.models import V1Pod
from pendulum import DateTime
@@ -265,7 +265,7 @@ class KubernetesPodTrigger(BaseTrigger):
pod = await self.hook.get_pod(name=self.pod_name, namespace=self.pod_namespace)
# Due to AsyncKubernetesHook overriding get_pod, we need to cast the return
# value to kubernetes_asyncio.V1Pod, because it's perceived as different type
- return cast(V1Pod, pod)
+ return cast("V1Pod", pod)
@cached_property
def hook(self) -> AsyncKubernetesHook:
diff --git a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py
index 0d6f353310b..3bb9609c782 100644
--- a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py
+++ b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py
@@ -670,7 +670,7 @@ class PodManager(LoggingMixin):
if not sep:
return None, line
try:
- last_log_time = cast(DateTime, pendulum.parse(timestamp))
+ last_log_time = cast("DateTime", pendulum.parse(timestamp))
except ParserError:
return None, line
return last_log_time, message
diff --git a/providers/common/io/src/airflow/providers/common/io/xcom/__init__.py b/providers/common/io/src/airflow/providers/common/io/xcom/__init__.py
index b245035ddbf..6bdd6c458f8 100644
--- a/providers/common/io/src/airflow/providers/common/io/xcom/__init__.py
+++ b/providers/common/io/src/airflow/providers/common/io/xcom/__init__.py
@@ -25,6 +25,5 @@ if packaging.version.parse(packaging.version.parse(airflow_version).base_version
"2.9.0"
):
raise AirflowOptionalProviderFeatureException(
- "The package xcom backend feature of `apache-airflow-providers-common-io` needs "
- "Apache Airflow 2.9.0+"
+ "The package xcom backend feature of `apache-airflow-providers-common-io` needs Apache Airflow 2.9.0+"
)
diff --git a/providers/common/io/tests/system/common/io/example_file_transfer_local_to_s3.py b/providers/common/io/tests/system/common/io/example_file_transfer_local_to_s3.py
index f1522d5f261..04204f3c38b 100644
--- a/providers/common/io/tests/system/common/io/example_file_transfer_local_to_s3.py
+++ b/providers/common/io/tests/system/common/io/example_file_transfer_local_to_s3.py
@@ -68,7 +68,7 @@ with DAG(
catchup=False,
) as dag:
temp_file = create_temp_file()
- temp_file_path = cast(ObjectStoragePath, temp_file)
+ temp_file_path = cast("ObjectStoragePath", temp_file)
# [START howto_transfer_local_to_s3]
transfer = FileTransferOperator(src=temp_file_path, dst=AWS_BUCKET, task_id="transfer")
diff --git a/providers/common/sql/src/airflow/providers/common/sql/hooks/handlers.pyi b/providers/common/sql/src/airflow/providers/common/sql/hooks/handlers.pyi
index 7e7992b88a3..43eb7d5cf36 100644
--- a/providers/common/sql/src/airflow/providers/common/sql/hooks/handlers.pyi
+++ b/providers/common/sql/src/airflow/providers/common/sql/hooks/handlers.pyi
@@ -34,6 +34,8 @@ isort:skip_file
from collections.abc import Iterable
-def return_single_query_results(sql: str | Iterable[str], return_last: bool, split_statements: bool): ...
+def return_single_query_results(
+ sql: str | Iterable[str], return_last: bool, split_statements: bool | None
+): ...
def fetch_all_handler(cursor) -> list[tuple] | None: ...
def fetch_one_handler(cursor) -> list[tuple] | None: ...
diff --git a/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.py b/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.py
index 3edc72fd106..8914aa97b4d 100644
--- a/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.py
+++ b/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.py
@@ -615,8 +615,8 @@ class DbApiHook(BaseHook):
is already a common data structure, this method should be ignored.
"""
if isinstance(result, Sequence):
- return cast(list[tuple], result)
- return cast(tuple, result)
+ return cast("list[tuple]", result)
+ return cast("tuple", result)
def _run_command(self, cur, sql_statement, parameters):
"""Run a statement using an already open cursor."""
diff --git a/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.pyi b/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.pyi
index fb9272e2290..d95daa4d0e9 100644
--- a/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.pyi
+++ b/providers/common/sql/src/airflow/providers/common/sql/hooks/sql.pyi
@@ -50,7 +50,9 @@ T = TypeVar("T")
SQL_PLACEHOLDERS: Incomplete
WARNING_MESSAGE: str
-def return_single_query_results(sql: str | Iterable[str], return_last: bool, split_statements: bool): ...
+def return_single_query_results(
+ sql: str | Iterable[str], return_last: bool, split_statements: bool | None
+): ...
def fetch_all_handler(cursor) -> list[tuple] | None: ...
def fetch_one_handler(cursor) -> list[tuple] | None: ...
def resolve_dialects() -> MutableMapping[str, MutableMapping]: ...
diff --git a/providers/common/sql/src/airflow/providers/common/sql/operators/sql.py b/providers/common/sql/src/airflow/providers/common/sql/operators/sql.py
index 2b20b1ee6bc..7e02a47c25b 100644
--- a/providers/common/sql/src/airflow/providers/common/sql/operators/sql.py
+++ b/providers/common/sql/src/airflow/providers/common/sql/operators/sql.py
@@ -1015,12 +1015,7 @@ class SQLIntervalCheckOperator(BaseSQLOperator):
test_results[metric] = self.ignore_zero
self.log.info(
- (
- "Current metric for %s: %s\n"
- "Past metric for %s: %s\n"
- "Ratio for %s: %s\n"
- "Threshold: %s\n"
- ),
+ ("Current metric for %s: %s\nPast metric for %s: %s\nRatio for %s: %s\nThreshold: %s\n"),
metric,
cur,
metric,
@@ -1134,11 +1129,11 @@ class SQLThresholdCheckOperator(BaseSQLOperator):
)
error_msg = (
f'Threshold Check: "{meta_data.get("task_id")}" failed.\n'
- f'DAG: {self.dag_id}\nTask_id: {meta_data.get("task_id")}\n'
- f'Check description: {meta_data.get("description")}\n'
+ f"DAG: {self.dag_id}\nTask_id: {meta_data.get('task_id')}\n"
+ f"Check description: {meta_data.get('description')}\n"
f"SQL: {self.sql}\n"
f"Result: {result} is not within thresholds "
- f'{meta_data.get("min_threshold")} and {meta_data.get("max_threshold")}'
+ f"{meta_data.get('min_threshold')} and {meta_data.get('max_threshold')}"
)
self._raise_exception(error_msg)
diff --git a/providers/databricks/src/airflow/providers/databricks/hooks/databricks_sql.py b/providers/databricks/src/airflow/providers/databricks/hooks/databricks_sql.py
index b0f52798d9f..d7d9423aa29 100644
--- a/providers/databricks/src/airflow/providers/databricks/hooks/databricks_sql.py
+++ b/providers/databricks/src/airflow/providers/databricks/hooks/databricks_sql.py
@@ -35,7 +35,6 @@ from databricks import sql # type: ignore[attr-defined]
from databricks.sql.types import Row
from airflow.exceptions import AirflowException
-from airflow.models.connection import Connection as AirflowConnection
from airflow.providers.common.sql.hooks.sql import DbApiHook, return_single_query_results
from airflow.providers.databricks.exceptions import DatabricksSqlExecutionError, DatabricksSqlExecutionTimeout
from airflow.providers.databricks.hooks.databricks_base import BaseDatabricksHook
@@ -43,6 +42,8 @@ from airflow.providers.databricks.hooks.databricks_base import BaseDatabricksHoo
if TYPE_CHECKING:
from databricks.sql.client import Connection
+ from airflow.models.connection import Connection as AirflowConnection
+
LIST_SQL_ENDPOINTS_ENDPOINT = ("GET", "api/2.0/sql/endpoints")
@@ -167,7 +168,7 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
if self._sql_conn is None:
raise AirflowException("SQL connection is not initialized")
- return cast(AirflowConnection, self._sql_conn)
+ return cast("AirflowConnection", self._sql_conn)
@overload # type: ignore[override]
def run(
@@ -295,11 +296,11 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
return []
rows_fields = tuple(rows[0].__fields__)
rows_object = namedtuple("Row", rows_fields, rename=True) # type: ignore
- return cast(list[tuple[Any, ...]], [rows_object(*row) for row in rows])
+ return cast("list[tuple[Any, ...]]", [rows_object(*row) for row in rows])
elif isinstance(result, Row):
row_fields = tuple(result.__fields__)
row_object = namedtuple("Row", row_fields, rename=True) # type: ignore
- return cast(tuple[Any, ...], row_object(*result))
+ return cast("tuple[Any, ...]", row_object(*result))
else:
raise TypeError(f"Expected Sequence[Row] or Row, but got {type(result)}")
diff --git a/providers/databricks/src/airflow/providers/databricks/utils/databricks.py b/providers/databricks/src/airflow/providers/databricks/utils/databricks.py
index 88d622c3bc1..8b0fcad654f 100644
--- a/providers/databricks/src/airflow/providers/databricks/utils/databricks.py
+++ b/providers/databricks/src/airflow/providers/databricks/utils/databricks.py
@@ -63,4 +63,4 @@ def validate_trigger_event(event: dict):
try:
RunState.from_json(event["run_state"])
except Exception:
- raise AirflowException(f'Run state returned by the Trigger is incorrect: {event["run_state"]}')
+ raise AirflowException(f"Run state returned by the Trigger is incorrect: {event['run_state']}")
diff --git a/providers/databricks/tests/unit/databricks/operators/test_databricks.py b/providers/databricks/tests/unit/databricks/operators/test_databricks.py
index 51e7a765998..298c2aecd47 100644
--- a/providers/databricks/tests/unit/databricks/operators/test_databricks.py
+++ b/providers/databricks/tests/unit/databricks/operators/test_databricks.py
@@ -2013,9 +2013,9 @@ class TestDatabricksNotebookOperator:
with pytest.raises(TaskDeferred) as exec_info:
operator.monitor_databricks_job()
- assert isinstance(
- exec_info.value.trigger, DatabricksExecutionTrigger
- ), "Trigger is not a DatabricksExecutionTrigger"
+ assert isinstance(exec_info.value.trigger, DatabricksExecutionTrigger), (
+ "Trigger is not a DatabricksExecutionTrigger"
+ )
assert exec_info.value.method_name == "execute_complete"
@mock.patch("airflow.providers.databricks.operators.databricks.DatabricksHook")
diff --git a/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py b/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
index 66967654fb3..2f5ee59b2d2 100644
--- a/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
+++ b/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
@@ -166,7 +166,7 @@ def provide_account_id(func: T) -> T:
return await func(*bound_args.args, **bound_args.kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
class DbtCloudHook(HttpHook):
@@ -569,8 +569,7 @@ class DbtCloudHook(HttpHook):
if cause is not None and len(cause) > DBT_CAUSE_MAX_LENGTH:
warnings.warn(
- f"Cause `{cause}` exceeds limit of {DBT_CAUSE_MAX_LENGTH}"
- f" characters and will be truncated.",
+ f"Cause `{cause}` exceeds limit of {DBT_CAUSE_MAX_LENGTH} characters and will be truncated.",
UserWarning,
stacklevel=2,
)
diff --git a/providers/docker/src/airflow/providers/docker/decorators/docker.py b/providers/docker/src/airflow/providers/docker/decorators/docker.py
index 69ef22e91bb..ff15c93f3e0 100644
--- a/providers/docker/src/airflow/providers/docker/decorators/docker.py
+++ b/providers/docker/src/airflow/providers/docker/decorators/docker.py
@@ -132,8 +132,7 @@ class _DockerDecoratedOperator(DecoratedOperator, DockerOperator):
serializer = serializer or "pickle"
if serializer not in _SERIALIZERS:
msg = (
- f"Unsupported serializer {serializer!r}. "
- f"Expected one of {', '.join(map(repr, _SERIALIZERS))}"
+ f"Unsupported serializer {serializer!r}. Expected one of {', '.join(map(repr, _SERIALIZERS))}"
)
raise AirflowException(msg)
@@ -148,9 +147,10 @@ class _DockerDecoratedOperator(DecoratedOperator, DockerOperator):
def generate_command(self):
return (
- f"""bash -cx '{_generate_decode_command("__PYTHON_SCRIPT", "/tmp/script.py",
- self.python_command)} &&"""
- f'{_generate_decode_command("__PYTHON_INPUT", "/tmp/script.in", self.python_command)} &&'
+ f"""bash -cx '{
+ _generate_decode_command("__PYTHON_SCRIPT", "/tmp/script.py", self.python_command)
+ } &&"""
+ f"{_generate_decode_command('__PYTHON_INPUT', '/tmp/script.in', self.python_command)} &&"
f"{self.python_command} /tmp/script.py /tmp/script.in /tmp/script.out none /tmp/script.out'"
)
diff --git a/providers/docker/tests/unit/docker/operators/test_docker.py b/providers/docker/tests/unit/docker/operators/test_docker.py
index 50ff7e4f553..e1116d6ff55 100644
--- a/providers/docker/tests/unit/docker/operators/test_docker.py
+++ b/providers/docker/tests/unit/docker/operators/test_docker.py
@@ -473,9 +473,9 @@ class TestDockerOperator:
operator = DockerOperator(
private_environment={"PRIVATE": "MESSAGE"}, image=TEST_IMAGE, task_id="unittest"
)
- assert operator._private_environment == {
- "PRIVATE": "MESSAGE"
- }, "To keep this private, it must be an underscored attribute."
+ assert operator._private_environment == {"PRIVATE": "MESSAGE"}, (
+ "To keep this private, it must be an underscored attribute."
+ )
@mock.patch("airflow.providers.docker.operators.docker.StringIO")
def test_environment_overrides_env_file(self, stringio_mock):
diff --git a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py
index 5b4190ec5d4..5e1f69096c6 100644
--- a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py
+++ b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py
@@ -210,9 +210,9 @@ class TestDockerSwarmOperator:
)
operator.execute(None)
- assert (
- client_mock.remove_service.call_count == 0
- ), "Docker service being removed even when `auto_remove` set to `never`"
+ assert client_mock.remove_service.call_count == 0, (
+ "Docker service being removed even when `auto_remove` set to `never`"
+ )
@pytest.mark.parametrize("status", ["failed", "shutdown", "rejected", "orphaned", "remove"])
@mock.patch("airflow.providers.docker.operators.docker_swarm.types")
diff --git a/providers/edge/src/airflow/providers/edge/cli/edge_command.py b/providers/edge/src/airflow/providers/edge/cli/edge_command.py
index f10f7daf8d6..c2d49d0c8d7 100644
--- a/providers/edge/src/airflow/providers/edge/cli/edge_command.py
+++ b/providers/edge/src/airflow/providers/edge/cli/edge_command.py
@@ -544,8 +544,8 @@ def maintenance(args):
marker_path.write_text(
MaintenanceMarker(
maintenance=args.maintenance,
- comments=f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {getuser()} put '
- f'node into maintenance mode via cli\nComment: {args.comments}'
+ comments=f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {getuser()} put "
+ f"node into maintenance mode via cli\nComment: {args.comments}"
if args.maintenance == "on"
else None,
).json
diff --git a/providers/edge/src/airflow/providers/edge/plugins/edge_executor_plugin.py b/providers/edge/src/airflow/providers/edge/plugins/edge_executor_plugin.py
index 1158a28e226..59d3ef5cdb7 100644
--- a/providers/edge/src/airflow/providers/edge/plugins/edge_executor_plugin.py
+++ b/providers/edge/src/airflow/providers/edge/plugins/edge_executor_plugin.py
@@ -102,17 +102,17 @@ def modify_maintenance_comment_on_update(maintenance_comment: str | None, userna
):
return re.sub(
r"^\[[-\d:\s]+\] - .+ put node into maintenance mode\r?\nComment:",
- f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {username} updated maintenance mode\nComment:',
+ f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {username} updated maintenance mode\nComment:",
maintenance_comment,
)
elif re.search(r"^\[[-\d:\s]+\] - .+ updated maintenance mode\r?\nComment:.*", maintenance_comment):
return re.sub(
r"^\[[-\d:\s]+\] - .+ updated maintenance mode\r?\nComment:",
- f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {username} updated maintenance mode\nComment:',
+ f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {username} updated maintenance mode\nComment:",
maintenance_comment,
)
- return f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {username} updated maintenance mode\nComment: {maintenance_comment}'
- return f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {username} updated maintenance mode\nComment:'
+ return f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {username} updated maintenance mode\nComment: {maintenance_comment}"
+ return f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {username} updated maintenance mode\nComment:"
# registers airflow/providers/edge/plugins/templates as a Jinja template folder
@@ -164,7 +164,7 @@ class EdgeWorkerHosts(BaseView):
from airflow.providers.edge.models.edge_worker import request_maintenance
maintenance_comment = request.form.get("maintenance_comment")
- maintenance_comment = f'[{datetime.now().strftime("%Y-%m-%d %H:%M")}] - {current_user.username} put node into maintenance mode\nComment: {maintenance_comment}'
+ maintenance_comment = f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] - {current_user.username} put node into maintenance mode\nComment: {maintenance_comment}"
request_maintenance(worker_name, maintenance_comment)
return redirect(url_for("EdgeWorkerHosts.status"))
diff --git a/providers/edge/src/airflow/providers/edge/worker_api/routes/logs.py b/providers/edge/src/airflow/providers/edge/worker_api/routes/logs.py
index 8a1b50ae026..a61ac1ed3dd 100644
--- a/providers/edge/src/airflow/providers/edge/worker_api/routes/logs.py
+++ b/providers/edge/src/airflow/providers/edge/worker_api/routes/logs.py
@@ -35,6 +35,7 @@ from airflow.providers.edge.worker_api.routes._v2_compat import (
create_openapi_http_exception_doc,
status,
)
+from airflow.utils.log.file_task_handler import FileTaskHandler
from airflow.utils.session import NEW_SESSION, provide_session
logs_router = AirflowRouter(tags=["Logs"], prefix="/logs")
@@ -44,8 +45,6 @@ logs_router = AirflowRouter(tags=["Logs"], prefix="/logs")
@provide_session
def _logfile_path(task: TaskInstanceKey, session=NEW_SESSION) -> str:
"""Elaborate the (relative) path and filename to expect from task execution."""
- from airflow.utils.log.file_task_handler import FileTaskHandler
-
ti = TaskInstance.get_task_instance(
dag_id=task.dag_id,
run_id=task.run_id,
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py
index 5f3ab3a2e1b..c71f5ebed92 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py
@@ -26,9 +26,9 @@ from flask_appbuilder.const import AUTH_LDAP
from flask_login import login_user
from airflow.api_fastapi.app import get_auth_manager
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
if TYPE_CHECKING:
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.models import User
CLIENT_AUTH: tuple[str, str] | Any | None = None
@@ -45,8 +45,7 @@ def auth_current_user() -> User | None:
auth = request.authorization
if auth is None or not auth.username or not auth.password:
return None
-
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
user = None
if security_manager.auth_type == AUTH_LDAP:
user = security_manager.auth_user_ldap(auth.username, auth.password)
@@ -67,4 +66,4 @@ def requires_authentication(function: T):
else:
return Response("Unauthorized", 401, {"WWW-Authenticate": "Basic"})
- return cast(T, decorated)
+ return cast("T", decorated)
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py
index 3955ac45895..769b70bae75 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py
@@ -28,11 +28,11 @@ from requests_kerberos import HTTPKerberosAuth
from airflow.api_fastapi.app import get_auth_manager
from airflow.configuration import conf
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.utils.net import getfqdn
if TYPE_CHECKING:
from airflow.api_fastapi.auth.managers.models.base_user import BaseUser
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
log = logging.getLogger(__name__)
@@ -115,7 +115,7 @@ T = TypeVar("T", bound=Callable)
def find_user(username=None, email=None):
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
return security_manager.find_user(username=username, email=email)
@@ -143,4 +143,4 @@ def requires_authentication(function: T, find_user: Callable[[str], BaseUser] |
return _forbidden()
return _unauthorized()
- return cast(T, decorated)
+ return cast("T", decorated)
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py
index 9ff1b89eefa..8b39c0e8f77 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py
@@ -44,4 +44,4 @@ def requires_authentication(function: T):
return Response("Unauthorized", 401, {})
return function(*args, **kwargs)
- return cast(T, decorated)
+ return cast("T", decorated)
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py b/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py
index 1200790b89f..e8aacedea8c 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py
@@ -25,7 +25,6 @@ from marshmallow import ValidationError
from sqlalchemy import asc, desc, func, select
from airflow.api_fastapi.app import get_auth_manager
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.models import Action, Role
from airflow.providers.fab.auth_manager.schemas.role_and_permission_schema import (
ActionCollection,
@@ -40,6 +39,7 @@ from airflow.providers.fab.www.api_connexion.security import requires_access_cus
from airflow.providers.fab.www.security import permissions
if TYPE_CHECKING:
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride
from airflow.providers.fab.www.api_connexion.types import APIResponse, UpdateMask
@@ -60,7 +60,7 @@ def _check_action_and_resource(sm: FabAirflowSecurityManagerOverride, perms: lis
@requires_access_custom_view("GET", permissions.RESOURCE_ROLE)
def get_role(*, role_name: str) -> APIResponse:
"""Get role."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
role = security_manager.find_role(name=role_name)
if not role:
raise NotFound(title="Role not found", detail=f"Role with name {role_name!r} was not found")
@@ -71,7 +71,7 @@ def get_role(*, role_name: str) -> APIResponse:
@format_parameters({"limit": check_limit})
def get_roles(*, order_by: str = "name", limit: int, offset: int | None = None) -> APIResponse:
"""Get roles."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
session = security_manager.get_session
total_entries = session.scalars(select(func.count(Role.id))).one()
direction = desc if order_by.startswith("-") else asc
@@ -81,8 +81,7 @@ def get_roles(*, order_by: str = "name", limit: int, offset: int | None = None)
allowed_sort_attrs = ["role_id", "name"]
if order_by not in allowed_sort_attrs:
raise BadRequest(
- detail=f"Ordering with '{order_by}' is disallowed or "
- f"the attribute does not exist on the model"
+ detail=f"Ordering with '{order_by}' is disallowed or the attribute does not exist on the model"
)
query = select(Role)
@@ -99,7 +98,7 @@ def get_roles(*, order_by: str = "name", limit: int, offset: int | None = None)
@format_parameters({"limit": check_limit})
def get_permissions(*, limit: int, offset: int | None = None) -> APIResponse:
"""Get permissions."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
session = security_manager.get_session
total_entries = session.scalars(select(func.count(Action.id))).one()
query = select(Action)
@@ -110,7 +109,7 @@ def get_permissions(*, limit: int, offset: int | None = None) -> APIResponse:
@requires_access_custom_view("DELETE", permissions.RESOURCE_ROLE)
def delete_role(*, role_name: str) -> APIResponse:
"""Delete a role."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
role = security_manager.find_role(name=role_name)
if not role:
@@ -122,7 +121,7 @@ def delete_role(*, role_name: str) -> APIResponse:
@requires_access_custom_view("PUT", permissions.RESOURCE_ROLE)
def patch_role(*, role_name: str, update_mask: UpdateMask = None) -> APIResponse:
"""Update a role."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
body = request.json
try:
data = role_schema.load(body)
@@ -155,7 +154,7 @@ def patch_role(*, role_name: str, update_mask: UpdateMask = None) -> APIResponse
@requires_access_custom_view("POST", permissions.RESOURCE_ROLE)
def post_role() -> APIResponse:
"""Create a new role."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
body = request.json
try:
data = role_schema.load(body)
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py b/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py
index ca0fc747e40..8c504d64466 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py
@@ -26,7 +26,6 @@ from sqlalchemy import asc, desc, func, select
from werkzeug.security import generate_password_hash
from airflow.api_fastapi.app import get_auth_manager
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.models import User
from airflow.providers.fab.auth_manager.schemas.user_schema import (
UserCollection,
@@ -40,6 +39,7 @@ from airflow.providers.fab.www.api_connexion.security import requires_access_cus
from airflow.providers.fab.www.security import permissions
if TYPE_CHECKING:
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.models import Role
from airflow.providers.fab.www.api_connexion.types import APIResponse, UpdateMask
@@ -47,7 +47,7 @@ if TYPE_CHECKING:
@requires_access_custom_view("GET", permissions.RESOURCE_USER)
def get_user(*, username: str) -> APIResponse:
"""Get a user."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
user = security_manager.find_user(username=username)
if not user:
raise NotFound(title="User not found", detail=f"The User with username `{username}` was not found")
@@ -58,7 +58,7 @@ def get_user(*, username: str) -> APIResponse:
@format_parameters({"limit": check_limit})
def get_users(*, limit: int, order_by: str = "id", offset: str | None = None) -> APIResponse:
"""Get users."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
session = security_manager.get_session
total_entries = session.execute(select(func.count(User.id))).scalar()
direction = desc if order_by.startswith("-") else asc
@@ -76,8 +76,7 @@ def get_users(*, limit: int, order_by: str = "id", offset: str | None = None) ->
]
if order_by not in allowed_sort_attrs:
raise BadRequest(
- detail=f"Ordering with '{order_by}' is disallowed or "
- f"the attribute does not exist on the model"
+ detail=f"Ordering with '{order_by}' is disallowed or the attribute does not exist on the model"
)
query = select(User).order_by(direction(getattr(User, order_param))).offset(offset).limit(limit)
@@ -94,7 +93,7 @@ def post_user() -> APIResponse:
except ValidationError as e:
raise BadRequest(detail=str(e.messages))
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
username = data["username"]
email = data["email"]
@@ -137,7 +136,7 @@ def patch_user(*, username: str, update_mask: UpdateMask = None) -> APIResponse:
except ValidationError as e:
raise BadRequest(detail=str(e.messages))
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
user = security_manager.find_user(username=username)
if user is None:
@@ -201,7 +200,7 @@ def patch_user(*, username: str, update_mask: UpdateMask = None) -> APIResponse:
@requires_access_custom_view("DELETE", permissions.RESOURCE_USER)
def delete_user(*, username: str) -> APIResponse:
"""Delete a user."""
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
user = security_manager.find_user(username=username)
if user is None:
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py b/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py
index 05f24e2d02b..99e057575a7 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py
@@ -24,9 +24,9 @@ from starlette.exceptions import HTTPException
from airflow.api_fastapi.app import get_auth_manager
from airflow.configuration import conf
from airflow.providers.fab.auth_manager.api_fastapi.datamodels.login import LoginBody, LoginResponse
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
if TYPE_CHECKING:
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
from airflow.providers.fab.auth_manager.models import User
@@ -43,7 +43,7 @@ class FABAuthManagerLogin:
status_code=status.HTTP_400_BAD_REQUEST, detail="Username and password must be provided"
)
- auth_manager = cast(FabAuthManager, get_auth_manager())
+ auth_manager = cast("FabAuthManager", get_auth_manager())
user: User = auth_manager.security_manager.find_user(username=body.username)
if not user:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid username")
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/utils.py b/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/utils.py
index badd7fd08ae..36ced77e80b 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/utils.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/utils.py
@@ -59,7 +59,7 @@ def get_application_builder() -> Generator[AirflowAppBuilder, None, None]:
url = make_url(flask_app.config["SQLALCHEMY_DATABASE_URI"])
if url.drivername == "sqlite" and url.database and not isabs(url.database):
raise AirflowConfigException(
- f'Cannot use relative path: `{conf.get("database", "SQL_ALCHEMY_CONN")}` to connect to sqlite. '
+ f"Cannot use relative path: `{conf.get('database', 'SQL_ALCHEMY_CONN')}` to connect to sqlite. "
"Please use absolute path such as `sqlite:////tmp/airflow.db`."
)
flask_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
diff --git a/providers/fab/src/airflow/providers/fab/www/api_connexion/parameters.py b/providers/fab/src/airflow/providers/fab/www/api_connexion/parameters.py
index 8edb8efa7bb..f60f2dce23b 100644
--- a/providers/fab/src/airflow/providers/fab/www/api_connexion/parameters.py
+++ b/providers/fab/src/airflow/providers/fab/www/api_connexion/parameters.py
@@ -104,7 +104,7 @@ def format_parameters(params_formatters: dict[str, Callable[[Any], Any]]) -> Cal
kwargs[key] = formatter(kwargs[key])
return func(*args, **kwargs)
- return cast(T, wrapped_function)
+ return cast("T", wrapped_function)
return format_parameters_decorator
diff --git a/providers/fab/src/airflow/providers/fab/www/api_connexion/security.py b/providers/fab/src/airflow/providers/fab/www/api_connexion/security.py
index 2a4a67cdd9a..f238e9de9b3 100644
--- a/providers/fab/src/airflow/providers/fab/www/api_connexion/security.py
+++ b/providers/fab/src/airflow/providers/fab/www/api_connexion/security.py
@@ -22,18 +22,18 @@ from typing import TYPE_CHECKING, Callable, TypeVar, cast
from flask import Response, current_app
from airflow.api_fastapi.app import get_auth_manager
-from airflow.providers.fab.www.airflow_flask_app import AirflowApp
from airflow.providers.fab.www.api_connexion.exceptions import PermissionDenied, Unauthenticated
if TYPE_CHECKING:
from airflow.api_fastapi.auth.managers.base_auth_manager import ResourceMethod
+ from airflow.providers.fab.www.airflow_flask_app import AirflowApp
T = TypeVar("T", bound=Callable)
def check_authentication() -> None:
"""Check that the request has valid authorization information."""
- for auth in cast(AirflowApp, current_app).api_auth:
+ for auth in cast("AirflowApp", current_app).api_auth:
response = auth.requires_authentication(Response)()
if response.status_code == 200:
return
@@ -79,6 +79,6 @@ def requires_access_custom_view(
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return requires_access_decorator
diff --git a/providers/fab/src/airflow/providers/fab/www/app.py b/providers/fab/src/airflow/providers/fab/www/app.py
index 22e164e1c8c..f96451a6275 100644
--- a/providers/fab/src/airflow/providers/fab/www/app.py
+++ b/providers/fab/src/airflow/providers/fab/www/app.py
@@ -60,7 +60,7 @@ def create_app(enable_plugins: bool):
url = make_url(flask_app.config["SQLALCHEMY_DATABASE_URI"])
if url.drivername == "sqlite" and url.database and not isabs(url.database):
raise AirflowConfigException(
- f'Cannot use relative path: `{conf.get("database", "SQL_ALCHEMY_CONN")}` to connect to sqlite. '
+ f"Cannot use relative path: `{conf.get('database', 'SQL_ALCHEMY_CONN')}` to connect to sqlite. "
"Please use absolute path such as `sqlite:////tmp/airflow.db`."
)
diff --git a/providers/fab/src/airflow/providers/fab/www/auth.py b/providers/fab/src/airflow/providers/fab/www/auth.py
index cd6998c1e35..c4bb1b3701c 100644
--- a/providers/fab/src/airflow/providers/fab/www/auth.py
+++ b/providers/fab/src/airflow/providers/fab/www/auth.py
@@ -121,7 +121,7 @@ def _has_access_no_details(is_authorized_callback: Callable[[], bool]) -> Callab
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
@@ -189,7 +189,7 @@ def has_access_connection(method: ResourceMethod) -> Callable[[T], T]:
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
@@ -240,7 +240,7 @@ def has_access_dag(method: ResourceMethod, access_entity: DagAccessEntity | None
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
@@ -269,7 +269,7 @@ def has_access_dag_entities(method: ResourceMethod, access_entity: DagAccessEnti
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
@@ -303,7 +303,7 @@ def has_access_pool(method: ResourceMethod) -> Callable[[T], T]:
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
@@ -336,7 +336,7 @@ def has_access_variable(method: ResourceMethod) -> Callable[[T], T]:
kwargs=kwargs,
)
- return cast(T, decorated)
+ return cast("T", decorated)
return has_access_decorator
diff --git a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py
index 97f8a600d02..247bb168fd0 100644
--- a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py
+++ b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py
@@ -27,11 +27,12 @@ from flask import Response, request
from flask_login import login_user
from airflow.api_fastapi.app import get_auth_manager
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
if TYPE_CHECKING:
from requests.auth import AuthBase
+ from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
+
log = logging.getLogger(__name__)
CLIENT_AUTH: tuple[str, str] | AuthBase | None = None
@@ -45,7 +46,7 @@ T = TypeVar("T", bound=Callable)
def _lookup_user(user_email_or_username: str):
- security_manager = cast(FabAuthManager, get_auth_manager()).security_manager
+ security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
user = security_manager.find_user(email=user_email_or_username) or security_manager.find_user(
username=user_email_or_username
)
@@ -79,4 +80,4 @@ def requires_authentication(function: T):
login_user(user, remember=False)
return function(*args, **kwargs)
- return cast(T, decorated)
+ return cast("T", decorated)
diff --git a/providers/fab/tests/unit/fab/auth_manager/cli_commands/test_user_command.py b/providers/fab/tests/unit/fab/auth_manager/cli_commands/test_user_command.py
index cf6be6f0d88..eb785e303cd 100644
--- a/providers/fab/tests/unit/fab/auth_manager/cli_commands/test_user_command.py
+++ b/providers/fab/tests/unit/fab/auth_manager/cli_commands/test_user_command.py
@@ -398,9 +398,9 @@ class TestCliUsers:
user_command.users_manage_role(args, remove=False)
assert 'User "test4" added to role "Op"' in stdout.getvalue()
- assert _does_user_belong_to_role(
- appbuilder=self.appbuilder, email=TEST_USER1_EMAIL, rolename="Op"
- ), "User should have been added to role 'Op'"
+ assert _does_user_belong_to_role(appbuilder=self.appbuilder, email=TEST_USER1_EMAIL, rolename="Op"), (
+ "User should have been added to role 'Op'"
+ )
def test_cli_remove_user_role(self, create_user_test4):
assert _does_user_belong_to_role(
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py b/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py
index f4beb819a2c..af41a07f1db 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py
@@ -56,7 +56,6 @@ from google.cloud.exceptions import NotFound
from googleapiclient.discovery import build
from pandas_gbq import read_gbq
from pandas_gbq.gbq import GbqConnector # noqa: F401 used in ``airflow.contrib.hooks.bigquery``
-from requests import Session
from sqlalchemy import create_engine
from airflow.exceptions import AirflowException, AirflowProviderDeprecationWarning
@@ -80,6 +79,7 @@ if TYPE_CHECKING:
import pandas as pd
from google.api_core.page_iterator import HTTPIterator
from google.api_core.retry import Retry
+ from requests import Session
log = logging.getLogger(__name__)
@@ -2116,7 +2116,7 @@ class BigQueryAsyncHook(GoogleBaseAsyncHook):
job_id=job_id,
project=project_id,
token=token,
- session=cast(Session, session),
+ session=cast("Session", session),
)
async def _get_job(
@@ -2181,7 +2181,7 @@ class BigQueryAsyncHook(GoogleBaseAsyncHook):
async with ClientSession() as session:
self.log.info("Executing get_job_output..")
job_client = await self.get_job_instance(project_id, job_id, session)
- job_query_response = await job_client.get_query_results(cast(Session, session))
+ job_query_response = await job_client.get_query_results(cast("Session", session))
return job_query_response
async def create_job_for_partition_get(
@@ -2201,7 +2201,7 @@ class BigQueryAsyncHook(GoogleBaseAsyncHook):
+ (f" WHERE table_name='{table_id}'" if table_id else ""),
"useLegacySql": False,
}
- job_query_resp = await job_client.query(query_request, cast(Session, session))
+ job_query_resp = await job_client.query(query_request, cast("Session", session))
return job_query_resp["jobReference"]["jobId"]
async def cancel_job(self, job_id: str, project_id: str | None, location: str | None) -> None:
@@ -2381,12 +2381,7 @@ class BigQueryAsyncHook(GoogleBaseAsyncHook):
test_results[metric] = float(ratios[metric]) < threshold
self.log.info(
- (
- "Current metric for %s: %s\n"
- "Past metric for %s: %s\n"
- "Ratio for %s: %s\n"
- "Threshold: %s\n"
- ),
+ ("Current metric for %s: %s\nPast metric for %s: %s\nRatio for %s: %s\nThreshold: %s\n"),
metric,
cur,
metric,
@@ -2451,5 +2446,5 @@ class BigQueryTableAsyncHook(GoogleBaseAsyncHook):
table_name=table_id,
project=project_id,
token=token,
- session=cast(Session, session),
+ session=cast("Session", session),
)
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/cloud_batch.py b/providers/google/src/airflow/providers/google/cloud/hooks/cloud_batch.py
index c647ac078ab..c50c8b6ce28 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/cloud_batch.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/cloud_batch.py
@@ -155,8 +155,7 @@ class CloudBatchHook(GoogleBaseHook):
raise AirflowException(message)
elif status == JobStatus.State.DELETION_IN_PROGRESS:
message = (
- "Unexpected error in the operation: "
- "Batch job with name {job_name} is being deleted."
+ "Unexpected error in the operation: Batch job with name {job_name} is being deleted."
)
raise AirflowException(message)
else:
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/dataflow.py b/providers/google/src/airflow/providers/google/cloud/hooks/dataflow.py
index ab26ccc38d6..e508d629937 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/dataflow.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/dataflow.py
@@ -136,7 +136,7 @@ def _fallback_variable_parameter(parameter_name: str, variable_key_name: str) ->
return func(self, *args, **kwargs)
- return cast(T, inner_wrapper)
+ return cast("T", inner_wrapper)
return _wrapper
@@ -1271,7 +1271,7 @@ class DataflowHook(GoogleBaseHook):
AirflowProviderDeprecationWarning,
stacklevel=3,
)
- on_new_job_id_callback(cast(str, job.get("id")))
+ on_new_job_id_callback(cast("str", job.get("id")))
if on_new_job_callback:
on_new_job_callback(job)
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/dataform.py b/providers/google/src/airflow/providers/google/cloud/hooks/dataform.py
index c921b56c6fe..d29b346e84c 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/dataform.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/dataform.py
@@ -453,8 +453,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"name": workspace_path,
@@ -496,8 +495,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"workspace": workspace_path,
@@ -542,8 +540,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"workspace": workspace_path,
@@ -587,8 +584,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"workspace": workspace_path,
@@ -629,8 +625,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"workspace": workspace_path,
@@ -671,8 +666,7 @@ class DataformHook(GoogleBaseHook):
"""
client = self.get_dataform_client()
workspace_path = (
- f"projects/{project_id}/locations/{region}/"
- f"repositories/{repository_id}/workspaces/{workspace_id}"
+ f"projects/{project_id}/locations/{region}/repositories/{repository_id}/workspaces/{workspace_id}"
)
request = {
"workspace": workspace_path,
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/datafusion.py b/providers/google/src/airflow/providers/google/cloud/hooks/datafusion.py
index 89a4986adfd..66e073e375c 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/datafusion.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/datafusion.py
@@ -137,8 +137,7 @@ class DataFusionHook(GoogleBaseHook):
# Time is up!
raise AirflowException(
- f"Pipeline {pipeline_name} state {current_state} is not "
- f"one of {success_states} after {timeout}s"
+ f"Pipeline {pipeline_name} state {current_state} is not one of {success_states} after {timeout}s"
)
@staticmethod
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/gcs.py b/providers/google/src/airflow/providers/google/cloud/hooks/gcs.py
index 3c17305a60a..36c26c1ad98 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/gcs.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/gcs.py
@@ -41,7 +41,6 @@ from google.api_core.exceptions import GoogleAPICallError, NotFound
from google.cloud import storage # type: ignore[attr-defined]
from google.cloud.exceptions import GoogleCloudError
from google.cloud.storage.retry import DEFAULT_RETRY
-from requests import Session
from airflow.exceptions import AirflowException, AirflowProviderDeprecationWarning
from airflow.providers.common.compat.lineage.hook import get_hook_lineage_collector
@@ -62,6 +61,7 @@ if TYPE_CHECKING:
from aiohttp import ClientSession
from google.api_core.retry import Retry
from google.cloud.storage.blob import Blob
+ from requests import Session
RT = TypeVar("RT")
@@ -135,16 +135,16 @@ def _fallback_object_url_to_object_name_and_bucket_name(
return func(self, *args, **kwargs)
- return cast(Callable[FParams, RT], _inner_wrapper)
+ return cast("Callable[FParams, RT]", _inner_wrapper)
- return cast(Callable[[T], T], _wrapper)
+ return cast("Callable[[T], T]", _wrapper)
# A fake bucket to use in functions decorated by _fallback_object_url_to_object_name_and_bucket_name.
# This allows the 'bucket' argument to be of type str instead of str | None,
# making it easier to type hint the function body without dealing with the None
# case that can never happen at runtime.
-PROVIDE_BUCKET: str = cast(str, None)
+PROVIDE_BUCKET: str = cast("str", None)
class GCSHook(GoogleBaseHook):
@@ -1494,5 +1494,5 @@ class GCSAsyncHook(GoogleBaseAsyncHook):
token = await self.get_token(session=session)
return Storage(
token=token,
- session=cast(Session, session),
+ session=cast("Session", session),
)
diff --git a/providers/google/src/airflow/providers/google/cloud/hooks/translate.py b/providers/google/src/airflow/providers/google/cloud/hooks/translate.py
index c56b4fb7fb3..57b7846f023 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/translate.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/translate.py
@@ -311,7 +311,7 @@ class TranslateHook(GoogleBaseHook, OperationHelper):
retry=retry,
metadata=metadata,
)
- return cast(dict, type(result).to_dict(result))
+ return cast("dict", type(result).to_dict(result))
def batch_translate_text(
self,
diff --git a/providers/google/src/airflow/providers/google/cloud/openlineage/mixins.py b/providers/google/src/airflow/providers/google/cloud/openlineage/mixins.py
index fd716556637..57bbdafef28 100644
--- a/providers/google/src/airflow/providers/google/cloud/openlineage/mixins.py
+++ b/providers/google/src/airflow/providers/google/cloud/openlineage/mixins.py
@@ -188,10 +188,10 @@ class _BigQueryInsertJobOperatorOpenLineageMixin:
return list(final_outputs.values())
def _get_input_dataset(self, table: dict) -> InputDataset:
- return cast(InputDataset, self._get_dataset(table, "input"))
+ return cast("InputDataset", self._get_dataset(table, "input"))
def _get_output_dataset(self, table: dict) -> OutputDataset:
- return cast(OutputDataset, self._get_dataset(table, "output"))
+ return cast("OutputDataset", self._get_dataset(table, "output"))
def _get_dataset(self, table: dict, dataset_type: str) -> Dataset:
project = table.get("projectId")
diff --git a/providers/google/src/airflow/providers/google/cloud/operators/automl.py b/providers/google/src/airflow/providers/google/cloud/operators/automl.py
index 2a683938ed9..16b6fd47f7a 100644
--- a/providers/google/src/airflow/providers/google/cloud/operators/automl.py
+++ b/providers/google/src/airflow/providers/google/cloud/operators/automl.py
@@ -268,7 +268,7 @@ class AutoMLPredictOperator(GoogleCloudBaseOperator):
@cached_property
def model(self) -> Model | None:
if self.model_id:
- hook = cast(CloudAutoMLHook, self.hook)
+ hook = cast("CloudAutoMLHook", self.hook)
return hook.get_model(
model_id=self.model_id,
location=self.location,
diff --git a/providers/google/src/airflow/providers/google/cloud/operators/dataproc.py b/providers/google/src/airflow/providers/google/cloud/operators/dataproc.py
index 4486ad8e762..6b52813a34b 100644
--- a/providers/google/src/airflow/providers/google/cloud/operators/dataproc.py
+++ b/providers/google/src/airflow/providers/google/cloud/operators/dataproc.py
@@ -1463,8 +1463,7 @@ class DataprocJobBaseOperator(GoogleCloudBaseOperator):
"""Initialize `self.job_template` with default values."""
if self.project_id is None:
raise AirflowException(
- "project id should either be set via project_id "
- "parameter or retrieved from the connection,"
+ "project id should either be set via project_id parameter or retrieved from the connection,"
)
job_template = DataProcJobBuilder(
project_id=self.project_id,
diff --git a/providers/google/src/airflow/providers/google/cloud/operators/spanner.py b/providers/google/src/airflow/providers/google/cloud/operators/spanner.py
index e93a8c30ace..36cccd1ce18 100644
--- a/providers/google/src/airflow/providers/google/cloud/operators/spanner.py
+++ b/providers/google/src/airflow/providers/google/cloud/operators/spanner.py
@@ -403,8 +403,7 @@ class SpannerDeployDatabaseInstanceOperator(GoogleCloudBaseOperator):
)
else:
self.log.info(
- "The database '%s' in project '%s' and instance '%s'"
- " already exists. Nothing to do. Exiting.",
+ "The database '%s' in project '%s' and instance '%s' already exists. Nothing to do. Exiting.",
self.database_id,
self.project_id,
self.instance_id,
diff --git a/providers/google/src/airflow/providers/google/cloud/operators/translate.py b/providers/google/src/airflow/providers/google/cloud/operators/translate.py
index 2c2424ea5f4..6f6100076ea 100644
--- a/providers/google/src/airflow/providers/google/cloud/operators/translate.py
+++ b/providers/google/src/airflow/providers/google/cloud/operators/translate.py
@@ -1145,7 +1145,7 @@ class TranslateDocumentOperator(GoogleCloudBaseOperator):
project_id=self.project_id or hook.project_id,
output_config=self.document_output_config,
)
- return cast(dict, type(doc_translation_result).to_dict(doc_translation_result))
+ return cast("dict", type(doc_translation_result).to_dict(doc_translation_result))
class TranslateDocumentBatchOperator(GoogleCloudBaseOperator):
@@ -1310,7 +1310,7 @@ class TranslateDocumentBatchOperator(GoogleCloudBaseOperator):
)
result = hook.wait_for_operation_result(batch_document_translate_operation)
self.log.info("Batch document translation job finished")
- return cast(dict, type(result).to_dict(result))
+ return cast("dict", type(result).to_dict(result))
class TranslateCreateGlossaryOperator(GoogleCloudBaseOperator):
diff --git a/providers/google/src/airflow/providers/google/cloud/transfers/gcs_to_bigquery.py b/providers/google/src/airflow/providers/google/cloud/transfers/gcs_to_bigquery.py
index 291608501b0..259cbd8e327 100644
--- a/providers/google/src/airflow/providers/google/cloud/transfers/gcs_to_bigquery.py
+++ b/providers/google/src/airflow/providers/google/cloud/transfers/gcs_to_bigquery.py
@@ -486,8 +486,7 @@ class GCSToBigQueryOperator(BaseOperator):
if self.max_id_key:
self.log.info("Selecting the MAX value from BigQuery column %r...", self.max_id_key)
select_command = (
- f"SELECT MAX({self.max_id_key}) AS max_value "
- f"FROM {self.destination_project_dataset_table}"
+ f"SELECT MAX({self.max_id_key}) AS max_value FROM {self.destination_project_dataset_table}"
)
self.configuration = {
"query": {
diff --git a/providers/google/src/airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py b/providers/google/src/airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py
index 9a28b960e6e..e888a176f8e 100644
--- a/providers/google/src/airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py
+++ b/providers/google/src/airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py
@@ -59,7 +59,7 @@ class CloudStorageTransferServiceCreateJobsTrigger(BaseTrigger):
def serialize(self) -> tuple[str, dict[str, Any]]:
"""Serialize StorageTransferJobsTrigger arguments and classpath."""
return (
- f"{self.__class__.__module__ }.{self.__class__.__qualname__}",
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
{
"project_id": self.project_id,
"job_names": self.job_names,
@@ -176,7 +176,7 @@ class CloudStorageTransferServiceCheckJobStatusTrigger(BaseTrigger):
def serialize(self) -> tuple[str, dict[str, Any]]:
"""Serialize CloudStorageTransferServiceCheckJobStatusTrigger arguments and classpath."""
return (
- f"{self.__class__.__module__ }.{self.__class__.__qualname__}",
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
{
"job_name": self.job_name,
"expected_statuses": self.expected_statuses,
diff --git a/providers/google/src/airflow/providers/google/common/auth_backend/google_openid.py b/providers/google/src/airflow/providers/google/common/auth_backend/google_openid.py
index e18e90af6a8..04329c1a3c8 100644
--- a/providers/google/src/airflow/providers/google/common/auth_backend/google_openid.py
+++ b/providers/google/src/airflow/providers/google/common/auth_backend/google_openid.py
@@ -146,4 +146,4 @@ def requires_authentication(function: T):
return function(*args, **kwargs)
- return cast(T, decorated)
+ return cast("T", decorated)
diff --git a/providers/google/src/airflow/providers/google/common/hooks/base_google.py b/providers/google/src/airflow/providers/google/common/hooks/base_google.py
index 35bccf808cc..21641d468c6 100644
--- a/providers/google/src/airflow/providers/google/common/hooks/base_google.py
+++ b/providers/google/src/airflow/providers/google/common/hooks/base_google.py
@@ -153,7 +153,7 @@ class retry_if_temporary_refresh_credentials(tenacity.retry_if_exception):
# This allows the 'project_id' argument to be of type str instead of str | None,
# making it easier to type hint the function body without dealing with the None
# case that can never happen at runtime.
-PROVIDE_PROJECT_ID: str = cast(str, None)
+PROVIDE_PROJECT_ID: str = cast("str", None)
T = TypeVar("T", bound=Callable)
RT = TypeVar("RT")
@@ -499,7 +499,7 @@ class GoogleBaseHook(BaseHook):
"after": tenacity.after_log(log, logging.DEBUG),
}
default_kwargs.update(**kwargs)
- return cast(T, tenacity.retry(*args, **default_kwargs)(func))
+ return cast("T", tenacity.retry(*args, **default_kwargs)(func))
return decorator
@@ -517,7 +517,7 @@ class GoogleBaseHook(BaseHook):
"after": tenacity.after_log(log, logging.DEBUG),
}
default_kwargs.update(**kwargs)
- return cast(T, tenacity.retry(*args, **default_kwargs)(func))
+ return cast("T", tenacity.retry(*args, **default_kwargs)(func))
return decorator
@@ -569,7 +569,7 @@ class GoogleBaseHook(BaseHook):
with self.provide_gcp_credential_file_as_context():
return func(self, *args, **kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
@contextmanager
def provide_gcp_credential_file_as_context(self) -> Generator[str | None, None, None]:
@@ -718,7 +718,7 @@ class _CredentialsToken(Token):
scopes: Sequence[str] | None = None,
) -> None:
_scopes: list[str] | None = list(scopes) if scopes else None
- super().__init__(session=cast(Session, session), scopes=_scopes)
+ super().__init__(session=cast("Session", session), scopes=_scopes)
self.credentials = credentials
self.project = project
@@ -743,7 +743,7 @@ class _CredentialsToken(Token):
async def refresh(self, *, timeout: int) -> TokenResponse:
await sync_to_async(self.credentials.refresh)(google.auth.transport.requests.Request())
- self.access_token = cast(str, self.credentials.token)
+ self.access_token = cast("str", self.credentials.token)
self.access_token_duration = 3600
self.access_token_acquired_at = self._now()
return TokenResponse(value=self.access_token, expires_in=self.access_token_duration)
diff --git a/providers/google/src/airflow/providers/google/marketing_platform/sensors/display_video.py b/providers/google/src/airflow/providers/google/marketing_platform/sensors/display_video.py
index 5f069702548..01e57813adc 100644
--- a/providers/google/src/airflow/providers/google/marketing_platform/sensors/display_video.py
+++ b/providers/google/src/airflow/providers/google/marketing_platform/sensors/display_video.py
@@ -83,7 +83,7 @@ class GoogleDisplayVideo360GetSDFDownloadOperationSensor(BaseSensorOperator):
)
operation = hook.get_sdf_download_operation(operation_name=self.operation_name)
if "error" in operation:
- message = f'The operation finished in error with {operation["error"]}'
+ message = f"The operation finished in error with {operation['error']}"
raise AirflowException(message)
if operation and operation.get("done"):
return True
diff --git a/providers/google/src/airflow/providers/google/suite/hooks/drive.py b/providers/google/src/airflow/providers/google/suite/hooks/drive.py
index a33828950c1..93176a558d0 100644
--- a/providers/google/src/airflow/providers/google/suite/hooks/drive.py
+++ b/providers/google/src/airflow/providers/google/suite/hooks/drive.py
@@ -192,9 +192,9 @@ class GoogleDriveHook(GoogleBaseHook):
# current_file_id can be file or directory id, Google API treats them the same way.
file_info = self._get_file_info(current_file_id)
if current_file_id == file_id:
- path = f'{file_info["name"]}'
+ path = f"{file_info['name']}"
else:
- path = f'{file_info["name"]}/{path}'
+ path = f"{file_info['name']}/{path}"
# Google API returns parents array if there is at least one object inside
if "parents" in file_info and len(file_info["parents"]) == 1:
diff --git a/providers/google/tests/system/google/cloud/bigquery/example_bigquery_dts.py b/providers/google/tests/system/google/cloud/bigquery/example_bigquery_dts.py
index f249c012c59..bb702d8dab0 100644
--- a/providers/google/tests/system/google/cloud/bigquery/example_bigquery_dts.py
+++ b/providers/google/tests/system/google/cloud/bigquery/example_bigquery_dts.py
@@ -123,7 +123,7 @@ with DAG(
task_id="gcp_bigquery_create_transfer",
)
- transfer_config_id = cast(str, XComArg(gcp_bigquery_create_transfer, key="transfer_config_id"))
+ transfer_config_id = cast("str", XComArg(gcp_bigquery_create_transfer, key="transfer_config_id"))
# [END howto_bigquery_create_data_transfer]
# [START howto_bigquery_start_transfer]
@@ -139,7 +139,7 @@ with DAG(
gcp_run_sensor = BigQueryDataTransferServiceTransferRunSensor(
task_id="gcp_run_sensor",
transfer_config_id=transfer_config_id,
- run_id=cast(str, XComArg(gcp_bigquery_start_transfer, key="run_id")),
+ run_id=cast("str", XComArg(gcp_bigquery_start_transfer, key="run_id")),
expected_statuses={"SUCCEEDED"},
)
# [END howto_bigquery_dts_sensor]
diff --git a/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build.py b/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build.py
index b8231e3903e..e20c363634d 100644
--- a/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build.py
+++ b/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build.py
@@ -92,7 +92,7 @@ with DAG(
# [START howto_operator_create_build_from_storage_result]
create_build_from_storage_result = BashOperator(
- bash_command=f"echo {cast(str, XComArg(create_build_from_storage, key='results'))}",
+ bash_command=f"echo {cast('str', XComArg(create_build_from_storage, key='results'))}",
task_id="create_build_from_storage_result",
)
# [END howto_operator_create_build_from_storage_result]
@@ -111,7 +111,7 @@ with DAG(
# [END howto_operator_create_build_from_storage_async]
create_build_from_storage_result = BashOperator(
- bash_command=f"echo {cast(str, XComArg(create_build_from_storage, key='results'))}",
+ bash_command=f"echo {cast('str', XComArg(create_build_from_storage, key='results'))}",
task_id="create_build_from_storage_result",
)
@@ -129,7 +129,7 @@ with DAG(
# [START howto_operator_create_build_from_repo_result]
create_build_from_repo_result = BashOperator(
- bash_command=f"echo {cast(str, XComArg(create_build_from_repo, key='results'))}",
+ bash_command=f"echo {cast('str', XComArg(create_build_from_repo, key='results'))}",
task_id="create_build_from_repo_result",
)
# [END howto_operator_create_build_from_repo_result]
@@ -148,7 +148,7 @@ with DAG(
# [END howto_operator_create_build_from_repo_async]
create_build_from_repo_result = BashOperator(
- bash_command=f"echo {cast(str, XComArg(create_build_from_repo, key='results'))}",
+ bash_command=f"echo {cast('str', XComArg(create_build_from_repo, key='results'))}",
task_id="create_build_from_repo_result",
)
@@ -195,7 +195,7 @@ with DAG(
# [START howto_operator_cancel_build]
cancel_build = CloudBuildCancelBuildOperator(
task_id="cancel_build",
- id_=cast(str, XComArg(create_build_without_wait, key="id")),
+ id_=cast("str", XComArg(create_build_without_wait, key="id")),
project_id=PROJECT_ID,
)
# [END howto_operator_cancel_build]
@@ -203,7 +203,7 @@ with DAG(
# [START howto_operator_retry_build]
retry_build = CloudBuildRetryBuildOperator(
task_id="retry_build",
- id_=cast(str, XComArg(cancel_build, key="id")),
+ id_=cast("str", XComArg(cancel_build, key="id")),
project_id=PROJECT_ID,
)
# [END howto_operator_retry_build]
@@ -211,7 +211,7 @@ with DAG(
# [START howto_operator_get_build]
get_build = CloudBuildGetBuildOperator(
task_id="get_build",
- id_=cast(str, XComArg(retry_build, key="id")),
+ id_=cast("str", XComArg(retry_build, key="id")),
project_id=PROJECT_ID,
)
# [END howto_operator_get_build]
@@ -232,19 +232,19 @@ with DAG(
cancel_build = CloudBuildCancelBuildOperator(
task_id="cancel_build",
- id_=cast(str, XComArg(create_build_without_wait, key="id")),
+ id_=cast("str", XComArg(create_build_without_wait, key="id")),
project_id=PROJECT_ID,
)
retry_build = CloudBuildRetryBuildOperator(
task_id="retry_build",
- id_=cast(str, XComArg(cancel_build, key="id")),
+ id_=cast("str", XComArg(cancel_build, key="id")),
project_id=PROJECT_ID,
)
get_build = CloudBuildGetBuildOperator(
task_id="get_build",
- id_=cast(str, XComArg(retry_build, key="id")),
+ id_=cast("str", XComArg(retry_build, key="id")),
project_id=PROJECT_ID,
)
diff --git a/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build_trigger.py b/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build_trigger.py
index a91f9b64513..50f1843ad6f 100644
--- a/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build_trigger.py
+++ b/providers/google/tests/system/google/cloud/cloud_build/example_cloud_build_trigger.py
@@ -123,7 +123,7 @@ with DAG(
)
# [END howto_operator_create_build_trigger]
- build_trigger_id = cast(str, XComArg(create_build_trigger, key="id"))
+ build_trigger_id = cast("str", XComArg(create_build_trigger, key="id"))
# [START howto_operator_run_build_trigger]
run_build_trigger = CloudBuildRunBuildTriggerOperator(
diff --git a/providers/google/tests/system/google/cloud/compute/example_compute_igm.py b/providers/google/tests/system/google/cloud/compute/example_compute_igm.py
index 76cb7f2e3ff..84493c279c8 100644
--- a/providers/google/tests/system/google/cloud/compute/example_compute_igm.py
+++ b/providers/google/tests/system/google/cloud/compute/example_compute_igm.py
@@ -91,8 +91,7 @@ INSTANCE_GROUP_MANAGER_BODY = {
}
SOURCE_TEMPLATE_URL = (
- f"https://www.googleapis.com/compute/beta/projects/{PROJECT_ID}/"
- f"global/instanceTemplates/{TEMPLATE_NAME}"
+ f"https://www.googleapis.com/compute/beta/projects/{PROJECT_ID}/global/instanceTemplates/{TEMPLATE_NAME}"
)
diff --git a/providers/google/tests/system/google/cloud/gcs/example_gcs_to_gdrive.py b/providers/google/tests/system/google/cloud/gcs/example_gcs_to_gdrive.py
index 5fa2e3c6bbc..5ad6131b4cf 100644
--- a/providers/google/tests/system/google/cloud/gcs/example_gcs_to_gdrive.py
+++ b/providers/google/tests/system/google/cloud/gcs/example_gcs_to_gdrive.py
@@ -77,10 +77,7 @@ with DAG(
conn_type="google_cloud_platform",
)
conn_extra_json = json.dumps(
- {
- "scope": "https://www.googleapis.com/auth/drive,"
- "https://www.googleapis.com/auth/cloud-platform"
- }
+ {"scope": "https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/cloud-platform"}
)
conn.set_extra(conn_extra_json)
diff --git a/providers/google/tests/system/google/cloud/gcs/example_gcs_to_sheets.py b/providers/google/tests/system/google/cloud/gcs/example_gcs_to_sheets.py
index 991f8347f5d..8e1ce8bb639 100644
--- a/providers/google/tests/system/google/cloud/gcs/example_gcs_to_sheets.py
+++ b/providers/google/tests/system/google/cloud/gcs/example_gcs_to_sheets.py
@@ -90,8 +90,7 @@ with DAG(
upload_sheet_to_gcs = GoogleSheetsToGCSOperator(
task_id="upload_sheet_to_gcs",
destination_bucket=BUCKET_NAME,
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=CONNECTION_ID,
)
@@ -100,8 +99,7 @@ with DAG(
task_id="upload_gcs_to_sheet",
bucket_name=BUCKET_NAME,
object_name="{{ task_instance.xcom_pull('upload_sheet_to_gcs')[0] }}",
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=CONNECTION_ID,
)
# [END upload_gcs_to_sheets]
diff --git a/providers/google/tests/system/google/cloud/gcs/example_gdrive_to_gcs.py b/providers/google/tests/system/google/cloud/gcs/example_gdrive_to_gcs.py
index 6f6a0bf8ee1..df25cd87358 100644
--- a/providers/google/tests/system/google/cloud/gcs/example_gdrive_to_gcs.py
+++ b/providers/google/tests/system/google/cloud/gcs/example_gdrive_to_gcs.py
@@ -69,10 +69,7 @@ with DAG(
conn_type="google_cloud_platform",
)
conn_extra_json = json.dumps(
- {
- "scope": "https://www.googleapis.com/auth/drive,"
- "https://www.googleapis.com/auth/cloud-platform"
- }
+ {"scope": "https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/cloud-platform"}
)
conn.set_extra(conn_extra_json)
diff --git a/providers/google/tests/system/google/cloud/gcs/example_sheets.py b/providers/google/tests/system/google/cloud/gcs/example_sheets.py
index 001ebb69d68..5f928ede907 100644
--- a/providers/google/tests/system/google/cloud/gcs/example_sheets.py
+++ b/providers/google/tests/system/google/cloud/gcs/example_sheets.py
@@ -89,8 +89,7 @@ with DAG(
upload_sheet_to_gcs = GoogleSheetsToGCSOperator(
task_id="upload_sheet_to_gcs",
destination_bucket=BUCKET_NAME,
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=CONNECTION_ID,
)
# [END upload_sheet_to_gcs]
@@ -113,8 +112,7 @@ with DAG(
task_id="upload_gcs_to_sheet",
bucket_name=BUCKET_NAME,
object_name="{{ task_instance.xcom_pull('upload_sheet_to_gcs')[0] }}",
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=CONNECTION_ID,
)
# [END upload_gcs_to_sheet]
diff --git a/providers/google/tests/system/google/cloud/gcs/example_sheets_to_gcs.py b/providers/google/tests/system/google/cloud/gcs/example_sheets_to_gcs.py
index 7c546060333..62bd55eaf87 100644
--- a/providers/google/tests/system/google/cloud/gcs/example_sheets_to_gcs.py
+++ b/providers/google/tests/system/google/cloud/gcs/example_sheets_to_gcs.py
@@ -90,8 +90,7 @@ with DAG(
upload_sheet_to_gcs = GoogleSheetsToGCSOperator(
task_id="upload_sheet_to_gcs",
destination_bucket=BUCKET_NAME,
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=CONNECTION_ID,
)
# [END upload_sheet_to_gcs]
diff --git a/providers/google/tests/system/google/cloud/sql_to_sheets/example_sql_to_sheets.py b/providers/google/tests/system/google/cloud/sql_to_sheets/example_sql_to_sheets.py
index 65c88b38ccf..8b38e5cc76f 100644
--- a/providers/google/tests/system/google/cloud/sql_to_sheets/example_sql_to_sheets.py
+++ b/providers/google/tests/system/google/cloud/sql_to_sheets/example_sql_to_sheets.py
@@ -257,8 +257,7 @@ with DAG(
sql=SQL_SELECT,
sql_conn_id=CONNECTION_ID,
database=DB_NAME,
- spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', "
- "key='spreadsheet_id') }}",
+ spreadsheet_id="{{ task_instance.xcom_pull(task_ids='create_spreadsheet', key='spreadsheet_id') }}",
gcp_conn_id=SHEETS_CONNECTION_ID,
)
# [END upload_sql_to_sheets]
diff --git a/providers/google/tests/system/google/cloud/transfers/example_gdrive_to_local.py b/providers/google/tests/system/google/cloud/transfers/example_gdrive_to_local.py
index 2723e8b28ce..2bd132126f3 100644
--- a/providers/google/tests/system/google/cloud/transfers/example_gdrive_to_local.py
+++ b/providers/google/tests/system/google/cloud/transfers/example_gdrive_to_local.py
@@ -73,10 +73,7 @@ with DAG(
conn_type="google_cloud_platform",
)
conn_extra_json = json.dumps(
- {
- "scope": "https://www.googleapis.com/auth/drive,"
- "https://www.googleapis.com/auth/cloud-platform"
- }
+ {"scope": "https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/cloud-platform"}
)
conn.set_extra(conn_extra_json)
diff --git a/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_custom_container.py b/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_custom_container.py
index 316e0d3a7cb..59c0d98de4f 100644
--- a/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_custom_container.py
+++ b/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_custom_container.py
@@ -161,8 +161,7 @@ with DAG(
task_id="delete_custom_training_job",
training_pipeline_id="{{ task_instance.xcom_pull(task_ids='custom_container_task', "
"key='training_id') }}",
- custom_job_id="{{ task_instance.xcom_pull(task_ids='custom_container_task', "
- "key='custom_job_id') }}",
+ custom_job_id="{{ task_instance.xcom_pull(task_ids='custom_container_task', key='custom_job_id') }}",
region=REGION,
project_id=PROJECT_ID,
trigger_rule=TriggerRule.ALL_DONE,
diff --git a/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_pipeline_job.py b/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_pipeline_job.py
index bc97ff6a58b..7377e60d49a 100644
--- a/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_pipeline_job.py
+++ b/providers/google/tests/system/google/cloud/vertex_ai/example_vertex_ai_pipeline_job.py
@@ -123,8 +123,7 @@ with DAG(
task_id="get_pipeline_job",
project_id=PROJECT_ID,
region=REGION,
- pipeline_job_id="{{ task_instance.xcom_pull("
- "task_ids='run_pipeline_job', key='pipeline_job_id') }}",
+ pipeline_job_id="{{ task_instance.xcom_pull(task_ids='run_pipeline_job', key='pipeline_job_id') }}",
)
# [END how_to_cloud_vertex_ai_get_pipeline_job_operator]
@@ -133,8 +132,7 @@ with DAG(
task_id="delete_pipeline_job",
project_id=PROJECT_ID,
region=REGION,
- pipeline_job_id="{{ task_instance.xcom_pull("
- "task_ids='run_pipeline_job', key='pipeline_job_id') }}",
+ pipeline_job_id="{{ task_instance.xcom_pull(task_ids='run_pipeline_job', key='pipeline_job_id') }}",
trigger_rule=TriggerRule.ALL_DONE,
)
# [END how_to_cloud_vertex_ai_delete_pipeline_job_operator]
diff --git a/providers/google/tests/system/google/cloud/workflows/example_workflows.py b/providers/google/tests/system/google/cloud/workflows/example_workflows.py
index b933d75a6f2..31fdccadc52 100644
--- a/providers/google/tests/system/google/cloud/workflows/example_workflows.py
+++ b/providers/google/tests/system/google/cloud/workflows/example_workflows.py
@@ -148,7 +148,7 @@ with DAG(
)
# [END how_to_create_execution]
- create_execution_id = cast(str, XComArg(create_execution, key="execution_id"))
+ create_execution_id = cast("str", XComArg(create_execution, key="execution_id"))
# [START how_to_wait_for_execution]
wait_for_execution = WorkflowExecutionSensor(
@@ -192,7 +192,7 @@ with DAG(
workflow_id=SLEEP_WORKFLOW_ID,
)
- cancel_execution_id = cast(str, XComArg(create_execution_for_cancel, key="execution_id"))
+ cancel_execution_id = cast("str", XComArg(create_execution_for_cancel, key="execution_id"))
# [START how_to_cancel_execution]
cancel_execution = WorkflowsCancelExecutionOperator(
diff --git a/providers/google/tests/system/google/datacatalog/example_datacatalog_search_catalog.py b/providers/google/tests/system/google/datacatalog/example_datacatalog_search_catalog.py
index c248280798a..f778a08425c 100644
--- a/providers/google/tests/system/google/datacatalog/example_datacatalog_search_catalog.py
+++ b/providers/google/tests/system/google/datacatalog/example_datacatalog_search_catalog.py
@@ -114,7 +114,7 @@ with DAG(
)
# [END howto_operator_gcp_datacatalog_create_tag]
- tag_id = cast(str, XComArg(create_tag, key="tag_id"))
+ tag_id = cast("str", XComArg(create_tag, key="tag_id"))
# [START howto_operator_gcp_datacatalog_create_tag_result]
create_tag_result = BashOperator(
diff --git a/providers/google/tests/system/google/datacatalog/example_datacatalog_tags.py b/providers/google/tests/system/google/datacatalog/example_datacatalog_tags.py
index 953f6b503d6..c8ab89239d9 100644
--- a/providers/google/tests/system/google/datacatalog/example_datacatalog_tags.py
+++ b/providers/google/tests/system/google/datacatalog/example_datacatalog_tags.py
@@ -115,7 +115,7 @@ with DAG(
)
# [END howto_operator_gcp_datacatalog_create_tag]
- tag_id = cast(str, XComArg(create_tag, key="tag_id"))
+ tag_id = cast("str", XComArg(create_tag, key="tag_id"))
# [START howto_operator_gcp_datacatalog_create_tag_result]
create_tag_result = BashOperator(
diff --git a/providers/google/tests/system/google/marketing_platform/example_campaign_manager.py b/providers/google/tests/system/google/marketing_platform/example_campaign_manager.py
index 54ee2216200..0685de961b4 100644
--- a/providers/google/tests/system/google/marketing_platform/example_campaign_manager.py
+++ b/providers/google/tests/system/google/marketing_platform/example_campaign_manager.py
@@ -214,7 +214,7 @@ with DAG(
task_id="create_report",
gcp_conn_id=CONNECTION_ID,
)
- report_id = cast(str, XComArg(create_report, key="report_id"))
+ report_id = cast("str", XComArg(create_report, key="report_id"))
# [END howto_campaign_manager_insert_report_operator]
# [START howto_campaign_manager_run_report_operator]
@@ -224,7 +224,7 @@ with DAG(
task_id="run_report",
gcp_conn_id=CONNECTION_ID,
)
- file_id = cast(str, XComArg(run_report, key="file_id"))
+ file_id = cast("str", XComArg(run_report, key="file_id"))
# [END howto_campaign_manager_run_report_operator]
# [START howto_campaign_manager_wait_for_operation]
diff --git a/providers/google/tests/system/google/marketing_platform/example_display_video.py b/providers/google/tests/system/google/marketing_platform/example_display_video.py
index 65b7b42a008..a55b8878c81 100644
--- a/providers/google/tests/system/google/marketing_platform/example_display_video.py
+++ b/providers/google/tests/system/google/marketing_platform/example_display_video.py
@@ -183,7 +183,7 @@ with DAG(
# [START howto_google_display_video_create_query_operator]
create_query_v2 = GoogleDisplayVideo360CreateQueryOperator(body=REPORT_V2, task_id="create_query")
- query_id = cast(str, XComArg(create_query_v2, key="query_id"))
+ query_id = cast("str", XComArg(create_query_v2, key="query_id"))
# [END howto_google_display_video_create_query_operator]
# [START howto_google_display_video_run_query_report_operator]
@@ -191,8 +191,8 @@ with DAG(
query_id=query_id, parameters=PARAMETERS, task_id="run_report"
)
- query_id = cast(str, XComArg(run_query_v2, key="query_id"))
- report_id = cast(str, XComArg(run_query_v2, key="report_id"))
+ query_id = cast("str", XComArg(run_query_v2, key="query_id"))
+ report_id = cast("str", XComArg(run_query_v2, key="report_id"))
# [END howto_google_display_video_run_query_report_operator]
# [START howto_google_display_video_wait_run_query_sensor]
diff --git a/providers/google/tests/unit/google/cloud/hooks/test_bigquery.py b/providers/google/tests/unit/google/cloud/hooks/test_bigquery.py
index 24375acb537..45eb7cf2d68 100644
--- a/providers/google/tests/unit/google/cloud/hooks/test_bigquery.py
+++ b/providers/google/tests/unit/google/cloud/hooks/test_bigquery.py
@@ -198,13 +198,13 @@ class TestBigQueryHookMethods(_BigQueryBaseTestClass):
src_fmt_configs = _validate_src_fmt_configs(
source_format, src_fmt_configs, valid_configs, backward_compatibility_configs
)
- assert (
- "test_config_known" in src_fmt_configs
- ), "src_fmt_configs should contain al known src_fmt_configs"
+ assert "test_config_known" in src_fmt_configs, (
+ "src_fmt_configs should contain al known src_fmt_configs"
+ )
- assert (
- "compatibility_val" in src_fmt_configs
- ), "_validate_src_fmt_configs should add backward_compatibility config"
+ assert "compatibility_val" in src_fmt_configs, (
+ "_validate_src_fmt_configs should add backward_compatibility config"
+ )
@mock.patch("airflow.providers.google.cloud.hooks.bigquery.Table")
@mock.patch("airflow.providers.google.cloud.hooks.bigquery.SchemaField")
diff --git a/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py b/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
index 881494fc9c6..1ee431b0a7b 100644
--- a/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
+++ b/providers/google/tests/unit/google/cloud/hooks/test_bigquery_dts.py
@@ -71,8 +71,7 @@ class TestBigQueryDataTransferHook:
assert expected == self.hook._disable_auto_scheduling(TRANSFER_CONFIG)
@mock.patch(
- "airflow.providers.google.cloud.hooks.bigquery_dts."
- "DataTransferServiceClient.create_transfer_config"
+ "airflow.providers.google.cloud.hooks.bigquery_dts.DataTransferServiceClient.create_transfer_config"
)
def test_create_transfer_config(self, service_mock):
self.hook.create_transfer_config(transfer_config=TRANSFER_CONFIG, project_id=PROJECT_ID)
@@ -87,8 +86,7 @@ class TestBigQueryDataTransferHook:
)
@mock.patch(
- "airflow.providers.google.cloud.hooks.bigquery_dts."
- "DataTransferServiceClient.delete_transfer_config"
+ "airflow.providers.google.cloud.hooks.bigquery_dts.DataTransferServiceClient.delete_transfer_config"
)
def test_delete_transfer_config(self, service_mock):
self.hook.delete_transfer_config(transfer_config_id=TRANSFER_CONFIG_ID, project_id=PROJECT_ID)
diff --git a/providers/google/tests/unit/google/cloud/hooks/test_dataform.py b/providers/google/tests/unit/google/cloud/hooks/test_dataform.py
index afbfc095615..ac271a62723 100644
--- a/providers/google/tests/unit/google/cloud/hooks/test_dataform.py
+++ b/providers/google/tests/unit/google/cloud/hooks/test_dataform.py
@@ -288,8 +288,7 @@ class TestDataformHook:
workspace_id=WORKSPACE_ID,
)
name = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.delete_workspace.assert_called_once_with(
@@ -312,8 +311,7 @@ class TestDataformHook:
contents=FILE_CONTENTS,
)
workspace_path = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.write_file.assert_called_once_with(
@@ -337,8 +335,7 @@ class TestDataformHook:
path=PATH_TO_FOLDER,
)
workspace_path = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.make_directory.assert_called_once_with(
@@ -361,8 +358,7 @@ class TestDataformHook:
path=PATH_TO_FOLDER,
)
workspace_path = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.remove_directory.assert_called_once_with(
@@ -385,8 +381,7 @@ class TestDataformHook:
filepath=FILEPATH,
)
workspace_path = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.remove_file.assert_called_once_with(
@@ -409,8 +404,7 @@ class TestDataformHook:
)
workspace_path = (
- f"projects/{PROJECT_ID}/locations/{REGION}/"
- f"repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
+ f"projects/{PROJECT_ID}/locations/{REGION}/repositories/{REPOSITORY_ID}/workspaces/{WORKSPACE_ID}"
)
mock_client.return_value.install_npm_packages.assert_called_once_with(
diff --git a/providers/google/tests/unit/google/cloud/operators/test_bigquery.py b/providers/google/tests/unit/google/cloud/operators/test_bigquery.py
index 01f42d19473..63d687227e6 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_bigquery.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_bigquery.py
@@ -1111,9 +1111,9 @@ class TestBigQueryGetDataOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryGetDataTrigger
- ), "Trigger is not a BigQueryGetDataTrigger"
+ assert isinstance(exc.value.trigger, BigQueryGetDataTrigger), (
+ "Trigger is not a BigQueryGetDataTrigger"
+ )
@pytest.mark.db_test
@pytest.mark.parametrize("as_dict", [True, False])
@@ -1141,9 +1141,9 @@ class TestBigQueryGetDataOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryGetDataTrigger
- ), "Trigger is not a BigQueryGetDataTrigger"
+ assert isinstance(exc.value.trigger, BigQueryGetDataTrigger), (
+ "Trigger is not a BigQueryGetDataTrigger"
+ )
@pytest.mark.parametrize("as_dict", [True, False])
def test_bigquery_get_data_operator_execute_failure(self, as_dict):
@@ -1816,9 +1816,9 @@ class TestBigQueryInsertJobOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryInsertJobTrigger
- ), "Trigger is not a BigQueryInsertJobTrigger"
+ assert isinstance(exc.value.trigger, BigQueryInsertJobTrigger), (
+ "Trigger is not a BigQueryInsertJobTrigger"
+ )
@mock.patch("airflow.providers.google.cloud.operators.bigquery.BigQueryHook")
def test_bigquery_insert_job_operator_async_inherits_hook_project_id_when_non_given(
@@ -1853,9 +1853,9 @@ class TestBigQueryInsertJobOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryInsertJobTrigger
- ), "Trigger is not a BigQueryInsertJobTrigger"
+ assert isinstance(exc.value.trigger, BigQueryInsertJobTrigger), (
+ "Trigger is not a BigQueryInsertJobTrigger"
+ )
assert exc.value.trigger.project_id == TEST_GCP_PROJECT_ID
@@ -2468,9 +2468,9 @@ class TestBigQueryIntervalCheckOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryIntervalCheckTrigger
- ), "Trigger is not a BigQueryIntervalCheckTrigger"
+ assert isinstance(exc.value.trigger, BigQueryIntervalCheckTrigger), (
+ "Trigger is not a BigQueryIntervalCheckTrigger"
+ )
@pytest.mark.db_test
@mock.patch("airflow.providers.google.cloud.operators.bigquery.BigQueryHook")
@@ -2781,9 +2781,9 @@ class TestBigQueryValueCheckOperator:
with pytest.raises(TaskDeferred) as exc:
ti.task.execute(MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryValueCheckTrigger
- ), "Trigger is not a BigQueryValueCheckTrigger"
+ assert isinstance(exc.value.trigger, BigQueryValueCheckTrigger), (
+ "Trigger is not a BigQueryValueCheckTrigger"
+ )
@pytest.mark.db_test
@mock.patch("airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator.defer")
diff --git a/providers/google/tests/unit/google/cloud/operators/test_cloud_build.py b/providers/google/tests/unit/google/cloud/operators/test_cloud_build.py
index 1b9eb363ee7..36631f923a8 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_cloud_build.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_cloud_build.py
@@ -428,9 +428,9 @@ def test_async_create_build_fires_correct_trigger_should_execute_successfully(
with pytest.raises(TaskDeferred) as exc:
ti.task.execute({"ti": ti})
- assert isinstance(
- exc.value.trigger, CloudBuildCreateBuildTrigger
- ), "Trigger is not a CloudBuildCreateBuildTrigger"
+ assert isinstance(exc.value.trigger, CloudBuildCreateBuildTrigger), (
+ "Trigger is not a CloudBuildCreateBuildTrigger"
+ )
@mock.patch(CLOUD_BUILD_HOOK_PATH)
diff --git a/providers/google/tests/unit/google/cloud/operators/test_compute.py b/providers/google/tests/unit/google/cloud/operators/test_compute.py
index 6aca2c2b7bb..37068c4925f 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_compute.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_compute.py
@@ -1044,8 +1044,7 @@ GCE_INSTANCE_TEMPLATE_BODY_GET = {
"network_interfaces": [
{
"kind": "compute#networkInterface",
- "network": "https://www.googleapis.com/compute/v1/"
- "projects/project/global/networks/default",
+ "network": "https://www.googleapis.com/compute/v1/projects/project/global/networks/default",
"access_configs": [
{
"kind": "compute#accessConfig",
@@ -1054,8 +1053,7 @@ GCE_INSTANCE_TEMPLATE_BODY_GET = {
],
},
{
- "network": "https://www.googleapis.com/compute/v1/"
- "projects/project/global/networks/default",
+ "network": "https://www.googleapis.com/compute/v1/projects/project/global/networks/default",
"access_configs": [{"kind": "compute#accessConfig", "networkTier": "PREMIUM"}],
},
],
@@ -1386,8 +1384,7 @@ class TestGceInstanceTemplateCopy:
GCE_INSTANCE_GROUP_MANAGER_NAME = "instance-group-test"
GCE_INSTANCE_TEMPLATE_SOURCE_URL = (
- "https://www.googleapis.com/compute/beta/projects/project"
- "/global/instanceTemplates/instance-template-test"
+ "https://www.googleapis.com/compute/beta/projects/project/global/instanceTemplates/instance-template-test"
)
GCE_INSTANCE_TEMPLATE_OTHER_URL = (
@@ -1401,8 +1398,7 @@ GCE_INSTANCE_TEMPLATE_NON_EXISTING_URL = (
)
GCE_INSTANCE_TEMPLATE_DESTINATION_URL = (
- "https://www.googleapis.com/compute/beta/projects/project"
- "/global/instanceTemplates/instance-template-new"
+ "https://www.googleapis.com/compute/beta/projects/project/global/instanceTemplates/instance-template-new"
)
GCE_INSTANCE_GROUP_MANAGER_GET = {
diff --git a/providers/google/tests/unit/google/cloud/operators/test_datafusion.py b/providers/google/tests/unit/google/cloud/operators/test_datafusion.py
index 43eb0a457e4..3aca8a37913 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_datafusion.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_datafusion.py
@@ -314,9 +314,9 @@ class TestCloudDataFusionStartPipelineOperatorAsync:
with pytest.raises(TaskDeferred) as exc:
op.execute(context=mock.MagicMock())
- assert isinstance(
- exc.value.trigger, DataFusionStartPipelineTrigger
- ), "Trigger is not a DataFusionStartPipelineTrigger"
+ assert isinstance(exc.value.trigger, DataFusionStartPipelineTrigger), (
+ "Trigger is not a DataFusionStartPipelineTrigger"
+ )
def test_asynch_execute_should_should_throw_exception(self):
"""Tests that an AirflowException is raised in case of error event"""
diff --git a/providers/google/tests/unit/google/cloud/operators/test_dataproc.py b/providers/google/tests/unit/google/cloud/operators/test_dataproc.py
index 91657896111..b9b804d0a54 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_dataproc.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_dataproc.py
@@ -355,8 +355,7 @@ TEST_JOB_ID = "test-job"
TEST_WORKFLOW_ID = "test-workflow"
DATAPROC_JOB_LINK_EXPECTED = (
- f"https://console.cloud.google.com/dataproc/jobs/{TEST_JOB_ID}?"
- f"region={GCP_REGION}&project={GCP_PROJECT}"
+ f"https://console.cloud.google.com/dataproc/jobs/{TEST_JOB_ID}?region={GCP_REGION}&project={GCP_PROJECT}"
)
DATAPROC_CLUSTER_LINK_EXPECTED = (
f"https://console.cloud.google.com/dataproc/clusters/{CLUSTER_NAME}/monitoring?"
@@ -1423,9 +1422,9 @@ class TestDataprocSubmitJobOperator(DataprocJobTestBase):
# Test whether xcom push occurs before polling for job
assert self.extra_links_manager_mock.mock_calls.index(
xcom_push_call
- ) < self.extra_links_manager_mock.mock_calls.index(
- wait_for_job_call
- ), "Xcom push for Job Link has to be done before polling for job status"
+ ) < self.extra_links_manager_mock.mock_calls.index(wait_for_job_call), (
+ "Xcom push for Job Link has to be done before polling for job status"
+ )
mock_hook.return_value.submit_job.assert_called_once_with(
project_id=GCP_PROJECT,
diff --git a/providers/google/tests/unit/google/cloud/operators/test_mlengine.py b/providers/google/tests/unit/google/cloud/operators/test_mlengine.py
index 456961242d7..2f7dee7328a 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_mlengine.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_mlengine.py
@@ -1302,9 +1302,9 @@ def test_async_create_training_job_should_execute_successfully(
with pytest.raises(TaskDeferred) as exc:
ti.task.execute({"ti": ti})
- assert isinstance(
- exc.value.trigger, MLEngineStartTrainingJobTrigger
- ), "Trigger is not a MLEngineStartTrainingJobTrigger"
+ assert isinstance(exc.value.trigger, MLEngineStartTrainingJobTrigger), (
+ "Trigger is not a MLEngineStartTrainingJobTrigger"
+ )
def test_async_create_training_job_should_throw_exception():
diff --git a/providers/google/tests/unit/google/cloud/operators/test_vertex_ai.py b/providers/google/tests/unit/google/cloud/operators/test_vertex_ai.py
index 6410249f10a..15852be62ab 100644
--- a/providers/google/tests/unit/google/cloud/operators/test_vertex_ai.py
+++ b/providers/google/tests/unit/google/cloud/operators/test_vertex_ai.py
@@ -415,9 +415,9 @@ class TestVertexAICreateCustomContainerTrainingJobOperator:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(context={"ti": mock.MagicMock()})
- assert isinstance(
- exc.value.trigger, CustomContainerTrainingJobTrigger
- ), "Trigger is not a CustomContainerTrainingJobTrigger"
+ assert isinstance(exc.value.trigger, CustomContainerTrainingJobTrigger), (
+ "Trigger is not a CustomContainerTrainingJobTrigger"
+ )
@mock.patch(VERTEX_AI_LINKS_PATH.format("VertexAIModelLink.persist"))
@mock.patch(VERTEX_AI_PATH.format("custom_job.CreateCustomContainerTrainingJobOperator.xcom_push"))
@@ -741,9 +741,9 @@ class TestVertexAICreateCustomPythonPackageTrainingJobOperator:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(context={"ti": mock.MagicMock()})
- assert isinstance(
- exc.value.trigger, CustomPythonPackageTrainingJobTrigger
- ), "Trigger is not a CustomPythonPackageTrainingJobTrigger"
+ assert isinstance(exc.value.trigger, CustomPythonPackageTrainingJobTrigger), (
+ "Trigger is not a CustomPythonPackageTrainingJobTrigger"
+ )
@mock.patch(VERTEX_AI_LINKS_PATH.format("VertexAIModelLink.persist"))
@mock.patch(VERTEX_AI_PATH.format("custom_job.CreateCustomPythonPackageTrainingJobOperator.xcom_push"))
@@ -1052,9 +1052,9 @@ class TestVertexAICreateCustomTrainingJobOperator:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(context={"ti": mock.MagicMock()})
- assert isinstance(
- exc.value.trigger, CustomTrainingJobTrigger
- ), "Trigger is not a CustomTrainingJobTrigger"
+ assert isinstance(exc.value.trigger, CustomTrainingJobTrigger), (
+ "Trigger is not a CustomTrainingJobTrigger"
+ )
@mock.patch(VERTEX_AI_LINKS_PATH.format("VertexAIModelLink.persist"))
@mock.patch(VERTEX_AI_PATH.format("custom_job.CreateCustomTrainingJobOperator.xcom_push"))
diff --git a/providers/google/tests/unit/google/cloud/sensors/test_bigquery.py b/providers/google/tests/unit/google/cloud/sensors/test_bigquery.py
index 91a98970f93..d568afe3701 100644
--- a/providers/google/tests/unit/google/cloud/sensors/test_bigquery.py
+++ b/providers/google/tests/unit/google/cloud/sensors/test_bigquery.py
@@ -97,9 +97,9 @@ class TestBigqueryTableExistenceSensor:
mock_hook.return_value.table_exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(mock.MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryTableExistenceTrigger
- ), "Trigger is not a BigQueryTableExistenceTrigger"
+ assert isinstance(exc.value.trigger, BigQueryTableExistenceTrigger), (
+ "Trigger is not a BigQueryTableExistenceTrigger"
+ )
def test_execute_deferred_failure(self):
"""Tests that an expected exception is raised in case of error event"""
@@ -200,9 +200,9 @@ class TestBigqueryTablePartitionExistenceSensor:
mock_hook.return_value.table_partition_exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(context={})
- assert isinstance(
- exc.value.trigger, BigQueryTablePartitionExistenceTrigger
- ), "Trigger is not a BigQueryTablePartitionExistenceTrigger"
+ assert isinstance(exc.value.trigger, BigQueryTablePartitionExistenceTrigger), (
+ "Trigger is not a BigQueryTablePartitionExistenceTrigger"
+ )
def test_execute_with_deferrable_mode_execute_failure(self):
"""Tests that an AirflowException is raised in case of error event"""
diff --git a/providers/google/tests/unit/google/cloud/sensors/test_dataflow.py b/providers/google/tests/unit/google/cloud/sensors/test_dataflow.py
index 50efd44c699..873780d0c35 100644
--- a/providers/google/tests/unit/google/cloud/sensors/test_dataflow.py
+++ b/providers/google/tests/unit/google/cloud/sensors/test_dataflow.py
@@ -127,9 +127,9 @@ class TestDataflowJobStatusSensor:
mock_poke.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(None)
- assert isinstance(
- exc.value.trigger, DataflowJobStatusTrigger
- ), "Trigger is not a DataflowJobStatusTrigger"
+ assert isinstance(exc.value.trigger, DataflowJobStatusTrigger), (
+ "Trigger is not a DataflowJobStatusTrigger"
+ )
def test_execute_complete_success(self):
"""Tests that the trigger event contains expected values if no callback function is provided."""
@@ -261,9 +261,9 @@ class TestDataflowJobMetricsSensor:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(None)
- assert isinstance(
- exc.value.trigger, DataflowJobMetricsTrigger
- ), "Trigger is not a DataflowJobMetricsTrigger"
+ assert isinstance(exc.value.trigger, DataflowJobMetricsTrigger), (
+ "Trigger is not a DataflowJobMetricsTrigger"
+ )
def test_execute_complete_success_without_callback_function(self):
"""Tests that the trigger event contains expected values if no callback function is provided."""
@@ -439,9 +439,9 @@ class TestDataflowJobMessagesSensor:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(None)
- assert isinstance(
- exc.value.trigger, DataflowJobMessagesTrigger
- ), "Trigger is not a DataflowJobMessagesTrigger"
+ assert isinstance(exc.value.trigger, DataflowJobMessagesTrigger), (
+ "Trigger is not a DataflowJobMessagesTrigger"
+ )
def test_execute_complete_success_without_callback_function(self):
"""Tests that the trigger event contains expected values if no callback function is provided."""
@@ -615,9 +615,9 @@ class TestDataflowJobAutoScalingEventsSensor:
mock_hook.return_value.exists.return_value = False
with pytest.raises(TaskDeferred) as exc:
task.execute(None)
- assert isinstance(
- exc.value.trigger, DataflowJobAutoScalingEventTrigger
- ), "Trigger is not a DataflowJobAutoScalingEventTrigger"
+ assert isinstance(exc.value.trigger, DataflowJobAutoScalingEventTrigger), (
+ "Trigger is not a DataflowJobAutoScalingEventTrigger"
+ )
def test_execute_complete_success_without_callback_function(self):
"""Tests that the trigger event contains expected values if no callback function is provided."""
diff --git a/providers/google/tests/unit/google/cloud/sensors/test_gcs.py b/providers/google/tests/unit/google/cloud/sensors/test_gcs.py
index c242856d603..13060a03f93 100644
--- a/providers/google/tests/unit/google/cloud/sensors/test_gcs.py
+++ b/providers/google/tests/unit/google/cloud/sensors/test_gcs.py
@@ -255,9 +255,9 @@ class TestGCSObjectUpdateAsyncSensor:
mock_hook.return_value.is_updated_after.return_value = False
with pytest.raises(TaskDeferred) as exc:
self.OPERATOR.execute(mock.MagicMock())
- assert isinstance(
- exc.value.trigger, GCSCheckBlobUpdateTimeTrigger
- ), "Trigger is not a GCSCheckBlobUpdateTimeTrigger"
+ assert isinstance(exc.value.trigger, GCSCheckBlobUpdateTimeTrigger), (
+ "Trigger is not a GCSCheckBlobUpdateTimeTrigger"
+ )
def test_gcs_object_update_async_sensor_execute_failure(self):
"""Tests that an AirflowException is raised in case of error event"""
@@ -532,9 +532,9 @@ class TestGCSUploadSessionCompleteAsyncSensor:
mock_hook.return_value.is_bucket_updated.return_value = False
with pytest.raises(TaskDeferred) as exc:
self.OPERATOR.execute(mock.MagicMock())
- assert isinstance(
- exc.value.trigger, GCSUploadSessionTrigger
- ), "Trigger is not a GCSUploadSessionTrigger"
+ assert isinstance(exc.value.trigger, GCSUploadSessionTrigger), (
+ "Trigger is not a GCSUploadSessionTrigger"
+ )
def test_gcs_upload_session_complete_sensor_execute_failure(self):
"""Tests that an AirflowException is raised in case of error event"""
diff --git a/providers/google/tests/unit/google/cloud/transfers/test_bigquery_to_gcs.py b/providers/google/tests/unit/google/cloud/transfers/test_bigquery_to_gcs.py
index b451d2037ef..38a95f4e734 100644
--- a/providers/google/tests/unit/google/cloud/transfers/test_bigquery_to_gcs.py
+++ b/providers/google/tests/unit/google/cloud/transfers/test_bigquery_to_gcs.py
@@ -173,9 +173,9 @@ class TestBigQueryToGCSOperator:
with pytest.raises(TaskDeferred) as exc:
operator.execute(context=mock.MagicMock())
- assert isinstance(
- exc.value.trigger, BigQueryInsertJobTrigger
- ), "Trigger is not a BigQueryInsertJobTrigger"
+ assert isinstance(exc.value.trigger, BigQueryInsertJobTrigger), (
+ "Trigger is not a BigQueryInsertJobTrigger"
+ )
mock_hook.return_value.insert_job.assert_called_once_with(
configuration=expected_configuration,
diff --git a/providers/google/tests/unit/google/cloud/triggers/test_bigquery.py b/providers/google/tests/unit/google/cloud/triggers/test_bigquery.py
index bbb1a503568..a9552ad2a29 100644
--- a/providers/google/tests/unit/google/cloud/triggers/test_bigquery.py
+++ b/providers/google/tests/unit/google/cloud/triggers/test_bigquery.py
@@ -303,9 +303,9 @@ class TestBigQueryInsertJobTrigger:
except asyncio.CancelledError:
pass
- assert (
- "Skipping to cancel job" in caplog.text
- ), "Expected message about skipping cancellation not found in log."
+ assert "Skipping to cancel job" in caplog.text, (
+ "Expected message about skipping cancellation not found in log."
+ )
assert mock_get_job_status.call_count == 2, "Job status should be checked multiple times"
diff --git a/providers/google/tests/unit/google/cloud/utils/test_credentials_provider.py b/providers/google/tests/unit/google/cloud/utils/test_credentials_provider.py
index 91a5cac5f06..4ad9ee8539a 100644
--- a/providers/google/tests/unit/google/cloud/utils/test_credentials_provider.py
+++ b/providers/google/tests/unit/google/cloud/utils/test_credentials_provider.py
@@ -366,9 +366,7 @@ class TestGetGcpCredentialsAndProjectId:
):
mock_secret_manager_client.return_value.is_valid_secret_name.return_value = True
mock_secret_manager_client.return_value.get_secret.return_value = (
- '{"type":"service_account","project_id":"pid",'
- '"private_key_id":"pkid",'
- '"private_key":"payload"}'
+ '{"type":"service_account","project_id":"pid","private_key_id":"pkid","private_key":"payload"}'
)
get_credentials_and_project_id(key_secret_name="secret name")
diff --git a/providers/google/tests/unit/google/leveldb/hooks/test_leveldb.py b/providers/google/tests/unit/google/leveldb/hooks/test_leveldb.py
index e37bc49d098..1443cafe36a 100644
--- a/providers/google/tests/unit/google/leveldb/hooks/test_leveldb.py
+++ b/providers/google/tests/unit/google/leveldb/hooks/test_leveldb.py
@@ -45,9 +45,9 @@ class TestLevelDBHook:
hook.get_conn(name=tmp_path.as_posix(), create_if_missing=True)
assert hook.run("get", b"test_key0") is None, "Initially, this key in LevelDB is empty"
hook.run("put", b"test_key0", b"test_value0")
- assert (
- hook.run("get", b"test_key0") == b"test_value0"
- ), "Connection to LevelDB with PUT and GET works."
+ assert hook.run("get", b"test_key0") == b"test_value0", (
+ "Connection to LevelDB with PUT and GET works."
+ )
hook.run("delete", b"test_key0")
assert hook.run("get", b"test_key0") is None, "Connection to LevelDB with DELETE works."
hook.close_conn()
diff --git a/providers/google/tests/unit/google/marketing_platform/hooks/test_display_video.py b/providers/google/tests/unit/google/marketing_platform/hooks/test_display_video.py
index 74fc448f201..a5841d57476 100644
--- a/providers/google/tests/unit/google/marketing_platform/hooks/test_display_video.py
+++ b/providers/google/tests/unit/google/marketing_platform/hooks/test_display_video.py
@@ -36,8 +36,7 @@ class TestGoogleDisplayVideo360Hook:
self.hook = GoogleDisplayVideo360Hook(api_version=API_VERSION, gcp_conn_id=GCP_CONN_ID)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook._authorize"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook._authorize"
)
@mock.patch("airflow.providers.google.marketing_platform.hooks.display_video.build")
def test_gen_conn(self, mock_build, mock_authorize):
@@ -51,8 +50,7 @@ class TestGoogleDisplayVideo360Hook:
assert mock_build.return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook._authorize"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook._authorize"
)
@mock.patch("airflow.providers.google.marketing_platform.hooks.display_video.build")
def test_get_conn_to_display_video(self, mock_build, mock_authorize):
@@ -66,8 +64,7 @@ class TestGoogleDisplayVideo360Hook:
assert mock_build.return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_create_query(self, get_conn_mock):
body = {"body": "test"}
@@ -84,8 +81,7 @@ class TestGoogleDisplayVideo360Hook:
assert return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_delete_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -100,8 +96,7 @@ class TestGoogleDisplayVideo360Hook:
get_conn_mock.return_value.queries.return_value.delete.assert_called_once_with(queryId=query_id)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_get_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -116,8 +111,7 @@ class TestGoogleDisplayVideo360Hook:
assert return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_list_queries(self, get_conn_mock):
queries = ["test"]
@@ -131,8 +125,7 @@ class TestGoogleDisplayVideo360Hook:
assert queries == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_run_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -145,8 +138,7 @@ class TestGoogleDisplayVideo360Hook:
)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_download_line_items_should_be_called_once(self, get_conn_mock):
request_body = {
@@ -159,8 +151,7 @@ class TestGoogleDisplayVideo360Hook:
get_conn_mock.return_value.lineitems.return_value.downloadlineitems.assert_called_once()
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_download_line_items_should_be_called_with_params(self, get_conn_mock):
request_body = {
@@ -176,8 +167,7 @@ class TestGoogleDisplayVideo360Hook:
)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_download_line_items_should_return_equal_values(self, get_conn_mock):
line_item = ["holy_hand_grenade"]
@@ -198,8 +188,7 @@ class TestGoogleDisplayVideo360Hook:
assert line_item == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_upload_line_items_should_be_called_once(self, get_conn_mock):
line_items = ["this", "is", "super", "awesome", "test"]
@@ -208,8 +197,7 @@ class TestGoogleDisplayVideo360Hook:
get_conn_mock.return_value.lineitems.return_value.uploadlineitems.assert_called_once()
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_upload_line_items_should_be_called_with_params(self, get_conn_mock):
line_items = "I spent too much time on this"
@@ -226,8 +214,7 @@ class TestGoogleDisplayVideo360Hook:
)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_upload_line_items_should_return_equal_values(self, get_conn_mock):
line_items = {"lineItems": "string", "format": "string", "dryRun": False}
@@ -380,8 +367,7 @@ class TestGoogleDisplayVideo360v2Hook:
self.hook = GoogleDisplayVideo360Hook(api_version=self.api_version, gcp_conn_id=GCP_CONN_ID)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook._authorize"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook._authorize"
)
@mock.patch("airflow.providers.google.marketing_platform.hooks.display_video.build")
def test_gen_conn(self, mock_build, mock_authorize):
@@ -395,8 +381,7 @@ class TestGoogleDisplayVideo360v2Hook:
assert mock_build.return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook._authorize"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook._authorize"
)
@mock.patch("airflow.providers.google.marketing_platform.hooks.display_video.build")
def test_get_conn_to_display_video(self, mock_build, mock_authorize):
@@ -410,8 +395,7 @@ class TestGoogleDisplayVideo360v2Hook:
assert mock_build.return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_create_query(self, get_conn_mock):
body = {"body": "test"}
@@ -428,8 +412,7 @@ class TestGoogleDisplayVideo360v2Hook:
assert return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_delete_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -444,8 +427,7 @@ class TestGoogleDisplayVideo360v2Hook:
get_conn_mock.return_value.queries.return_value.delete.assert_called_once_with(queryId=query_id)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_get_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -460,8 +442,7 @@ class TestGoogleDisplayVideo360v2Hook:
assert return_value == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_list_queries(self, get_conn_mock):
queries = ["test"]
@@ -475,8 +456,7 @@ class TestGoogleDisplayVideo360v2Hook:
assert queries == result
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_run_query(self, get_conn_mock):
query_id = "QUERY_ID"
@@ -489,8 +469,7 @@ class TestGoogleDisplayVideo360v2Hook:
)
@mock.patch(
- "airflow.providers.google.marketing_platform.hooks."
- "display_video.GoogleDisplayVideo360Hook.get_conn"
+ "airflow.providers.google.marketing_platform.hooks.display_video.GoogleDisplayVideo360Hook.get_conn"
)
def test_get_report(self, get_conn_mock):
query_id = "QUERY_ID"
diff --git a/providers/hashicorp/src/airflow/providers/hashicorp/_internal_client/vault_client.py b/providers/hashicorp/src/airflow/providers/hashicorp/_internal_client/vault_client.py
index 9daa563215a..272ecbd37f4 100644
--- a/providers/hashicorp/src/airflow/providers/hashicorp/_internal_client/vault_client.py
+++ b/providers/hashicorp/src/airflow/providers/hashicorp/_internal_client/vault_client.py
@@ -126,8 +126,7 @@ class _VaultClient(LoggingMixin):
super().__init__()
if kv_engine_version and kv_engine_version not in VALID_KV_VERSIONS:
raise VaultError(
- f"The version is not supported: {kv_engine_version}. "
- f"It should be one of {VALID_KV_VERSIONS}"
+ f"The version is not supported: {kv_engine_version}. It should be one of {VALID_KV_VERSIONS}"
)
if auth_type not in VALID_AUTH_TYPES:
raise VaultError(
diff --git a/providers/http/tests/unit/http/hooks/test_http.py b/providers/http/tests/unit/http/hooks/test_http.py
index 194f799e3d6..a3ab5269fda 100644
--- a/providers/http/tests/unit/http/hooks/test_http.py
+++ b/providers/http/tests/unit/http/hooks/test_http.py
@@ -592,12 +592,12 @@ class TestHttpHook:
custom_adapter = HTTPAdapter()
hook = HttpHook(method="GET", adapter=custom_adapter)
session = hook.get_conn()
- assert isinstance(
- session.adapters["http://"], type(custom_adapter)
- ), "Custom HTTP adapter not correctly mounted"
- assert isinstance(
- session.adapters["https://"], type(custom_adapter)
- ), "Custom HTTPS adapter not correctly mounted"
+ assert isinstance(session.adapters["http://"], type(custom_adapter)), (
+ "Custom HTTP adapter not correctly mounted"
+ )
+ assert isinstance(session.adapters["https://"], type(custom_adapter)), (
+ "Custom HTTPS adapter not correctly mounted"
+ )
def test_process_extra_options_from_connection(self):
extra_options = {}
diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
index 4aaa668c5ae..914bfccab59 100644
--- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
+++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
@@ -85,7 +85,7 @@ class AzureContainerInstanceHook(AzureBaseHook):
if all([conn.login, conn.password, tenant]):
self.log.info("Getting connection using specific credentials and subscription_id.")
credential = ClientSecretCredential(
- client_id=conn.login, client_secret=conn.password, tenant_id=cast(str, tenant)
+ client_id=conn.login, client_secret=conn.password, tenant_id=cast("str", tenant)
)
else:
self.log.info("Using DefaultAzureCredential as credential")
@@ -96,7 +96,7 @@ class AzureContainerInstanceHook(AzureBaseHook):
workload_identity_tenant_id=workload_identity_tenant_id,
)
- subscription_id = cast(str, conn.extra_dejson.get("subscriptionId"))
+ subscription_id = cast("str", conn.extra_dejson.get("subscriptionId"))
return ContainerInstanceManagementClient(
credential=credential,
subscription_id=subscription_id,
diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py
index 2b12729f1a7..d2e2a6207b1 100644
--- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py
+++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py
@@ -1104,7 +1104,7 @@ def provide_targeted_factory_async(func: T) -> T:
return await func(*bound_args.args, **bound_args.kwargs)
- return cast(T, wrapper)
+ return cast("T", wrapper)
class AzureDataFactoryAsyncHook(AzureDataFactoryHook):
@@ -1193,7 +1193,7 @@ class AzureDataFactoryAsyncHook(AzureDataFactoryHook):
:param factory_name: The factory name.
"""
pipeline_run = await self.get_pipeline_run(run_id, resource_group_name, factory_name)
- status: str = cast(str, pipeline_run.status)
+ status: str = cast("str", pipeline_run.status)
return status
@provide_targeted_factory_async
diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py
index cc082677adf..806e6346635 100644
--- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py
+++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py
@@ -328,8 +328,7 @@ class AzureDataLakeStorageV2Hook(BaseHook):
prefix = "extra__adls__"
if field_name.startswith("extra__"):
raise ValueError(
- f"Got prefixed name {field_name}; please remove the '{prefix}' prefix "
- f"when using this method."
+ f"Got prefixed name {field_name}; please remove the '{prefix}' prefix when using this method."
)
if field_name in extra_dict:
return extra_dict[field_name] or None
diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py
index 014be1903c1..1162b4edf59 100644
--- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py
+++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py
@@ -144,8 +144,7 @@ class WasbHook(BaseHook):
prefix = "extra__wasb__"
if field_name.startswith("extra__"):
raise ValueError(
- f"Got prefixed name {field_name}; please remove the '{prefix}' prefix "
- f"when using this method."
+ f"Got prefixed name {field_name}; please remove the '{prefix}' prefix when using this method."
)
if field_name in extra_dict:
return extra_dict[field_name] or None
diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py
index 8b21f8226b3..ea2c96d62a5 100644
--- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py
+++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py
@@ -120,7 +120,13 @@ class AzureContainerInstancesOperator(BaseOperator):
},
secured_variables=["POSTGRES_PASSWORD"],
volumes=[
- ("azure_container_instance_conn_id", "my_storage_container", "my_fileshare", "/input-data", True),
+ (
+ "azure_container_instance_conn_id",
+ "my_storage_container",
+ "my_fileshare",
+ "/input-data",
+ True,
+ ),
],
memory_in_gb=14.0,
cpu=4.0,
diff --git a/providers/microsoft/azure/tests/system/microsoft/azure/example_adf_run_pipeline.py b/providers/microsoft/azure/tests/system/microsoft/azure/example_adf_run_pipeline.py
index c2e23061f15..ed95bdb0141 100644
--- a/providers/microsoft/azure/tests/system/microsoft/azure/example_adf_run_pipeline.py
+++ b/providers/microsoft/azure/tests/system/microsoft/azure/example_adf_run_pipeline.py
@@ -66,19 +66,19 @@ with DAG(
pipeline_run_sensor = AzureDataFactoryPipelineRunStatusSensor(
task_id="pipeline_run_sensor",
- run_id=cast(str, XComArg(run_pipeline2, key="run_id")),
+ run_id=cast("str", XComArg(run_pipeline2, key="run_id")),
)
# Performs polling on the Airflow Triggerer thus freeing up resources on Airflow Worker
pipeline_run_sensor_deferred = AzureDataFactoryPipelineRunStatusSensor(
task_id="pipeline_run_sensor_defered",
- run_id=cast(str, XComArg(run_pipeline2, key="run_id")),
+ run_id=cast("str", XComArg(run_pipeline2, key="run_id")),
deferrable=True,
)
pipeline_run_async_sensor = AzureDataFactoryPipelineRunStatusSensor(
task_id="pipeline_run_async_sensor",
- run_id=cast(str, XComArg(run_pipeline2, key="run_id")),
+ run_id=cast("str", XComArg(run_pipeline2, key="run_id")),
deferrable=True,
)
# [END howto_operator_adf_run_pipeline_async]
diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_wasb.py b/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_wasb.py
index ec44cf515b8..55895879fac 100644
--- a/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_wasb.py
+++ b/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_wasb.py
@@ -675,6 +675,6 @@ class TestWasbHook:
wasb_hook = WasbHook(wasb_conn_id=conn_id_str)
account_name = wasb_hook.get_conn().account_name
- assert (
- account_name == expected_account_name
- ), f"Expected account name {expected_account_name} but got {account_name}"
+ assert account_name == expected_account_name, (
+ f"Expected account name {expected_account_name} but got {account_name}"
+ )
diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_data_factory.py b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_data_factory.py
index f59355565dc..788f52efc37 100644
--- a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_data_factory.py
+++ b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_data_factory.py
@@ -367,8 +367,7 @@ class TestAzureDataFactoryRunPipelineOperatorWithDeferrable:
@pytest.mark.db_test
@mock.patch(
- "airflow.providers.microsoft.azure.operators.data_factory.AzureDataFactoryRunPipelineOperator"
- ".defer"
+ "airflow.providers.microsoft.azure.operators.data_factory.AzureDataFactoryRunPipelineOperator.defer"
)
@mock.patch(
"airflow.providers.microsoft.azure.hooks.data_factory.AzureDataFactoryHook.get_pipeline_run_status",
@@ -390,8 +389,7 @@ class TestAzureDataFactoryRunPipelineOperatorWithDeferrable:
@pytest.mark.db_test
@pytest.mark.parametrize("status", sorted(AzureDataFactoryPipelineRunStatus.FAILURE_STATES))
@mock.patch(
- "airflow.providers.microsoft.azure.operators.data_factory.AzureDataFactoryRunPipelineOperator"
- ".defer"
+ "airflow.providers.microsoft.azure.operators.data_factory.AzureDataFactoryRunPipelineOperator.defer"
)
@mock.patch(
"airflow.providers.microsoft.azure.hooks.data_factory.AzureDataFactoryHook.get_pipeline_run_status",
@@ -430,9 +428,9 @@ class TestAzureDataFactoryRunPipelineOperatorWithDeferrable:
with pytest.raises(TaskDeferred) as exc:
self.ti.task.execute(context=self.create_context(self.ti.task))
- assert isinstance(
- exc.value.trigger, AzureDataFactoryTrigger
- ), "Trigger is not a AzureDataFactoryTrigger"
+ assert isinstance(exc.value.trigger, AzureDataFactoryTrigger), (
+ "Trigger is not a AzureDataFactoryTrigger"
+ )
@pytest.mark.db_test
def test_azure_data_factory_run_pipeline_operator_async_execute_complete_success(self):
diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_data_factory.py b/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_data_factory.py
index 6e4288ef9de..4abf612cec3 100644
--- a/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_data_factory.py
+++ b/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_data_factory.py
@@ -87,14 +87,13 @@ class TestAzureDataFactoryPipelineRunStatusSensor:
mock_hook.return_value.get_pipeline_run_status.return_value = AzureDataFactoryPipelineRunStatus.QUEUED
with pytest.raises(TaskDeferred) as exc:
self.defered_sensor.execute(mock.MagicMock())
- assert isinstance(
- exc.value.trigger, ADFPipelineRunStatusSensorTrigger
- ), "Trigger is not a ADFPipelineRunStatusSensorTrigger"
+ assert isinstance(exc.value.trigger, ADFPipelineRunStatusSensorTrigger), (
+ "Trigger is not a ADFPipelineRunStatusSensorTrigger"
+ )
@mock.patch("airflow.providers.microsoft.azure.sensors.data_factory.AzureDataFactoryHook")
@mock.patch(
- "airflow.providers.microsoft.azure.sensors.data_factory"
- ".AzureDataFactoryPipelineRunStatusSensor.defer"
+ "airflow.providers.microsoft.azure.sensors.data_factory.AzureDataFactoryPipelineRunStatusSensor.defer"
)
def test_adf_pipeline_status_sensor_finish_before_deferred(self, mock_defer, mock_hook):
mock_hook.return_value.get_pipeline_run_status.return_value = (
@@ -134,9 +133,9 @@ class TestAzureDataFactoryPipelineRunStatusSensorWithAsync:
mock_hook.return_value.get_pipeline_run_status.return_value = AzureDataFactoryPipelineRunStatus.QUEUED
with pytest.raises(TaskDeferred) as exc:
self.SENSOR.execute({})
- assert isinstance(
- exc.value.trigger, ADFPipelineRunStatusSensorTrigger
- ), "Trigger is not a ADFPipelineRunStatusSensorTrigger"
+ assert isinstance(exc.value.trigger, ADFPipelineRunStatusSensorTrigger), (
+ "Trigger is not a ADFPipelineRunStatusSensorTrigger"
+ )
def test_adf_pipeline_status_sensor_execute_complete_success(self):
"""Assert execute_complete log success message when trigger fire with target status"""
diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_wasb.py b/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_wasb.py
index f89b2319d11..c93db4ea05b 100644
--- a/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_wasb.py
+++ b/providers/microsoft/azure/tests/unit/microsoft/azure/sensors/test_wasb.py
@@ -305,9 +305,9 @@ class TestWasbPrefixAsyncSensor:
mock_hook.return_value.check_for_prefix.return_value = False
with pytest.raises(TaskDeferred) as exc:
self.SENSOR.execute(self.create_context(self.SENSOR))
- assert isinstance(
- exc.value.trigger, WasbPrefixSensorTrigger
- ), "Trigger is not a WasbPrefixSensorTrigger"
+ assert isinstance(exc.value.trigger, WasbPrefixSensorTrigger), (
+ "Trigger is not a WasbPrefixSensorTrigger"
+ )
@pytest.mark.parametrize(
"event",
diff --git a/providers/microsoft/mssql/src/airflow/providers/microsoft/mssql/dialects/mssql.py b/providers/microsoft/mssql/src/airflow/providers/microsoft/mssql/dialects/mssql.py
index 0c0ba72309a..9203eb4e414 100644
--- a/providers/microsoft/mssql/src/airflow/providers/microsoft/mssql/dialects/mssql.py
+++ b/providers/microsoft/mssql/src/airflow/providers/microsoft/mssql/dialects/mssql.py
@@ -56,14 +56,14 @@ class MsSqlDialect(Dialect):
self.log.debug("columns: %s", columns)
sql = f"""MERGE INTO {table} WITH (ROWLOCK) AS target
- USING (SELECT {', '.join(map(lambda column: f'{self.placeholder} AS {self.escape_word(column)}', target_fields))}) AS source
- ON {' AND '.join(map(lambda column: f'target.{self.escape_word(column)} = source.{self.escape_word(column)}', primary_keys))}"""
+ USING (SELECT {", ".join(map(lambda column: f"{self.placeholder} AS {self.escape_word(column)}", target_fields))}) AS source
+ ON {" AND ".join(map(lambda column: f"target.{self.escape_word(column)} = source.{self.escape_word(column)}", primary_keys))}"""
if columns:
sql = f"""{sql}
WHEN MATCHED THEN
- UPDATE SET {', '.join(map(lambda column: f'target.{column} = source.{column}', columns))}"""
+ UPDATE SET {", ".join(map(lambda column: f"target.{column} = source.{column}", columns))}"""
return f"""{sql}
WHEN NOT MATCHED THEN
- INSERT ({', '.join(map(self.escape_word, target_fields))}) VALUES ({', '.join(map(lambda column: f'source.{self.escape_word(column)}', target_fields))});"""
+ INSERT ({", ".join(map(self.escape_word, target_fields))}) VALUES ({", ".join(map(lambda column: f"source.{self.escape_word(column)}", target_fields))});"""
diff --git a/providers/odbc/src/airflow/providers/odbc/hooks/odbc.py b/providers/odbc/src/airflow/providers/odbc/hooks/odbc.py
index 1d9ebb6fc37..7ba3d3d57f0 100644
--- a/providers/odbc/src/airflow/providers/odbc/hooks/odbc.py
+++ b/providers/odbc/src/airflow/providers/odbc/hooks/odbc.py
@@ -223,7 +223,7 @@ class OdbcHook(DbApiHook):
if isinstance(result, Sequence):
field_names = [col[0] for col in result[0].cursor_description]
row_object = namedtuple("Row", field_names, rename=True) # type: ignore
- return cast(list[tuple], [row_object(*row) for row in result])
+ return cast("list[tuple]", [row_object(*row) for row in result])
else:
field_names = [col[0] for col in result.cursor_description]
- return cast(tuple, namedtuple("Row", field_names, rename=True)(*result)) # type: ignore
+ return cast("tuple", namedtuple("Row", field_names, rename=True)(*result)) # type: ignore
diff --git a/providers/openlineage/tests/unit/openlineage/extractors/test_manager.py b/providers/openlineage/tests/unit/openlineage/extractors/test_manager.py
index dde336c6a62..1aaaf2ff317 100644
--- a/providers/openlineage/tests/unit/openlineage/extractors/test_manager.py
+++ b/providers/openlineage/tests/unit/openlineage/extractors/test_manager.py
@@ -385,7 +385,9 @@ def mocked_parse(spy_agency):
mocked_parse(
StartupDetails(
- ti=TaskInstance(id=uuid7(), task_id="hello", dag_id="super_basic_run", run_id="c", try_number=1),
+ ti=TaskInstance(
+ id=uuid7(), task_id="hello", dag_id="super_basic_run", run_id="c", try_number=1
+ ),
file="",
requests_fd=0,
),
diff --git a/providers/qdrant/tests/integration/qdrant/operators/test_qdrant_ingest.py b/providers/qdrant/tests/integration/qdrant/operators/test_qdrant_ingest.py
index 534622ec907..6aded06fffe 100644
--- a/providers/qdrant/tests/integration/qdrant/operators/test_qdrant_ingest.py
+++ b/providers/qdrant/tests/integration/qdrant/operators/test_qdrant_ingest.py
@@ -66,6 +66,6 @@ class TestQdrantIngestOperator:
operator.execute(self.mock_context)
- assert (
- hook.conn.count(collection_name=collection_name).count == points_count
- ), f"Added {points_count} points to the Qdrant collection"
+ assert hook.conn.count(collection_name=collection_name).count == points_count, (
+ f"Added {points_count} points to the Qdrant collection"
+ )
diff --git a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
index 721c2e75d87..6d467c29956 100644
--- a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
+++ b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
@@ -34,7 +34,7 @@ class SmtpNotifier(BaseNotifier):
.. code-block:: python
- EmptyOperator(task_id="task", on_failure_callback=SmtpNotifier(from_email=None, to="myemail@myemail.com"))
+ EmptyOperator(task_id="task", on_failure_callback=SmtpNotifier(from_email=None, to="my@mail.com"))
EmptyOperator(
task_id="task",
diff --git a/providers/snowflake/src/airflow/providers/snowflake/operators/snowflake.py b/providers/snowflake/src/airflow/providers/snowflake/operators/snowflake.py
index ad66bf6b2a5..b4eb71079f2 100644
--- a/providers/snowflake/src/airflow/providers/snowflake/operators/snowflake.py
+++ b/providers/snowflake/src/airflow/providers/snowflake/operators/snowflake.py
@@ -505,7 +505,7 @@ class SnowflakeSqlApiOperator(SQLExecuteQueryOperator):
raise AirflowException(msg)
elif "status" in event and event["status"] == "success":
hook = SnowflakeSqlApiHook(snowflake_conn_id=self.snowflake_conn_id)
- query_ids = cast(list[str], event["statement_query_ids"])
+ query_ids = cast("list[str]", event["statement_query_ids"])
hook.check_query_output(query_ids)
self.log.info("%s completed successfully.", self.task_id)
else:
diff --git a/providers/snowflake/tests/unit/snowflake/operators/test_snowflake.py b/providers/snowflake/tests/unit/snowflake/operators/test_snowflake.py
index 7d39ec7a821..1651818ed54 100644
--- a/providers/snowflake/tests/unit/snowflake/operators/test_snowflake.py
+++ b/providers/snowflake/tests/unit/snowflake/operators/test_snowflake.py
@@ -289,9 +289,9 @@ class TestSnowflakeSqlApiOperator:
with pytest.raises(TaskDeferred) as exc:
operator.execute(create_context(operator))
- assert isinstance(
- exc.value.trigger, SnowflakeSqlApiTrigger
- ), "Trigger is not a SnowflakeSqlApiTrigger"
+ assert isinstance(exc.value.trigger, SnowflakeSqlApiTrigger), (
+ "Trigger is not a SnowflakeSqlApiTrigger"
+ )
def test_snowflake_sql_api_execute_complete_failure(self):
"""Test SnowflakeSqlApiOperator raise AirflowException of error event"""
diff --git a/providers/standard/src/airflow/providers/standard/operators/bash.py b/providers/standard/src/airflow/providers/standard/operators/bash.py
index 02a3c03afbd..3be7b58d16b 100644
--- a/providers/standard/src/airflow/providers/standard/operators/bash.py
+++ b/providers/standard/src/airflow/providers/standard/operators/bash.py
@@ -253,7 +253,7 @@ class BashOperator(BaseOperator):
"""
with working_directory(cwd=self.cwd) as cwd:
with tempfile.NamedTemporaryFile(mode="w", dir=cwd, suffix=".sh") as file:
- file.write(cast(str, self.bash_command))
+ file.write(cast("str", self.bash_command))
file.flush()
bash_script = os.path.basename(file.name)
diff --git a/providers/standard/src/airflow/providers/standard/operators/python.py b/providers/standard/src/airflow/providers/standard/operators/python.py
index 8523a9d670b..67a79a40b1e 100644
--- a/providers/standard/src/airflow/providers/standard/operators/python.py
+++ b/providers/standard/src/airflow/providers/standard/operators/python.py
@@ -460,8 +460,7 @@ class _BasePythonVirtualenvOperator(PythonOperator, metaclass=ABCMeta):
serializer = serializer or "pickle"
if serializer not in _SERIALIZERS:
msg = (
- f"Unsupported serializer {serializer!r}. "
- f"Expected one of {', '.join(map(repr, _SERIALIZERS))}"
+ f"Unsupported serializer {serializer!r}. Expected one of {', '.join(map(repr, _SERIALIZERS))}"
)
raise AirflowException(msg)
@@ -1142,7 +1141,6 @@ def _get_current_context() -> Mapping[str, Any]:
if not _CURRENT_CONTEXT:
raise RuntimeError(
- "Current context was requested but no context was found! "
- "Are you running within an Airflow task?"
+ "Current context was requested but no context was found! Are you running within an Airflow task?"
)
return _CURRENT_CONTEXT[-1]
diff --git a/providers/standard/src/airflow/providers/standard/sensors/external_task.py b/providers/standard/src/airflow/providers/standard/sensors/external_task.py
index 0b6ab06b349..0a34cc5d48f 100644
--- a/providers/standard/src/airflow/providers/standard/sensors/external_task.py
+++ b/providers/standard/src/airflow/providers/standard/sensors/external_task.py
@@ -400,8 +400,7 @@ class ExternalTaskSensor(BaseSensorOperator, BaseOperator):
for external_task_id in self.external_task_ids:
if not refreshed_dag_info.has_task(external_task_id):
raise AirflowException(
- f"The external task {external_task_id} in "
- f"DAG {self.external_dag_id} does not exist."
+ f"The external task {external_task_id} in DAG {self.external_dag_id} does not exist."
)
if self.external_task_group_id:
diff --git a/providers/standard/src/airflow/providers/standard/triggers/external_task.py b/providers/standard/src/airflow/providers/standard/triggers/external_task.py
index 0ba3ba31005..3c1e6747685 100644
--- a/providers/standard/src/airflow/providers/standard/triggers/external_task.py
+++ b/providers/standard/src/airflow/providers/standard/triggers/external_task.py
@@ -208,4 +208,4 @@ class DagStateTrigger(BaseTrigger):
)
.scalar()
)
- return typing.cast(int, count)
+ return typing.cast("int", count)
diff --git a/providers/standard/src/airflow/providers/standard/utils/sensor_helper.py b/providers/standard/src/airflow/providers/standard/utils/sensor_helper.py
index 8c4524cba65..db796373833 100644
--- a/providers/standard/src/airflow/providers/standard/utils/sensor_helper.py
+++ b/providers/standard/src/airflow/providers/standard/utils/sensor_helper.py
@@ -74,7 +74,7 @@ def _get_count(
) / len(external_task_group_task_ids)
else:
count = session.scalar(_count_stmt(DR, states, dttm_filter, external_dag_id))
- return cast(int, count)
+ return cast("int", count)
def _count_stmt(model, states, dttm_filter, external_dag_id) -> Executable:
diff --git a/providers/standard/tests/unit/standard/decorators/test_python.py b/providers/standard/tests/unit/standard/decorators/test_python.py
index 03b86fee93a..29e5af2ab7f 100644
--- a/providers/standard/tests/unit/standard/decorators/test_python.py
+++ b/providers/standard/tests/unit/standard/decorators/test_python.py
@@ -851,9 +851,9 @@ def test_task_decorator_has_wrapped_attr():
decorated_test_func = task_decorator(org_test_func)
- assert hasattr(
- decorated_test_func, "__wrapped__"
- ), "decorated function does not have __wrapped__ attribute"
+ assert hasattr(decorated_test_func, "__wrapped__"), (
+ "decorated function does not have __wrapped__ attribute"
+ )
assert decorated_test_func.__wrapped__ is org_test_func, "__wrapped__ attr is not the original function"
@@ -869,9 +869,9 @@ def test_task_decorator_has_doc_attr():
decorated_test_func = task_decorator(org_test_func)
assert hasattr(decorated_test_func, "__doc__"), "decorated function should have __doc__ attribute"
- assert (
- decorated_test_func.__doc__ == org_test_func.__doc__
- ), "__doc__ attr should be the original docstring"
+ assert decorated_test_func.__doc__ == org_test_func.__doc__, (
+ "__doc__ attr should be the original docstring"
+ )
def test_upstream_exception_produces_none_xcom(dag_maker, session):
diff --git a/providers/standard/tests/unit/standard/operators/test_datetime.py b/providers/standard/tests/unit/standard/operators/test_datetime.py
index 790a4d8c549..eab06756610 100644
--- a/providers/standard/tests/unit/standard/operators/test_datetime.py
+++ b/providers/standard/tests/unit/standard/operators/test_datetime.py
@@ -99,9 +99,9 @@ class TestBranchDateTimeOperator:
except KeyError:
raise ValueError(f"Invalid task id {ti.task_id} found!")
else:
- assert ti.state == (
- expected_state
- ), f"Task {ti.task_id} has state {ti.state} instead of expected {expected_state}"
+ assert ti.state == (expected_state), (
+ f"Task {ti.task_id} has state {ti.state} instead of expected {expected_state}"
+ )
def test_no_target_time(self):
"""Check if BranchDateTimeOperator raises exception on missing target"""
diff --git a/providers/teradata/src/airflow/providers/teradata/operators/teradata_compute_cluster.py b/providers/teradata/src/airflow/providers/teradata/operators/teradata_compute_cluster.py
index 1648d8dd618..3257465f344 100644
--- a/providers/teradata/src/airflow/providers/teradata/operators/teradata_compute_cluster.py
+++ b/providers/teradata/src/airflow/providers/teradata/operators/teradata_compute_cluster.py
@@ -170,7 +170,7 @@ class _TeradataComputeClusterOperator(BaseOperator):
self.defer(
timeout=timedelta(minutes=self.timeout),
trigger=TeradataComputeClusterSyncTrigger(
- teradata_conn_id=cast(str, self.teradata_conn_id),
+ teradata_conn_id=cast("str", self.teradata_conn_id),
compute_profile_name=self.compute_profile_name,
compute_group_name=self.compute_group_name,
operation_type=operation_type,
diff --git a/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py b/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py
index e49cc58f024..f70c9348451 100644
--- a/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py
+++ b/providers/weaviate/src/airflow/providers/weaviate/hooks/weaviate.py
@@ -266,7 +266,7 @@ class WeaviateHook(BaseHook):
if isinstance(data, pandas.DataFrame):
data = json.loads(data.to_json(orient="records"))
- return cast(list[dict[str, Any]], data)
+ return cast("list[dict[str, Any]]", data)
def batch_data(
self,
@@ -787,12 +787,12 @@ class WeaviateHook(BaseHook):
if isinstance(data, Sequence) and isinstance(data[0], dict):
# This is done to narrow the type to list[dict[str, Any].
- data = pd.json_normalize(cast(list[dict[str, Any]], data))
+ data = pd.json_normalize(cast("list[dict[str, Any]]", data))
elif isinstance(data, Sequence) and isinstance(data[0], pd.DataFrame):
# This is done to narrow the type to list[pd.DataFrame].
- data = pd.concat(cast(list[pd.DataFrame], data), ignore_index=True)
+ data = pd.concat(cast("list[pd.DataFrame]", data), ignore_index=True)
else:
- data = cast(pd.DataFrame, data)
+ data = cast("pd.DataFrame", data)
unique_columns = sorted(data.columns.to_list())
diff --git a/providers/weaviate/tests/unit/weaviate/operators/test_weaviate.py b/providers/weaviate/tests/unit/weaviate/operators/test_weaviate.py
index a90c1c53805..aa3be7a3cd8 100644
--- a/providers/weaviate/tests/unit/weaviate/operators/test_weaviate.py
+++ b/providers/weaviate/tests/unit/weaviate/operators/test_weaviate.py
@@ -24,7 +24,7 @@ from airflow.utils.task_instance_session import set_current_task_instance_sessio
pytest.importorskip("weaviate")
-from airflow.providers.weaviate.operators.weaviate import ( # noqa: E402
+from airflow.providers.weaviate.operators.weaviate import (
WeaviateDocumentIngestOperator,
WeaviateIngestOperator,
)
diff --git a/pyproject.toml b/pyproject.toml
index 8a1e128c0f9..2e84ca4abde 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -369,7 +369,7 @@ testing = ["dev", "providers.tests", "tests_common", "tests", "system", "unit",
# Remove some docstring rules from files that do not need docstrings
"providers/apache/hdfs/src/airflow/providers/apache/hdfs/sensors/hdfs.py" = ["D101"]
-
+"docs/exts/exampleinclude.py" = ["E402", 'F401', ]
# All the modules which do not follow B028 yet: https://docs.astral.sh/ruff/rules/no-explicit-stacklevel/
"helm_tests/airflow_aux/test_basic_helm_chart.py" = ["B028"]
diff --git a/scripts/ci/pre_commit/breeze_cmd_line.py b/scripts/ci/pre_commit/breeze_cmd_line.py
index c56ae9710a2..9e248c9a7b6 100755
--- a/scripts/ci/pre_commit/breeze_cmd_line.py
+++ b/scripts/ci/pre_commit/breeze_cmd_line.py
@@ -73,8 +73,7 @@ return_code = 0
verify_all_commands_described_in_docs()
if is_regeneration_needed():
console.print(
- "\n[bright_blue]Some of the commands changed since last time "
- "images were generated. Regenerating.\n"
+ "\n[bright_blue]Some of the commands changed since last time images were generated. Regenerating.\n"
)
return_code = 1
res = subprocess.run(
diff --git a/scripts/ci/pre_commit/check_deprecations.py b/scripts/ci/pre_commit/check_deprecations.py
index 13717c9a91f..fad1009463e 100755
--- a/scripts/ci/pre_commit/check_deprecations.py
+++ b/scripts/ci/pre_commit/check_deprecations.py
@@ -199,8 +199,7 @@ def check_decorators(mod: ast.Module, file: str, file_group: str) -> int:
if not any(cv.endswith(category_value) for cv in warns_types):
errors += 1
print(
- f"{file}:{category_keyword.lineno}: "
- f"category={category_value}, but {expected_types}"
+ f"{file}:{category_keyword.lineno}: category={category_value}, but {expected_types}"
)
errors += validate_end_of_life_deprecation_warnings(
file_path=file, decorator=decorator, warning_class=category_value
diff --git a/scripts/ci/pre_commit/sort_in_the_wild.py b/scripts/ci/pre_commit/sort_in_the_wild.py
index cfe2047236b..64b1cdb257c 100755
--- a/scripts/ci/pre_commit/sort_in_the_wild.py
+++ b/scripts/ci/pre_commit/sort_in_the_wild.py
@@ -53,7 +53,7 @@ if __name__ == "__main__":
match = NUMBER_MATCH.match(line)
if not match:
print(
- f"\033[0;31mERROR: The {index+1} line in `INTHEWILD.md` should begin with '1.'. "
+ f"\033[0;31mERROR: The {index + 1} line in `INTHEWILD.md` should begin with '1.'. "
f"Please fix it !\033[0m\n"
)
print(line)
@@ -61,7 +61,7 @@ if __name__ == "__main__":
sys.exit(1)
if not line.startswith("1."):
print(
- f"\033[0;33mWARNING: The {index+1} line in `INTHEWILD.md` should begin with '1.' "
+ f"\033[0;33mWARNING: The {index + 1} line in `INTHEWILD.md` should begin with '1.' "
f"but it starts with {match.group(1)} Replacing the number with 1.\033[0m\n"
)
old_line = line
diff --git a/scripts/ci/pre_commit/update_example_dags_paths.py b/scripts/ci/pre_commit/update_example_dags_paths.py
index a60a408ab34..3a3a6a9807b 100755
--- a/scripts/ci/pre_commit/update_example_dags_paths.py
+++ b/scripts/ci/pre_commit/update_example_dags_paths.py
@@ -66,7 +66,7 @@ def replace_match(file: Path, line: str) -> str | None:
provider, version = get_provider_and_version(url_path_to_dir)
proper_system_tests_url = (
f"https://github.com/apache/airflow/tree/providers-{provider}/{version}"
- f"/providers/{provider.replace('.','/')}/tests/system/{url_path_to_dir}"
+ f"/providers/{provider.replace('.', '/')}/tests/system/{url_path_to_dir}"
)
if not example_dags_folder.exists():
if proper_system_tests_url in file.read_text():
diff --git a/scripts/ci/testing/summarize_junit_failures.py b/scripts/ci/testing/summarize_junit_failures.py
index d7d795aa482..f404326be4f 100755
--- a/scripts/ci/testing/summarize_junit_failures.py
+++ b/scripts/ci/testing/summarize_junit_failures.py
@@ -98,11 +98,11 @@ def summarize_file(input, test_type, backend):
for testcase in testsuite.findall(".//testcase[error]"):
case_name = translate_name(testcase)
for err in testcase.iterfind("error"):
- print(f'{case_name}: {TEXT_YELLOW}{err.get("message")}{TEXT_RESET}')
+ print(f"{case_name}: {TEXT_YELLOW}{err.get('message')}{TEXT_RESET}")
for testcase in testsuite.findall(".//testcase[failure]"):
case_name = translate_name(testcase)
for failure in testcase.iterfind("failure"):
- print(f'{case_name}: {TEXT_YELLOW}{failure.get("message")}{TEXT_RESET}')
+ print(f"{case_name}: {TEXT_YELLOW}{failure.get('message')}{TEXT_RESET}")
if __name__ == "__main__":
diff --git a/scripts/in_container/install_airflow_and_providers.py b/scripts/in_container/install_airflow_and_providers.py
index a26e8c8ad0c..caf50c816fe 100755
--- a/scripts/in_container/install_airflow_and_providers.py
+++ b/scripts/in_container/install_airflow_and_providers.py
@@ -128,8 +128,7 @@ def get_airflow_constraints_location(
return airflow_constraints_location
if airflow_constraints_reference:
console.print(
- f"[info]Building constraints location from "
- f"constraints reference: {airflow_constraints_reference}"
+ f"[info]Building constraints location from constraints reference: {airflow_constraints_reference}"
)
elif airflow_package_version:
if re.match(r"[0-9]+\.[0-9]+\.[0-9]+[0-9a-z.]*|main|v[0-9]_.*", airflow_package_version):
@@ -335,8 +334,7 @@ def find_installation_spec(
python_version=python_version,
)
console.print(
- "\nDo not install airflow task-sdk. It should be installed automatically if needed "
- "by providers."
+ "\nDo not install airflow task-sdk. It should be installed automatically if needed by providers."
)
airflow_task_sdk_distribution = None
airflow_task_sdk_constraints_location = None
diff --git a/scripts/in_container/install_development_dependencies.py b/scripts/in_container/install_development_dependencies.py
index 3ea647c5f0b..c4449e88bbd 100755
--- a/scripts/in_container/install_development_dependencies.py
+++ b/scripts/in_container/install_development_dependencies.py
@@ -33,7 +33,7 @@ import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.resolve()))
-from in_container_utils import AIRFLOW_ROOT_PATH, click, run_command
+from in_container_utils import AIRFLOW_ROOT_PATH, click, console, run_command
from packaging.requirements import Requirement
@@ -76,9 +76,16 @@ def install_development_dependencies(constraint: str, github_actions: bool):
)
for provider_id in providers_dependencies:
development_dependencies.extend(providers_dependencies[provider_id]["devel-deps"])
-
command = ["uv", "pip", "install", *development_dependencies, "--constraints", constraint]
- run_command(command, check=True, github_actions=github_actions)
+ result = run_command(command, check=False, github_actions=github_actions)
+ if result.returncode != 0:
+ console.print("[yellow]Failed to install development dependencies with constraints[/]\n")
+ console.print("Trying without constraints\n")
+ command = ["uv", "pip", "install", *development_dependencies]
+ result = run_command(command, check=False, github_actions=github_actions)
+ if result.returncode != 0:
+ console.print("[red]Failed to install development dependencies even without constraints[/]")
+ sys.exit(1)
if __name__ == "__main__":
diff --git a/scripts/in_container/run_generate_constraints.py b/scripts/in_container/run_generate_constraints.py
index 4b07b0994fa..8f7799ded78 100755
--- a/scripts/in_container/run_generate_constraints.py
+++ b/scripts/in_container/run_generate_constraints.py
@@ -317,7 +317,7 @@ def uninstall_all_packages(config_params: ConfigParams):
def get_all_active_provider_distributions(python_version: str | None = None) -> list[str]:
return [
- f"apache-airflow-providers-{provider.replace('.','-')}"
+ f"apache-airflow-providers-{provider.replace('.', '-')}"
for provider in ALL_PROVIDER_DEPENDENCIES.keys()
if ALL_PROVIDER_DEPENDENCIES[provider]["state"] == "ready"
and (
@@ -354,14 +354,14 @@ def generate_constraints_pypi_providers(config_params: ConfigParams) -> None:
console.print("[bright_blue]Installing Airflow with PyPI providers with eager upgrade")
if config_params.chicken_egg_providers:
for chicken_egg_provider in config_params.chicken_egg_providers.split(" "):
- chicken_egg_prefixes.append(f"apache-airflow-providers-{chicken_egg_provider.replace('.','-')}")
+ chicken_egg_prefixes.append(f"apache-airflow-providers-{chicken_egg_provider.replace('.', '-')}")
console.print(
f"[bright_blue]Checking if {chicken_egg_prefixes} are available in local dist folder "
f"as chicken egg providers)"
)
for provider_package in all_provider_distributions:
if config_params.chicken_egg_providers and provider_package.startswith(tuple(chicken_egg_prefixes)):
- glob_pattern = f"{provider_package.replace('-','_')}-*.whl"
+ glob_pattern = f"{provider_package.replace('-', '_')}-*.whl"
console.print(
f"[bright_blue]Checking if {provider_package} is available in local dist folder "
f"with {glob_pattern} pattern"
@@ -369,8 +369,7 @@ def generate_constraints_pypi_providers(config_params: ConfigParams) -> None:
files = AIRFLOW_DIST_PATH.glob(glob_pattern)
for file in files:
console.print(
- f"[yellow]Installing {file.name} from local dist folder as it is "
- f"a chicken egg provider"
+ f"[yellow]Installing {file.name} from local dist folder as it is a chicken egg provider"
)
packages_to_install.append(f"{provider_package} @ file://{file.as_posix()}")
break
@@ -423,8 +422,7 @@ def generate_constraints_no_providers(config_params: ConfigParams) -> None:
"""
uninstall_all_packages(config_params)
console.print(
- "[bright_blue]Installing airflow with `all-core` extras only with eager upgrade in "
- "installable mode."
+ "[bright_blue]Installing airflow with `all-core` extras only with eager upgrade in installable mode."
)
install_local_airflow_with_eager_upgrade(config_params)
console.print("[success]Installed airflow with [all-core] extras only with eager upgrade.")
diff --git a/scripts/in_container/run_provider_yaml_files_check.py b/scripts/in_container/run_provider_yaml_files_check.py
index 3f9a3671fc1..348997b4888 100755
--- a/scripts/in_container/run_provider_yaml_files_check.py
+++ b/scripts/in_container/run_provider_yaml_files_check.py
@@ -295,7 +295,7 @@ def parse_module_data(provider_data, resource_type, yaml_file_path):
expected_modules = {
_filepath_to_module(f)
for f in py_files
- if f.name != "__init__.py" and f"{module.replace('.','/')}/tests/" not in f.as_posix()
+ if f.name != "__init__.py" and f"{module.replace('.', '/')}/tests/" not in f.as_posix()
}
resource_data = provider_data.get(resource_type, [])
return expected_modules, _filepath_to_module(provider_dir), resource_data
diff --git a/scripts/tools/generate-integrations-json.py b/scripts/tools/generate-integrations-json.py
index e66c28d9c0c..b58ab3cc314 100755
--- a/scripts/tools/generate-integrations-json.py
+++ b/scripts/tools/generate-integrations-json.py
@@ -53,7 +53,7 @@ for provider_info in ALL_PROVIDER_YAMLS:
doc_url = integration.get("how-to-guide")
if doc_url:
doc_url = doc_url[0].strip()
- doc_url = re.sub(f'/{provider_info["package-name"]}/', r"\g<0>stable/", doc_url)
+ doc_url = re.sub(f"/{provider_info['package-name']}/", r"\g<0>stable/", doc_url)
doc_url = re.sub(r"\.rst", ".html", doc_url)
else:
doc_url = f"/docs/{provider_info['package-name'].lower()}/stable/index.html"
diff --git a/task-sdk/src/airflow/sdk/bases/operator.py b/task-sdk/src/airflow/sdk/bases/operator.py
index b4b17402669..87e0e79c61e 100644
--- a/task-sdk/src/airflow/sdk/bases/operator.py
+++ b/task-sdk/src/airflow/sdk/bases/operator.py
@@ -499,7 +499,7 @@ class BaseOperatorMeta(abc.ABCMeta):
apply_defaults.__non_optional_args = non_optional_args # type: ignore
apply_defaults.__param_names = set(non_variadic_params) # type: ignore
- return cast(T, apply_defaults)
+ return cast("T", apply_defaults)
def __new__(cls, name, bases, namespace, **kwargs):
execute_method = namespace.get("execute")
@@ -1406,7 +1406,9 @@ class BaseOperator(AbstractOperator, metaclass=BaseOperatorMeta):
# This is equivalent to
with DAG(...):
generate_content = GenerateContentOperator(task_id="generate_content")
- send_email = EmailOperator(..., html_content="{{ task_instance.xcom_pull('generate_content') }}")
+ send_email = EmailOperator(
+ ..., html_content="{{ task_instance.xcom_pull('generate_content') }}"
+ )
generate_content >> send_email
"""
diff --git a/task-sdk/src/airflow/sdk/definitions/dag.py b/task-sdk/src/airflow/sdk/definitions/dag.py
index ef2f0b0d0bd..b7249587a23 100644
--- a/task-sdk/src/airflow/sdk/definitions/dag.py
+++ b/task-sdk/src/airflow/sdk/definitions/dag.py
@@ -67,7 +67,6 @@ from airflow.timetables.simple import (
from airflow.utils.dag_cycle_tester import check_cycle
from airflow.utils.decorators import fixup_decorator_warning_stack
from airflow.utils.trigger_rule import TriggerRule
-from airflow.utils.types import EdgeInfoType
if TYPE_CHECKING:
# TODO: Task-SDK: Remove pendulum core dep
@@ -77,6 +76,7 @@ if TYPE_CHECKING:
from airflow.sdk.definitions.abstractoperator import Operator
from airflow.sdk.definitions.taskgroup import TaskGroup
from airflow.typing_compat import Self
+ from airflow.utils.types import EdgeInfoType
log = logging.getLogger(__name__)
@@ -992,7 +992,7 @@ class DAG:
def get_edge_info(self, upstream_task_id: str, downstream_task_id: str) -> EdgeInfoType:
"""Return edge information for the given pair of tasks or an empty edge if there is no information."""
# Note - older serialized DAGs may not have edge_info being a dict at all
- empty = cast(EdgeInfoType, {})
+ empty = cast("EdgeInfoType", {})
if self.edge_info:
return self.edge_info.get(upstream_task_id, {}).get(downstream_task_id, empty)
else:
diff --git a/task-sdk/src/airflow/sdk/execution_time/callback_runner.py b/task-sdk/src/airflow/sdk/execution_time/callback_runner.py
index 31f701074cf..f35d76d0589 100644
--- a/task-sdk/src/airflow/sdk/execution_time/callback_runner.py
+++ b/task-sdk/src/airflow/sdk/execution_time/callback_runner.py
@@ -107,4 +107,4 @@ def create_executable_runner(
return result # noqa: F821 # Ruff is not smart enough to know this is always set in _run().
- return cast(_ExecutionCallableRunner[P, R], _ExecutionCallableRunnerImpl)
+ return cast("_ExecutionCallableRunner[P, R]", _ExecutionCallableRunnerImpl)
diff --git a/task-sdk/src/airflow/sdk/execution_time/context.py b/task-sdk/src/airflow/sdk/execution_time/context.py
index 843ec37a24a..a85864ef288 100644
--- a/task-sdk/src/airflow/sdk/execution_time/context.py
+++ b/task-sdk/src/airflow/sdk/execution_time/context.py
@@ -166,8 +166,7 @@ def _get_variable(key: str, deserialize_json: bool) -> Any:
return var_val
except Exception:
log.exception(
- "Unable to retrieve variable from secrets backend (%s). "
- "Checking subsequent secrets backend.",
+ "Unable to retrieve variable from secrets backend (%s). Checking subsequent secrets backend.",
type(secrets_backend).__name__,
)
diff --git a/task-sdk/src/airflow/sdk/execution_time/supervisor.py b/task-sdk/src/airflow/sdk/execution_time/supervisor.py
index 133e97ce9a5..22aa51eca36 100644
--- a/task-sdk/src/airflow/sdk/execution_time/supervisor.py
+++ b/task-sdk/src/airflow/sdk/execution_time/supervisor.py
@@ -145,7 +145,7 @@ def mkpipe(
io: BinaryIO | socket
if remote_read:
# If _we_ are writing, we don't want to buffer
- io = cast(BinaryIO, local.makefile("wb", buffering=0))
+ io = cast("BinaryIO", local.makefile("wb", buffering=0))
else:
io = local
diff --git a/task-sdk/tests/conftest.py b/task-sdk/tests/conftest.py
index add954751ed..6363cfae7d7 100644
--- a/task-sdk/tests/conftest.py
+++ b/task-sdk/tests/conftest.py
@@ -118,9 +118,9 @@ def captured_logs(request):
# We need to replace remove the last processor (the one that turns JSON into text, as we want the
# event dict for tests)
proc = processors.pop()
- assert isinstance(
- proc, (structlog.dev.ConsoleRenderer, structlog.processors.JSONRenderer)
- ), "Pre-condition"
+ assert isinstance(proc, (structlog.dev.ConsoleRenderer, structlog.processors.JSONRenderer)), (
+ "Pre-condition"
+ )
try:
cap = LogCapture()
processors.append(cap)
diff --git a/task-sdk/tests/task_sdk/definitions/test_asset.py b/task-sdk/tests/task_sdk/definitions/test_asset.py
index 1637cffac61..b084946fe73 100644
--- a/task-sdk/tests/task_sdk/definitions/test_asset.py
+++ b/task-sdk/tests/task_sdk/definitions/test_asset.py
@@ -220,12 +220,12 @@ def test_asset_trigger_setup_and_serialization(create_test_assets):
deserialized_dag = SerializedDAG.deserialize_dag(SerializedDAG.serialize_dag(dag))
# Verify serialization and deserialization integrity
- assert isinstance(
- deserialized_dag.timetable.asset_condition, AssetAny
- ), "Deserialized assets should maintain type AssetAny"
- assert (
- deserialized_dag.timetable.asset_condition.objects == dag.timetable.asset_condition.objects
- ), "Deserialized assets should match original"
+ assert isinstance(deserialized_dag.timetable.asset_condition, AssetAny), (
+ "Deserialized assets should maintain type AssetAny"
+ )
+ assert deserialized_dag.timetable.asset_condition.objects == dag.timetable.asset_condition.objects, (
+ "Deserialized assets should match original"
+ )
def assets_equal(a1: BaseAsset, a2: BaseAsset) -> bool:
diff --git a/task-sdk/tests/task_sdk/definitions/test_secrets_masker.py b/task-sdk/tests/task_sdk/definitions/test_secrets_masker.py
index 4735ddc048c..7ad1f4a70f3 100644
--- a/task-sdk/tests/task_sdk/definitions/test_secrets_masker.py
+++ b/task-sdk/tests/task_sdk/definitions/test_secrets_masker.py
@@ -215,7 +215,7 @@ class TestSecretsMasker:
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
- File ".../test_secrets_masker.py", line {line+4}, in test_masking_in_explicit_context_exceptions
+ File ".../test_secrets_masker.py", line {line + 4}, in test_masking_in_explicit_context_exceptions
raise RuntimeError(f"Exception: {{exception}}") from exception
RuntimeError: Exception: Cannot connect to user:***
"""