3
pd                 @   s   d Z ddlmZ ddlZddlZddlZddlmZ eejfe	dddZ
ejfee	edd	d
Zdd Zdd ZddefddZdS )zx
Helpers for configuring locale settings.

Name `localization` is chosen to avoid overlap with builtin `locale` module.
    )contextmanagerN)options)lc_varc             c   sZ   t j }z>t j||  t j }tdd |D r>dj|V  n| V  W dt j|| X dS )aE  
    Context manager for temporarily setting a locale.

    Parameters
    ----------
    new_locale : str or tuple
        A string of the form <language_country>.<encoding>. For example to set
        the current locale to US English with a UTF8 encoding, you would pass
        "en_US.UTF-8".
    lc_var : int, default `locale.LC_ALL`
        The category of the locale being set.

    Notes
    -----
    This is useful when you want to run a particular block of code under a
    particular locale, without globally setting the locale. This probably isn't
    thread-safe.
    c             s   s   | ]}|d k	V  qd S )N ).0xr   r   =/tmp/pip-build-7vycvbft/pandas/pandas/_config/localization.py	<genexpr>'   s    zset_locale.<locals>.<genexpr>.N)locale	getlocale	setlocalealljoin)Z
new_localer   Zcurrent_localeZnormalized_localer   r   r   
set_locale   s    
r   )lcr   returnc             C   s@   yt | |d W dQ R X W n ttjfk
r6   dS X dS dS )aj  
    Check to see if we can set a locale, and subsequently get the locale,
    without raising an Exception.

    Parameters
    ----------
    lc : str
        The locale to attempt to set.
    lc_var : int, default `locale.LC_ALL`
        The category of the locale being set.

    Returns
    -------
    bool
        Whether the passed locale can be set
    )r   NFT)r   
ValueErrorr   Error)r   r   r   r   r   can_set_locale/   s    r   c             C   s*   |rdd }ndd }t ttt|| S )ar  
    Return a list of normalized locales that do not throw an ``Exception``
    when set.

    Parameters
    ----------
    locales : str
        A string where each locale is separated by a newline.
    normalize : bool
        Whether to call ``locale.normalize`` on each locale.

    Returns
    -------
    valid_locales : list
        A list of valid locales.
    c             S   s   t j| j S )N)r   	normalizestrip)r   r   r   r   <lambda>\   s    z _valid_locales.<locals>.<lambda>c             S   s   | j  S )N)r   )r   r   r   r   r   ^   s    )listfilterr   map)Zlocalesr   Z
normalizerr   r   r   _valid_localesJ   s    
r   c              C   s   t jdgdd} | S )Nz	locale -aT)shell)
subprocesscheck_output)raw_localesr   r   r   _default_locale_getterc   s    r!   Tc             C   s   y
| }W n t jk
r    dS X yb|jd}g }xN|D ]F}y|jt|tjjd W q8 tk
r|   |jt|dd Y q8X q8W W n t	k
r   Y nX | dkrt
||S tj|  d}|jdj|}t
||S )a  
    Get all the locales that are available on the system.

    Parameters
    ----------
    prefix : str
        If not ``None`` then return only those locales with the prefix
        provided. For example to get all English language locales (those that
        start with ``"en"``), pass ``prefix="en"``.
    normalize : bool
        Call ``locale.normalize`` on the resulting list of available locales.
        If ``True``, only locales that can be set without throwing an
        ``Exception`` are returned.
    locale_getter : callable
        The function to use to retrieve the current locales. This should return
        a string with each locale separated by a newline character.

    Returns
    -------
    locales : list of strings
        A list of locale strings that can be set with ``locale.setlocale()``.
        For example::

            locale.setlocale(locale.LC_ALL, locale_string)

    On error will return None (no locale available, e.g. Windows)

    N   
)encodingzwindows-1252z.*
)r   CalledProcessErrorsplitappendstrr   displayr#   UnicodeError	TypeErrorr   recompilefindallr   )prefixr   Zlocale_getterr    Zout_localesr   patternfoundr   r   r   get_localesh   s&    


 
r2   )__doc__
contextlibr   r   r,   r   Zpandas._config.configr   LC_ALLintr   r(   boolr   r   r!   r2   r   r   r   r   <module>   s    