Skip to content

Commit 6712b79

Browse files
committed
Merge pull request #1491 from dhermes/bigtable-partial-rows
Adding Bigtable PartialRowsData.
2 parents 67684e5 + 1a73441 commit 6712b79

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

gcloud/bigtable/row_data.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,37 @@ def to_dict(self):
109109
_to_bytes(column_qual))
110110
result[key] = cells
111111
return result
112+
113+
114+
class PartialRowsData(object):
115+
"""Convenience wrapper for consuming a ``ReadRows`` streaming response.
116+
117+
:type response_iterator:
118+
:class:`grpc.framework.alpha._reexport._CancellableIterator`
119+
:param response_iterator: A streaming iterator returned from a
120+
``ReadRows`` request.
121+
"""
122+
123+
def __init__(self, response_iterator):
124+
# We expect an iterator of `data_messages_pb2.ReadRowsResponse`
125+
self._response_iterator = response_iterator
126+
self._rows = {}
127+
128+
def __eq__(self, other):
129+
if not isinstance(other, self.__class__):
130+
return False
131+
return other._response_iterator == self._response_iterator
132+
133+
def __ne__(self, other):
134+
return not self.__eq__(other)
135+
136+
@property
137+
def rows(self):
138+
"""Property returning all rows accumulated from the stream.
139+
140+
:rtype: dict
141+
:returns: Dictionary of :class:`PartialRowData`.
142+
"""
143+
# NOTE: To avoid duplicating large objects, this is just the
144+
# mutable private data.
145+
return self._rows

gcloud/bigtable/test_row_data.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,50 @@ def test_to_dict(self):
176176
b'name2:col3': cell3,
177177
}
178178
self.assertEqual(result, expected_result)
179+
180+
181+
class TestPartialRowsData(unittest2.TestCase):
182+
183+
def _getTargetClass(self):
184+
from gcloud.bigtable.row_data import PartialRowsData
185+
return PartialRowsData
186+
187+
def _makeOne(self, *args, **kwargs):
188+
return self._getTargetClass()(*args, **kwargs)
189+
190+
def test_constructor(self):
191+
response_iterator = object()
192+
partial_rows_data = self._makeOne(response_iterator)
193+
self.assertTrue(partial_rows_data._response_iterator
194+
is response_iterator)
195+
self.assertEqual(partial_rows_data._rows, {})
196+
197+
def test___eq__(self):
198+
response_iterator = object()
199+
partial_rows_data1 = self._makeOne(response_iterator)
200+
partial_rows_data2 = self._makeOne(response_iterator)
201+
self.assertEqual(partial_rows_data1, partial_rows_data2)
202+
203+
def test___eq__type_differ(self):
204+
partial_rows_data1 = self._makeOne(None)
205+
partial_rows_data2 = object()
206+
self.assertNotEqual(partial_rows_data1, partial_rows_data2)
207+
208+
def test___ne__same_value(self):
209+
response_iterator = object()
210+
partial_rows_data1 = self._makeOne(response_iterator)
211+
partial_rows_data2 = self._makeOne(response_iterator)
212+
comparison_val = (partial_rows_data1 != partial_rows_data2)
213+
self.assertFalse(comparison_val)
214+
215+
def test___ne__(self):
216+
response_iterator1 = object()
217+
partial_rows_data1 = self._makeOne(response_iterator1)
218+
response_iterator2 = object()
219+
partial_rows_data2 = self._makeOne(response_iterator2)
220+
self.assertNotEqual(partial_rows_data1, partial_rows_data2)
221+
222+
def test_rows_getter(self):
223+
partial_rows_data = self._makeOne(None)
224+
partial_rows_data._rows = value = object()
225+
self.assertTrue(partial_rows_data.rows is value)

0 commit comments

Comments
 (0)