o
    V\                     @   s   d Z ddlZddlZddlmZmZ ddlZddlZddlZddl	m
Z
mZ ddlZddlmZ e Zdd ZedejZd	d
 ZedZdddZdd ZG dd dejZdddZejZG dd deZejZ ej!Z!ej"Z"ej#Z#ej$Z$ej%Z%ej&Z&dS )z
    babel.util
    ~~~~~~~~~~

    Various utility classes and functions.

    :copyright: (c) 2013-2019 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    N)	timedeltatzinfo)izipimap)	localtimec                 c   s2    t  }t| D ]}||vr|V  || qdS )a  Yield all items in an iterable collection that are distinct.

    Unlike when using sets for a similar effect, the original ordering of the
    items in the collection is preserved by this function.

    >>> print(list(distinct([1, 2, 1, 3, 4, 4])))
    [1, 2, 3, 4]
    >>> print(list(distinct('foobar')))
    ['f', 'o', 'b', 'a', 'r']

    :param iterable: the iterable collection providing the data
    N)setiteradd)iterableseenitem r   ,/usr/lib/python3/dist-packages/babel/util.pydistinct   s   
r   s(   [ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)c              
   C   s  |   }| d zw|  }|tj}|r|ttjd }t|}|sJzddl	}|
|d W n tttfy@   Y n
w |  }t|}|ri|ra|dd}|dkratd|W | | dS |ry|ddW | | S W | | dS | | w )a/  Deduce the encoding of a source file from magic comment.

    It does this in the same way as the `Python interpreter`__

    .. __: https://docs.python.org/3.4/reference/lexical_analysis.html#encoding-declarations

    The ``fp`` argument should be a seekable file object.

    (From Jeff Dairiki)
    r   Nlatin-1   zutf-8zencoding problem: {0} with BOM)tellseekreadline
startswithcodecsBOM_UTF8lenPYTHON_MAGIC_COMMENT_rematchparserZsuitedecodeImportErrorSyntaxErrorUnicodeEncodeErrorgroupformat)fpposZline1Zhas_bommr   Zline2Zmagic_comment_encodingr   r   r   parse_encoding1   sB   


r%   z'from\s+__future__\s+import\s+\(*(.+)\)*r   c           
   	   C   s   ddl }|  }| d d}zK|  |}tdd|}tdd|}tdd|}t|D ]!}d	d
 |	d
dD }|D ]}t||d}	|	rQ||	jO }qBq1W | | |S | | w )zRParse the compiler flags by :mod:`__future__` from the given Python
    code.
    r   Nzimport\s*\([\r\n]+zimport (z,\s*[\r\n]+z, z\\\s*[\r\n]+ c                 S   s   g | ]	}|   d qS )z())strip).0xr   r   r   
<listcomp>}   s    z&parse_future_flags.<locals>.<listcomp>r   ,)
__future__r   r   readr   resubPYTHON_FUTURE_IMPORT_refinditerr    splitgetattrZcompiler_flag)
r"   encodingr,   r#   flagsbodyr$   namesnameZfeaturer   r   r   parse_future_flagsg   s*   


r9   c                 C   s   ddddddd}|  drdg}| d	d
 } n|  dr'dg}| dd
 } ng }ttd| D ]\}}|d rA|||  q1|rK|t| q1td|d |t	j
d}|d
uS )a  Extended pathname pattern matching.

    This function is similar to what is provided by the ``fnmatch`` module in
    the Python standard library, but:

     * can match complete (relative or absolute) path names, and not just file
       names, and
     * also supports a convenience pattern ("**") to match files at any
       directory level.

    Examples:

    >>> pathmatch('**.py', 'bar.py')
    True
    >>> pathmatch('**.py', 'foo/bar/baz.py')
    True
    >>> pathmatch('**.py', 'templates/index.html')
    False

    >>> pathmatch('./foo/**.py', 'foo/bar/baz.py')
    True
    >>> pathmatch('./foo/**.py', 'bar/baz.py')
    False

    >>> pathmatch('^foo/**.py', 'foo/bar/baz.py')
    True
    >>> pathmatch('^foo/**.py', 'bar/baz.py')
    False

    >>> pathmatch('**/templates/*.html', 'templates/index.html')
    True
    >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html')
    False

    :param pattern: the glob pattern
    :param filename: the path name of the file to match against
    z[^/]z[^/]/z[^/]+z[^/]+/z	(?:.+/)*?z(?:.+/)*?[^/]+)?z?/*z*/z**/z**^r   Nz./   z	([?*]+/?) $/)r   	enumerater.   r2   appendescaper   joinreplaceossep)patternfilenamesymbolsbufidxpartr   r   r   r   	pathmatch   s,   '
	
 rN   c                   @   s   e Zd ZedZdS )TextWrapperz((\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))N)__name__
__module____qualname__r.   compileZ
wordsep_rer   r   r   r   rO      s    rO   F   r>   c                 C   s   t |||dd}|| S )a  Simple wrapper around the ``textwrap.wrap`` function in the standard
    library. This version does not wrap lines on hyphens in words.

    :param text: the text to wrap
    :param width: the maximum line width
    :param initial_indent: string that will be prepended to the first line of
                           wrapped output
    :param subsequent_indent: string that will be prepended to all lines save
                              the first of wrapped output
    F)widthinitial_indentsubsequent_indentZbreak_long_words)rO   wrap)textrU   rV   rW   wrapperr   r   r   wraptext   s
   
r[   c                   @   sB   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S )FixedOffsetTimezonez&Fixed offset in minutes east from UTC.Nc                 C   s&   t |d| _|d u rd| }|| _d S )N)Zminutesz
Etc/GMT%+d)r   _offsetzone)selfoffsetr8   r   r   r   __init__   s   
zFixedOffsetTimezone.__init__c                 C      | j S Nr^   r_   r   r   r   __str__      zFixedOffsetTimezone.__str__c                 C   s   d| j | jf S )Nz<FixedOffset "%s" %s>)r^   r]   re   r   r   r   __repr__   s   zFixedOffsetTimezone.__repr__c                 C   rb   rc   )r]   r_   Zdtr   r   r   	utcoffset   rg   zFixedOffsetTimezone.utcoffsetc                 C   rb   rc   rd   ri   r   r   r   tzname   rg   zFixedOffsetTimezone.tznamec                 C   s   t S rc   )ZEROri   r   r   r   dst   s   zFixedOffsetTimezone.dstrc   )
rP   rQ   rR   __doc__ra   rf   rh   rj   rk   rm   r   r   r   r   r\      s    
r\   )r   )rT   r>   r>   )'rn   r   collectionsZdatetimer   r   rF   r.   textwrapZbabel._compatr   r   ZpytzZ_pytzZbabelr   objectmissingr   rS   VERBOSEr   r%   r0   r9   rN   rO   r[   OrderedDictZodictr\   ZutcZUTCZLOCALTZZget_localzoneZ	STDOFFSETZ	DSTOFFSETZDSTDIFFrl   r   r   r   r   <module>   s@   
2
 A

