From 5384b775a4d9cadc92e4493132c27c86fb2168b5 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 20 Oct 2025 21:09:19 +0000 Subject: [PATCH] refactor(session): modernize type annotations to PEP 604 syntax --- unshackle/core/session.py | 14 +++++++------- uv.lock | 11 +++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/unshackle/core/session.py b/unshackle/core/session.py index d1a03e2..bb08ca2 100644 --- a/unshackle/core/session.py +++ b/unshackle/core/session.py @@ -8,10 +8,10 @@ import time import warnings from datetime import datetime, timezone from email.utils import parsedate_to_datetime -from typing import Any, List, Optional, Set, Tuple +from typing import Any from urllib.parse import urlparse -from curl_cffi import Response, Session, exceptions +from curl_cffi.requests import Response, Session, exceptions from unshackle.core.config import config @@ -27,15 +27,16 @@ class MaxRetriesError(exceptions.RequestException): super().__init__(message) self.__cause__ = cause + class CurlSession(Session): def __init__( self, max_retries: int = 10, backoff_factor: float = 0.2, max_backoff: float = 60.0, - status_forcelist: Optional[List[int]] = None, - allowed_methods: Optional[Set[str]] = None, - catch_exceptions: Optional[Tuple[type[Exception], ...]] = None, + status_forcelist: list[int] | None = None, + allowed_methods: set[str] | None = None, + catch_exceptions: tuple[type[Exception], ...] | None = None, **session_kwargs: Any, ): super().__init__(**session_kwargs) @@ -92,8 +93,7 @@ class CurlSession(Session): last_exception = e response = None self.log.warning( - f"{e.__class__.__name__}({urlparse(url).path}). Retrying... " - f"({attempt + 1}/{self.max_retries})" + f"{e.__class__.__name__}({urlparse(url).path}). Retrying... ({attempt + 1}/{self.max_retries})" ) if attempt < self.max_retries: diff --git a/uv.lock b/uv.lock index bd17d09..8b2b799 100644 --- a/uv.lock +++ b/uv.lock @@ -1126,6 +1126,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/5f/af7da8e6f1e42b52f44a24d08b8e4c726207434e2593732d39e7af5e7256/pycryptodomex-3.23.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:14c37aaece158d0ace436f76a7bb19093db3b4deade9797abfc39ec6cd6cc2fe", size = 1806478, upload-time = "2025-05-17T17:23:26.066Z" }, ] +[[package]] +name = "pyexecjs" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/8e/aedef81641c8dca6fd0fb7294de5bed9c45f3397d67fddf755c1042c2642/PyExecJS-1.5.1.tar.gz", hash = "sha256:34cc1d070976918183ff7bdc0ad71f8157a891c92708c00c5fbbff7a769f505c", size = 13344, upload-time = "2018-01-18T04:33:55.126Z" } + [[package]] name = "pygments" version = "2.19.2" @@ -1580,6 +1589,7 @@ dependencies = [ { name = "protobuf" }, { name = "pycaption" }, { name = "pycryptodomex" }, + { name = "pyexecjs" }, { name = "pyjwt" }, { name = "pymediainfo" }, { name = "pymp4" }, @@ -1631,6 +1641,7 @@ requires-dist = [ { name = "protobuf", specifier = ">=4.25.3,<5" }, { name = "pycaption", specifier = ">=2.2.6,<3" }, { name = "pycryptodomex", specifier = ">=3.20.0,<4" }, + { name = "pyexecjs", specifier = ">=1.5.1" }, { name = "pyjwt", specifier = ">=2.8.0,<3" }, { name = "pymediainfo", specifier = ">=6.1.0,<7" }, { name = "pymp4", specifier = ">=1.4.0,<2" },