Skip to content

Commit d45e776

Browse files
author
Mohamed Ben Makhlouf
committed
finish info option
1 parent 28ed205 commit d45e776

File tree

4 files changed

+68
-28
lines changed

4 files changed

+68
-28
lines changed

pyzipcodeapi/api.py

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,21 @@
22
from http.client import HTTPSConnection
33
from io import StringIO
44
from json import loads
5-
from xml.etree.ElementTree import Element, fromstring
65
from urllib.parse import urlencode
6+
from xml.etree.ElementTree import Element, fromstring
77

88
import requests
99

10-
from pyzipcodeapi.dataclass import Distance, Error, MultiDistance, Radius, MultiRadius, MatchClose
11-
from pyzipcodeapi.enums import FormatEnum, UnitEnum, CountryEnum
10+
from pyzipcodeapi.dataclass import (
11+
Distance,
12+
Error,
13+
MatchClose,
14+
MultiDistance,
15+
MultiRadius,
16+
Radius,
17+
Info,
18+
)
19+
from pyzipcodeapi.enums import CountryEnum, DistanceUnitEnum, FormatEnum, GeoUnitEnum
1220
from pyzipcodeapi.options import OPTIONS
1321

1422
BASE_URL = "https://www.zipcodeapi.com/rest/{api_key}/{option}.{format}/"
@@ -120,7 +128,7 @@ def _api_call(
120128
body: str | None = None,
121129
headers: dict | None = None,
122130
):
123-
base_url = f"rest/v2/CA" if self.country == CountryEnum.CA else f"rest"
131+
base_url = "rest/v2/CA" if self.country == CountryEnum.CA else "rest"
124132
self.con.request(
125133
method=method,
126134
url=f"/{base_url}/{self.api_key}/{option}.{self.format}/{path}",
@@ -141,7 +149,7 @@ def _post(self, option: str, path: str, data: dict):
141149
headers=headers,
142150
)
143151

144-
def parse_response(
152+
def _parse_response(
145153
self, data_class: type | None = None
146154
) -> DictReader | bytes | type | Element | Error | list[type]:
147155
response = self.con.getresponse()
@@ -165,40 +173,46 @@ def parse_response(
165173
return data
166174

167175
def distance(
168-
self, zip_code1: str, zip_code2: str, units: UnitEnum = UnitEnum.KM
176+
self,
177+
zip_code1: str,
178+
zip_code2: str,
179+
units: DistanceUnitEnum = DistanceUnitEnum.KM,
169180
) -> Distance | DictReader | Element:
170181
"""distance.<format>/<zip_code1>/<zip_code2>/<units>"""
171182
self._get("distance", f"{zip_code1}/{zip_code2}/{units}")
172-
return self.parse_response(data_class=Distance)
183+
return self._parse_response(data_class=Distance)
173184

174185
def multi_distance(
175-
self, zip_code: str, zip_codes: list[str], units: UnitEnum = UnitEnum.KM
186+
self,
187+
zip_code: str,
188+
zip_codes: list[str],
189+
units: DistanceUnitEnum = DistanceUnitEnum.KM,
176190
) -> MultiDistance | DictReader | Element:
177191
"""multi-distance.<format>/<zip_code>/<other_zip_codes>/<units>"""
178192
assert len(zip_codes) <= 100
179193
self._get("multi-distance", f"{zip_code}/{','.join(zip_codes)}/{units}")
180-
return self.parse_response(data_class=MultiDistance)
194+
return self._parse_response(data_class=MultiDistance)
181195

182196
def radius(
183197
self,
184198
zip_code: str,
185199
distance: int,
186200
minimal: bool = False,
187-
units: UnitEnum = UnitEnum.KM,
201+
units: DistanceUnitEnum = DistanceUnitEnum.KM,
188202
) -> Radius | DictReader | Element:
189203
"""radius.<format>/<zip_code>/<distance>/<units>"""
190204
path = f"{zip_code}/{distance}/{units}"
191205
if minimal:
192206
path = f"{path}?minimal"
193207
self._get("radius", path)
194-
return self.parse_response(data_class=Radius)
208+
return self._parse_response(data_class=Radius)
195209

196210
def multi_radius(
197211
self,
198212
distance: int,
199213
zip_codes: list[str] | None = None,
200214
addresses: list[str] | None = None,
201-
units: UnitEnum = UnitEnum.KM,
215+
units: DistanceUnitEnum = DistanceUnitEnum.KM,
202216
) -> MultiRadius | DictReader | Element:
203217
"""multi-radius.<format>/<distance>/<units>"""
204218
if zip_codes is None and addresses is None:
@@ -211,11 +225,21 @@ def multi_radius(
211225
assert len(addresses) <= 100
212226
body["addrs"] = "\n".join(addresses)
213227
self._post("multi-radius", f"{distance}/{units}", data=body)
214-
return self.parse_response(data_class=MultiRadius)
228+
return self._parse_response(data_class=MultiRadius)
215229

216230
def match_close(
217-
self, zip_codes: list[str], distance: int, units: UnitEnum = UnitEnum.KM
231+
self,
232+
zip_codes: list[str],
233+
distance: int,
234+
units: DistanceUnitEnum = DistanceUnitEnum.KM,
218235
) -> list[MatchClose] | DictReader | Element:
219236
"""match-close.<format>/<zip_codes>/<distance>/<units>"""
220237
self._get("match-close", f"{','.join(zip_codes)}/{distance}/{units}")
221-
return self.parse_response(data_class=MatchClose)
238+
return self._parse_response(data_class=MatchClose)
239+
240+
def info(
241+
self, zip_code: str, units: GeoUnitEnum = GeoUnitEnum.DEGREES
242+
) -> Info | DictReader | Element:
243+
"""info.<format>/<zip_code>/<units>"""
244+
self._get("info", f"{zip_code}/{units}")
245+
return self._parse_response(data_class=Info)

pyzipcodeapi/dataclass.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,17 @@ class MatchClose:
5656
zip_code1: str
5757
zip_code2: str
5858
distance: float
59+
60+
61+
62+
63+
@dataclass
64+
class Info:
65+
zip_code: str
66+
lat: float
67+
lng: float
68+
city: str
69+
state: str
70+
timezone: dict
71+
acceptable_city_names: list[dict]
72+
area_codes: list[int]

pyzipcodeapi/enums.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ class FormatEnum(str, Enum):
77
CSV = "csv"
88

99

10-
class UnitEnum(str, Enum):
10+
class DistanceUnitEnum(str, Enum):
1111
KM = "km"
1212
MILE = "mile"
1313

1414

15+
class GeoUnitEnum(str, Enum):
16+
DEGREES = "degrees"
17+
RADIANS = "radians"
18+
19+
1520
class CountryEnum(str, Enum):
1621
US = "US"
1722
CA = "CA"

pyzipcodeapi/example.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,35 @@
1111
obj = ZipCodeApi(API_KEY)
1212
# V2
1313
f2 = FormatEnum.JSON
14-
u2 = UnitEnum.KM
14+
ud = DistanceUnitEnum.KM
15+
ug = GeoUnitEnum.DEGREES
1516
us = CountryEnum.US
1617
ca = CountryEnum.CA
1718
zca = ZipCodeApiV2(api_key=API_KEY, f=f2, country=us)
1819
# https://www.zipcodeapi.com/rest/<api_key>/distance.<format>/<zip_code1>/<zip_code2>/<units>
19-
print(zca.distance(zip_code1="94106", zip_code2="94132", units=u2))
20+
print(zca.distance(zip_code1="94106", zip_code2="94132", units=ud))
2021
print("------------------")
2122
# https://www.zipcodeapi.com/rest/<api_key>/multi-distance.<format>/<zip_code>/<other_zip_codes>/<units>
22-
print(zca.multi_distance(zip_code="94106", zip_codes=["94132"], units=u2))
23+
print(zca.multi_distance(zip_code="94106", zip_codes=["94132"], units=ud))
2324
print("------------------")
2425
# https://www.zipcodeapi.com/rest/<api_key>/radius.<format>/<zip_code>/<distance>/<units>
25-
print(zca.radius(zip_code="94120", distance=5, units=u2, minimal=False))
26+
print(zca.radius(zip_code="94120", distance=5, units=ud, minimal=False))
2627
print("------------------")
2728
# https://www.zipcodeapi.com/rest/<api_key>/multi-radius.<format>/<zip_code>/<distance>/<units>
2829
print(
2930
zca.multi_radius(
3031
distance=5,
3132
zip_codes=["22911", "22902"],
3233
addresses=["1827 Glissade Ln, Charlottesville VA 22911"],
33-
units=u2,
34+
units=ud,
3435
)
3536
)
3637
print("------------------")
3738
# https://www.zipcodeapi.com/rest/<api_key>/match-close.<format>/<zip_codes>/<distance>/<units>
38-
print(
39-
zca.match_close(
40-
zip_codes=["22911", "22902", "22904", "22905"], distance=120, units=u2
41-
)
42-
)
39+
print(zca.match_close(zip_codes=["22911", "22902", "22904"], distance=90, units=ud))
4340
print("------------------")
44-
# https://www.zipcodeapi.com/rest/<api_key>/multi-info.<format>/<zip_code>/<units>
45-
print(obj.get("multi-info", f).filter(zip_code="94132", units=ou))
41+
# https://www.zipcodeapi.com/rest/<api_key>/info.<format>/<zip_code>/<units>
42+
print(zca.info(zip_code="22911", units=ug))
4643
print("------------------")
4744
# https://www.zipcodeapi.com/rest/<api_key>/city-zips.<format>/<city>/<state>
4845
print(obj.get("city-zips", f).filter(city="San Francisco", state="CA"))

0 commit comments

Comments
 (0)