Skip to content

Commit ee7ad5b

Browse files
committed
Change Data class and add DataElement
1 parent 519590e commit ee7ad5b

2 files changed

Lines changed: 98 additions & 30 deletions

File tree

opus/data.py

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,32 @@ class Data(object):
44
def __init__(self, json):
55
self.json = json
66
self.index = 0
7+
self._data = {}
8+
for row in self.json['page']:
9+
el = DataElement(self.columns, row)
10+
self._data[str(el)] = el
711

812
def __repr__(self):
9-
return 'OPUS API Data object (with {} elements)'.format(self.count)
13+
return 'OPUS API Data object (with {} elements):\n'.format(len(self)) + \
14+
'\n'.join(' - {}'.format(key) for key, _ in self.items())
1015

1116
def __len__(self):
12-
return self.count
17+
return len(self._data)
1318

14-
def __getitem__(self, index):
15-
return self.json['page'][index]
19+
def __getitem__(self, attr):
20+
return self._data[attr]
1621

1722
def __iter__(self):
18-
return self
23+
return iter(self._data)
1924

20-
def __next__(self):
21-
try:
22-
result = self.__getitem__(self.index)
23-
except IndexError:
24-
self.index = 0
25-
raise StopIteration
26-
self.index += 1
27-
return result
25+
def keys(self):
26+
return self._data.keys()
2827

29-
def next(self):
30-
return self.__next__()
28+
def items(self):
29+
return self._data.items()
30+
31+
def values(self):
32+
return self._data.values()
3133

3234
@property
3335
def count(self):
@@ -48,3 +50,47 @@ def page_no(self):
4850
@property
4951
def labels(self):
5052
return self.json['labels']
53+
54+
@property
55+
def columns(self):
56+
return self.json['columns']
57+
58+
class DataElement(object):
59+
def __init__(self, columns, row):
60+
self._columns = columns
61+
self._row = row
62+
self._id = None
63+
self._data = {}
64+
for column, value in zip(columns, row):
65+
if 'Ring Observation ID' in column:
66+
self._id = value
67+
else:
68+
self._data[column] = value
69+
70+
if self._id is None:
71+
raise KeyError('`Ring Observation ID` key is missing in `cols` query')
72+
73+
def __repr__(self):
74+
return 'Ring Observation ID: {}\n'.format(str(self)) + \
75+
'\n'.join(' - {}: {}'.format(key, value) for key, value in self.items())
76+
77+
def __str__(self):
78+
return self._id
79+
80+
def __len__(self):
81+
return len(self._data)
82+
83+
def __getitem__(self, attr):
84+
return self._data[attr]
85+
86+
def __iter__(self):
87+
return iter(self._data)
88+
89+
def keys(self):
90+
return self._data.keys()
91+
92+
def items(self):
93+
return self._data.items()
94+
95+
def values(self):
96+
return self._data.values()

tests/test_data.py

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

44
import json as JSON
55

6-
from opus.data import Data
6+
from opus.data import Data, DataElement
77

88
@pytest.fixture
99
def json():
@@ -13,9 +13,16 @@ def json():
1313
def data(json):
1414
return Data(json)
1515

16+
@pytest.fixture
17+
def el(data):
18+
return data['S_IMG_CO_ISS_1508094647_N']
19+
1620
def test_data_meta(data):
17-
assert repr(data) == 'OPUS API Data object (with 10 elements)'
21+
r = repr(data)
22+
assert 'OPUS API Data object (with 10 elements)' in r
23+
assert '- S_IMG_CO_ISS_1508094647_N' in r
1824
assert len(data) == 10
25+
assert data.count == 10
1926
assert data.limit == 10
2027
assert data.page_no == 2
2128
assert data.order == 'obs_general.time1'
@@ -32,18 +39,33 @@ def test_data_labels(data):
3239
assert labels[6] == 'Observation Stop Time (UTC)'
3340

3441

35-
def test_data_images(data):
36-
img = data[0]
37-
assert img[0] == 'S_IMG_CO_ISS_1508094647_N'
38-
assert img[1] == 'SAT'
39-
assert img[2] == 'PAN'
40-
assert img[3] == 87.786
41-
assert img[4] == 88.169
42-
assert img[5] == '2005-288T18:42:08.622'
43-
assert img[6] == '2005-288T18:42:09.302'
42+
def test_data_iter(data):
43+
for key in data:
44+
assert key in data.keys()
45+
break
4446

47+
for value in data.values():
48+
assert isinstance(value, DataElement)
49+
break
4550

46-
def test_data_iter(data):
47-
data.next() == data[0]
48-
for ii, img in enumerate(data):
49-
img = data[ii]
51+
52+
def test_data_element(el):
53+
assert el['Planet'] == 'SAT'
54+
assert el['Intended Target Name'] == 'PAN'
55+
assert el['Observed Phase Angle (Min)'] == 87.786
56+
assert el['Observed Phase Angle (Max)'] == 88.169
57+
assert el['Observation Start Time (UTC)'] == '2005-288T18:42:08.622'
58+
assert el['Observation Stop Time (UTC)'] == '2005-288T18:42:09.302'
59+
assert len(el) == 6
60+
assert 'Planet' in repr(el)
61+
assert 'SAT' in el.values()
62+
63+
64+
def test_data_element_iter(el):
65+
for key in el:
66+
assert key in el.keys()
67+
break
68+
69+
def test_data_element_err():
70+
with pytest.raises(KeyError):
71+
DataElement(['abc'], ['foo'])

0 commit comments

Comments
 (0)