Skip to content

Commit e73291f

Browse files
committed
Make language list weakly private and make most_specific on Subdivisions a property that always returns an object.
1 parent eab2504 commit e73291f

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

geoip2/records.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ class PlaceRecord(Record):
2828
def __init__(self, languages=None, **kwargs):
2929
if languages is None:
3030
languages = ['en']
31-
object.__setattr__(self, 'languages', languages)
31+
if kwargs.get('names') is None:
32+
kwargs['names'] = {}
33+
object.__setattr__(self, '_languages', languages)
3234
super(PlaceRecord, self).__init__(**kwargs)
3335

3436
@property
3537
def name(self):
36-
return next((self.names.get(x) for x in self.languages if x in
38+
return next((self.names.get(x) for x in self._languages if x in
3739
self.names), None)
3840

3941

@@ -208,20 +210,24 @@ class Subdivisions(tuple):
208210
"""
209211
def __new__(cls, languages, *subdivisions):
210212
subdivisions = [Subdivision(languages, **x) for x in subdivisions]
211-
return super(cls, Subdivisions).__new__(cls, subdivisions)
213+
obj = super(cls, Subdivisions).__new__(cls, subdivisions)
214+
obj._languages = languages
215+
return obj
212216

217+
@property
213218
def most_specific(self):
214219
"""The most specific subdivision available
215220
216-
:returns: The most specific (smallest) :py:class:`Subdivision`
217-
:raises: :py:exc:`ValueError` if :py:class:`Subdivisions` does
218-
not contain any :py:class:`Subdivision` objects
221+
:returns: The most specific (smallest) :py:class:`Subdivision`. If there
222+
are no :py:class:`Subdivision` objects for the response, this returns an
223+
empty :py:class:`Subdivision`.
219224
220225
"""
221226
try:
222227
return self[-1]
223228
except IndexError:
224-
raise ValueError('No subdivisions are available');
229+
return Subdivision(self._languages)
230+
225231

226232
class Traits(Record):
227233
""" Contains data for the traits record associated with an IP address

tests/models_test.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def test_omni_full(self):
109109
{'en': 'Minnesota'}, 'div 1 names are correct')
110110
self.assertEqual(model.subdivisions[1].name, 'Hennepin',
111111
'div 2 has correct name')
112-
self.assertEqual(model.subdivisions.most_specific().iso_code, 'HP',
112+
self.assertEqual(model.subdivisions.most_specific.iso_code, 'HP',
113113
'subdivisions.most_specific returns HP')
114114

115115
def test_omni_min(self):
@@ -129,9 +129,13 @@ def test_omni_min(self):
129129
'geoip2.records.Location object')
130130
self.assertEqual(type(model.traits), geoip2.records.Traits,
131131
'geoip2.records.Traits object')
132-
with self.assertRaisesRegex(ValueError,
133-
'No subdivisions are available'):
134-
model.subdivisions.most_specific()
132+
self.assertEqual(type(model.subdivisions.most_specific),
133+
geoip2.records.Subdivision,
134+
'geoip2.records.Subdivision object returned even'
135+
'when none are available.')
136+
self.assertEqual(model.subdivisions.most_specific.names, {},
137+
'Empty names hash returned')
138+
135139

136140
def test_city_full(self):
137141
raw = {

0 commit comments

Comments
 (0)