author | sylvain.thenault@logilab.fr |
Mon, 11 May 2009 17:38:55 +0200 | |
branch | tls-sprint |
changeset 1731 | 13f948678a6a |
parent 1726 | 08918409815e |
child 1739 | 78b0819162a8 |
permissions | -rw-r--r-- |
1152 | 1 |
"""relation tags store |
2 |
||
3 |
:organization: Logilab |
|
4 |
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
|
5 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
|
6 |
""" |
|
7 |
__docformat__ = "restructuredtext en" |
|
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
8 |
|
1533 | 9 |
|
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
10 |
class RelationTags(object): |
1533 | 11 |
"""a tag store for full relation definitions : |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
12 |
|
1533 | 13 |
(subject type, relation type, object type, tagged) |
1152 | 14 |
|
15 |
allowing to set tags using wildcard (eg '*') as subject type / object type |
|
16 |
||
1533 | 17 |
This class associates a single tag to each key. |
1152 | 18 |
""" |
1451 | 19 |
|
1533 | 20 |
def __init__(self): |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
21 |
self._tagdefs = {} |
1451 | 22 |
|
1528
864ae7c15ef5
other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1451
diff
changeset
|
23 |
def __repr__(self): |
864ae7c15ef5
other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1451
diff
changeset
|
24 |
return repr(self._tagdefs) |
864ae7c15ef5
other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1451
diff
changeset
|
25 |
|
1533 | 26 |
# dict compat |
27 |
def __getitem__(self, key): |
|
28 |
return self.get(*key) |
|
29 |
__contains__ = __getitem__ |
|
1451 | 30 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
31 |
def _get_tagged(self, stype, otype, tagged=None): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
32 |
stype, otype = str(stype), str(otype) |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
33 |
if tagged is None: |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
34 |
if stype[0] == '!': |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
35 |
tagged = 'subject' |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
36 |
stype = stype[1:] |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
37 |
elif otype[0] == '!': |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
38 |
tagged = 'object' |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
39 |
otype = otype[1:] |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
40 |
else: |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
41 |
raise AssertionError('either stype or rtype should have the ' |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
42 |
'role mark ("!")') |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
43 |
else: |
1726
08918409815e
[rtags] .get api change
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents:
1723
diff
changeset
|
44 |
assert tagged in ('subject', 'object'), repr(tagged) |
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
45 |
return stype, otype, tagged |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
46 |
|
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
47 |
def _get_keys(self, stype, rtype, otype, tagged=None): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
48 |
stype, otype, tagged = self._get_tagged(stype, otype, tagged) |
1533 | 49 |
keys = [(rtype, tagged, '*', '*'), |
50 |
(rtype, tagged, '*', otype), |
|
51 |
(rtype, tagged, stype, '*'), |
|
52 |
(rtype, tagged, stype, otype)] |
|
53 |
if stype == '*' or otype == '*': |
|
54 |
keys.remove((rtype, tagged, '*', '*')) |
|
55 |
if stype == '*': |
|
56 |
keys.remove((rtype, tagged, '*', otype)) |
|
57 |
if otype == '*': |
|
58 |
keys.remove((rtype, tagged, stype, '*')) |
|
59 |
return keys |
|
1451 | 60 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
61 |
def tag_relation(self, stype, rtype, otype, tag, tagged=None): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
62 |
stype, otype, tagged = self._get_tagged(stype, otype, tagged) |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
63 |
self._tagdefs[(str(rtype), tagged, stype, otype)] = tag |
1548
bd225e776739
new tag_attribute convenience method
sylvain.thenault@logilab.fr
parents:
1533
diff
changeset
|
64 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
65 |
def tag_attribute(self, stype, attr, tag): |
1723 | 66 |
self.tag_relation(stype, attr, '*', tag, 'subject') |
1533 | 67 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
68 |
def del_rtag(self, stype, rtype, otype): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
69 |
stype, otype, tagged = self._get_tagged(stype, otype) |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
70 |
del self._tagdefs[(str(rtype), tagged, stype, otype)] |
1533 | 71 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
72 |
def get(self, stype, rtype, otype, tagged=None): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
73 |
for key in reversed(self._get_keys(stype, rtype, otype, tagged)): |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
74 |
try: |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
75 |
return self._tagdefs[key] |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
76 |
except KeyError: |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
77 |
continue |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
78 |
return None |
1451 | 79 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
80 |
def etype_get(self, etype, rtype, role, ttype='*'): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
81 |
if role == 'subject': |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
82 |
return self.get(etype, rtype, ttype, role) |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
83 |
return self.get(ttype, rtype, etype, role) |
1533 | 84 |
|
85 |
||
1451 | 86 |
|
1533 | 87 |
class RelationTagsSet(RelationTags): |
88 |
"""This class associates a set of tags to each key.""" |
|
89 |
||
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
90 |
def tag_relation(self, stype, rtype, otype, tag, tagged=None): |
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
91 |
stype, otype, tagged = self._get_tagged(stype, otype, tagged) |
1533 | 92 |
rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set()) |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
93 |
rtags.add(tag) |
1451 | 94 |
|
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
95 |
def get(self, stype, rtype, otype, tagged=None): |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
96 |
rtags = set() |
1721
694f6a50e138
final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents:
1548
diff
changeset
|
97 |
for key in self._get_keys(stype, rtype, otype, tagged): |
1148
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
98 |
try: |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
99 |
rtags.update(self._tagdefs[key]) |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
100 |
except KeyError: |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
101 |
continue |
55a8238f8f7c
keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
102 |
return rtags |