| 176 | |
| 177 | |
| 178 | class Iter: |
| 179 | |
| 180 | def __init__(self, sobject): |
| 181 | self.sobject = sobject |
| 182 | self.keylist = self.__keylist(sobject) |
| 183 | self.index = 0 |
| 184 | |
| 185 | def __next__(self): |
| 186 | return self.next() |
| 187 | |
| 188 | def next(self): |
| 189 | keylist = self.keylist |
| 190 | nkeys = len(self.keylist) |
| 191 | while self.index < nkeys: |
| 192 | k = keylist[self.index] |
| 193 | self.index += 1 |
| 194 | if hasattr(self.sobject, k): |
| 195 | v = getattr(self.sobject, k) |
| 196 | return (k, v) |
| 197 | raise StopIteration() |
| 198 | |
| 199 | def __keylist(self, sobject): |
| 200 | keylist = sobject.__keylist__ |
| 201 | try: |
| 202 | keyset = set(keylist) |
| 203 | ordering = sobject.__metadata__.ordering |
| 204 | ordered = set(ordering) |
| 205 | if not ordered.issuperset(keyset): |
| 206 | log.debug( |
| 207 | '%s must be superset of %s, ordering ignored', |
| 208 | keylist, |
| 209 | ordering) |
| 210 | raise KeyError() |
| 211 | return ordering |
| 212 | except: |
| 213 | return keylist |
| 214 | |
| 215 | def __iter__(self): |
| 216 | return self |
| 217 | |
| 218 | |
| 219 | class Metadata(Object): |