Skip to content

Commit e87bb88

Browse files
author
Mohamed Ben Makhlouf
committed
new zip code class version 2
1 parent 28657cf commit e87bb88

File tree

2 files changed

+25
-34
lines changed

2 files changed

+25
-34
lines changed

pyzipcodeapi/api.py

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,91 +101,84 @@ def get(self, option, output_format="json"):
101101
class ZipCodeApiV2:
102102
host: str = "www.zipcodeapi.com"
103103

104-
def __init__(self, api_key: str):
104+
def __init__(
105+
self,
106+
api_key: str,
107+
f: FormatEnum = FormatEnum.JSON,
108+
country: CountryEnum = CountryEnum.US,
109+
):
105110
self.api_key = api_key
111+
self.format = f
112+
self.country = country
106113
self.con = HTTPSConnection(host=self.host)
107114

108115
def _api_call(
109116
self,
110117
option: str,
111-
f: FormatEnum,
112118
path: str,
113119
data_class: type | None = None,
114-
country: CountryEnum = CountryEnum.US,
115120
method: str = "GET",
116121
body: str | None = None,
117122
) -> DictReader | bytes | type | Element | Error:
118-
base_url = f"rest/v2/CA" if country == CountryEnum.CA else f"rest"
123+
base_url = f"rest/v2/CA" if self.country == CountryEnum.CA else f"rest"
119124
headers = {}
120125
if method != "GET":
121126
headers = {"Content-type": "application/x-www-form-urlencoded"}
122127
self.con.request(
123-
method, f"/{base_url}/{self.api_key}/{option}.{f}/{path}", body, headers
128+
method=method,
129+
url=f"/{base_url}/{self.api_key}/{option}.{self.format}/{path}",
130+
body=body,
131+
headers=headers,
124132
)
125133
response = self.con.getresponse()
126134
success = response.status == 200
127135
data = response.read()
128-
if f == FormatEnum.JSON:
136+
if self.format == FormatEnum.JSON:
129137
data = loads(data)
130138
if success:
131139
return data_class(**data) if data_class else data
132140
return Error(**data)
133-
elif f == FormatEnum.CSV:
141+
elif self.format == FormatEnum.CSV:
134142
return DictReader(StringIO(data.decode()), delimiter=",")
135-
elif f == FormatEnum.XML:
143+
elif self.format == FormatEnum.XML:
136144
if success:
137145
return fromstring(data.decode())
138146
return data
139147

140148
def distance(
141-
self,
142-
zip_code1: str,
143-
zip_code2: str,
144-
units: UnitEnum = UnitEnum.KM,
145-
f: FormatEnum | None = FormatEnum.JSON,
146-
country: CountryEnum = CountryEnum.US,
149+
self, zip_code1: str, zip_code2: str, units: UnitEnum = UnitEnum.KM
147150
) -> Distance | DictReader | Element:
148151
"""distance.<format>/<zip_code1>/<zip_code2>/<units>"""
149152
path = f"{zip_code1}/{zip_code2}/{units}"
150-
dc = Distance
151-
return self._api_call("distance", f, path, dc, country=country)
153+
return self._api_call("distance", path, data_class=Distance)
152154

153155
def multi_distance(
154-
self,
155-
zip_code: str,
156-
zip_codes: list[str],
157-
units: UnitEnum = UnitEnum.KM,
158-
f: FormatEnum | None = FormatEnum.JSON,
156+
self, zip_code: str, zip_codes: list[str], units: UnitEnum = UnitEnum.KM
159157
) -> MultiDistance | DictReader | Element:
160158
"""multi-distance.<format>/<zip_code>/<other_zip_codes>/<units>"""
161159
assert len(zip_codes) <= 100
162160
path = f"{zip_code}/{','.join(zip_codes)}/{units}"
163-
dc = MultiDistance
164-
return self._api_call("multi-distance", f, path, dc)
161+
return self._api_call("multi-distance", path, data_class=MultiDistance)
165162

166163
def radius(
167164
self,
168165
zip_code: str,
169166
distance: int,
170167
minimal: bool = False,
171168
units: UnitEnum = UnitEnum.KM,
172-
f: FormatEnum | None = FormatEnum.JSON,
173-
country: CountryEnum = CountryEnum.US,
174169
) -> Radius | DictReader | Element:
175170
"""radius.<format>/<zip_code>/<distance>/<units>"""
176171
path = f"{zip_code}/{distance}/{units}"
177-
dc = Radius
178172
if minimal:
179173
path = f"{path}?minimal"
180-
return self._api_call("radius", f, path, dc, country=country)
174+
return self._api_call("radius", path, data_class=Radius)
181175

182176
def multi_radius(
183177
self,
184178
distance: int,
185179
zip_codes: list[str] | None = None,
186180
addresses: list[str] | None = None,
187181
units: UnitEnum = UnitEnum.KM,
188-
f: FormatEnum | None = FormatEnum.JSON,
189182
) -> MultiRadius | DictReader | Element:
190183
"""multi-radius.<format>/<distance>/<units>"""
191184
if zip_codes is None and addresses is None:
@@ -200,4 +193,4 @@ def multi_radius(
200193
assert len(addresses) <= 100
201194
params["addrs"] = "\n".join(addresses)
202195
body = urlencode(params)
203-
return self._api_call("multi-radius", f, path, dc, method="POST", body=body)
196+
return self._api_call("multi-radius", path, dc, method="POST", body=body)

pyzipcodeapi/example.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,16 @@
1010
ou = "degrees"
1111
obj = ZipCodeApi(API_KEY)
1212
# V2
13-
zca = ZipCodeApiV2(api_key=API_KEY)
1413
f2 = FormatEnum.JSON
1514
u2 = UnitEnum.KM
1615
us = CountryEnum.US
1716
ca = CountryEnum.CA
17+
zca = ZipCodeApiV2(api_key=API_KEY, f=f2, country=us)
1818
# https://www.zipcodeapi.com/rest/<api_key>/distance.<format>/<zip_code1>/<zip_code2>/<units>
19-
print(
20-
zca.distance(zip_code1="94106", zip_code2="94132", units=u2, f=f2, country=us)
21-
)
19+
print(zca.distance(zip_code1="94106", zip_code2="94132", units=u2))
2220
print("------------------")
2321
# https://www.zipcodeapi.com/rest/<api_key>/multi-distance.<format>/<zip_code>/<other_zip_codes>/<units>
24-
print(zca.multi_distance(zip_code="94106", zip_codes=["94132"], units=u2, f=f2))
22+
print(zca.multi_distance(zip_code="94106", zip_codes=["94132"], units=u2))
2523
print("------------------")
2624
# https://www.zipcodeapi.com/rest/<api_key>/radius.<format>/<zip_code>/<distance>/<units>
2725
print(zca.radius(zip_code="94120", distance=5, units=u2, minimal=False))

0 commit comments

Comments
 (0)