Skip to content

Commit 39264ec

Browse files
author
Mohamed Ben Makhlouf
committed
new zip code class version 2
1 parent 75b8a08 commit 39264ec

File tree

3 files changed

+58
-3
lines changed

3 files changed

+58
-3
lines changed

pyzipcodeapi/api.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
from io import StringIO
44
from json import loads
55
from xml.etree.ElementTree import Element, fromstring
6+
from urllib.parse import urlencode
67

78
import requests
89

9-
from pyzipcodeapi.dataclass import Distance, Error, MultiDistance, Radius
10+
from pyzipcodeapi.dataclass import Distance, Error, MultiDistance, Radius, MultiRadius
1011
from pyzipcodeapi.enums import FormatEnum, UnitEnum, CountryEnum
1112
from pyzipcodeapi.options import OPTIONS
1213

@@ -111,10 +112,15 @@ def _api_call(
111112
path: str,
112113
data_class: type | None = None,
113114
country: CountryEnum = CountryEnum.US,
115+
method: str = "GET",
116+
body: str | None = None,
114117
) -> DictReader | bytes | type | Element | Error:
115118
base_url = f"rest/v2/CA" if country == CountryEnum.CA else f"rest"
119+
headers = {}
120+
if method != "GET":
121+
headers = {"Content-type": "application/x-www-form-urlencoded"}
116122
self.con.request(
117-
method="GET", url=f"/{base_url}/{self.api_key}/{option}.{f}/{path}"
123+
method, f"/{base_url}/{self.api_key}/{option}.{f}/{path}", body, headers
118124
)
119125
response = self.con.getresponse()
120126
success = response.status == 200
@@ -172,3 +178,25 @@ def radius(
172178
if minimal:
173179
path = f"{path}?minimal"
174180
return self._api_call("radius", f, path, dc, country=country)
181+
182+
def multi_radius(
183+
self,
184+
distance: int,
185+
zip_codes: list[str] | None = None,
186+
addresses: list[str] | None = None,
187+
units: UnitEnum = UnitEnum.KM,
188+
f: FormatEnum | None = FormatEnum.JSON,
189+
) -> MultiRadius | DictReader | Element:
190+
"""multi-radius.<format>/<distance>/<units>"""
191+
assert len(zip_codes) <= 100
192+
if zip_codes is None and addresses is None:
193+
raise ValueError
194+
path = f"{distance}/{units}"
195+
dc = MultiRadius
196+
params = dict()
197+
if zip_codes:
198+
params["zip_codes"] = "\n".join(zip_codes)
199+
if addresses:
200+
params["addrs"] = "\n".join(addresses)
201+
body = urlencode(params)
202+
return self._api_call("multi-radius", f, path, dc, method="POST", body=body)

pyzipcodeapi/dataclass.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,18 @@ def info(self) -> list[RadiusInfo | str]:
3434
if self.zip_codes and type(self.zip_codes[0] == dict):
3535
return [RadiusInfo(**zp) for zp in self.zip_codes]
3636
return self.zip_codes
37+
38+
39+
@dataclass
40+
class MultiRadiusInfo:
41+
base_zip_code: str
42+
zip_codes: list[str]
43+
44+
45+
@dataclass
46+
class MultiRadius:
47+
responses: list[dict]
48+
49+
@property
50+
def info(self) -> list[MultiRadiusInfo]:
51+
return [MultiRadiusInfo(**r) for r in self.responses]

pyzipcodeapi/example.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,26 @@
1616
us = CountryEnum.US
1717
ca = CountryEnum.CA
1818
# 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, f=f2, country=us))
19+
print(
20+
zca.distance(zip_code1="94106", zip_code2="94132", units=u2, f=f2, country=us)
21+
)
2022
print("------------------")
2123
# https://www.zipcodeapi.com/rest/<api_key>/multi-distance.<format>/<zip_code>/<other_zip_codes>/<units>
2224
print(zca.multi_distance(zip_code="94106", zip_codes=["94132"], units=u2, f=f2))
2325
print("------------------")
2426
# https://www.zipcodeapi.com/rest/<api_key>/radius.<format>/<zip_code>/<distance>/<units>
2527
print(zca.radius(zip_code="94120", distance=5, units=u2, minimal=False))
2628
print("------------------")
29+
# https://www.zipcodeapi.com/rest/<api_key>/multi-radius.<format>/<zip_code>/<distance>/<units>
30+
print(
31+
zca.multi_radius(
32+
distance=5,
33+
zip_codes=["22911", "22902"],
34+
addresses=["1827 Glissade Ln, Charlottesville VA 22911"],
35+
units=u2,
36+
)
37+
)
38+
print("------------------")
2739
# https://www.zipcodeapi.com/rest/<api_key>/match-close.<format>/<zip_codes>/<distance>/<units>
2840
print(obj.get("match-close", f).filter(zip_codes="941asd32", distance="5", units=u))
2941
print("------------------")

0 commit comments

Comments
 (0)