| Total Complexity | 2 | 
| Total Lines | 30 | 
| Duplicated Lines | 0 % | 
| Changes | 0 | ||
| 1 | import attr  | 
            ||
| 2 | |||
| 3 | from so_magic.utils import SubclassRegistry  | 
            ||
| 4 | |||
| 5 | |||
| 6 | class EngineTabularRetriever(metaclass=SubclassRegistry): pass  | 
            ||
| 7 | |||
| 8 | |||
| 9 | class EngineTabularIterator(metaclass=SubclassRegistry): pass  | 
            ||
| 10 | |||
| 11 | |||
| 12 | class EngineTabularMutator(metaclass=SubclassRegistry): pass  | 
            ||
| 13 | |||
| 14 | |||
| 15 | @attr.s  | 
            ||
| 16 | class BackendSpecifications:  | 
            ||
| 17 | name_abbreviation = attr.ib(init=True)  | 
            ||
| 18 | name = attr.ib(init=True, default=attr.Factory(lambda self: self.name_abbreviation, takes_self=True))  | 
            ||
| 19 | |||
| 20 | def __call__(self, *args, **kwargs):  | 
            ||
| 21 | backend = args[0]  | 
            ||
| 22 | backend.retriever = EngineTabularRetriever.subclasses[self.name_abbreviation]  | 
            ||
| 23 | backend.iterator = EngineTabularIterator.subclasses[self.name_abbreviation]  | 
            ||
| 24 | backend.mutator = EngineTabularMutator.subclasses[self.name_abbreviation]  | 
            ||
| 25 | backend.id = self.name_abbreviation  | 
            ||
| 26 | |||
| 27 | @classmethod  | 
            ||
| 28 | def from_dict(cls, a_dict):  | 
            ||
| 29 |         return BackendSpecifications(a_dict['id'], a_dict.get('name', a_dict['id'])) | 
            ||
| 30 |