root/gaphor/tags/gaphor-0.7.0/uml2/collection.py

Revision 445, 5.4 kB (checked in by arjanmol, 4 years ago)

*** empty log message ***

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