1
2
3
4
5
6 import sys
7 from rdkit import six
8
10 """ base class for all virtual library nodes,
11 defines minimal required interface
12
13 """
15 self._children = []
16 self._parents = []
17
18
19
20
21
23 """ part of the iterator interface """
24 self.reset()
25 return self
27 """ part of the iterator interface
28
29 raises StopIteration on failure
30 """
31 pass
38
39
40
41
42
43
44
45
47 """
48
49 >>> p1 = VLibNode()
50 >>> p2 = VLibNode()
51 >>> c1 = VLibNode()
52 >>> p1.AddChild(c1)
53 >>> len(c1.GetParents())
54 1
55 >>> len(p1.GetChildren())
56 1
57 >>> p2.AddChild(c1,notify=0)
58 >>> len(c1.GetParents())
59 1
60 >>> len(p2.GetChildren())
61 1
62 >>> c1.AddParent(p2,notify=0)
63 >>> len(c1.GetParents())
64 2
65 >>> len(p2.GetChildren())
66 1
67
68 """
69 self._children.append(child)
70 if notify:
71 child.AddParent(self,notify=0)
73 """
74 >>> p1 = VLibNode()
75 >>> c1 = VLibNode()
76 >>> p1.AddChild(c1)
77 >>> len(c1.GetParents())
78 1
79 >>> len(p1.GetChildren())
80 1
81 >>> p1.RemoveChild(c1)
82 >>> len(c1.GetParents())
83 0
84 >>> len(p1.GetChildren())
85 0
86 """
87 self._children.remove(child)
88 if notify:
89 child.RemoveParent(self,notify=0)
91 return tuple(self._children)
92
94 """
95 >>> p1 = VLibNode()
96 >>> p2 = VLibNode()
97 >>> c1 = VLibNode()
98 >>> c1.AddParent(p1)
99 >>> len(c1.GetParents())
100 1
101 >>> len(p1.GetChildren())
102 1
103 >>> c1.AddParent(p2,notify=0)
104 >>> len(c1.GetParents())
105 2
106 >>> len(p2.GetChildren())
107 0
108 >>> p2.AddChild(c1,notify=0)
109 >>> len(c1.GetParents())
110 2
111 >>> len(p2.GetChildren())
112 1
113 """
114 self._parents.append(parent)
115 if notify:
116 parent.AddChild(self,notify=0)
118 """
119 >>> p1 = VLibNode()
120 >>> c1 = VLibNode()
121 >>> p1.AddChild(c1)
122 >>> len(c1.GetParents())
123 1
124 >>> len(p1.GetChildren())
125 1
126 >>> c1.RemoveParent(p1)
127 >>> len(c1.GetParents())
128 0
129 >>> len(p1.GetChildren())
130 0
131 """
132 self._parents.remove(parent)
133 if notify:
134 parent.RemoveChild(self,notify=0)
136 return tuple(self._parents)
137
138 - def Destroy(self,notify=1,propagateDown=0,propagateUp=0):
139 """
140 >>> p1 = VLibNode()
141 >>> p2 = VLibNode()
142 >>> c1 = VLibNode()
143 >>> c2 = VLibNode()
144 >>> p1.AddChild(c1)
145 >>> p2.AddChild(c1)
146 >>> p2.AddChild(c2)
147 >>> len(c1.GetParents())
148 2
149 >>> len(c2.GetParents())
150 1
151 >>> len(p1.GetChildren())
152 1
153 >>> len(p2.GetChildren())
154 2
155 >>> c1.Destroy(propagateUp=1)
156 >>> len(p2.GetChildren())
157 0
158 >>> len(c1.GetParents())
159 0
160 >>> len(c2.GetParents())
161 0
162
163 """
164
165 if hasattr(self,'_destroyed'): return
166 self._destroyed=1
167
168 if notify:
169 for o in self.GetChildren():
170 o.RemoveParent(self,notify=0)
171 if propagateDown:
172 o.Destroy(notify=1,propagateDown=1,propagateUp=propagateUp)
173 for o in self.GetParents():
174
175 o.RemoveChild(self,notify=0)
176 if propagateUp:
177 o.Destroy(notify=1,propagateDown=propagateDown,propagateUp=1)
178 self._children = []
179 self._parents = []
180
181 if six.PY3:
182 VLibNode.__next__ = VLibNode.next
183
184
185
186
187
188
190 import doctest,sys
191 return doctest.testmod(sys.modules["__main__"])
192
193 if __name__ == '__main__':
194 import sys
195 failed,tried = _test()
196 sys.exit(failed)
197