root/gaphor/tags/gaphor-0.12.5/gaphor/UML/collection.py

Revision 1835, 5.3 kB (checked in by wrobe..@pld-linux.org, 1 year ago)

- killed moveDown/moveUp collection methods, use swap instead

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 """
2 1:n and n:m relations in the data model are saved using a collection.
3 """
4
5 import inspect
6
7 class CollectionError(Exception):
8     pass
9
10 class collection(object):
11     """
12     Collection (set-like) for model elements' 1:n and n:m relationships.
13     """
14
15     def __init__(self, property, object, type):
16         self.property = property
17         self.object = object
18         self.type = type
19         self.items = []
20
21     def __len__(self):
22         return len(self.items)
23
24     def __setitem__(self, key, value):
25         raise CollectionError, 'items should not be overwritten.'
26
27     def __delitem__(self, key):
28         self.remove(key)
29
30     def __getitem__(self, key):
31         return self.items.__getitem__(key)
32
33     def __getslice__(self, i, j):
34         return self.items.__getslice__(i, j)
35
36     def __setslice__(self, i, j, s):
37         raise CollectionError, 'items should not be overwritten.'
38
39     def __delslice__(self, i, j):
40         raise CollectionError, 'items should not be deleted this way.'
41
42     def __contains__(self, obj):
43         return self.items.__contains__(obj)
44
45     def __iter__(self):
46         return iter(self.items)
47
48     def __str__(self):
49         return str(self.items)
50
51     __repr__ = __str__
52
53     def __nonzero__(self):
54         return self.items!=[]
55
56     def append(self, value):
57         if isinstance(value, self.type):
58             self.property._set(self.object, value)
59         else:
60             raise CollectionError, 'Object is not of type %s' % self.type.__name__
61
62     def remove(self, value):
63         if value in self.items:
64             self.property.__delete__(self.object, value)
65         else:
66             raise AttributeError, '%s not in collection' % value
67
68
69     def index(self, key):
70         """
71         Given an object, return the position of that object in the
72         collection.
73         """
74         return self.items.index(key)
75
76
77     # OCL members (from SMW by Ivan Porres, http://www.abo.fi/~iporres/smw)
78
79     def size(self):
80         return len(self.items)
81
82     def includes(self,o):
83         return o in self.items
84
85     def excludes(self,o):
86         return not self.includes(o)
87
88     def count(self,o):
89         c=0
90         for x in self.items:
91             if x==o:
92                 c=c+1
93         return c
94
95     def includesAll(self,c):
96         for o in c:
97             if o not in self.items:
98                 return 0
99         return 1
100
101     def excludesAll(self,c):
102         for o in c:
103             if o in self.items:
104                 return 0
105         return 1
106
107     def select(self,f):
108         result=list()
109         for v in self.items:
110             if f(v):
111                 result.append(v)
112         return result
113
114     def reject(self,f):
115         result=list()
116         for v in self.items:
117             if not f(v):
118                 result.append(v)
119         return result
120
121     def collect(self,f):
122         result=list()
123         for v in self.items:
124             result.append(f(v))
125         return result
126
127     def isEmpty(self):
128         return len(self.items)==0
129
130     def nonEmpty(self):
131         return not self.isEmpty()
132    
133     def sum(self):
134         r=0
135         for o in self.items:
136             r=r+o
137         return o
138    
139     def forAll(self,f):
140         if not self.items or not inspect.getargspec(f)[0]:
141             return True
142
143         nargs=len(inspect.getargspec(f)[0])
144         if inspect.getargspec(f)[3]:
145             nargs=nargs-len(inspect.getargspec(f)[3])
146            
147         assert(nargs>0)
148         nitems=len(self.items)
149         index=[0]*nargs
150        
151         while 1:
152             args=[]
153             for x in index:
154                 args.append(self.items[x])
155             if not apply(f,args):
156                 return False
157             c=len(index)-1
158             index[c]=index[c]+1
159             while index[c]==nitems:
160                 index[c]=0
161                 c=c-1
162                 if c<0:
163                     return True
164                 else:
165                     index[c]=index[c]+1
166                 if index[c]==nitems-1:
167                     c=c-1
168         return False
169
170     def exist(self,f):
171         if not self.items or not inspect.getargspec(f)[0]:
172             return False
173
174         nargs=len(inspect.getargspec(f)[0])
175         if inspect.getargspec(f)[3]:
176             nargs=nargs-len(inspect.getargspec(f)[3])
177            
178         assert(nargs>0)
179         nitems=len(self.items)
180         index=[0]*nargs
181         while 1:
182             args=[]
183             for x in index:
184                 args.append(self.items[x])
185             if apply(f,args):
186                 return True
187             c=len(index)-1
188             index[c]=index[c]+1
189             while index[c]==nitems:
190                 index[c]=0
191                 c=c-1
192                 if c<0:
193                     return False
194                 else:
195                     index[c]=index[c]+1
196                 if index[c]==nitems-1:
197                     c=c-1
198         return False
199
200
201     def swap(self, item1, item2):
202         """
203         Swap two elements. Return true if swap was successful.
204         """
205         try:
206             i1 = self.items.index(item1)
207             i2 = self.items.index(item2)
208             self.items[i1], self.items[i2] = self.items[i2], self.items[i1]
209             # send a notification that this list has changed
210             self.property.notify(self.object)
211             return True
212         except IndexError, ex:
213             return False
214         except ValueError, ex:
215             return False
216
217
218 # vi:sw=4:et
Note: See TracBrowser for help on using the browser.