rtags.py
branchtls-sprint
changeset 1179 70825477c6ce
parent 1152 c99ef2a2535c
child 1283 d812bd08c11c
equal deleted inserted replaced
1178:8d9b705168d3 1179:70825477c6ce
    20     
    20     
    21     def __init__(self, use_set=False):
    21     def __init__(self, use_set=False):
    22         self.use_set = use_set
    22         self.use_set = use_set
    23         self._tagdefs = {}
    23         self._tagdefs = {}
    24         
    24         
    25     def set_rtag(self, tag, role, rtype, stype='*', otype='*'):
    25     def set_rtag(self, tag, rtype, role, stype='*', otype='*'):
    26         assert not self.use_set
    26         assert not self.use_set
    27         assert role in ('subject', 'object'), role
    27         assert role in ('subject', 'object'), role
    28         self._tagdefs[(stype, rtype, otype, role)] = tag
    28         self._tagdefs[(rtype, role, stype, otype)] = tag
    29         
    29         
    30     def rtag(self, role, rtype, stype='*', otype='*'):
    30     def rtag(self, rtype, role, stype='*', otype='*'):
    31         assert not self.use_set
    31         assert not self.use_set
    32         for key in reversed(self._get_keys(role, rtype, stype, otype)):
    32         for key in reversed(self._get_keys(rtype, role, stype, otype)):
    33             try:
    33             try:
    34                 return self._tagdefs[key]
    34                 return self._tagdefs[key]
    35             except KeyError:
    35             except KeyError:
    36                 continue
    36                 continue
    37         return None
    37         return None
    38         
    38         
    39     def etype_rtag(self, etype, role, rtype, ttype='*'):
    39     def etype_rtag(self, etype, rtype, role, ttype='*'):
    40         if role == 'subject':
    40         if role == 'subject':
    41             return self.rtag(role, rtype, etype, ttype)
    41             return self.rtag(rtype, role, etype, ttype)
    42         return self.rtag(role, rtype, ttype, etype)
    42         return self.rtag(rtype, role, ttype, etype)
    43         
    43         
    44     def add_rtag(self, tag, role, rtype, stype='*', otype='*'):
    44     def add_rtag(self, tag, rtype, role, stype='*', otype='*'):
    45         assert self.use_set
    45         assert self.use_set
    46         assert role in ('subject', 'object'), role
    46         assert role in ('subject', 'object'), role
    47         rtags = self._tagdefs.setdefault((stype, rtype, otype, role), set())
    47         rtags = self._tagdefs.setdefault((rtype, role, stype, otype), set())
    48         rtags.add(tag)
    48         rtags.add(tag)
    49         
    49         
    50     def rtags(self, role, rtype, stype='*', otype='*'):
    50     def rtags(self, rtype, role, stype='*', otype='*'):
    51         assert self.use_set
    51         assert self.use_set
    52         rtags = set()
    52         rtags = set()
    53         for key in self._get_keys(role, rtype, stype, otype):
    53         for key in self._get_keys(rtype, role, stype, otype):
    54             try:
    54             try:
    55                 rtags.update(self._tagdefs[key])
    55                 rtags.update(self._tagdefs[key])
    56             except KeyError:
    56             except KeyError:
    57                 continue
    57                 continue
    58         return rtags
    58         return rtags
    59         
    59         
    60     def etype_rtags(self, etype, role, rtype, ttype='*'):
    60     def etype_rtags(self, etype, rtype, role, ttype='*'):
    61         if role == 'subject':
    61         if role == 'subject':
    62             return self.rtags(role, rtype, etype, ttype)
    62             return self.rtags(rtype, role, etype, ttype)
    63         return self.rtags(role, rtype, ttype, etype)
    63         return self.rtags(rtype, role, ttype, etype)
    64 
    64 
    65     def _get_keys(self, role, rtype, stype, otype): 
    65     def _get_keys(self, rtype, role, stype, otype): 
    66         assert role in ('subject', 'object'), role
    66         assert role in ('subject', 'object'), role
    67         keys = [('*', rtype, '*', role),
    67         keys = [(rtype, role, '*', '*'),
    68                 ('*', rtype, otype, role),
    68                 (rtype, role, '*', otype),
    69                 (stype, rtype, '*', role),
    69                 (rtype, role, stype, '*'),
    70                 (stype, rtype, otype, role)]
    70                 (rtype, role, stype, otype)]
    71         if stype == '*' or otype == '*':
    71         if stype == '*' or otype == '*':
    72             keys.remove(('*', rtype, '*', role))
    72             keys.remove((rtype, role, '*', '*'))
    73             if stype == '*':
    73             if stype == '*':
    74                 keys.remove(('*', rtype, otype, role))
    74                 keys.remove((rtype, role, '*', otype))
    75             if otype == '*':
    75             if otype == '*':
    76                 keys.remove((stype, rtype, '*', role))            
    76                 keys.remove((rtype, role, stype, '*'))            
    77         return keys
    77         return keys
    78     
    78     
    79     # dict compat
    79     # dict compat
    80     def __getitem__(self, key):
    80     def __getitem__(self, key):
    81         if isinstance(key, basestring):
    81         if isinstance(key, basestring):