22from http .client import HTTPSConnection
33from io import StringIO
44from json import loads
5- from xml .etree .ElementTree import Element , fromstring
65from urllib .parse import urlencode
6+ from xml .etree .ElementTree import Element , fromstring
77
88import 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
1220from pyzipcodeapi .options import OPTIONS
1321
1422BASE_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 )
0 commit comments