B
    fc                 @   s   d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	 i Z
e ZejejedZedejZdd Zd	d
 Zdd Zdd ZdddZdd ZG dd dZG dd dejZdS )aG  
    babel.localedata
    ~~~~~~~~~~~~~~~~

    Low-level locale data access.

    :note: The `Locale` class, which uses this module under the hood, provides a
           more convenient interface for accessing the locale data.

    :copyright: (c) 2013-2022 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    N)abc)chainzlocale-dataz%^(con|prn|aux|nul|com[0-9]|lpt[0-9])$c             C   sL   | rt | tsdS |   } x(ttt gD ]}| | kr0|S q0W dS )zNormalize a locale ID by stripping spaces and apply proper casing.

    Returns the normalized locale ID string or `None` if the ID is not
    recognized.
    N)
isinstancestrstriplowerr   from_iterable_cachelocale_identifiers)nameZ	locale_id r   /lib/python3.7/site-packages/babel/localedata.pynormalize_locale   s    r   c             C   sJ   t j| } tjdkr8tt j| d r8td|  t j	t
d|  S )z?
    Resolve a locale identifier to a `.dat` path on disk.
    win32r   zName %s is invalid on Windowsz%s.dat)ospathbasenamesysplatform_windows_reserved_name_rematchsplitext
ValueErrorjoin_dirname)r   r   r   r   resolve_locale_filename+   s     r   c             C   sB   | rt | tsdS | tkrdS tjt| }|r6dS tt| S )zCheck whether locale data is available for the given locale.

    Returns `True` if it exists, `False` otherwise.

    :param name: the locale identifier string
    FT)	r   r   r	   r   r   existsr   boolr   )r   Z
file_foundr   r   r   r   ;   s    r   c              C   s<   t tdd} | dkr8dd dd ttD D  t_} | S )a  Return a list of all locale identifiers for which locale data is
    available.

    This data is cached after the first invocation in `locale_identifiers.cache`.

    Removing the `locale_identifiers.cache` attribute or setting it to `None`
    will cause this function to re-read the list from disk.

    .. versionadded:: 0.8.1

    :return: a list of locale identifiers (strings)
    cacheNc             S   s$   g | ]\}}|d kr|dkr|qS )z.datrootr   ).0Zstem	extensionr   r   r   
<listcomp>Z   s   z&locale_identifiers.<locals>.<listcomp>c             s   s   | ]}t j|V  qd S )N)r   r   r   )r    filenamer   r   r   	<genexpr>\   s    z%locale_identifiers.<locals>.<genexpr>)getattrr
   r   listdirr   r   )datar   r   r   r
   J   s
    r
   Tc          	   C   s   t j| } t  zt| }|s| dks0|s6i }nXddlm} |d| }|s| 	d}t
|dkrpd}nd|dd }t| }t| }t|d	.}| dkr|rt|t| n
t|}W dQ R X |t| < |S t  X dS )
ae  Load the locale data for the given locale.

    The locale data is a dictionary that contains much of the data defined by
    the Common Locale Data Repository (CLDR). This data is stored as a
    collection of pickle files inside the ``babel`` package.

    >>> d = load('en_US')
    >>> d['languages']['sv']
    u'Swedish'

    Note that the results are cached, and subsequent requests for the same
    locale return the same dictionary:

    >>> d1 = load('en_US')
    >>> d2 = load('en_US')
    >>> d1 is d2
    True

    :param name: the locale identifier string (or "root")
    :param merge_inherited: whether the inherited data should be merged into
                            the data of the requested locale
    :raise `IOError`: if no locale data file is found for the given locale
                      identifer, or one of the locales it inherits from
    r   r   )
get_globalZparent_exceptions_   Nrb)r   r   r   _cache_lockacquirer	   getZ
babel.corer(   splitlenr   loadcopyr   openmergepicklerelease)r   Zmerge_inheritedr'   r(   parentpartsr#   Zfileobjr   r   r   r2   b   s.    

r2   c             C   s   x|  D ]\}}|dk	r
| |}t|tr|dkr:i }t|trN||f}qt|tr||\}}| }t|| ||f}q| }t|| n|}|| |< q
W dS )an  Merge the data from `dict2` into the `dict1` dictionary, making copies
    of nested dictionaries.

    >>> d = {1: 'foo', 3: 'baz'}
    >>> merge(d, {1: 'Foo', 2: 'Bar'})
    >>> sorted(d.items())
    [(1, 'Foo'), (2, 'Bar'), (3, 'baz')]

    :param dict1: the dictionary to merge into
    :param dict2: the dictionary containing the data that should be merged
    N)itemsr/   r   dictAliastupler3   r5   )Zdict1Zdict2keyZval2Zval1aliasothersr   r   r   r5      s"    






r5   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r<   zRepresentation of an alias in the locale data.

    An alias is a value that refers to some other part of the locale data,
    as specified by the `keys`.
    c             C   s   t || _d S )N)r=   keys)selfrA   r   r   r   __init__   s    zAlias.__init__c             C   s   dt | j| jf S )Nz<%s %r>)type__name__rA   )rB   r   r   r   __repr__   s    zAlias.__repr__c             C   sR   |}x| j D ]}|| }qW t|tr2||}nt|trN|\}}||}|S )zResolve the alias based on the given data.

        This is done recursively, so if one alias resolves to a second alias,
        that second alias will also be resolved.

        :param data: the locale data
        :type data: `dict`
        )rA   r   r<   resolver=   )rB   r'   baser>   r?   r@   r   r   r   rG      s    	


zAlias.resolveN)rE   
__module____qualname____doc__rC   rF   rG   r   r   r   r   r<      s   r<   c               @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )LocaleDataDictzUDictionary wrapper that automatically resolves aliases to the actual
    values.
    Nc             C   s   || _ |d kr|}|| _d S )N)_datarH   )rB   r'   rH   r   r   r   rC      s    zLocaleDataDict.__init__c             C   s
   t | jS )N)r1   rM   )rB   r   r   r   __len__   s    zLocaleDataDict.__len__c             C   s
   t | jS )N)iterrM   )rB   r   r   r   __iter__   s    zLocaleDataDict.__iter__c             C   s   | j |  }}t|tr$|| j}t|trP|\}}|| j }t|| t|t	krjt
|| jd}||k	r||| j |< |S )N)rH   )rM   r   r<   rG   rH   r=   r3   r5   rD   r;   rL   )rB   r>   Zorigvalr?   r@   r   r   r   __getitem__   s    



zLocaleDataDict.__getitem__c             C   s   || j |< d S )N)rM   )rB   r>   valuer   r   r   __setitem__   s    zLocaleDataDict.__setitem__c             C   s   | j |= d S )N)rM   )rB   r>   r   r   r   __delitem__   s    zLocaleDataDict.__delitem__c             C   s   t | j | jdS )N)rH   )rL   rM   r3   rH   )rB   r   r   r   r3      s    zLocaleDataDict.copy)N)rE   rI   rJ   rK   rC   rN   rP   rR   rT   rU   r3   r   r   r   r   rL      s   
rL   )T)rK   r6   r   rer   Z	threadingcollectionsr   	itertoolsr   r	   RLockr-   r   r   dirname__file__r   compileIr   r   r   r   r
   r2   r5   r<   MutableMappingrL   r   r   r   r   <module>   s&   
7!!