Passed
Pull Request — dev (#32)
by Konstantinos
02:28 queued 52s
created

get_operator()   A

Complexity

Conditions 2

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nop 2
dl 0
loc 13
rs 9.9
c 0
b 0
f 0
1
import inspect
2
import types
3
import attr
4
5
from so_magic.data.backend.engine_specs import EngineTabularRetriever, EngineTabularIterator, EngineTabularMutator
6
from .client_code import PDTabularRetrieverDelegate, PDTabularIteratorDelegate, PDTabularMutatorDelegate
7
8
9
__all__ = ['PDTabularRetriever', 'PDTabularIterator', 'PDTabularMutator']
10
11
12
# INFRASTRUCTURE
13
14
def with_self(function):
15
    def _function(_self, *args, **kwargs):
16
        return function(*args, **kwargs)
17
    return _function
18
19
20
class Delegate:
21
    def __new__(cls, *args, **kwargs):
22
        delegate_ins = super().__new__(cls)
23
        tabular_operator = args[0]
24
        for _member_name, member in inspect.getmembers(
25
                tabular_operator, predicate=lambda x: any([inspect.ismethod(x), inspect.isfunction(x)])):
26
            if isinstance(member, types.FunctionType):  # if no decorator is used
27
                setattr(delegate_ins, member.__name__, types.MethodType(member, delegate_ins))
28
            if isinstance(member, types.MethodType):  # if @classmethod is used
29
                setattr(delegate_ins, member.__name__, types.MethodType(with_self(member), delegate_ins))
30
        return delegate_ins
31
32
33
tabular_operators = {
34
    'retriever': {
35
        'implementations': {
36
            'pd': PDTabularRetrieverDelegate,
37
        },
38
        'class_registry': EngineTabularRetriever,
39
    },
40
    'iterator': {
41
        'implementations': {
42
            'pd': PDTabularIteratorDelegate,
43
        },
44
        'class_registry': EngineTabularIterator,
45
    },
46
    'mutator': {
47
        'implementations': {
48
            'pd': PDTabularMutatorDelegate,
49
        },
50
        'class_registry': EngineTabularMutator,
51
    }
52
}
53
54
55
def get_operator(backend_id: str, operator_type: str):
56
    class_registry = tabular_operators[operator_type]['class_registry']
57
    
58
    @attr.s
59
    @class_registry.register_as_subclass(backend_id)
60
    class OperatorClass(class_registry):
61
        _delegate = attr.ib(
62
            default=attr.Factory(lambda: Delegate(tabular_operators[operator_type]['implementations'][backend_id])))
63
64
        def __getattr__(self, name: str):
65
            return getattr(self._delegate, name)
66
67
    return OperatorClass
68
69
70
# CONCRETE IMPLEMENTATIONS
71
72
PDTabularRetriever = get_operator('pd', 'retriever')
73
PDTabularIterator = get_operator('pd', 'iterator')
74
PDTabularMutator = get_operator('pd', 'mutator')
75