88from .details import Details
99from .exceptions import RequestQuotaExceededError
1010
11+
1112class Handler ():
13+ """
14+ Allows client to request data for specified IP address. Instantiates and
15+ and maintains access to cache.
16+ """
1217
1318 API_URL = 'https://ipinfo.io'
1419 CACHE_MAXSIZE = 4096
1520 CACHE_TTL = 60 * 60 * 24
1621 COUNTRY_FILE_DEFAULT = 'countries.json'
1722
1823 def __init__ (self , access_token = None , ** kwargs ):
24+ """Initialize the Handler object with country name list and the cache initialized."""
1925 self .access_token = access_token
2026 self .countries = self ._read_country_names (kwargs .get ('countries_file' ))
2127
@@ -27,20 +33,22 @@ def __init__(self, access_token=None, **kwargs):
2733 ttl = cache_options .get ('ttl' , self .CACHE_TTL )
2834 self .cache = DefaultCache (maxsize , ttl , ** cache_options )
2935
30- def getDetails (self , ip_address = None ):
36+ def getDetails (self , ip_address = None ):
37+ """Get details for specified IP address as a Details object."""
3138 raw_details = self ._requestDetails (ip_address )
3239 raw_details ['country_name' ] = self .countries .get (raw_details .get ('country' ))
3340 raw_details ['ip_address' ] = ipaddress .ip_address (raw_details .get ('ip' ))
3441
3542 lat , lon = None , None
36- coords = tuple (raw_details .get ('loc' ,'' ).split (',' ))
43+ coords = tuple (raw_details .get ('loc' , '' ).split (',' ))
3744 if coords :
3845 lat , lon = coords [0 ], coords [1 ]
3946 raw_details ['latitude' ], raw_details ['longitude' ] = lat , lon
4047
4148 return Details (raw_details )
4249
43- def _requestDetails (self , ip_address = None ):
50+ def _requestDetails (self , ip_address = None ):
51+ """Get IP address data by sending request to IPinfo API."""
4452 if ip_address not in self .cache :
4553 url = self .API_URL
4654 if ip_address :
@@ -55,6 +63,7 @@ def _requestDetails(self, ip_address = None):
5563 return self .cache [ip_address ]
5664
5765 def _get_headers (self ):
66+ """Built headers for request to IPinfo API."""
5867 headers = {
5968 'user-agent' : 'IPinfoClient/Python{version}/1.0' .format (version = sys .version_info [0 ]),
6069 'accept' : 'application/json'
@@ -65,7 +74,8 @@ def _get_headers(self):
6574
6675 return headers
6776
68- def _read_country_names (self , countries_file = None ):
77+ def _read_country_names (self , countries_file = None ):
78+ """Read list of countries from specified country file or default file."""
6979 if not countries_file :
7080 countries_file = os .path .join (os .path .dirname (__file__ ), self .COUNTRY_FILE_DEFAULT )
7181 with open (countries_file ) as f :
0 commit comments