--- a/rtags.py Wed Apr 29 09:27:03 2009 +0200
+++ b/rtags.py Wed Apr 29 10:29:03 2009 +0200
@@ -6,88 +6,81 @@
"""
__docformat__ = "restructuredtext en"
+
class RelationTags(object):
- """RelationTags instances are a tag store for full relation definitions :
+ """a tag store for full relation definitions :
- (subject type, relation type, object type, role)
+ (subject type, relation type, object type, tagged)
allowing to set tags using wildcard (eg '*') as subject type / object type
- if `use_set` is True, a set of tags is associated to each key, and you
- should use rtags / etype_rtags / add_rtag api. Otherwise, a single tag is
- associated to each key, and you should use rtag / etype_rtag / set_rtag api.
+ This class associates a single tag to each key.
"""
- def __init__(self, use_set=False):
- self.use_set = use_set
+ def __init__(self):
self._tagdefs = {}
def __repr__(self):
return repr(self._tagdefs)
- def set_rtag(self, tag, rtype, role, stype='*', otype='*'):
- assert not self.use_set
- assert role in ('subject', 'object'), role
- self._tagdefs[(str(rtype), role, str(stype), str(otype))] = tag
+ # dict compat
+ def __getitem__(self, key):
+ return self.get(*key)
+ __contains__ = __getitem__
- def del_rtag(self, rtype, role, stype='*', otype='*'):
- assert not self.use_set
- assert role in ('subject', 'object'), role
- del self._tagdefs[(str(rtype), role, str(stype), str(otype))]
+ def _get_keys(self, rtype, tagged, stype, otype):
+ assert tagged in ('subject', 'object'), tagged
+ keys = [(rtype, tagged, '*', '*'),
+ (rtype, tagged, '*', otype),
+ (rtype, tagged, stype, '*'),
+ (rtype, tagged, stype, otype)]
+ if stype == '*' or otype == '*':
+ keys.remove((rtype, tagged, '*', '*'))
+ if stype == '*':
+ keys.remove((rtype, tagged, '*', otype))
+ if otype == '*':
+ keys.remove((rtype, tagged, stype, '*'))
+ return keys
- def rtag(self, rtype, role, stype='*', otype='*'):
- assert not self.use_set
- for key in reversed(self._get_keys(rtype, role, stype, otype)):
+ def tag_relation(self, tag, relation, tagged):
+ assert tagged in ('subject', 'object'), tagged
+ stype, rtype, otype = relation
+ self._tagdefs[(str(rtype), tagged, str(stype), str(otype))] = tag
+
+ def del_rtag(self, relation, tagged):
+ assert tagged in ('subject', 'object'), tagged
+ stype, rtype, otype = relation
+ del self._tagdefs[(str(rtype), tagged, str(stype), str(otype))]
+
+ def get(self, rtype, tagged, stype='*', otype='*'):
+ for key in reversed(self._get_keys(rtype, tagged, stype, otype)):
try:
return self._tagdefs[key]
except KeyError:
continue
return None
- def etype_rtag(self, etype, rtype, role, ttype='*'):
- if role == 'subject':
- return self.rtag(rtype, role, etype, ttype)
- return self.rtag(rtype, role, ttype, etype)
+ def etype_get(self, etype, rtype, tagged, ttype='*'):
+ if tagged == 'subject':
+ return self.get(rtype, tagged, etype, ttype)
+ return self.get(rtype, tagged, ttype, etype)
+
+
- def add_rtag(self, tag, rtype, role, stype='*', otype='*'):
- assert self.use_set
- assert role in ('subject', 'object'), role
- rtags = self._tagdefs.setdefault((rtype, role, stype, otype), set())
+class RelationTagsSet(RelationTags):
+ """This class associates a set of tags to each key."""
+
+ def tag_relation(self, tag, relation, tagged):
+ assert tagged in ('subject', 'object'), tagged
+ stype, rtype, otype = relation
+ rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set())
rtags.add(tag)
- def rtags(self, rtype, role, stype='*', otype='*'):
- assert self.use_set
+ def get(self, rtype, tagged, stype='*', otype='*'):
rtags = set()
- for key in self._get_keys(rtype, role, stype, otype):
+ for key in self._get_keys(rtype, tagged, stype, otype):
try:
rtags.update(self._tagdefs[key])
except KeyError:
continue
return rtags
-
- def etype_rtags(self, etype, rtype, role, ttype='*'):
- if role == 'subject':
- return self.rtags(rtype, role, etype, ttype)
- return self.rtags(rtype, role, ttype, etype)
-
- def _get_keys(self, rtype, role, stype, otype):
- assert role in ('subject', 'object'), role
- keys = [(rtype, role, '*', '*'),
- (rtype, role, '*', otype),
- (rtype, role, stype, '*'),
- (rtype, role, stype, otype)]
- if stype == '*' or otype == '*':
- keys.remove((rtype, role, '*', '*'))
- if stype == '*':
- keys.remove((rtype, role, '*', otype))
- if otype == '*':
- keys.remove((rtype, role, stype, '*'))
- return keys
-
- # dict compat
- def __getitem__(self, key):
- if isinstance(key, basestring):
- key = (key,)
- return self.rtags(*key)
-
- __contains__ = __getitem__