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) |