| 263 | |
| 264 | @classmethod |
| 265 | def from_row(cls, row, columns=None): |
| 266 | if not columns: |
| 267 | colnames = 'filename funcname name kind data'.split() |
| 268 | else: |
| 269 | colnames = list(columns) |
| 270 | for i, column in enumerate(colnames): |
| 271 | if column == 'file': |
| 272 | colnames[i] = 'filename' |
| 273 | elif column == 'funcname': |
| 274 | colnames[i] = 'parent' |
| 275 | if len(row) != len(set(colnames)): |
| 276 | raise NotImplementedError(columns, row) |
| 277 | kwargs = {} |
| 278 | for column, value in zip(colnames, row): |
| 279 | if column == 'filename': |
| 280 | kwargs['file'] = FileInfo.from_raw(value) |
| 281 | elif column == 'kind': |
| 282 | kwargs['kind'] = KIND(value) |
| 283 | elif column in cls._fields: |
| 284 | kwargs[column] = value |
| 285 | else: |
| 286 | raise NotImplementedError(column) |
| 287 | return cls(**kwargs) |
| 288 | |
| 289 | @property |
| 290 | def id(self): |