Passed
Push — dev ( 4bfa05...67478a )
by Konstantinos
01:31
created

green_magic.data.backend.engine_specs   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 11
eloc 58
dl 0
loc 78
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A EngineSpecifications.from_dict() 0 3 1
A EngineTabularMutator.register_as_subclass() 0 7 1
A EngineTabularRetriever.register_as_subclass() 0 6 1
A EngineSpecifications.__call__() 0 5 1
A EngineTabularMutator.create() 0 6 2
A EngineTabularRetriever.create() 0 6 2
A EngineTabularIterator.create() 0 6 2
A EngineTabularIterator.register_as_subclass() 0 7 1
1
from abc import ABC
2
import attr
3
4
from green_magic.data.interfaces import TabularRetriever, TabularIterator, TabularMutator
5
6
7
class EngineTabularRetriever(TabularRetriever, ABC):
8
9
    subclasses = {}
10
11
    @classmethod
12
    def register_as_subclass(cls, backend_type):
13
        def wrapper(subclass):
14
            cls.subclasses[backend_type] = subclass
15
            return subclass
16
        return wrapper
17
18
    @classmethod
19
    def create(cls, backend_type, *args, **kwargs) -> TabularRetriever:
20
        if backend_type not in cls.subclasses:
21
            raise ValueError(
22
                f"Requested TabularRetriever of type '{backend_type}'; supported are [{', '.join(sorted(cls.subclasses.keys()))}]")
23
        return cls.subclasses[backend_type](*args, **kwargs)
24
25
26
class EngineTabularIterator(TabularIterator, ABC):
27
    subclasses = {}
28
29
    @classmethod
30
    def register_as_subclass(cls, backend_type):
31
        def wrapper(subclass):
32
            cls.subclasses[backend_type] = subclass
33
            return subclass
34
35
        return wrapper
36
37
    @classmethod
38
    def create(cls, backend_type, *args, **kwargs) -> TabularRetriever:
39
        if backend_type not in cls.subclasses:
40
            raise ValueError(
41
                f"Requested TabularIterator of type '{backend_type}'; supported are [{', '.join(sorted(cls.subclasses.keys()))}]")
42
        return cls.subclasses[backend_type](*args, **kwargs)
43
44
45
class EngineTabularMutator(TabularMutator, ABC):
46
    subclasses = {}
47
48
    @classmethod
49
    def register_as_subclass(cls, backend_type):
50
        def wrapper(subclass):
51
            cls.subclasses[backend_type] = subclass
52
            return subclass
53
54
        return wrapper
55
56
    @classmethod
57
    def create(cls, backend_type, *args, **kwargs) -> TabularRetriever:
58
        if backend_type not in cls.subclasses:
59
            raise ValueError(
60
                f"Requested TabularMutator of type '{backend_type}'; supported are [{', '.join(sorted(cls.subclasses.keys()))}]")
61
        return cls.subclasses[backend_type](*args, **kwargs)
62
63
64
@attr.s
65
class EngineSpecifications:
66
    name_abbreviation = attr.ib(init=True)
67
    name = attr.ib(init=True, default=attr.Factory(lambda self: self.name_abbreviation, takes_self=True))
68
69
    def __call__(self, *args, **kwargs):
70
        engine = args[0]
71
        engine.retriever = EngineTabularRetriever.subclasses[self.name_abbreviation]
72
        engine.iterator = EngineTabularIterator.subclasses[self.name_abbreviation]
73
        engine.mutator = EngineTabularMutator.subclasses[self.name_abbreviation]
74
75
    @classmethod
76
    def from_dict(cls, a_dict):
77
        return EngineSpecifications(a_dict['id'], a_dict.get('name', a_dict['id']))
78