Skip to content

Commit ecfa420

Browse files
committed
Support Component Analysis
1 parent 3b0249b commit ecfa420

File tree

4 files changed

+112
-2
lines changed

4 files changed

+112
-2
lines changed

smartystreets_python_sdk/us_street/analysis.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from .component_analysis import ComponentAnalysis
2+
13
class Analysis:
24
def __init__(self, obj):
35
"""
@@ -15,3 +17,5 @@ def __init__(self, obj):
1517
self.lacs_link_indicator = obj.get('lacslink_indicator', None)
1618
self.is_suite_link_match = obj.get('suitelink_match', None)
1719
self.enhanced_match = obj.get('enhanced_match', None)
20+
components_obj = obj.get("components", None)
21+
self.components = ComponentAnalysis(components_obj) if components_obj else None
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from .match_info import MatchInfo
2+
3+
class ComponentAnalysis:
4+
def __init__(self, obj):
5+
"""
6+
This class contains detailed match information for each component of an address.
7+
"""
8+
self.primary_number = MatchInfo(obj['primary_number']) if 'primary_number' in obj else None
9+
self.street_predirection = MatchInfo(obj['street_predirection']) if 'street_predirection' in obj else None
10+
self.street_name = MatchInfo(obj['street_name']) if 'street_name' in obj else None
11+
self.street_postdirection = MatchInfo(obj['street_postdirection']) if 'street_postdirection' in obj else None
12+
self.street_suffix = MatchInfo(obj['street_suffix']) if 'street_suffix' in obj else None
13+
self.secondary_number = MatchInfo(obj['secondary_number']) if 'secondary_number' in obj else None
14+
self.secondary_designator = MatchInfo(obj['secondary_designator']) if 'secondary_designator' in obj else None
15+
self.extra_secondary_number = MatchInfo(obj['extra_secondary_number']) if 'extra_secondary_number' in obj else None
16+
self.extra_secondary_designator = MatchInfo(obj['extra_secondary_designator']) if 'extra_secondary_designator' in obj else None
17+
self.city_name = MatchInfo(obj['city_name']) if 'city_name' in obj else None
18+
self.state_abbreviation = MatchInfo(obj['state_abbreviation']) if 'state_abbreviation' in obj else None
19+
self.zipcode = MatchInfo(obj['zipcode']) if 'zipcode' in obj else None
20+
self.plus4_code = MatchInfo(obj['plus4_code']) if 'plus4_code' in obj else None
21+
self.urbanization = MatchInfo(obj['urbanization']) if 'urbanization' in obj else None
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class MatchInfo:
2+
def __init__(self, obj):
3+
"""
4+
Holds matching status and change information for an address component.
5+
"""
6+
self.status = obj.get('status', None)
7+
self.change = obj.get('change', None)

test/us_street/client_test.py

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def test_full_json_response_deserialization(self):
149149
"elot_sort": "A",
150150
"latitude": 40.27658,
151151
"longitude": -111.65759,
152-
"coordinate_license": 1,
152+
"coordinate_license": 1,
153153
"precision": "Zip9",
154154
"time_zone": "Mountain",
155155
"utc_offset": -7,
@@ -167,7 +167,55 @@ def test_full_json_response_deserialization(self):
167167
"lacslink_code": "lacslink_code",
168168
"lacslink_indicator": "lacslink_indicator",
169169
"suitelink_match": true,
170-
"enhanced_match": "enhanced_match"
170+
"enhanced_match": "enhanced_match",
171+
"components": {
172+
"primary_number": {
173+
"status": "confirmed",
174+
"change": ["spelling"]
175+
},
176+
"street_predirection": {
177+
"status": "confirmed",
178+
"change": ["spelling"]
179+
},
180+
"street_name": {
181+
"status": "confirmed",
182+
"change": ["added"]
183+
},
184+
"street_postdirection": {
185+
"status": "confirmed"
186+
},
187+
"street_suffix": {
188+
"status": "confirmed"
189+
},
190+
"secondary_number": {
191+
"status": "confirmed"
192+
},
193+
"secondary_designator": {
194+
"status": "confirmed"
195+
},
196+
"extra_secondary_number": {
197+
"status": "confirmed"
198+
},
199+
"extra_secondary_designator": {
200+
"status": "confirmed",
201+
"change": ["abbreviated"]
202+
},
203+
"city_name": {
204+
"status": "confirmed"
205+
},
206+
"state_abbreviation": {
207+
"status": "confirmed"
208+
},
209+
"zipcode": {
210+
"status": "confirmed"
211+
},
212+
"plus4_code": {
213+
"status": "confirmed"
214+
},
215+
"urbanization": {
216+
"status": "unconfirmed"
217+
}
218+
}
171219
}
172220
}"""
173221

@@ -230,3 +278,33 @@ def test_full_json_response_deserialization(self):
230278
self.assertEqual(actual_candidate.analysis.lacs_link_indicator, "lacslink_indicator")
231279
self.assertEqual(actual_candidate.analysis.is_suite_link_match, True)
232280
self.assertEqual(actual_candidate.analysis.enhanced_match, "enhanced_match")
281+
282+
self.assertEqual(actual_candidate.analysis.components.primary_number.status, "confirmed")
283+
self.assertEqual(actual_candidate.analysis.components.primary_number.change, ["spelling"])
284+
self.assertEqual(actual_candidate.analysis.components.street_predirection.status, "confirmed")
285+
self.assertEqual(actual_candidate.analysis.components.street_predirection.change, ["spelling"])
286+
self.assertEqual(actual_candidate.analysis.components.street_name.status, "confirmed")
287+
self.assertEqual(actual_candidate.analysis.components.street_name.change, ["added"])
288+
self.assertEqual(actual_candidate.analysis.components.street_postdirection.status, "confirmed")
289+
self.assertIsNone(actual_candidate.analysis.components.street_postdirection.change)
290+
self.assertEqual(actual_candidate.analysis.components.street_suffix.status, "confirmed")
291+
self.assertIsNone(actual_candidate.analysis.components.street_suffix.change)
292+
self.assertEqual(actual_candidate.analysis.components.secondary_number.status, "confirmed")
293+
self.assertIsNone(actual_candidate.analysis.components.secondary_number.change)
294+
self.assertEqual(actual_candidate.analysis.components.secondary_designator.status, "confirmed")
295+
self.assertIsNone(actual_candidate.analysis.components.secondary_designator.change)
296+
self.assertEqual(actual_candidate.analysis.components.extra_secondary_number.status, "confirmed")
297+
self.assertIsNone(actual_candidate.analysis.components.extra_secondary_number.change)
298+
self.assertEqual(actual_candidate.analysis.components.extra_secondary_designator.status, "confirmed")
299+
self.assertEqual(actual_candidate.analysis.components.extra_secondary_designator.change, ["abbreviated"])
300+
self.assertEqual(actual_candidate.analysis.components.city_name.status, "confirmed")
301+
self.assertIsNone(actual_candidate.analysis.components.city_name.change)
302+
self.assertEqual(actual_candidate.analysis.components.state_abbreviation.status, "confirmed")
303+
self.assertIsNone(actual_candidate.analysis.components.state_abbreviation.change)
304+
self.assertEqual(actual_candidate.analysis.components.zipcode.status, "confirmed")
305+
self.assertIsNone(actual_candidate.analysis.components.zipcode.change)
306+
self.assertEqual(actual_candidate.analysis.components.plus4_code.status, "confirmed")
307+
self.assertIsNone(actual_candidate.analysis.components.plus4_code.change)
308+
self.assertEqual(actual_candidate.analysis.components.urbanization.status, "unconfirmed")
309+
self.assertIsNone(actual_candidate.analysis.components.urbanization.change)
310+

0 commit comments

Comments
 (0)