o
    4c                      @   s   d Z zddlmZmZ ddlmZ dZW n ey   dZY nw ddlm	Z	m
Z
 ddlmZ ddlmZ dd	lmZmZ d
ZG dd de	ZdS )z&
:class:`.YahooPlaceFinder` geocoder.
    )getRequest)OAuth1FT)GeocoderDEFAULT_TIMEOUT)GeocoderParseError)Location)string_compare	text_type)YahooPlaceFinderc                       sh   e Zd ZdZeddf fdd	Zedd Zdd Zed	d
 Z							dddZ
dddZ  ZS )r   z
    Geocoder that utilizes the Yahoo! BOSS PlaceFinder API. Documentation at:
        https://developer.yahoo.com/boss/geo/docs/
    Nc                    sV   t rtdtt| j|||d t|| _t|| _t| j| jddd| _	d| _
dS )a  
        :param str consumer_key: Key provided by Yahoo.

        :param str consumer_secret: Secret corresponding to the key
            provided by Yahoo.

        :param int timeout: Time, in seconds, to wait for the geocoding service
            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
            exception.

        :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

        :param str user_agent: Use a custom User-Agent header.

            .. versionadded:: 1.12.0
        zgrequests-oauthlib is needed for YahooPlaceFinder. Install with `pip install geopy -e ".[placefinder]"`.)timeoutproxies
user_agentz	HMAC-SHA1AUTH_HEADER)
client_keyclient_secretsignature_methodsignature_typez+https://yboss.yahooapis.com/geo/placefinderN)requests_missingImportErrorsuperr   __init__r
   consumer_keyconsumer_secretr   authapi)selfr   r   r   r   r   	__class__ Q/var/www/html/gps/gps/lib/python3.10/site-packages/geopy/geocoders/placefinder.pyr      s    



zYahooPlaceFinder.__init__c                    s0    r fdd| D } rfdd| D } | S )z
        Returns only the results that meet the minimum quality threshold
        and are located in expected countries.
        c                    s"   g | ]}t |jd   kr|qS )quality)intraw.0loc)min_qualityr   r    
<listcomp>P   s    z6YahooPlaceFinder._filtered_results.<locals>.<listcomp>c                    s   g | ]}|j d   v r|qS )countrycoder#   r$   )valid_country_codesr   r    r(   W   s    r   )resultsr'   r+   r   )r'   r+   r    _filtered_resultsI   s   

z"YahooPlaceFinder._filtered_resultsc              	      sb   z#|d d }t |rt |dg sW dS  fdd|d D }W |S  ttfy0   tdw )zF
        Returns the parsed result of a PlaceFinder API call.
        bossresponseplacefinderr,   Nc                    s4   g | ]}t  |t|d  t|d f|dqS )latitude	longituder*   )r   humanizefloat)r%   placer   r   r    r(   i   s    z4YahooPlaceFinder._parse_response.<locals>.<listcomp>z Error parsing PlaceFinder result)lenr   KeyError
ValueErrorr   )r   contentr/   r,   r   r5   r    _parse_response_   s   

z YahooPlaceFinder._parse_responsec                    s   d  fdddD S )zW
        Returns a human readable representation of a raw PlaceFinder location
        z, c                    s   g | ]
} | r | qS r   r   )r%   linelocationr   r    r(   {   s    z-YahooPlaceFinder.humanize.<locals>.<listcomp>)line1line2line3line4)joinr<   r   r<   r    r2   v   s   zYahooPlaceFinder.humanizeTr   Fc                 C   s   |dd}|rd|d< |rd|d< |r|d  d7  < | j | j|t|| jd	}	| |	}
|
d
u r2d
S | |
||}
|r?|
d S |
S )a  
        Geocode a location query.

        :param str query: The address or query you wish to geocode.

        :param bool exactly_one: Return one result or a list of results, if
            available.

        :param int min_quality:

        :param bool reverse:

        :param valid_country_codes:
        :type valid_country_codes: list or tuple

        :param bool with_timezone: Include the timezone in the response's
            `raw` dictionary (as `timezone`).
        J)r=   flagsRgflags1countrD   T)r   	requesterparamsr   Nr   )_call_geocoderr   r   r   r:   r-   )r   queryexactly_oner   r'   reverser+   with_timezonerK   responser,   r   r   r    geocode   s6   
zYahooPlaceFinder.geocodec                 C   s2   |  |}t|tr|dd}| j|||ddS )a  
        Returns a reverse geocoded location using Yahoo"s PlaceFinder API.

        :param query: The coordinates for which you wish to obtain the
            closest human-readable addresses.
        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
            longitude), or string as "%(latitude)s, %(longitude)s"

        :param bool exactly_one: Return one result or a list of results, if
            available.
          T)rN   r   rO   )_coerce_point_to_string
isinstancer	   replacerR   )r   rM   rN   r   r   r   r    rO      s   

zYahooPlaceFinder.reverse)TNr   FNF)TN)__name__
__module____qualname____doc__r   r   staticmethodr-   r:   r2   rR   rO   __classcell__r   r   r   r    r      s&    	/


>r   N)r[   requestsr   r   requests_oauthlibr   r   r   geopy.geocoders.baser   r   	geopy.excr   geopy.locationr   geopy.compatr	   r
   __all__r   r   r   r   r    <module>   s    