Skip to content

Commit e446a86

Browse files
committed
address gemini comments
1 parent b8fdf59 commit e446a86

3 files changed

Lines changed: 75 additions & 3 deletions

File tree

packages/google-cloud-bigtable/google/cloud/bigtable/helpers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,15 @@ def __init__(self, *args, **kwargs):
4848
super(_MappableAttributesMixin, self).__init__(*args, **new_kwargs)
4949

5050
def __getattr__(self, name):
51+
if name == "_attribute_map":
52+
raise AttributeError
5153
if name not in self._attribute_map:
5254
raise AttributeError
5355
return getattr(self, self._attribute_map[name])
5456

5557
def __setattr__(self, name, value):
58+
if name == "_attribute_map":
59+
super(_MappableAttributesMixin, self).__setattr__(name, value)
60+
return
5661
attribute = self._attribute_map.get(name, name)
5762
super(_MappableAttributesMixin, self).__setattr__(attribute, value)

packages/google-cloud-bigtable/google/cloud/bigtable/row_set.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ def get_range_kwargs(self):
186186
"""Convert row range object to dict which can be passed to
187187
google.bigtable.v2.RowRange add method.
188188
"""
189-
return {
190-
descriptor.name: value for descriptor, value in self._pb._pb.ListFields()
191-
}
189+
range_kwargs = {}
190+
if self.start_key is not None:
191+
key = "start_key_closed" if self.start_is_inclusive else "start_key_open"
192+
range_kwargs[key] = self.start_key
193+
if self.end_key is not None:
194+
key = "end_key_closed" if self.end_is_inclusive else "end_key_open"
195+
range_kwargs[key] = self.end_key
196+
return range_kwargs

packages/google-cloud-bigtable/tests/unit/v2_client/test_row_set.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,68 @@ def test_row_range_get_range_kwargs_open_closed():
279279
assert expected_result == actual_result
280280

281281

282+
def test_row_range_get_range_kwargs_unbounded_start():
283+
from google.cloud.bigtable.row_set import RowRange
284+
285+
end_key = b"row_key9"
286+
expected_result = {"end_key_open": end_key}
287+
row_range = RowRange(None, end_key)
288+
actual_result = row_range.get_range_kwargs()
289+
assert expected_result == actual_result
290+
291+
292+
def test_row_range_get_range_kwargs_unbounded_end():
293+
from google.cloud.bigtable.row_set import RowRange
294+
295+
start_key = b"row_key1"
296+
expected_result = {"start_key_closed": start_key}
297+
row_range = RowRange(start_key, None)
298+
actual_result = row_range.get_range_kwargs()
299+
assert expected_result == actual_result
300+
301+
302+
def test_mappable_attributes_mixin_guard_recursion():
303+
import pytest
304+
305+
from google.cloud.bigtable.helpers import _MappableAttributesMixin
306+
307+
class Uninitialized(_MappableAttributesMixin):
308+
pass
309+
310+
obj = Uninitialized()
311+
with pytest.raises(AttributeError):
312+
_ = obj._attribute_map
313+
with pytest.raises(AttributeError):
314+
_ = obj.non_existent_attribute
315+
316+
# Verify setattr on _attribute_map doesn't cause recursion
317+
obj._attribute_map = {"old_attr": "new_attr"}
318+
assert obj._attribute_map == {"old_attr": "new_attr"}
319+
320+
321+
def test_mappable_attributes_mixin_remap():
322+
import pytest
323+
324+
from google.cloud.bigtable.helpers import _MappableAttributesMixin
325+
326+
class DummyBase:
327+
def __init__(self, target_attr=None):
328+
self.target_attr = target_attr
329+
330+
class MappedClass(_MappableAttributesMixin, DummyBase):
331+
_attribute_map = {"source_attr": "target_attr"}
332+
333+
instance = MappedClass(source_attr="hello")
334+
assert instance.target_attr == "hello"
335+
assert instance.source_attr == "hello"
336+
337+
instance.source_attr = "world"
338+
assert instance.target_attr == "world"
339+
340+
with pytest.raises(AttributeError):
341+
_ = instance.unknown_attr
342+
343+
282344
def _ReadRowsRequestPB(*args, **kw):
283345
from google.cloud.bigtable_v2.types import bigtable as messages_v2_pb2
284346

0 commit comments

Comments
 (0)