rtags.py
branchtls-sprint
changeset 1451 982e8616d9a2
parent 1356 7b4802822f40
child 1528 864ae7c15ef5
equal deleted inserted replaced
1450:8edb0806dde4 1451:982e8616d9a2
    15 
    15 
    16     if `use_set` is True, a set of tags is associated to each key, and you
    16     if `use_set` is True, a set of tags is associated to each key, and you
    17     should use rtags / etype_rtags / add_rtag api. Otherwise, a single tag is
    17     should use rtags / etype_rtags / add_rtag api. Otherwise, a single tag is
    18     associated to each key, and you should use rtag / etype_rtag / set_rtag api.
    18     associated to each key, and you should use rtag / etype_rtag / set_rtag api.
    19     """
    19     """
    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, rtype, role, 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[(str(rtype), role, str(stype), str(otype))] = tag
    28         self._tagdefs[(str(rtype), role, str(stype), str(otype))] = tag
    29         
    29 
    30     def del_rtag(self, rtype, role, stype='*', otype='*'):
    30     def del_rtag(self, rtype, role, stype='*', otype='*'):
    31         assert not self.use_set
    31         assert not self.use_set
    32         assert role in ('subject', 'object'), role
    32         assert role in ('subject', 'object'), role
    33         del self._tagdefs[(str(rtype), role, str(stype), str(otype))]
    33         del self._tagdefs[(str(rtype), role, str(stype), str(otype))]
    34         
    34 
    35     def rtag(self, rtype, role, stype='*', otype='*'):
    35     def rtag(self, rtype, role, stype='*', otype='*'):
    36         assert not self.use_set
    36         assert not self.use_set
    37         for key in reversed(self._get_keys(rtype, role, stype, otype)):
    37         for key in reversed(self._get_keys(rtype, role, stype, otype)):
    38             try:
    38             try:
    39                 return self._tagdefs[key]
    39                 return self._tagdefs[key]
    40             except KeyError:
    40             except KeyError:
    41                 continue
    41                 continue
    42         return None
    42         return None
    43         
    43 
    44     def etype_rtag(self, etype, rtype, role, ttype='*'):
    44     def etype_rtag(self, etype, rtype, role, ttype='*'):
    45         if role == 'subject':
    45         if role == 'subject':
    46             return self.rtag(rtype, role, etype, ttype)
    46             return self.rtag(rtype, role, etype, ttype)
    47         return self.rtag(rtype, role, ttype, etype)
    47         return self.rtag(rtype, role, ttype, etype)
    48         
    48 
    49     def add_rtag(self, tag, rtype, role, stype='*', otype='*'):
    49     def add_rtag(self, tag, rtype, role, stype='*', otype='*'):
    50         assert self.use_set
    50         assert self.use_set
    51         assert role in ('subject', 'object'), role
    51         assert role in ('subject', 'object'), role
    52         rtags = self._tagdefs.setdefault((rtype, role, stype, otype), set())
    52         rtags = self._tagdefs.setdefault((rtype, role, stype, otype), set())
    53         rtags.add(tag)
    53         rtags.add(tag)
    54         
    54 
    55     def rtags(self, rtype, role, stype='*', otype='*'):
    55     def rtags(self, rtype, role, stype='*', otype='*'):
    56         assert self.use_set
    56         assert self.use_set
    57         rtags = set()
    57         rtags = set()
    58         for key in self._get_keys(rtype, role, stype, otype):
    58         for key in self._get_keys(rtype, role, stype, otype):
    59             try:
    59             try:
    60                 rtags.update(self._tagdefs[key])
    60                 rtags.update(self._tagdefs[key])
    61             except KeyError:
    61             except KeyError:
    62                 continue
    62                 continue
    63         return rtags
    63         return rtags
    64         
    64 
    65     def etype_rtags(self, etype, rtype, role, ttype='*'):
    65     def etype_rtags(self, etype, rtype, role, ttype='*'):
    66         if role == 'subject':
    66         if role == 'subject':
    67             return self.rtags(rtype, role, etype, ttype)
    67             return self.rtags(rtype, role, etype, ttype)
    68         return self.rtags(rtype, role, ttype, etype)
    68         return self.rtags(rtype, role, ttype, etype)
    69 
    69 
    70     def _get_keys(self, rtype, role, stype, otype): 
    70     def _get_keys(self, rtype, role, stype, otype):
    71         assert role in ('subject', 'object'), role
    71         assert role in ('subject', 'object'), role
    72         keys = [(rtype, role, '*', '*'),
    72         keys = [(rtype, role, '*', '*'),
    73                 (rtype, role, '*', otype),
    73                 (rtype, role, '*', otype),
    74                 (rtype, role, stype, '*'),
    74                 (rtype, role, stype, '*'),
    75                 (rtype, role, stype, otype)]
    75                 (rtype, role, stype, otype)]
    76         if stype == '*' or otype == '*':
    76         if stype == '*' or otype == '*':
    77             keys.remove((rtype, role, '*', '*'))
    77             keys.remove((rtype, role, '*', '*'))
    78             if stype == '*':
    78             if stype == '*':
    79                 keys.remove((rtype, role, '*', otype))
    79                 keys.remove((rtype, role, '*', otype))
    80             if otype == '*':
    80             if otype == '*':
    81                 keys.remove((rtype, role, stype, '*'))            
    81                 keys.remove((rtype, role, stype, '*'))
    82         return keys
    82         return keys
    83     
    83 
    84     # dict compat
    84     # dict compat
    85     def __getitem__(self, key):
    85     def __getitem__(self, key):
    86         if isinstance(key, basestring):
    86         if isinstance(key, basestring):
    87             key = (key,)
    87             key = (key,)
    88         return self.rtags(*key)
    88         return self.rtags(*key)