diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py index b671680f5..a40c4e94b 100644 --- a/api/funkwhale_api/instance/nodeinfo.py +++ b/api/funkwhale_api/instance/nodeinfo.py @@ -1,4 +1,4 @@ -import memoize.djangocache +from cache_memoize import cache_memoize from django.urls import reverse @@ -11,9 +11,6 @@ from funkwhale_api.music import utils as music_utils from . import stats -store = memoize.djangocache.Cache("default") -memo = memoize.Memoizer(store, namespace="instance:stats") - def get(): all_preferences = preferences.all() @@ -72,7 +69,7 @@ def get(): } if share_stats: - getter = memo(lambda: stats.get(), max_age=600) + getter = cache_memoize(600, prefix="memoize:instance:stats")(stats.get) statistics = getter() data["usage"]["users"]["total"] = statistics["users"]["total"] data["usage"]["users"]["activeHalfyear"] = statistics["users"][ diff --git a/api/funkwhale_api/musicbrainz/client.py b/api/funkwhale_api/musicbrainz/client.py index ae038f900..8fdf90322 100644 --- a/api/funkwhale_api/musicbrainz/client.py +++ b/api/funkwhale_api/musicbrainz/client.py @@ -1,5 +1,5 @@ -import memoize.djangocache import musicbrainzngs +from cache_memoize import cache_memoize from django.conf import settings from funkwhale_api import __version__ @@ -9,10 +9,6 @@ _api.set_useragent("funkwhale", str(__version__), settings.FUNKWHALE_URL) _api.set_hostname(settings.MUSICBRAINZ_HOSTNAME) -store = memoize.djangocache.Cache("default") -memo = memoize.Memoizer(store, namespace="memoize:musicbrainz") - - def clean_artist_search(query, **kwargs): cleaned_kwargs = {} if kwargs.get("name"): @@ -24,38 +20,59 @@ class API(object): _api = _api class artists(object): - search = memo(clean_artist_search, max_age=settings.MUSICBRAINZ_CACHE_DURATION) - get = memo(_api.get_artist_by_id, max_age=settings.MUSICBRAINZ_CACHE_DURATION) + search = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:clean_artist_search", + )(clean_artist_search) + get = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:get_artist_by_id", + )(_api.get_artist_by_id) class images(object): - get_front = memo( - _api.get_image_front, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) + get_front = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:get_image_front", + )(_api.get_image_front) class recordings(object): - search = memo( - _api.search_recordings, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) - get = memo( - _api.get_recording_by_id, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) + search = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:search_recordings", + )(_api.search_recordings) + get = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:get_recording_by_id", + )(_api.get_recording_by_id) class releases(object): - search = memo(_api.search_releases, max_age=settings.MUSICBRAINZ_CACHE_DURATION) - get = memo(_api.get_release_by_id, max_age=settings.MUSICBRAINZ_CACHE_DURATION) - browse = memo(_api.browse_releases, max_age=settings.MUSICBRAINZ_CACHE_DURATION) + search = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:search_releases", + )(_api.search_releases) + get = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:get_release_by_id", + )(_api.get_release_by_id) + browse = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:browse_releases", + )(_api.browse_releases) # get_image_front = _api.get_image_front class release_groups(object): - search = memo( - _api.search_release_groups, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) - get = memo( - _api.get_release_group_by_id, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) - browse = memo( - _api.browse_release_groups, max_age=settings.MUSICBRAINZ_CACHE_DURATION - ) + search = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:search_release_groups", + )(_api.search_release_groups) + get = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:get_release_group_by_id", + )(_api.get_release_group_by_id) + browse = cache_memoize( + settings.MUSICBRAINZ_CACHE_DURATION, + prefix="memoize:musicbrainz:browse_release_groups", + )(_api.browse_release_groups) # get_image_front = _api.get_image_front diff --git a/api/poetry.lock b/api/poetry.lock index 11823f8cf..7d6b8c78c 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -583,6 +583,17 @@ python-versions = ">=3.6" Django = ">=2.2" python-ldap = ">=3.1" +[[package]] +name = "django-cache-memoize" +version = "0.1.10" +description = "Django utility for a memoization decorator that uses the Django cache framework." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["flake8", "tox", "twine", "therapist", "black"] + [[package]] name = "django-cacheops" version = "6.0" @@ -1419,14 +1430,6 @@ cachetools = ["cachetools"] frozendict = ["frozendict"] requests = ["requests"] -[[package]] -name = "pymemoize" -version = "1.0.3" -description = "Simple memoizing module." -category = "main" -optional = false -python-versions = "*" - [[package]] name = "pyopenssl" version = "21.0.0" @@ -2085,7 +2088,7 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "ca5f7edc67e0b0c9feeb5b24a24fa74517bced0bd4c52d663e62987a63cabb7c" +content-hash = "795509eb06dc1c88a068fc192ab5c503fd20c23a807c3a783383384defacd1e9" [metadata.files] aiohttp = [ @@ -2454,6 +2457,10 @@ django-auth-ldap = [ {file = "django-auth-ldap-4.0.0.tar.gz", hash = "sha256:276f79e624ce083ce13f161387f65ff1c0efe83ef8a42f2b9830d43317b15239"}, {file = "django_auth_ldap-4.0.0-py3-none-any.whl", hash = "sha256:94119c94981809124d3dc4bed974f71c7a980666896df626f556a88a5fe0b59c"}, ] +django-cache-memoize = [ + {file = "django-cache-memoize-0.1.10.tar.gz", hash = "sha256:63e8faa245a41c0dbad843807e9f21a6e59eba8e6e50df310fdf6485a6749843"}, + {file = "django_cache_memoize-0.1.10-py3-none-any.whl", hash = "sha256:676299313079cde9242ae84db0160e80b1d44e8dd6bc9b1f4f1247e11b30c9e0"}, +] django-cacheops = [ {file = "django-cacheops-6.0.tar.gz", hash = "sha256:78e161ebd96a32e28e19ec7da31f2afed9e62a79726b8b5f0ed12dd16c2e5841"}, {file = "django_cacheops-6.0-py2.py3-none-any.whl", hash = "sha256:ee38b969c9fc68f7c88e769b6c811e19563cca1ae08210d9f553ff758b6c3e17"}, @@ -3078,9 +3085,6 @@ pygments = [ pyld = [ {file = "PyLD-2.0.3.tar.gz", hash = "sha256:287445f888c3a332ccbd20a14844c66c2fcbaeab3c99acd506a0788e2ebb2f82"}, ] -pymemoize = [ - {file = "PyMemoize-1.0.3.tar.gz", hash = "sha256:07c7b8f592b1f03af74289ef0e554520022dae378ba36d0dbc1f80532130197b"}, -] pyopenssl = [ {file = "pyOpenSSL-21.0.0-py2.py3-none-any.whl", hash = "sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6"}, {file = "pyOpenSSL-21.0.0.tar.gz", hash = "sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3"}, diff --git a/api/pyproject.toml b/api/pyproject.toml index 937397a19..49b929322 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -27,7 +27,6 @@ django-versatileimagefield = "==2.2" django-filter = "==21.1" django-rest-auth = "==0.9.5" mutagen = "==1.45.1" -PyMemoize = "==1.0.3" django-dynamic-preferences = "==1.11.0" python-magic = "==0.4.25" channels = "==3.0.4" @@ -57,6 +56,7 @@ ipython = "==7.31.1" python-ldap = "==3.4.0" django-auth-ldap = "==4.0.0" uvicorn = {version = "==0.17.4", extras = ["standard"]} +django-cache-memoize = "^0.1.10" [tool.poetry.dev-dependencies] flake8 = "==3.9.2" diff --git a/changes/changelog.d/memoize.enhancement b/changes/changelog.d/memoize.enhancement new file mode 100644 index 000000000..998d7f15b --- /dev/null +++ b/changes/changelog.d/memoize.enhancement @@ -0,0 +1,2 @@ +Change unmaintained PyMemoize library to django-cache-memoize +to enable Python 3.10 support