Skip to content

Commit c303c6e

Browse files
oschwaldautarch
authored andcommitted
Get rid of the attributes for each subdivision and just return a tuple-like data structure for subdivisions.
1 parent 046973d commit c303c6e

File tree

2 files changed

+15
-45
lines changed

2 files changed

+15
-45
lines changed

geoip2/records.py

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -193,46 +193,22 @@ class Subdivision(PlaceRecord):
193193
_valid_attributes = set(['confidence', 'geoname_id', 'iso_code', 'names'])
194194

195195

196-
class Subdivisions(collections.namedtuple('Subdivisions',
197-
'subdivision_1 subdivision_2 '
198-
'subdivision_3')):
199-
"""Contains data for the subdivisions associated with an IP address
196+
class Subdivisions(tuple):
197+
"""A tuple-like collection of subdivisions associated with an IP address
200198
201199
This class contains the subdivisions of the country associated with the
202-
IP address.
200+
IP address from largest to smallest.
203201
204202
For instance, the response for Oxford in the United Kingdom would have
205-
England as subdivision_1 and Oxfordshire as subdivision_2.
203+
England as the first element and Oxfordshire as the second element.
206204
207-
This record is returned by all the end points except the Country end point.
208-
209-
Attributes:
210-
211-
:ivar subdivision_1: The first-level (largest) subdivision associated with
212-
the location of the IP address. Many countries will only have this
213-
subdivision. For instance, in the United States, this would be a state.
214-
:ivar subdivision_2: The second-level subdivision associated with the
215-
location of the IP address.
216-
:ivar subdivision_3: The third-level subdivsion associated with the
217-
location of the IP address.
205+
This collection is returned by all the end points except the Country
206+
end point.
218207
219208
"""
220-
__slots__ = ()
221-
222-
def __new__(cls, languages, subdivision_1=None, subdivision_2=None,
223-
subdivision_3=None):
224-
if subdivision_1 is None:
225-
subdivision_1 = {}
226-
if subdivision_2 is None:
227-
subdivision_2 = {}
228-
if subdivision_3 is None:
229-
subdivision_3 = {}
230-
231-
subdivision_1 = Subdivision(languages, **subdivision_1)
232-
subdivision_2 = Subdivision(languages, **subdivision_2)
233-
subdivision_3 = Subdivision(languages, **subdivision_3)
234-
return super(cls, Subdivisions).__new__(cls, subdivision_1,
235-
subdivision_2, subdivision_3)
209+
def __new__(cls, languages, *subdivisions):
210+
subdivisions = [Subdivision(languages, **x) for x in subdivisions]
211+
return super(cls, Subdivisions).__new__(cls, subdivisions)
236212

237213

238214
class Traits(Record):

tests/models_test.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,21 @@ def test_omni_full(self):
8686
'geoip2.records.Country object')
8787
self.assertEqual(type(model.location), geoip2.records.Location,
8888
'geoip2.records.Location object')
89-
self.assertEqual(type(model.subdivisions.subdivision_1),
89+
self.assertEqual(type(model.subdivisions[0]),
9090
geoip2.records.Subdivision,
9191
'geoip2.records.Subdivision object')
9292
self.assertEqual(type(model.traits), geoip2.records.Traits,
9393
'geoip2.records.Traits object')
9494
self.assertEqual(model.raw, raw, 'raw method returns raw input')
95-
self.assertEqual(model.subdivisions.subdivision_1.iso_code, 'MN',
95+
self.assertEqual(model.subdivisions[0].iso_code, 'MN',
9696
'div 1 has correct iso_code')
97-
self.assertEqual(model.subdivisions.subdivision_1.confidence, 88,
97+
self.assertEqual(model.subdivisions[0].confidence, 88,
9898
'div 1 has correct confidence')
99-
self.assertEqual(model.subdivisions.subdivision_1.geoname_id, 574635,
99+
self.assertEqual(model.subdivisions[0].geoname_id, 574635,
100100
'div 1 has correct geoname_id')
101-
self.assertEqual(model.subdivisions.subdivision_1.names,
101+
self.assertEqual(model.subdivisions[0].names,
102102
{'en': 'Minnesota'}, 'div 1 names are correct')
103-
self.assertEqual(model.subdivisions.subdivision_2.name, 'Hennepin',
103+
self.assertEqual(model.subdivisions[1].name, 'Hennepin',
104104
'div 2 has correct name')
105105

106106
def test_omni_min(self):
@@ -118,9 +118,6 @@ def test_omni_min(self):
118118
'geoip2.records.Country object')
119119
self.assertEqual(type(model.location), geoip2.records.Location,
120120
'geoip2.records.Location object')
121-
self.assertEqual(type(model.subdivisions.subdivision_1),
122-
geoip2.records.Subdivision,
123-
'geoip2.records.Subdivision object')
124121
self.assertEqual(type(model.traits), geoip2.records.Traits,
125122
'geoip2.records.Traits object')
126123

@@ -160,9 +157,6 @@ def test_city_full(self):
160157
'geoip2.records.Country object')
161158
self.assertEqual(type(model.location), geoip2.records.Location,
162159
'geoip2.records.Location object')
163-
self.assertEqual(type(model.subdivisions.subdivision_1),
164-
geoip2.records.Subdivision,
165-
'geoip2.records.Subdivision object')
166160
self.assertEqual(type(model.traits), geoip2.records.Traits,
167161
'geoip2.records.Traits object')
168162
self.assertEqual(model.raw, raw, 'raw method returns raw input')

0 commit comments

Comments
 (0)