This is an automated email from the ASF dual-hosted git repository.
jscheffl 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 75bd6287123 Fix code formatting via ruff preview (#57641)
75bd6287123 is described below
commit 75bd6287123bbd078fd30a5f4bcdc9f60d4977f0
Author: Jens Scheffler <[email protected]>
AuthorDate: Sat Nov 1 10:04:48 2025 +0100
Fix code formatting via ruff preview (#57641)
---
airflow-core/src/airflow/operators/__init__.py | 8 ++++----
airflow-core/src/airflow/plugins_manager.py | 1 -
airflow-core/src/airflow/sensors/__init__.py | 6 +++---
.../src/airflow/ti_deps/deps/not_previously_skipped_dep.py | 2 +-
airflow-core/src/airflow/utils/log/file_task_handler.py | 2 +-
.../tests/unit/api_fastapi/core_api/routes/public/test_pools.py | 6 +++---
airflow-core/tests/unit/utils/test_log_handlers.py | 1 -
dev/airflow-github | 2 --
devel-common/src/sphinx_exts/docs_build/fetch_inventories.py | 1 -
.../src/airflow/providers/amazon/aws/hooks/batch_waiters.py | 1 -
.../celery/tests/unit/celery/log_handlers/test_log_handlers.py | 1 -
.../tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py | 1 -
.../common/sql/src/airflow/providers/common/sql/hooks/sql.pyi | 6 +++---
providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py | 1 -
providers/common/sql/tests/unit/common/sql/hooks/test_sql.py | 1 -
.../databricks/tests/unit/databricks/hooks/test_databricks.py | 2 --
.../edge3/src/airflow/providers/edge3/worker_api/routes/worker.py | 2 +-
.../google/src/airflow/providers/google/cloud/hooks/bigquery.py | 2 +-
.../google/src/airflow/providers/google/cloud/hooks/mlengine.py | 2 +-
.../airflow/providers/google/common/auth_backend/google_openid.py | 1 -
.../src/airflow/providers/google/common/hooks/base_google.py | 1 -
.../airflow/providers/google/common/utils/id_token_credentials.py | 3 +--
.../postgres/src/airflow/providers/postgres/hooks/postgres.py | 1 -
providers/standard/tests/unit/standard/operators/test_python.py | 1 -
scripts/ci/prek/significant_newsfragments_checker.py | 1 -
task-sdk/src/airflow/sdk/definitions/asset/__init__.py | 4 ++--
task-sdk/src/airflow/sdk/definitions/decorators/condition.py | 4 ++--
task-sdk/tests/task_sdk/execution_time/test_supervisor.py | 6 +++---
28 files changed, 26 insertions(+), 44 deletions(-)
diff --git a/airflow-core/src/airflow/operators/__init__.py
b/airflow-core/src/airflow/operators/__init__.py
index 70d2da8f06b..84a526c134f 100644
--- a/airflow-core/src/airflow/operators/__init__.py
+++ b/airflow-core/src/airflow/operators/__init__.py
@@ -27,7 +27,7 @@ from __future__ import annotations
from airflow.utils.deprecation_tools import add_deprecated_classes
__deprecated_classes = {
- "python":{
+ "python": {
"PythonOperator":
"airflow.providers.standard.operators.python.PythonOperator",
"BranchPythonOperator":
"airflow.providers.standard.operators.python.BranchPythonOperator",
"ShortCircuitOperator":
"airflow.providers.standard.operators.python.ShortCircuitOperator",
@@ -37,10 +37,10 @@ __deprecated_classes = {
"BranchPythonVirtualenvOperator":
"airflow.providers.standard.operators.python.BranchPythonVirtualenvOperator",
"get_current_context": "airflow.sdk.get_current_context",
},
- "bash":{
+ "bash": {
"BashOperator":
"airflow.providers.standard.operators.bash.BashOperator",
},
- "datetime":{
+ "datetime": {
"BranchDateTimeOperator":
"airflow.providers.standard.operators.datetime.BranchDateTimeOperator",
},
"generic_transfer": {
@@ -64,7 +64,7 @@ __deprecated_classes = {
"smooth": {
"SmoothOperator":
"airflow.providers.standard.operators.smooth.SmoothOperator",
},
- "branch":{
+ "branch": {
"BranchMixIn":
"airflow.providers.standard.operators.branch.BranchMixIn",
"BaseBranchOperator":
"airflow.providers.standard.operators.branch.BaseBranchOperator",
}
diff --git a/airflow-core/src/airflow/plugins_manager.py
b/airflow-core/src/airflow/plugins_manager.py
index 5a70dbcd8f0..6f74a8e958f 100644
--- a/airflow-core/src/airflow/plugins_manager.py
+++ b/airflow-core/src/airflow/plugins_manager.py
@@ -19,7 +19,6 @@
from __future__ import annotations
-import importlib
import importlib.machinery
import importlib.util
import inspect
diff --git a/airflow-core/src/airflow/sensors/__init__.py
b/airflow-core/src/airflow/sensors/__init__.py
index db378f45503..366837c20fd 100644
--- a/airflow-core/src/airflow/sensors/__init__.py
+++ b/airflow-core/src/airflow/sensors/__init__.py
@@ -32,13 +32,13 @@ __deprecated_classes = {
"PokeReturnValue": "airflow.sdk.bases.sensor.PokeReturnValue",
"poke_mode_only": "airflow.sdk.bases.sensor.poke_mode_only",
},
- "python":{
+ "python": {
"PythonSensor":
"airflow.providers.standard.sensors.python.PythonSensor",
},
- "bash":{
+ "bash": {
"BashSensor": "airflow.providers.standard.sensors.bash.BashSensor",
},
- "date_time":{
+ "date_time": {
"DateTimeSensor":
"airflow.providers.standard.sensors.date_time.DateTimeSensor",
"DateTimeSensorAsync":
"airflow.providers.standard.sensors.date_time.DateTimeSensorAsync",
},
diff --git
a/airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py
b/airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py
index 205cc5338b9..5238ca97d1c 100644
--- a/airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py
+++ b/airflow-core/src/airflow/ti_deps/deps/not_previously_skipped_dep.py
@@ -20,7 +20,7 @@ from __future__ import annotations
from airflow.models.taskinstance import PAST_DEPENDS_MET
from airflow.ti_deps.deps.base_ti_dep import BaseTIDep
-## The following constants are taken from the SkipMixin class in the standard
provider
+# The following constants are taken from the SkipMixin class in the standard
provider
# The key used by SkipMixin to store XCom data.
XCOM_SKIPMIXIN_KEY = "skipmixin_key"
diff --git a/airflow-core/src/airflow/utils/log/file_task_handler.py
b/airflow-core/src/airflow/utils/log/file_task_handler.py
index 33c53199caa..606c7369a1a 100644
--- a/airflow-core/src/airflow/utils/log/file_task_handler.py
+++ b/airflow-core/src/airflow/utils/log/file_task_handler.py
@@ -177,7 +177,7 @@ def _fetch_logs_from_service(url: str, log_relative_path:
str) -> Response:
algorithm="HS512",
# We must set an empty private key here as otherwise it can be
automatically loaded by JWTGenerator
# and secret_key and private_key cannot be set together
- private_key=None, # type: ignore[arg-type]
+ private_key=None, # type: ignore[arg-type]
issuer=None,
valid_for=conf.getint("webserver", "log_request_clock_grace",
fallback=30),
audience="task-instance-logs",
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py
index 4c2ff3f9d77..fbd5f61d380 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_pools.py
@@ -991,9 +991,9 @@ class TestBulkPools(TestPoolsEndpoint):
# Assert: fetch from DB and check only masked field changed
updated_pool = session.query(Pool).filter_by(pool="pool1").one()
- assert updated_pool.slots == 50 # updated
- assert updated_pool.description is None # unchanged
- assert updated_pool.include_deferred is True # unchanged
+ assert updated_pool.slots == 50 # updated
+ assert updated_pool.description is None # unchanged
+ assert updated_pool.include_deferred is True # unchanged
def test_should_respond_401(self, unauthenticated_test_client):
response = unauthenticated_test_client.patch("/pools", json={})
diff --git a/airflow-core/tests/unit/utils/test_log_handlers.py
b/airflow-core/tests/unit/utils/test_log_handlers.py
index 0b85a31a117..97d5c2c50e5 100644
--- a/airflow-core/tests/unit/utils/test_log_handlers.py
+++ b/airflow-core/tests/unit/utils/test_log_handlers.py
@@ -21,7 +21,6 @@ import heapq
import io
import itertools
import logging
-import logging.config
import os
import re
from http import HTTPStatus
diff --git a/dev/airflow-github b/dev/airflow-github
index fbbc846b7be..5abeffb83f2 100755
--- a/dev/airflow-github
+++ b/dev/airflow-github
@@ -299,9 +299,7 @@ def cli():
" searching for few commits to find the cherry-picked commits",
)
@click.option("--unmerged", "show_uncherrypicked_only", help="Show unmerged
PRs only", is_flag=True)
-
@click.option("--show-commits", help="Show commit SHAs (default: on, off when
--unmerged)", is_flag=True, default=None)
-
def compare(target_version, github_token, previous_version=None,
show_uncherrypicked_only=False, show_commits=None):
# Set smart defaults
if show_commits is None:
diff --git a/devel-common/src/sphinx_exts/docs_build/fetch_inventories.py
b/devel-common/src/sphinx_exts/docs_build/fetch_inventories.py
index ca2560662e6..ce472095b4a 100644
--- a/devel-common/src/sphinx_exts/docs_build/fetch_inventories.py
+++ b/devel-common/src/sphinx_exts/docs_build/fetch_inventories.py
@@ -16,7 +16,6 @@
# under the License.
from __future__ import annotations
-import concurrent
import concurrent.futures
import datetime
import itertools
diff --git
a/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_waiters.py
b/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_waiters.py
index b2916d8afd8..a78e368bdd9 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_waiters.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/batch_waiters.py
@@ -33,7 +33,6 @@ from copy import deepcopy
from pathlib import Path
from typing import TYPE_CHECKING, Any
-import botocore.client
import botocore.exceptions
import botocore.waiter
diff --git
a/providers/celery/tests/unit/celery/log_handlers/test_log_handlers.py
b/providers/celery/tests/unit/celery/log_handlers/test_log_handlers.py
index 6a0ef98842f..8584217c664 100644
--- a/providers/celery/tests/unit/celery/log_handlers/test_log_handlers.py
+++ b/providers/celery/tests/unit/celery/log_handlers/test_log_handlers.py
@@ -18,7 +18,6 @@
from __future__ import annotations
import logging
-import logging.config
from importlib import reload
from unittest import mock
diff --git
a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py
b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py
index 7cddf3d04af..0f83f43d623 100644
---
a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py
+++
b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py
@@ -18,7 +18,6 @@
from __future__ import annotations
import logging
-import logging.config
import re
from importlib import reload
from unittest import mock
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 e4a355abb9d..8bfdb4f43b1 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
@@ -109,7 +109,7 @@ class DbApiHook(BaseHook):
) -> PandasDataFrame: ...
def get_pandas_df_by_chunks(
self, sql, parameters: list | tuple | Mapping[str, Any] | None = None,
*, chunksize: int, **kwargs
- ) -> Generator[PandasDataFrame, None, None]: ...
+ ) -> Generator[PandasDataFrame]: ...
def get_records(
self, sql: str | list[str], parameters: Iterable | Mapping[str, Any] |
None = None
) -> Any: ...
@@ -143,7 +143,7 @@ class DbApiHook(BaseHook):
chunksize: int,
df_type: Literal["pandas"] = "pandas",
**kwargs,
- ) -> Generator[PandasDataFrame, None, None]: ...
+ ) -> Generator[PandasDataFrame]: ...
@overload
def get_df_by_chunks(
self,
@@ -153,7 +153,7 @@ class DbApiHook(BaseHook):
chunksize: int,
df_type: Literal["polars"],
**kwargs,
- ) -> Generator[PolarsDataFrame, None, None]: ...
+ ) -> Generator[PolarsDataFrame]: ...
@staticmethod
def strip_sql_string(sql: str) -> str: ...
@staticmethod
diff --git a/providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py
b/providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py
index e77c5d342a7..8127740b170 100644
--- a/providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py
+++ b/providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py
@@ -19,7 +19,6 @@ from __future__ import annotations
import json
import logging
-import logging.config
from unittest import mock
import pytest
diff --git a/providers/common/sql/tests/unit/common/sql/hooks/test_sql.py
b/providers/common/sql/tests/unit/common/sql/hooks/test_sql.py
index dee8ac692b2..16bbb5e97a1 100644
--- a/providers/common/sql/tests/unit/common/sql/hooks/test_sql.py
+++ b/providers/common/sql/tests/unit/common/sql/hooks/test_sql.py
@@ -20,7 +20,6 @@ from __future__ import annotations
import inspect
import logging
-import logging.config
from unittest.mock import MagicMock
import pandas as pd
diff --git
a/providers/databricks/tests/unit/databricks/hooks/test_databricks.py
b/providers/databricks/tests/unit/databricks/hooks/test_databricks.py
index 0b3ad5fbd14..fe7d64bbf68 100644
--- a/providers/databricks/tests/unit/databricks/hooks/test_databricks.py
+++ b/providers/databricks/tests/unit/databricks/hooks/test_databricks.py
@@ -26,9 +26,7 @@ from unittest import mock
from unittest.mock import AsyncMock
import aiohttp
-import aiohttp.client_exceptions
import azure.identity
-import azure.identity.aio
import pytest
import tenacity
from azure.core.credentials import AccessToken
diff --git
a/providers/edge3/src/airflow/providers/edge3/worker_api/routes/worker.py
b/providers/edge3/src/airflow/providers/edge3/worker_api/routes/worker.py
index 1a696509d1e..23c8f0c202c 100644
--- a/providers/edge3/src/airflow/providers/edge3/worker_api/routes/worker.py
+++ b/providers/edge3/src/airflow/providers/edge3/worker_api/routes/worker.py
@@ -215,7 +215,7 @@ def set_state(
free_concurrency=int(body.sysinfo["free_concurrency"]),
queues=worker.queues,
)
- _assert_version(body.sysinfo) # Exception only after worker state is in
the DB
+ _assert_version(body.sysinfo) # Exception only after worker state is in
the DB
return WorkerSetStateReturn(
state=worker.state, queues=worker.queues,
maintenance_comments=worker.maintenance_comment
)
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 49bb291f104..b9764ba1c4d 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/bigquery.py
@@ -790,7 +790,7 @@ class BigQueryHook(GoogleBaseHook, DbApiHook):
if return_iterator:
# The iterator returned by list_datasets() is a HTTPIterator but
annotated
# as Iterator
- return iterator # type: ignore
+ return iterator # type: ignore
datasets_list = list(iterator)
self.log.info("Datasets List: %s", len(datasets_list))
diff --git
a/providers/google/src/airflow/providers/google/cloud/hooks/mlengine.py
b/providers/google/src/airflow/providers/google/cloud/hooks/mlengine.py
index b79d991227d..86893b4c735 100644
--- a/providers/google/src/airflow/providers/google/cloud/hooks/mlengine.py
+++ b/providers/google/src/airflow/providers/google/cloud/hooks/mlengine.py
@@ -588,7 +588,7 @@ class MLEngineAsyncHook(GoogleBaseAsyncHook):
job = await self.get_job(
project_id=project_id,
job_id=job_id,
- session=session, # type: ignore
+ session=session, # type: ignore
)
job = await job.json(content_type=None)
self.log.info("Retrieving json_response: %s", job)
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 a0af8390ca7..3bda9e677c5 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
@@ -24,7 +24,6 @@ from collections.abc import Callable
from functools import wraps
from typing import TypeVar, cast
-import google
import google.auth.transport.requests
import google.oauth2.id_token
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 f2fd56f524c..a3abecb848b 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
@@ -32,7 +32,6 @@ from subprocess import check_output
from typing import TYPE_CHECKING, Any, TypeVar, cast
import google.auth
-import google.oauth2.service_account
import google_auth_httplib2
import requests
import tenacity
diff --git
a/providers/google/src/airflow/providers/google/common/utils/id_token_credentials.py
b/providers/google/src/airflow/providers/google/common/utils/id_token_credentials.py
index 3f73f5b4bdb..6a96589cb20 100644
---
a/providers/google/src/airflow/providers/google/common/utils/id_token_credentials.py
+++
b/providers/google/src/airflow/providers/google/common/utils/id_token_credentials.py
@@ -35,12 +35,11 @@ import json
import os
from typing import TYPE_CHECKING
-import google.auth.transport
from google.auth import credentials as google_auth_credentials,
environment_vars, exceptions
from google.oauth2 import credentials as oauth2_credentials, service_account
if TYPE_CHECKING:
- import google.oauth2
+ import google.auth.transport
# Valid types accepted for file-based credentials.
# They are taken from "google.auth._default" and since they are all
"protected" and the imports might
diff --git
a/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
b/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
index 1b678160591..eaa51ddaf6a 100644
--- a/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
+++ b/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
@@ -24,7 +24,6 @@ from copy import deepcopy
from typing import TYPE_CHECKING, Any, Literal, Protocol, TypeAlias, cast,
overload
import psycopg2
-import psycopg2.extensions
import psycopg2.extras
from more_itertools import chunked
from psycopg2.extras import DictCursor, NamedTupleCursor, RealDictCursor,
execute_batch
diff --git a/providers/standard/tests/unit/standard/operators/test_python.py
b/providers/standard/tests/unit/standard/operators/test_python.py
index 6b3c864c186..2ee282b01ec 100644
--- a/providers/standard/tests/unit/standard/operators/test_python.py
+++ b/providers/standard/tests/unit/standard/operators/test_python.py
@@ -19,7 +19,6 @@ from __future__ import annotations
import copy
import logging
-import logging.config
import os
import pickle
import re
diff --git a/scripts/ci/prek/significant_newsfragments_checker.py
b/scripts/ci/prek/significant_newsfragments_checker.py
index a25e9d59e27..61344862e31 100755
--- a/scripts/ci/prek/significant_newsfragments_checker.py
+++ b/scripts/ci/prek/significant_newsfragments_checker.py
@@ -32,7 +32,6 @@ import glob
import re
import docutils.nodes
-import docutils.parsers.rst
from docutils.core import publish_doctree
from jinja2 import BaseLoader, Environment
diff --git a/task-sdk/src/airflow/sdk/definitions/asset/__init__.py
b/task-sdk/src/airflow/sdk/definitions/asset/__init__.py
index b5386452e19..3597f016f8b 100644
--- a/task-sdk/src/airflow/sdk/definitions/asset/__init__.py
+++ b/task-sdk/src/airflow/sdk/definitions/asset/__init__.py
@@ -196,8 +196,8 @@ def _validate_identifier(instance, attribute, value):
raise ValueError(f"{type(instance).__name__} {attribute.name} cannot
exceed 1500 characters")
if value.isspace():
raise ValueError(f"{type(instance).__name__} {attribute.name} cannot
be just whitespace")
- ## We use latin1_general_cs to store the name (and group, asset values
etc.) on MySQL.
- ## relaxing this check for non mysql backend
+ # We use latin1_general_cs to store the name (and group, asset values
etc.) on MySQL.
+ # relaxing this check for non mysql backend
if SQL_ALCHEMY_CONN.startswith("mysql") and not value.isascii():
raise ValueError(f"{type(instance).__name__} {attribute.name} must
only consist of ASCII characters")
return value
diff --git a/task-sdk/src/airflow/sdk/definitions/decorators/condition.py
b/task-sdk/src/airflow/sdk/definitions/decorators/condition.py
index 2808563ffcf..50503e0ddcd 100644
--- a/task-sdk/src/airflow/sdk/definitions/decorators/condition.py
+++ b/task-sdk/src/airflow/sdk/definitions/decorators/condition.py
@@ -30,8 +30,8 @@ if TYPE_CHECKING:
from airflow.sdk.definitions.context import Context
BoolConditionFunc: TypeAlias = Callable[[Context], bool]
- MsgConditionFunc: TypeAlias = "Callable[[Context], tuple[bool, str |
None]]"
- AnyConditionFunc: TypeAlias = "BoolConditionFunc | MsgConditionFunc"
+ MsgConditionFunc: TypeAlias = Callable[[Context], tuple[bool, str | None]]
+ AnyConditionFunc: TypeAlias = BoolConditionFunc | MsgConditionFunc
__all__ = ["run_if", "skip_if"]
diff --git a/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
b/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
index 8c219a4eebf..cdb7d322c6f 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
@@ -1208,7 +1208,7 @@ class TestWatchedSubprocessKill:
def test_service_subprocess(self, watched_subprocess, mock_process,
mocker):
"""Test `_service_subprocess` processes selector events and handles
subprocess exit."""
- ## Given
+ # Given
# Mock file objects and handlers
mock_stdout = mocker.Mock()
@@ -1228,10 +1228,10 @@ class TestWatchedSubprocessKill:
# Mock to simulate process exited successfully
mock_process.wait.return_value = 0
- ## Our actual test
+ # Our actual test
watched_subprocess._service_subprocess(max_wait_time=1.0)
- ## Validations!
+ # Validations!
# Validate selector interactions
watched_subprocess.selector.select.assert_called_once_with(timeout=1.0)