Skip to content

Commit 7a3093e

Browse files
authored
Merge pull request #56 from smartystreets/eric/add-enrichment-secondary
Eric/add enrichment secondary
2 parents dd2bbf1 + 0410922 commit 7a3093e

File tree

4 files changed

+222
-10
lines changed

4 files changed

+222
-10
lines changed

smartystreets_python_sdk/us_enrichment/client.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from smartystreets_python_sdk import Request
22
from smartystreets_python_sdk.exceptions import SmartyException
3-
from .lookup import FinancialLookup, PrincipalLookup, GeoReferenceLookup, Lookup
3+
from .lookup import FinancialLookup, PrincipalLookup, GeoReferenceLookup, SecondaryLookup, SecondaryCountLookup, Lookup
44
from .response import Response
55

66

@@ -27,6 +27,16 @@ def send_geo_reference_lookup(self, smartykey):
2727
send_lookup(self, l)
2828
return l.result
2929

30+
def send_secondary_lookup(self, smartykey):
31+
l = SecondaryLookup(smartykey)
32+
send_lookup(self, l)
33+
return l.result
34+
35+
def send_secondary_count_lookup(self, smartykey):
36+
l = SecondaryCountLookup(smartykey)
37+
send_lookup(self, l)
38+
return l.result
39+
3040
def send_generic_lookup(self, smartykey, dataset, dataSubset):
3141
l = Lookup(smartykey, dataset, dataSubset)
3242
send_lookup(self, l)

smartystreets_python_sdk/us_enrichment/lookup.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
financialDataSubset = "financial"
33
principalDataSubset = "principal"
44
geoReferenceDataset = "geo-reference"
5+
secondaryDataset = "secondary"
6+
countDataSubset = "count"
57
noneDataSubset = None
68

79
class Lookup:
@@ -21,4 +23,12 @@ def __init__(self, smartykey):
2123

2224
class GeoReferenceLookup(Lookup):
2325
def __init__(self, smartykey):
24-
super().__init__(smartykey, geoReferenceDataset, noneDataSubset)
26+
super().__init__(smartykey, geoReferenceDataset, noneDataSubset)
27+
28+
class SecondaryLookup(Lookup):
29+
def __init__(self, smartykey):
30+
super().__init__(smartykey, secondaryDataset, noneDataSubset)
31+
32+
class SecondaryCountLookup(Lookup):
33+
def __init__(self, smartykey):
34+
super().__init__(smartykey, secondaryDataset, countDataSubset)

smartystreets_python_sdk/us_enrichment/response.py

+151-7
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,56 @@
11
class Response:
22
def __init__(self, obj):
33
self.smarty_key = obj.get('smarty_key', None)
4-
self.data_set_name = obj.get('data_set_name', None)
5-
self.data_subset_name = obj.get('data_subset_name', None)
6-
self.attributes = get_attributes(self.data_set_name, self.data_subset_name, obj.get('attributes', None))
4+
data_set_name = None
5+
data_subset_name = None
6+
if 'data_set_name' in obj:
7+
self.data_set_name = obj.get('data_set_name')
8+
data_set_name = obj.get('data_set_name')
9+
elif 'secondaries' in obj:
10+
data_set_name = 'secondary'
11+
12+
if 'data_subset_name' in obj:
13+
self.data_subset_name = obj.get('data_subset_name', None)
14+
data_subset_name = obj.get('data_subset_name', None)
15+
elif 'count' in obj:
16+
data_set_name = 'secondary'
17+
data_subset_name = 'count'
18+
19+
if data_set_name == 'secondary':
20+
if data_subset_name == 'count':
21+
self.count = obj.get('count', None)
22+
else:
23+
self.root_address = get_secondary_root_address(obj.get('root_address', None))
24+
if 'aliases' in obj:
25+
self.aliases = get_secondary_aliases(obj.get('aliases', None))
26+
self.secondaries = get_secondary_secondaries(obj.get('secondaries', None))
27+
else:
28+
self.attributes = get_attributes(data_set_name, data_subset_name, obj.get('attributes', None))
729

830
def __str__(self):
931
lines = [self.__class__.__name__ + ':']
1032
for key, val in vars(self).items():
11-
lines += '{}: {}'.format(key, val).split('\n')
33+
lines += get_lines(key, val)
1234
return '\n '.join(lines)
1335

1436
def __eq__(self, __value: object) -> bool:
1537
return isinstance(__value, type(self)) and __value.smarty_key == self.smarty_key
1638

39+
def get_lines(key, val):
40+
lines = ['']
41+
if type(val) is list:
42+
if len(val) > 1:
43+
for item in val:
44+
if val.index(item) == 0:
45+
lines += ['secondaries:']
46+
lines += get_lines(val.index(item), val[val.index(item)])
47+
return lines
48+
else:
49+
return get_lines(key, val[0])
50+
else:
51+
if type(key) == int:
52+
return ' {}: {}'.format(key, val).split('\n')
53+
return '{}: {}'.format(key, val).split('\n')
1754

1855
def get_attributes(dataset, data_subset, attribute_obj):
1956
if dataset == "property":
@@ -24,7 +61,6 @@ def get_attributes(dataset, data_subset, attribute_obj):
2461
if dataset == "geo-reference":
2562
return GeoReferenceOutputCategories(attribute_obj)
2663

27-
2864
class PrincipalAttributes:
2965
def __init__(self, obj):
3066
self.first_floor_sqft = obj.get('1st_floor_sqft', None)
@@ -575,7 +611,7 @@ def __str__(self):
575611

576612
class GeoReferenceOutputCategories:
577613
def __init__(self, obj):
578-
614+
579615
self.census_block = get_geo_reference_census_block(obj.get('census_block', None))
580616
self.census_county_division = get_geo_reference_census_county_division(obj.get('census_county_division', None))
581617
self.census_tract = get_geo_reference_census_tract(obj.get('census_tract', None))
@@ -669,4 +705,112 @@ def get_geo_reference_place(geo_reference_place_obj):
669705
return None
670706
output = []
671707
output.append(GeoReferencePlace(geo_reference_place_obj))
672-
return output
708+
return output
709+
710+
class SecondaryRootAddress:
711+
def __init__(self, obj):
712+
self.secondary_count = obj.get('secondary_count', None)
713+
self.smarty_key = obj.get('smarty_key', None)
714+
self.primary_number = obj.get('primary_number', None)
715+
self.street_predirection = obj.get('street_predirection', None)
716+
self.street_name = obj.get('street_name', None)
717+
self.street_suffix = obj.get('street_suffix', None)
718+
self.street_postdirection = obj.get('street_postdirection', None)
719+
self.city_name = obj.get('city_name', None)
720+
self.state_abbreviation = obj.get('state_abbreviation', None)
721+
self.zipcode = obj.get('zipcode', None)
722+
self.plus4_code = obj.get('plus4_code', None)
723+
724+
def __str__(self):
725+
lines = ['']
726+
for key, val in vars(self).items():
727+
if type(val) is list:
728+
lines.append(key + ': ')
729+
for item in val:
730+
for subkey, subval in vars(item).items():
731+
lines += ' {}: {}'.format(subkey, subval).split('\n')
732+
else:
733+
lines.append(key + ': ' + str(val))
734+
return '\n '.join(lines)
735+
736+
def get_secondary_root_address(secondary_root_address_obj):
737+
if secondary_root_address_obj is None:
738+
return None
739+
output = []
740+
output.append(SecondaryRootAddress(secondary_root_address_obj))
741+
742+
return output
743+
744+
class SecondaryAliases:
745+
def __init__(self, obj):
746+
self.smarty_key = obj.get('smarty_key', None)
747+
self.primary_number = obj.get('primary_number', None)
748+
self.street_predirection = obj.get('street_predirection', None)
749+
self.street_name = obj.get('street_name', None)
750+
self.street_suffix = obj.get('street_suffix', None)
751+
self.street_postdirection = obj.get('street_postdirection', None)
752+
self.city_name = obj.get('city_name', None)
753+
self.state_abbreviation = obj.get('state_abbreviation', None)
754+
self.zipcode = obj.get('zipcode', None)
755+
self.plus4_code = obj.get('plus4_code', None)
756+
757+
def __str__(self):
758+
lines = ['']
759+
for key, val in vars(self).items():
760+
if type(val) is list:
761+
lines.append(key + ': ')
762+
for item in val:
763+
for subkey, subval in vars(item).items():
764+
lines += ' {}: {}'.format(subkey, subval).split('\n')
765+
else:
766+
lines.append(key + ': ' + str(val))
767+
return '\n '.join(lines)
768+
769+
def get_secondary_aliases(secondary_aliases_obj):
770+
if secondary_aliases_obj is None:
771+
return None
772+
output = []
773+
output_list = []
774+
for item in secondary_aliases_obj:
775+
output.append(SecondaryAliases(item))
776+
output_list.append(output)
777+
output = []
778+
return output_list
779+
780+
class SecondarySecondaries:
781+
def __init__(self, obj):
782+
self.smarty_key = obj.get('smarty_key', None)
783+
self.secondary_designator = obj.get('secondary_designator', None)
784+
self.secondary_number = obj.get('secondary_number', None)
785+
self.plus4_code = obj.get('plus4_code', None)
786+
787+
def __str__(self):
788+
lines = ['']
789+
for key, val in vars(self).items():
790+
if type(val) is list:
791+
lines.append(key + ': ')
792+
for item in val:
793+
for subkey, subval in vars(item).items():
794+
lines += ' {}: {}'.format(subkey, subval).split('\n')
795+
else:
796+
lines.append(key + ': ' + str(val))
797+
return '\n '.join(lines)
798+
799+
def get_secondary_secondaries(secondary_secondaries_obj):
800+
if secondary_secondaries_obj is None:
801+
return None
802+
output = []
803+
output_list = []
804+
for item in secondary_secondaries_obj:
805+
output.append(SecondarySecondaries(item))
806+
output_list.append(output)
807+
output = []
808+
return output_list
809+
810+
class SecondaryCountAttributes:
811+
def __init__(self, obj):
812+
self.smarty_key = obj.get('smarty_key', None)
813+
self.count = obj.get('count', None)
814+
815+
def __str__(self):
816+
return self.__dict__.__str__()

test/us_enrichment/client_test.py

+49-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from smartystreets_python_sdk import URLPrefixSender
44
from smartystreets_python_sdk.us_enrichment.client import Client, send_lookup
5-
from smartystreets_python_sdk.us_enrichment.lookup import FinancialLookup, PrincipalLookup
5+
from smartystreets_python_sdk.us_enrichment.lookup import FinancialLookup, PrincipalLookup, GeoReferenceLookup, SecondaryLookup, SecondaryCountLookup
66
from smartystreets_python_sdk.us_enrichment.response import Response
77
from test.mocks import *
88

@@ -38,3 +38,51 @@ def test_sending_principal_lookup(self):
3838

3939
function_result = client.send_property_principal_lookup("xxx")
4040
self.assertEqual(result, function_result)
41+
42+
def test_sending_geo_reference_lookup(self):
43+
capturing_sender = RequestCapturingSender()
44+
sender = URLPrefixSender('http://localhost/', capturing_sender)
45+
serializer = FakeSerializer(None)
46+
client = Client(sender, serializer)
47+
48+
lookup = GeoReferenceLookup("xxx")
49+
result = send_lookup(client, lookup)
50+
51+
self.assertEqual("geo-reference", lookup.dataset)
52+
self.assertEqual(None, lookup.dataSubset)
53+
self.assertEqual(lookup.result, result)
54+
55+
function_result = client.send_geo_reference_lookup("xxx")
56+
self.assertEqual(result, function_result)
57+
58+
def test_sending_secondary_lookup(self):
59+
capturing_sender = RequestCapturingSender()
60+
sender = URLPrefixSender('http://localhost/', capturing_sender)
61+
serializer = FakeSerializer(None)
62+
client = Client(sender, serializer)
63+
64+
lookup = SecondaryLookup("xxx")
65+
result = send_lookup(client, lookup)
66+
67+
self.assertEqual("secondary", lookup.dataset)
68+
self.assertEqual(None, lookup.dataSubset)
69+
self.assertEqual(lookup.result, result)
70+
71+
function_result = client.send_secondary_lookup("xxx")
72+
self.assertEqual(result, function_result)
73+
74+
def test_sending_secondary_count_lookup(self):
75+
capturing_sender = RequestCapturingSender()
76+
sender = URLPrefixSender('http://localhost/', capturing_sender)
77+
serializer = FakeSerializer(None)
78+
client = Client(sender, serializer)
79+
80+
lookup = SecondaryCountLookup("xxx")
81+
result = send_lookup(client, lookup)
82+
83+
self.assertEqual("secondary", lookup.dataset)
84+
self.assertEqual("count", lookup.dataSubset)
85+
self.assertEqual(lookup.result, result)
86+
87+
function_result = client.send_secondary_count_lookup("xxx")
88+
self.assertEqual(result, function_result)

0 commit comments

Comments
 (0)