From abade83f8ddb63a11746b69038ebcd9c1405a00a Mon Sep 17 00:00:00 2001 From: Simon Sawicki Date: Mon, 16 Feb 2026 21:11:02 +0100 Subject: [PATCH] [cleanup] Bump ruff to 0.15.x (#15951) Authored by: Grub4K --- pyproject.toml | 2 +- test/helper.py | 2 +- test/test_networking.py | 7 ++++++- test/test_traversal.py | 1 + test/test_websockets.py | 28 ++++++++++++++++------------ yt_dlp/extractor/bilibili.py | 2 +- yt_dlp/extractor/sbs.py | 4 ++-- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b5642fddc9..34265dfe9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,7 +85,7 @@ dev = [ ] static-analysis = [ "autopep8~=2.0", - "ruff~=0.14.0", + "ruff~=0.15.0", ] test = [ "pytest~=8.1", diff --git a/test/helper.py b/test/helper.py index adc5f455e5..4f65a09d13 100644 --- a/test/helper.py +++ b/test/helper.py @@ -294,7 +294,7 @@ def expect_info_dict(self, got_dict, expected_dict): missing_keys = sorted( test_info_dict.keys() - expected_dict.keys(), - key=lambda x: ALLOWED_KEYS_SORT_ORDER.index(x)) + key=ALLOWED_KEYS_SORT_ORDER.index) if missing_keys: def _repr(v): if isinstance(v, str): diff --git a/test/test_networking.py b/test/test_networking.py index f78a8d5770..3269878bed 100644 --- a/test/test_networking.py +++ b/test/test_networking.py @@ -1004,6 +1004,7 @@ class TestUrllibRequestHandler(TestRequestHandlerBase): @pytest.mark.parametrize('handler', ['Requests'], indirect=True) class TestRequestsRequestHandler(TestRequestHandlerBase): + # ruff: disable[PLW0108] `requests` and/or `urllib3` may not be available @pytest.mark.parametrize('raised,expected', [ (lambda: requests.exceptions.ConnectTimeout(), TransportError), (lambda: requests.exceptions.ReadTimeout(), TransportError), @@ -1017,8 +1018,10 @@ class TestRequestsRequestHandler(TestRequestHandlerBase): # catch-all: https://github.com/psf/requests/blob/main/src/requests/adapters.py#L535 (lambda: urllib3.exceptions.HTTPError(), TransportError), (lambda: requests.exceptions.RequestException(), RequestError), - # (lambda: requests.exceptions.TooManyRedirects(), HTTPError) - Needs a response object + # Needs a response object + # (lambda: requests.exceptions.TooManyRedirects(), HTTPError), ]) + # ruff: enable[PLW0108] def test_request_error_mapping(self, handler, monkeypatch, raised, expected): with handler() as rh: def mock_get_instance(*args, **kwargs): @@ -1034,6 +1037,7 @@ class TestRequestsRequestHandler(TestRequestHandlerBase): assert exc_info.type is expected + # ruff: disable[PLW0108] `urllib3` may not be available @pytest.mark.parametrize('raised,expected,match', [ (lambda: urllib3.exceptions.SSLError(), SSLError, None), (lambda: urllib3.exceptions.TimeoutError(), TransportError, None), @@ -1052,6 +1056,7 @@ class TestRequestsRequestHandler(TestRequestHandlerBase): '3 bytes read, 5 more expected', ), ]) + # ruff: enable[PLW0108] def test_response_error_mapping(self, handler, monkeypatch, raised, expected, match): from requests.models import Response as RequestsResponse from urllib3.response import HTTPResponse as Urllib3Response diff --git a/test/test_traversal.py b/test/test_traversal.py index d4abacc597..45985afa94 100644 --- a/test/test_traversal.py +++ b/test/test_traversal.py @@ -239,6 +239,7 @@ class TestTraversal: 'accept matching `expected_type` type' assert traverse_obj(_EXPECTED_TYPE_DATA, 'str', expected_type=int) is None, \ 'reject non matching `expected_type` type' + # ruff: noqa: PLW0108 `type`s get special treatment, so wrap in lambda assert traverse_obj(_EXPECTED_TYPE_DATA, 'int', expected_type=lambda x: str(x)) == '0', \ 'transform type using type function' assert traverse_obj(_EXPECTED_TYPE_DATA, 'str', expected_type=lambda _: 1 / 0) is None, \ diff --git a/test/test_websockets.py b/test/test_websockets.py index 39b207d6b1..caa026f44f 100644 --- a/test/test_websockets.py +++ b/test/test_websockets.py @@ -448,6 +448,7 @@ def create_fake_ws_connection(raised): @pytest.mark.parametrize('handler', ['Websockets'], indirect=True) class TestWebsocketsRequestHandler: + # ruff: disable[PLW0108] `websockets` may not be available @pytest.mark.parametrize('raised,expected', [ # https://websockets.readthedocs.io/en/stable/reference/exceptions.html (lambda: websockets.exceptions.InvalidURI(msg='test', uri='test://'), RequestError), @@ -459,13 +460,14 @@ class TestWebsocketsRequestHandler: (lambda: websockets.exceptions.NegotiationError(), TransportError), # Catch-all (lambda: websockets.exceptions.WebSocketException(), TransportError), - (lambda: TimeoutError(), TransportError), + (TimeoutError, TransportError), # These may be raised by our create_connection implementation, which should also be caught - (lambda: OSError(), TransportError), - (lambda: ssl.SSLError(), SSLError), - (lambda: ssl.SSLCertVerificationError(), CertificateVerifyError), - (lambda: socks.ProxyError(), ProxyError), + (OSError, TransportError), + (ssl.SSLError, SSLError), + (ssl.SSLCertVerificationError, CertificateVerifyError), + (socks.ProxyError, ProxyError), ]) + # ruff: enable[PLW0108] def test_request_error_mapping(self, handler, monkeypatch, raised, expected): import websockets.sync.client @@ -482,11 +484,12 @@ class TestWebsocketsRequestHandler: @pytest.mark.parametrize('raised,expected,match', [ # https://websockets.readthedocs.io/en/stable/reference/sync/client.html#websockets.sync.client.ClientConnection.send (lambda: websockets.exceptions.ConnectionClosed(None, None), TransportError, None), - (lambda: RuntimeError(), TransportError, None), - (lambda: TimeoutError(), TransportError, None), - (lambda: TypeError(), RequestError, None), - (lambda: socks.ProxyError(), ProxyError, None), + (RuntimeError, TransportError, None), + (TimeoutError, TransportError, None), + (TypeError, RequestError, None), + (socks.ProxyError, ProxyError, None), # Catch-all + # ruff: noqa: PLW0108 `websockets` may not be available (lambda: websockets.exceptions.WebSocketException(), TransportError, None), ]) def test_ws_send_error_mapping(self, handler, monkeypatch, raised, expected, match): @@ -499,10 +502,11 @@ class TestWebsocketsRequestHandler: @pytest.mark.parametrize('raised,expected,match', [ # https://websockets.readthedocs.io/en/stable/reference/sync/client.html#websockets.sync.client.ClientConnection.recv (lambda: websockets.exceptions.ConnectionClosed(None, None), TransportError, None), - (lambda: RuntimeError(), TransportError, None), - (lambda: TimeoutError(), TransportError, None), - (lambda: socks.ProxyError(), ProxyError, None), + (RuntimeError, TransportError, None), + (TimeoutError, TransportError, None), + (socks.ProxyError, ProxyError, None), # Catch-all + # ruff: noqa: PLW0108 `websockets` may not be available (lambda: websockets.exceptions.WebSocketException(), TransportError, None), ]) def test_ws_recv_error_mapping(self, handler, monkeypatch, raised, expected, match): diff --git a/yt_dlp/extractor/bilibili.py b/yt_dlp/extractor/bilibili.py index 8675061d1a..207d48241f 100644 --- a/yt_dlp/extractor/bilibili.py +++ b/yt_dlp/extractor/bilibili.py @@ -124,7 +124,7 @@ class BilibiliBaseIE(InfoExtractor): **traverse_obj(play_info, { 'quality': ('quality', {int_or_none}), 'format_id': ('quality', {str_or_none}), - 'format_note': ('quality', {lambda x: format_names.get(x)}), + 'format_note': ('quality', {format_names.get}), 'duration': ('timelength', {float_or_none(scale=1000)}), }), **parse_resolution(format_names.get(play_info.get('quality'))), diff --git a/yt_dlp/extractor/sbs.py b/yt_dlp/extractor/sbs.py index 7edb5214ee..c8be9bdc3a 100644 --- a/yt_dlp/extractor/sbs.py +++ b/yt_dlp/extractor/sbs.py @@ -146,8 +146,8 @@ class SBSIE(InfoExtractor): 'release_year': ('releaseYear', {int_or_none}), 'duration': ('duration', ({float_or_none}, {parse_duration})), 'is_live': ('liveStream', {bool}), - 'age_limit': (('classificationID', 'contentRating'), {str.upper}, { - lambda x: self._AUS_TV_PARENTAL_GUIDELINES.get(x)}), # dict.get is unhashable in py3.7 + 'age_limit': ( + ('classificationID', 'contentRating'), {str.upper}, {self._AUS_TV_PARENTAL_GUIDELINES.get}), }, get_all=False), **traverse_obj(media, { 'categories': (('genres', ...), ('taxonomy', ('genre', 'subgenre'), 'name'), {str}),