/usr/lib/python3/dist-packages/geopy/geocoders/smartystreets.py is in python3-geopy 1.11.0+ds1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | """
:class:`.LiveAddress` geocoder.
"""
from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT, DEFAULT_SCHEME
from geopy.compat import urlencode
from geopy.location import Location
from geopy.exc import ConfigurationError, GeocoderQuotaExceeded
from geopy.util import logger
__all__ = ("LiveAddress", )
class LiveAddress(Geocoder): # pylint: disable=W0223
"""
Initialize a customized LiveAddress geocoder provided by SmartyStreets.
More information regarding the LiveAddress API can be found here:
https://smartystreets.com/products/liveaddress-api
"""
def __init__(
self,
auth_id,
auth_token,
candidates=1,
scheme=DEFAULT_SCHEME,
timeout=DEFAULT_TIMEOUT,
proxies=None,
user_agent=None,
): # pylint: disable=R0913
"""
Initialize a customized SmartyStreets LiveAddress geocoder.
:param string auth_id: Valid `Auth ID` from SmartyStreets.
.. versionadded:: 1.5.0
:param string auth_token: Valid `Auth Token` from SmartyStreets.
:param int candidates: An integer between 1 and 10 indicating the max
number of candidate addresses to return if a valid address
could be found.
:param string scheme: Use 'https' or 'http' as the API URL's scheme.
Default is https. Note that SSL connections' certificates are not
verified.
.. versionadded:: 0.97
.. versionchanged:: 1.8.0
LiveAddress now requires `https`. Specifying `scheme=http` will
result in a :class:`geopy.exc.ConfigurationError`.
:param int timeout: Time, in seconds, to wait for the geocoding service
to respond before raising an :class:`geopy.exc.GeocoderTimedOut`
exception.
.. versionadded:: 0.97
:param dict proxies: If specified, routes this geocoder's requests
through the specified proxy. E.g., {"https": "192.0.2.0"}. For
more information, see documentation on
:class:`urllib2.ProxyHandler`.
.. versionadded:: 0.96
"""
super(LiveAddress, self).__init__(
timeout=timeout, proxies=proxies, user_agent=user_agent
)
if scheme == "http":
raise ConfigurationError("LiveAddress now requires `https`.")
self.scheme = scheme
self.auth_id = auth_id
self.auth_token = auth_token
if candidates:
if not 1 <= candidates <= 10:
raise ValueError('candidates must be between 1 and 10')
self.candidates = candidates
self.api = '%s://api.smartystreets.com/street-address' % self.scheme
def geocode(self, query, exactly_one=True, timeout=None): # pylint: disable=W0221
"""
Geocode a location query.
:param string query: The address or query you wish to geocode.
:param bool exactly_one: Return one result or a list of results, if
available.
"""
url = self._compose_url(query)
logger.debug("%s.geocode: %s", self.__class__.__name__, url)
return self._parse_json(self._call_geocoder(url, timeout=timeout),
exactly_one)
def _geocoder_exception_handler(self, error, message): # pylint: disable=R0201,W0613
"""
LiveStreets-specific exceptions.
"""
if "no active subscriptions found" in message.lower():
raise GeocoderQuotaExceeded(message)
def _compose_url(self, location):
"""
Generate API URL.
"""
query = {
'auth-id': self.auth_id,
'auth-token': self.auth_token,
'street': location,
'candidates': self.candidates
}
return '{url}?{query}'.format(url=self.api, query=urlencode(query))
def _parse_json(self, response, exactly_one=True):
"""
Parse responses as JSON objects.
"""
if not len(response):
return None
if exactly_one is True:
return self._format_structured_address(response[0])
else:
return [self._format_structured_address(c) for c in response]
@staticmethod
def _format_structured_address(address):
"""
Pretty-print address and return lat, lon tuple.
"""
latitude = address['metadata'].get('latitude')
longitude = address['metadata'].get('longitude')
return Location(
", ".join((address['delivery_line_1'], address['last_line'])),
(latitude, longitude) if latitude and longitude else None,
address
)
|