diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4451162c..1583844e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,6 @@ jobs: - '3.11' - '3.10' - '3.9' - - '3.8' services: nginx: image: kennethreitz/httpbin diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6f3b90cd..a463cb4e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,13 +8,13 @@ repos: - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.1 + rev: v0.9.2 hooks: - id: ruff args: [--fix] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.13.0 + rev: v1.14.1 hooks: - id: mypy additional_dependencies: [attrs, aiohttp, types-aiofiles, types-redis] @@ -23,6 +23,6 @@ repos: hooks: - id: prettier - repo: https://github.com/crate-ci/typos - rev: v1.28.1 + rev: v1.29.4 hooks: - id: typos diff --git a/HISTORY.md b/HISTORY.md index 6ea20be5..d2ad68d2 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -4,6 +4,7 @@ - Fixed `CachedResponse.read()` to be consistent with `ClientResponse.read()` by allowing to call `read()` multiple times. (#289) - Now a warning is raised when a cache backend is accessed after disconnecting (after exiting the `CachedSession` context manager). (#241) +- Dropped Python 3.8 support due to the EOL. ## 0.12.4 (2024-10-30) diff --git a/README.md b/README.md index 545d8eeb..dd931662 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ client requests, based on [requests-cache](https://github.com/reclosedev/request # Quickstart -First, install with pip (python 3.8+ required): +First, install with pip (python 3.9+ required): ```bash pip install aiohttp-client-cache[all] diff --git a/aiohttp_client_cache/backends/__init__.py b/aiohttp_client_cache/backends/__init__.py index 9eac7184..df2a00cf 100644 --- a/aiohttp_client_cache/backends/__init__.py +++ b/aiohttp_client_cache/backends/__init__.py @@ -1,6 +1,6 @@ from inspect import Parameter, signature from logging import getLogger -from typing import Callable, Dict +from typing import Callable from aiohttp_client_cache.backends.base import ( # noqa: F401 BaseCache, @@ -25,7 +25,7 @@ def __init__(*args, **kwargs): return PlaceholderBackend -def get_valid_kwargs(func: Callable, kwargs: Dict, accept_varkwargs: bool = True) -> Dict: +def get_valid_kwargs(func: Callable, kwargs: dict, accept_varkwargs: bool = True) -> dict: """Get the subset of non-None ``kwargs`` that are valid params for ``func``""" params = signature(func).parameters diff --git a/aiohttp_client_cache/backends/base.py b/aiohttp_client_cache/backends/base.py index 7a721d10..3046a689 100644 --- a/aiohttp_client_cache/backends/base.py +++ b/aiohttp_client_cache/backends/base.py @@ -6,7 +6,8 @@ from collections import UserDict from datetime import datetime from logging import getLogger -from typing import Any, AsyncIterable, Awaitable, Callable, Iterable, Union +from typing import Any, Callable, Union +from collections.abc import AsyncIterable, Awaitable, Iterable from aiohttp import ClientResponse from aiohttp.typedefs import StrOrURL diff --git a/aiohttp_client_cache/backends/dynamodb.py b/aiohttp_client_cache/backends/dynamodb.py index 9215efd6..1f7eaa9b 100644 --- a/aiohttp_client_cache/backends/dynamodb.py +++ b/aiohttp_client_cache/backends/dynamodb.py @@ -2,7 +2,8 @@ from contextlib import asynccontextmanager from logging import getLogger -from typing import Any, AsyncIterable +from typing import Any +from collections.abc import AsyncIterable import aioboto3 from aioboto3.session import ResourceCreatorContext diff --git a/aiohttp_client_cache/backends/filesystem.py b/aiohttp_client_cache/backends/filesystem.py index 06d5c362..9d12e79a 100644 --- a/aiohttp_client_cache/backends/filesystem.py +++ b/aiohttp_client_cache/backends/filesystem.py @@ -7,7 +7,8 @@ from pickle import PickleError from shutil import rmtree from tempfile import gettempdir -from typing import Any, AsyncIterable +from typing import Any +from collections.abc import AsyncIterable import aiofiles import aiofiles.os diff --git a/aiohttp_client_cache/backends/mongodb.py b/aiohttp_client_cache/backends/mongodb.py index 1ac1161a..c9a2cd9a 100644 --- a/aiohttp_client_cache/backends/mongodb.py +++ b/aiohttp_client_cache/backends/mongodb.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import Any, AsyncIterable +from typing import Any +from collections.abc import AsyncIterable from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient diff --git a/aiohttp_client_cache/backends/redis.py b/aiohttp_client_cache/backends/redis.py index 428e14b2..dc321ad9 100644 --- a/aiohttp_client_cache/backends/redis.py +++ b/aiohttp_client_cache/backends/redis.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import Any, AsyncIterable +from typing import Any +from collections.abc import AsyncIterable from redis.asyncio import Redis, from_url diff --git a/aiohttp_client_cache/backends/sqlite.py b/aiohttp_client_cache/backends/sqlite.py index 188abbc4..315e9a13 100644 --- a/aiohttp_client_cache/backends/sqlite.py +++ b/aiohttp_client_cache/backends/sqlite.py @@ -11,7 +11,8 @@ from os.path import abspath, basename, dirname, expanduser, isabs, join from pathlib import Path from tempfile import gettempdir -from typing import Any, AsyncIterable, AsyncIterator +from typing import Any +from collections.abc import AsyncIterable, AsyncIterator import aiosqlite diff --git a/aiohttp_client_cache/cache_control.py b/aiohttp_client_cache/cache_control.py index 53313caa..ed3a350f 100644 --- a/aiohttp_client_cache/cache_control.py +++ b/aiohttp_client_cache/cache_control.py @@ -9,7 +9,8 @@ from functools import singledispatch from itertools import chain from logging import getLogger -from typing import Any, Dict, Mapping, NoReturn, Tuple, Union +from typing import Any, NoReturn, Union +from collections.abc import Mapping from aiohttp import ClientResponse from aiohttp.typedefs import StrOrURL @@ -32,9 +33,9 @@ ] RESPONSE_CACHE_HEADERS = ['Cache-Control', 'ETag', 'Expires', 'Age'] -CacheDirective = Tuple[str, Union[None, int, bool]] +CacheDirective = tuple[str, Union[None, int, bool]] ExpirationTime = Union[None, int, float, str, datetime, timedelta] -ExpirationPatterns = Dict[str, ExpirationTime] +ExpirationPatterns = dict[str, ExpirationTime] logger = getLogger(__name__) diff --git a/aiohttp_client_cache/cache_keys.py b/aiohttp_client_cache/cache_keys.py index d8d927f4..25c52151 100644 --- a/aiohttp_client_cache/cache_keys.py +++ b/aiohttp_client_cache/cache_keys.py @@ -4,7 +4,8 @@ import hashlib from collections.abc import Mapping -from typing import Any, Iterable, Sequence, Union +from typing import Any, Union +from collections.abc import Iterable, Sequence from aiohttp.typedefs import StrOrURL from multidict import MultiDict diff --git a/aiohttp_client_cache/response.py b/aiohttp_client_cache/response.py index 6c8128f0..dcd0f8e3 100644 --- a/aiohttp_client_cache/response.py +++ b/aiohttp_client_cache/response.py @@ -8,7 +8,8 @@ from functools import singledispatch from http.cookies import SimpleCookie from logging import getLogger -from typing import Any, Dict, List, Mapping, Optional, Tuple, Union +from typing import Any, Optional, Union +from collections.abc import Mapping from unittest.mock import Mock import attr @@ -44,9 +45,9 @@ 'is_expired': False, } -JsonResponse = Optional[Dict[str, Any]] -DictItems = List[Tuple[str, str]] -LinkItems = List[Tuple[str, DictItems]] +JsonResponse = Optional[dict[str, Any]] +DictItems = list[tuple[str, str]] +LinkItems = list[tuple[str, DictItems]] LinkMultiDict = MultiDictProxy[MultiDictProxy[Union[str, URL]]] logger = getLogger(__name__) diff --git a/docs/user_guide.md b/docs/user_guide.md index 76cae599..da496c94 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -18,7 +18,7 @@ conda install -c conda-forge aiohttp-client-cache ### Requirements -- Requires python 3.8+. +- Requires python 3.9+. - You may need additional dependencies depending on which backend you want to use. To install with extra dependencies for all supported {ref}`backends`: ```bash diff --git a/noxfile.py b/noxfile.py index e69df0ea..884446e7 100644 --- a/noxfile.py +++ b/noxfile.py @@ -29,7 +29,7 @@ XDIST_ARGS = '--numprocesses=auto --dist=loadfile' # Run tests in parallel, grouped by test module -@session(python=['3.8', '3.9', '3.10', '3.11', '3.12']) +@session(python=['3.9', '3.10', '3.11', '3.12']) def test(session): """Run tests for a specific python version""" test_paths = session.posargs or [UNIT_TESTS] diff --git a/poetry.lock b/poetry.lock index 2fb9d869..98fc7592 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "aioboto3" @@ -384,10 +384,6 @@ files = [ {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"}, {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, @@ -400,14 +396,8 @@ files = [ {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"}, {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, - {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"}, - {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, @@ -418,24 +408,8 @@ files = [ {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"}, {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, - {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"}, - {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"}, - {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"}, - {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"}, {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, @@ -445,10 +419,6 @@ files = [ {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"}, {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, @@ -460,10 +430,6 @@ files = [ {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"}, {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, @@ -476,10 +442,6 @@ files = [ {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"}, {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, @@ -492,10 +454,6 @@ files = [ {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"}, {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, @@ -2707,5 +2665,5 @@ sqlite = ["aiosqlite"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "c484309deb977c4021ebc75b4d2dc77ee105ddf2cded0726f149884da09ea570" +python-versions = "^3.9" +content-hash = "5630fd387c84ad8fd6d70371787de437c31ef13b2c0ea9edb7366351c925bf10" diff --git a/pyproject.toml b/pyproject.toml index 621d0672..f60a7649 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ "Documentation" = "https://aiohttp-client-cache.readthedocs.io" [tool.poetry.dependencies] -python = "^3.8" +python = "^3.9" aiohttp = "^3.8" attrs = ">=21.2" itsdangerous = ">=2.0" @@ -111,7 +111,7 @@ exclude_lines = [ ] [tool.mypy] -python_version = 3.8 +python_version = 3.9 ignore_missing_imports = true warn_redundant_casts = true warn_unused_ignores = true @@ -125,7 +125,7 @@ exclude = "dist|build" [tool.ruff] line-length = 100 output-format = 'grouped' -target-version = 'py38' +target-version = 'py39' [tool.ruff.format] quote-style = 'single' diff --git a/test/conftest.py b/test/conftest.py index 3c3bf91e..ce793455 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -3,7 +3,7 @@ from datetime import datetime from os import getenv from tempfile import NamedTemporaryFile -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/test/integration/base_backend_test.py b/test/integration/base_backend_test.py index d48f88a2..e8dcad7a 100644 --- a/test/integration/base_backend_test.py +++ b/test/integration/base_backend_test.py @@ -17,7 +17,8 @@ httpbin, httpbin_custom, ) -from typing import Any, AsyncIterator, cast +from typing import Any, cast +from collections.abc import AsyncIterator from unittest.mock import MagicMock from uuid import uuid4 diff --git a/test/integration/base_storage_test.py b/test/integration/base_storage_test.py index d95457b6..5a455962 100644 --- a/test/integration/base_storage_test.py +++ b/test/integration/base_storage_test.py @@ -1,7 +1,8 @@ from __future__ import annotations from contextlib import asynccontextmanager from datetime import datetime -from typing import Any, AsyncIterator, TypeVar +from typing import Any, TypeVar +from collections.abc import AsyncIterator import pytest diff --git a/test/integration/test_filesystem.py b/test/integration/test_filesystem.py index 847b9938..e10ccd87 100644 --- a/test/integration/test_filesystem.py +++ b/test/integration/test_filesystem.py @@ -3,7 +3,7 @@ from os.path import isfile from shutil import rmtree from tempfile import gettempdir -from typing import AsyncIterator +from collections.abc import AsyncIterator from aiohttp_client_cache.backends.filesystem import FileBackend, FileCache from aiohttp_client_cache.session import CachedSession diff --git a/test/integration/test_sqlite.py b/test/integration/test_sqlite.py index 663bf9b9..cac2a9c8 100644 --- a/test/integration/test_sqlite.py +++ b/test/integration/test_sqlite.py @@ -77,9 +77,10 @@ async def bulk_commit_items(n_items): assert mock_connection.commit.call_count == 5 async def test_fast_save(self): - async with self.init_cache( - self.storage_class, index=1, fast_save=True - ) as cache_1, self.init_cache(self.storage_class, index=2, fast_save=True) as cache_2: + async with ( + self.init_cache(self.storage_class, index=1, fast_save=True) as cache_1, + self.init_cache(self.storage_class, index=2, fast_save=True) as cache_2, + ): for i in range(1000): await cache_1.write(i, i) # type: ignore[arg-type] await cache_2.write(i, i) # type: ignore[arg-type] diff --git a/test/unit/test_cache_control.py b/test/unit/test_cache_control.py index a299bc98..ac668869 100644 --- a/test/unit/test_cache_control.py +++ b/test/unit/test_cache_control.py @@ -5,7 +5,8 @@ from datetime import datetime, timedelta, timezone from email.utils import format_datetime from test.conftest import HTTPDATE_DATETIME, HTTPDATE_STR -from typing import Any, Mapping +from typing import Any +from collections.abc import Mapping from unittest.mock import MagicMock, patch import pytest diff --git a/test/unit/test_session.py b/test/unit/test_session.py index 0e1333d1..c5c70de9 100644 --- a/test/unit/test_session.py +++ b/test/unit/test_session.py @@ -1,7 +1,7 @@ from __future__ import annotations from http.cookies import SimpleCookie -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock, patch, AsyncMock from aiohttp import ClientResponse import pytest @@ -13,12 +13,6 @@ pytestmark = [pytest.mark.asyncio] -# AsyncMock was added to the stdlib in python 3.8 -try: - from unittest.mock import AsyncMock -except ImportError: - pytestmark += [pytest.mark.skip(reason='Tests require AsyncMock from python 3.8+')] - FakeCachedResponse = CachedResponse(method='GET', reason='OK', status=200, url='url', version='1.1') FakeClientResponse = ClientResponse(