Passed
Push — dev ( 5faf7b...5a9f48 )
by Konstantinos
01:22
created

test_data_manager.test_json_data()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
import pytest
2
from green_magic.data.commands_manager import CommandsManager
3
from green_magic.data.backend import Backend, DataEngine
4
from green_magic.data.data_manager import DataManager
5
from green_magic.data.backend import panda_handling
6
7
8
@pytest.fixture()
9
def test_json_data(sample_json):
10
    return {
11
        'file_path': sample_json,
12
        'nb_lines': 100,
13
        'attributes': {'flavors', 'name', 'medical', 'description', 'image_urls', 'parents', 'negatives', 'grow_info', '_id', 'type', 'image_paths', 'effects'},
14
    }
15
16
def test_engine_registration():
17
    from green_magic.data.backend import DataEngine
18
    from green_magic.data.backend.engine import EngineType
19
    assert type(DataEngine) == EngineType
20
    from green_magic.data.commands_manager import CommandRegistrator
21
22
    # type(type(DataEngine))
23
    ATTRS = ('registry', '_commands', 'command')
24
    DataEngine.new('test_pd')
25
    assert 'test_pd' in DataEngine.subclasses
26
    assert type(DataEngine.test_pd) == type(DataEngine)
27
    assert all(hasattr(DataEngine.test_pd, x) for x in ATTRS)
28
29
    DataEngine.new('data_lib')
30
    assert 'data_lib' in DataEngine.subclasses
31
    assert type(DataEngine.data_lib) == type(DataEngine)
32
    assert all(hasattr(DataEngine.data_lib, x) for x in ATTRS)
33
34
    for x in ATTRS:
35
        print(getattr(DataEngine.test_pd, x), getattr(DataEngine.data_lib, x))
36
        assert id(getattr(DataEngine.test_pd, x)) != id(getattr(DataEngine.data_lib, x)) != id(DataEngine.registry)
37
38
    assert id(DataEngine.test_pd.datapoints_factory) == id(DataEngine.data_lib.datapoints_factory)
39
40
    import pandas as pd
41
    @DataEngine.test_pd.command
42
    def observations(file_path):
43
        return pd.read_json(file_path, lines=True)
44
45
    # TODO uncomment below
46
    # assert len(DataEngine.test_pd.registry) == 1
47
    # assert len(DataEngine.data_lib.registry) == 0
48
49
    # assert all(id(getattr(DataEngine.test_pd, x) != id(getattr(DataEngine.data_lib, x)) for x in ATTRS))
50
51
52
def test_data_manager(test_json_data):
53
    import types
54
    from green_magic.utils.commands import Command
55
    from green_magic.data.backend.panda_handling.df_backend import PDTabularIterator, PDTabularRetriever, PDTabularReporter
56
    from green_magic.data.features.phi import PhiFunction
57
58
    DataEngine.new('test_pd')
59
    assert 'test_pd' in DataEngine.subclasses
60
    assert hasattr(DataEngine, 'state')
61
    assert hasattr(DataEngine, 'registry')
62
63
    data_api = DataManager(CommandsManager(), Backend(DataEngine.create('test_pd')))
64
    # make the datapoint_manager listen to newly created Datapoints objects events
65
    assert hasattr(data_api, 'commands_manager')
66
    assert hasattr(data_api.commands_manager, 'command')
67
    assert hasattr(data_api.backend, 'datapoints_manager')
68
69
    data_api.backend.engine.__class__.datapoints_factory.subject.attach(data_api.backend.datapoints_manager)
70
    DataEngine.test_pd.command_factory.attach(data_api.commands_manager.command.accumulator)
71
    PhiFunction.subject.attach(data_api.phis)
72
73
    assert data_api.backend.engine.__class__.datapoints_factory not in PhiFunction.subject._observers
74
75
    # test runtime command registration
76
    import pandas as pd
77
    @DataEngine.test_pd.dec()
78
    def observations(file_path):
79
        return pd.read_json(file_path, lines=True)
80
81
    @DataEngine.test_pd.dec()
82
    def add_attribute(_datapoints, values, new_attribute):
83
        print("CORRECT")
84
        _datapoints.observations[new_attribute] = values
85
86
    assert type(DataEngine.test_pd) == type(DataEngine)
87
    assert type(DataEngine.test_pd.registry) == dict
88
    assert type(DataEngine.test_pd._commands) == dict
89
    assert 'observations' in DataEngine.test_pd.registry
90
    assert 'observations' in DataEngine.test_pd._commands
91
    assert 'observations' not in DataEngine.registry
92
93
    assert type(DataEngine.test_pd._commands['observations']) == Command
94
95
    cmd = DataEngine.test_pd._commands['observations']
96
    # cmd = data_api.command.observations
97
    cmd.args = [test_json_data['file_path']]
98
99
    assert type(cmd._receiver) == types.FunctionType
100
    assert cmd._method == '__call__'
101
    assert cmd.args == [test_json_data['file_path']]
102
103
    from green_magic.utils.commands import Invoker, CommandHistory
104
105
    DataEngine.test_pd.retriever = PDTabularRetriever
106
    DataEngine.test_pd.iterator = PDTabularIterator
107
    DataEngine.test_pd.reporter = PDTabularReporter
108
109
    inv = Invoker(CommandHistory())
110
    inv.execute_command(cmd)
111
112
    datapoints = data_api.backend.datapoints_manager.datapoints
113
    assert len(datapoints) == test_json_data['nb_lines']
114
    print(datapoints.attributes)
115
116
    assert set(datapoints.attributes) == test_json_data['attributes']
117
118
    assert 'add_attribute' in DataEngine.test_pd.registry
119
120
    cmd1 = DataEngine.test_pd._commands['add_attribute']
121
    # cmd1 = data_api.command.observations
122
    cmd1.args = [datapoints, [_ for _ in range(1, len(datapoints) + 1)], 'test_attr']
123
124
    cmd1.execute()
125
126
    assert set(datapoints.attributes) == set(_ for _ in list(test_json_data['attributes']) + ['test_attr'])
127