Made attributes.has() actually return booleans as the API specifies.

This commit is contained in:
Griatch 2016-09-03 18:19:38 +02:00
parent 3c9b58f460
commit fd351a2809

View file

@ -295,6 +295,8 @@ class AttributeHandler(object):
attr_obj (Attribute): The newly saved attribute attr_obj (Attribute): The newly saved attribute
""" """
if not key: # don't allow an empty key in cache
return
cachekey = "%s-%s" % (key, category) cachekey = "%s-%s" % (key, category)
catkey = "-%s" % category catkey = "-%s" % category
self._cache[cachekey] = attr_obj self._cache[cachekey] = attr_obj
@ -311,21 +313,25 @@ class AttributeHandler(object):
category (str or None): A cleaned category name category (str or None): A cleaned category name
""" """
cachekey = "%s-%s" % (key, category)
catkey = "-%s" % category catkey = "-%s" % category
self._cache.pop(cachekey, None) if key:
cachekey = "%s-%s" % (key, category)
self._cache.pop(cachekey, None)
else:
[self._cache.pop(key, None) for key in self._cache if key.endswith(catkey)]
# mark that the category cache is no longer up-to-date # mark that the category cache is no longer up-to-date
self._catcache.pop(catkey, None) self._catcache.pop(catkey, None)
self._cache_complete = False self._cache_complete = False
def has(self, key, category=None): def has(self, key=None, category=None):
""" """
Checks if the given Attribute (or list of Attributes) exists on Checks if the given Attribute (or list of Attributes) exists on
the object. the object.
Args: Args:
key (str or iterable): The Attribute key or keys to check for. key (str or iterable): The Attribute key or keys to check for.
category (str): Limit the check to Attributes with this If `None`, search by category.
category (str or None): Limit the check to Attributes with this
category (note, that `None` is the default category). category (note, that `None` is the default category).
Returns: Returns:
@ -334,8 +340,9 @@ class AttributeHandler(object):
the return is a list of booleans. the return is a list of booleans.
""" """
ret = [self._getcache(k, category) for k in make_iter(key)] \ ret = []
if key else [self._getcache(None, category)] for keystr in make_iter(key):
ret.extend(bool(attr) for attr in self._getcache(keystr, category))
return ret[0] if len(ret) == 1 else ret return ret[0] if len(ret) == 1 else ret
#if self._cache is None or not _TYPECLASS_AGGRESSIVE_CACHE: #if self._cache is None or not _TYPECLASS_AGGRESSIVE_CACHE:
@ -459,6 +466,7 @@ class AttributeHandler(object):
self._attrcreate, default=default_access): self._attrcreate, default=default_access):
# check create access # check create access
return return
if not key: if not key:
return return
@ -537,7 +545,7 @@ class AttributeHandler(object):
keys, values = make_iter(key), make_iter(value) keys, values = make_iter(key), make_iter(value)
if len(keys) != len(values): if len(keys) != len(values):
raise RuntimeError("AttributeHandler.add(): key and value of different length: %s vs %s" % key, value) raise RuntimeError("AttributeHandler.add(): key and value lists of different length: %s vs %s" % key, value)
category = category.strip().lower() if category is not None else None category = category.strip().lower() if category is not None else None
new_attrobjs = [] new_attrobjs = []
for ikey, keystr in enumerate(keys): for ikey, keystr in enumerate(keys):
@ -546,9 +554,10 @@ class AttributeHandler(object):
#cachekey = "%s-%s" % (keystr, category) #cachekey = "%s-%s" % (keystr, category)
#attr_obj = self._cache.get(cachekey) #attr_obj = self._cache.get(cachekey)
attr_obj = self._getcache(keystr, category) attr_objs = self._getcache(keystr, category)
if attr_obj: if attr_objs:
attr_obj = attr_objs[0]
# update an existing attribute object # update an existing attribute object
if strattr: if strattr:
# store as a simple string (will not notify OOB handlers) # store as a simple string (will not notify OOB handlers)
@ -602,15 +611,15 @@ class AttributeHandler(object):
#key = [k.strip().lower() for k in make_iter(key) if k] #key = [k.strip().lower() for k in make_iter(key) if k]
#category = category.strip().lower() if category is not None else None #category = category.strip().lower() if category is not None else None
for keystr in make_iter(key): for keystr in make_iter(key):
attr_obj = self._getcache(keystr, category) attr_objs = self._getcache(keystr, category)
if attr_obj: for attr_obj in attr_objs:
if not (accessing_obj and not attr_obj.access(accessing_obj, if not (accessing_obj and not attr_obj.access(accessing_obj,
self._attredit, default=default_access)): self._attredit, default=default_access)):
attr_obj.delete() attr_obj.delete()
self._delcache(key, category) self._delcache(key, category)
elif not attr_obj and raise_exception: if not attr_objs and raise_exception:
raise AttributeError raise AttributeError
self._recache() #self._recache()
def clear(self, category=None, accessing_obj=None, default_access=True): def clear(self, category=None, accessing_obj=None, default_access=True):
""" """