diff -r 111c52e0022f -r bcd4bfff658b rtags.py --- 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__