rtags.py
branchstable
changeset 2369 5a2b8ed266ca
parent 1977 606923dff11b
child 2689 44f041222d0f
--- a/rtags.py	Fri Jul 10 09:44:36 2009 +0200
+++ b/rtags.py	Fri Jul 10 12:15:09 2009 +0200
@@ -101,6 +101,7 @@
                    '%r is not an allowed tag (should be in %s)' % (
                 tag, self._allowed_values)
         self._tagdefs[(rtype, tagged, stype, otype)] = tag
+        return tag
 
     # rtag runtime api ########################################################
 
@@ -123,15 +124,19 @@
 
 
 class RelationTagsSet(RelationTags):
-    """This class associates a set of tags to each key."""
+    """This class associates a set of tags to each key.
+    """
+    tag_container_cls = set
 
     def tag_relation(self, key, tag):
         stype, rtype, otype, tagged = [str(k) for k in key]
-        rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set())
+        rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype),
+                                         self.tag_container_cls())
         rtags.add(tag)
+        return rtags
 
     def get(self, stype, rtype, otype, tagged):
-        rtags = set()
+        rtags = self.tag_container_cls()
         for key in self._get_keys(stype, rtype, otype, tagged):
             try:
                 rtags.update(self._tagdefs[key])
@@ -140,6 +145,31 @@
         return rtags
 
 
+class RelationTagsDict(RelationTagsSet):
+    """This class associates a set of tags to each key."""
+    tag_container_cls = dict
+
+    def tag_relation(self, key, tag):
+        stype, rtype, otype, tagged = [str(k) for k in key]
+        try:
+            rtags = self._tagdefs[(rtype, tagged, stype, otype)]
+            rtags.update(tag)
+            return rtags
+        except KeyError:
+            self._tagdefs[(rtype, tagged, stype, otype)] = tag
+            return tag
+
+    def setdefault(self, key, tagkey, tagvalue):
+        stype, rtype, otype, tagged = [str(k) for k in key]
+        try:
+            rtags = self._tagdefs[(rtype, tagged, stype, otype)]
+            rtags.setdefault(tagkey, tagvalue)
+            return rtags
+        except KeyError:
+            self._tagdefs[(rtype, tagged, stype, otype)] = {tagkey: tagvalue}
+            return self._tagdefs[(rtype, tagged, stype, otype)]
+
+
 class RelationTagsBool(RelationTags):
     _allowed_values = frozenset((True, False))