rtags.py
branchtls-sprint
changeset 1533 bcd4bfff658b
parent 1528 864ae7c15ef5
child 1548 bd225e776739
--- 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__