From bfcd41f04a3e9495273e60cd6fd16ceb9e634d9b Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sat, 10 Feb 2024 08:51:02 +0100 Subject: [PATCH] [clean] drop obsolete py3.7 compatibility - https://github.com/searxng/searxng/discussions/2356 Signed-off-by: Markus Heiser --- searx/compat.py | 73 -------------------------------------- searx/infopage/__init__.py | 2 +- 2 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 searx/compat.py diff --git a/searx/compat.py b/searx/compat.py deleted file mode 100644 index 15e27d45d..000000000 --- a/searx/compat.py +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -# lint: pylint -# pyright: basic -"""Module for backward compatibility. - -""" -# pylint: disable=C,R - - -__all__ = ('cached_property',) - - -try: - from functools import cached_property # type: ignore - -except ImportError: - - # cache_property has been added in py3.8 [1] - # - # To support cache_property in py3.7 the implementation from 3.8 has been - # copied here. This code can be cleanup with EOL of py3.7. - # - # [1] https://docs.python.org/3/library/functools.html#functools.cached_property - - from threading import RLock - - _NOT_FOUND = object() - - class cached_property: - def __init__(self, func): - self.func = func - self.attrname = None - self.__doc__ = func.__doc__ - self.lock = RLock() - - def __set_name__(self, owner, name): - if self.attrname is None: - self.attrname = name - elif name != self.attrname: - raise TypeError( - "Cannot assign the same cached_property to two different names " - f"({self.attrname!r} and {name!r})." - ) - - def __get__(self, instance, owner=None): - if instance is None: - return self - if self.attrname is None: - raise TypeError("Cannot use cached_property instance without calling __set_name__ on it.") - try: - cache = instance.__dict__ - except AttributeError: # not all objects have __dict__ (e.g. class defines slots) - msg = ( - f"No '__dict__' attribute on {type(instance).__name__!r} " - f"instance to cache {self.attrname!r} property." - ) - raise TypeError(msg) from None - val = cache.get(self.attrname, _NOT_FOUND) - if val is _NOT_FOUND: - with self.lock: - # check if another thread filled cache while we awaited lock - val = cache.get(self.attrname, _NOT_FOUND) - if val is _NOT_FOUND: - val = self.func(instance) - try: - cache[self.attrname] = val - except TypeError: - msg = ( - f"The '__dict__' attribute on {type(instance).__name__!r} instance " - f"does not support item assignment for caching {self.attrname!r} property." - ) - raise TypeError(msg) from None - return val diff --git a/searx/infopage/__init__.py b/searx/infopage/__init__.py index 8e6da0256..9ba0ea517 100644 --- a/searx/infopage/__init__.py +++ b/searx/infopage/__init__.py @@ -27,12 +27,12 @@ import logging import typing import urllib.parse +from functools import cached_property import jinja2 from flask.helpers import url_for from markdown_it import MarkdownIt from .. import get_setting -from ..compat import cached_property from ..version import GIT_URL from ..locales import LOCALE_NAMES