Skip to content

Commit 69798e0

Browse files
committed
Add DataDict class
1 parent f3b8f0c commit 69798e0

2 files changed

Lines changed: 55 additions & 49 deletions

File tree

opus/data.py

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
# -*- coding: utf-8 -*-
22

3-
class Data(object):
4-
def __init__(self, json):
5-
self._json = json
3+
class DataDict(object):
4+
def __init__(self):
65
self._data = {}
7-
for row in json['page']:
8-
el = DataElement(self.columns, row)
9-
self._data[str(el)] = el
106

117
def __repr__(self):
12-
return 'OPUS API Data object (with {} elements):\n'.format(len(self)) + \
13-
'\n'.join(' - {}'.format(key) for key, _ in self.items())
8+
return '<OPUS API generic class for data objects>'
149

1510
def __len__(self):
1611
return len(self._data)
@@ -30,6 +25,21 @@ def items(self):
3025
def values(self):
3126
return self._data.values()
3227

28+
def append(self, key, value):
29+
self._data[key] = value
30+
31+
class Data(DataDict):
32+
def __init__(self, json):
33+
DataDict.__init__(self)
34+
self._json = json
35+
for row in json['page']:
36+
el = DataElement(self.columns, row)
37+
self._data[str(el)] = el
38+
39+
def __repr__(self):
40+
return 'OPUS API Data object (with {} elements):\n'.format(len(self)) + \
41+
'\n'.join(' - {}'.format(key) for key, _ in self.items())
42+
3343
@property
3444
def count(self):
3545
return int(self._json['count'])
@@ -54,17 +64,18 @@ def labels(self):
5464
def columns(self):
5565
return self._json['columns']
5666

57-
class DataElement(object):
67+
68+
class DataElement(DataDict):
5869
def __init__(self, columns, row):
70+
DataDict.__init__(self)
5971
self._columns = columns
6072
self._row = row
6173
self._id = None
62-
self._data = {}
6374
for column, value in zip(columns, row):
6475
if 'Ring Observation ID' in column:
6576
self._id = value
6677
else:
67-
self._data[column] = value
78+
self.append(column, value)
6879

6980
if self._id is None:
7081
raise KeyError('`Ring Observation ID` key is missing in `cols` query')
@@ -75,21 +86,3 @@ def __repr__(self):
7586

7687
def __str__(self):
7788
return self._id
78-
79-
def __len__(self):
80-
return len(self._data)
81-
82-
def __getitem__(self, attr):
83-
return self._data[attr]
84-
85-
def __iter__(self):
86-
return iter(self._data)
87-
88-
def keys(self):
89-
return self._data.keys()
90-
91-
def items(self):
92-
return self._data.items()
93-
94-
def values(self):
95-
return self._data.values()

tests/test_data.py

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33

44
import json as JSON
55

6-
from opus.data import Data, DataElement
6+
from opus.data import DataDict, Data, DataElement
7+
8+
9+
@pytest.fixture
10+
def data_dict():
11+
return DataDict()
712

813
@pytest.fixture
914
def json():
@@ -17,11 +22,35 @@ def data(json):
1722
def el(data):
1823
return data['S_IMG_CO_ISS_1508094647_N']
1924

25+
26+
def test_data_dict(data_dict):
27+
data_dict.append('abc', 'foo')
28+
assert repr(data_dict) == '<OPUS API generic class for data objects>'
29+
assert len(data_dict) == 1
30+
assert data_dict['abc'] == 'foo'
31+
32+
33+
def test_data_dict_iter(data_dict):
34+
data_dict.append('abc', 'foo')
35+
36+
for key in data_dict:
37+
assert key == 'abc'
38+
39+
for key in data_dict.keys():
40+
assert key == 'abc'
41+
42+
for key, value in data_dict.items():
43+
assert key == 'abc'
44+
assert value == 'foo'
45+
46+
for value in data_dict.values():
47+
assert value == 'foo'
48+
49+
2050
def test_data_meta(data):
2151
r = repr(data)
2252
assert 'OPUS API Data object (with 10 elements)' in r
23-
assert '- S_IMG_CO_ISS_1508094647_N' in r
24-
assert len(data) == 10
53+
assert 'S_IMG_CO_ISS_1508094647_N' in r
2554
assert data.count == 10
2655
assert data.limit == 10
2756
assert data.page_no == 2
@@ -39,32 +68,16 @@ def test_data_labels(data):
3968
assert labels[6] == 'Observation Stop Time (UTC)'
4069

4170

42-
def test_data_iter(data):
43-
for key in data:
44-
assert key in data.keys()
45-
break
46-
47-
for value in data.values():
48-
assert isinstance(value, DataElement)
49-
break
50-
51-
5271
def test_data_element(el):
72+
assert 'Planet' in repr(el)
5373
assert el['Planet'] == 'SAT'
5474
assert el['Intended Target Name'] == 'PAN'
5575
assert el['Observed Phase Angle (Min)'] == 87.786
5676
assert el['Observed Phase Angle (Max)'] == 88.169
5777
assert el['Observation Start Time (UTC)'] == '2005-288T18:42:08.622'
5878
assert el['Observation Stop Time (UTC)'] == '2005-288T18:42:09.302'
5979
assert len(el) == 6
60-
assert 'Planet' in repr(el)
61-
assert 'SAT' in el.values()
62-
6380

64-
def test_data_element_iter(el):
65-
for key in el:
66-
assert key in el.keys()
67-
break
6881

6982
def test_data_element_err():
7083
with pytest.raises(KeyError):

0 commit comments

Comments
 (0)