summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-11-13 16:04:47 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2020-11-13 16:04:47 -0500
commit5dcc3367619ae8bcd1b34019e8727d4050bb2747 (patch)
treeb05085dedee8056d9aa16d0392675e2b0a2a273b
parent8cc7e8d184168f36fb05cac96834ea7ec35fb8a0 (diff)
downloaddogpile-cache-5dcc3367619ae8bcd1b34019e8727d4050bb2747.tar.gz
Add subclasshook for CacheMutex
Also restore python-memcached to test suite Change-Id: If4cd5e4604a0c5b51e1b34ba5a1a397ec1ef15cf
-rw-r--r--dogpile/cache/api.py4
-rw-r--r--tests/cache/_fixtures.py7
-rw-r--r--tests/cache/test_region.py32
-rw-r--r--tox.ini1
4 files changed, 44 insertions, 0 deletions
diff --git a/dogpile/cache/api.py b/dogpile/cache/api.py
index dd16252..d89ac56 100644
--- a/dogpile/cache/api.py
+++ b/dogpile/cache/api.py
@@ -85,6 +85,10 @@ class CacheMutex(abc.ABC):
raise NotImplementedError()
+ @classmethod
+ def __subclasshook__(cls, C):
+ return hasattr(C, "acquire") and hasattr(C, "release")
+
class CachedValue(NamedTuple):
"""Represent a value stored in the cache.
diff --git a/tests/cache/_fixtures.py b/tests/cache/_fixtures.py
index e55c471..1be5a2c 100644
--- a/tests/cache/_fixtures.py
+++ b/tests/cache/_fixtures.py
@@ -12,6 +12,7 @@ import pytest
from dogpile.cache import CacheRegion
from dogpile.cache import register_backend
from dogpile.cache.api import CacheBackend
+from dogpile.cache.api import CacheMutex
from dogpile.cache.api import NO_VALUE
from dogpile.cache.region import _backend_loader
from . import assert_raises_message
@@ -395,6 +396,12 @@ class _GenericMutexTest(_GenericBackendFixture, TestCase):
assert ac3
mutex.release()
+ def test_subclass_match(self):
+ backend = self._backend()
+ mutex = backend.get_mutex("foo")
+
+ assert isinstance(mutex, CacheMutex)
+
@pytest.mark.time_intensive
def test_mutex_threaded(self):
backend = self._backend()
diff --git a/tests/cache/test_region.py b/tests/cache/test_region.py
index 7168433..087d533 100644
--- a/tests/cache/test_region.py
+++ b/tests/cache/test_region.py
@@ -13,6 +13,7 @@ from dogpile.cache import make_region
from dogpile.cache import util
from dogpile.cache.api import CacheBackend
from dogpile.cache.api import CachedValue
+from dogpile.cache.api import CacheMutex
from dogpile.cache.api import NO_VALUE
from dogpile.cache.proxy import ProxyBackend
from dogpile.cache.region import _backend_loader
@@ -605,6 +606,37 @@ class TestProxyValue(object):
self.value = value
+class MutexAPITest(TestCase):
+ def test_mutex_non_match(self):
+ assert not isinstance(5, CacheMutex)
+ assert not isinstance("some string", CacheMutex)
+
+ class Foo:
+ def release(self):
+ pass
+
+ assert not isinstance(Foo(), CacheMutex)
+
+ class Bar:
+ def acquire(self):
+ pass
+
+ assert not isinstance(Bar(), CacheMutex)
+
+ def test_mutex_match(self):
+ class Foo:
+ def acquire(self):
+ # note we are missing the "wait" parameter. not sure
+ # how ABCs are supposed to efficiently test these
+ # things.
+ pass
+
+ def release(self):
+ pass
+
+ assert isinstance(Foo(), CacheMutex)
+
+
class AsyncCreatorTest(TestCase):
def _fixture(self):
def async_creation_runner(cache, somekey, creator, mutex):
diff --git a/tox.ini b/tox.ini
index 2c11621..61c6d19 100644
--- a/tox.ini
+++ b/tox.ini
@@ -35,6 +35,7 @@ deps=
# the py3k python-memcached fails for multiple
# delete
+ {memcached}: python-memcached
{memcached}: python-binary-memcached>=0.29.0
{memcached}: pifpaf>=2.5.0
{redis}: redis