B
    Ad                 @  s`  d Z ddlmZ ddl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
mZ ddlmZmZmZ ddlmZmZ e ZedZdd	d
ddZedejZdddddZedZd,ddddddZddddddZG dd dejZd-ddddd"d#d$d%Zej Z!G d&d' d'ej"Z#ej$Z$ej%Z%ej&Z&ej'Z'ej(Z(ej)Z)ej*Z*d(d(d)d*d+Z+dS ).z
    babel.util
    ~~~~~~~~~~

    Various utility classes and functions.

    :copyright: (c) 2013-2023 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    )annotationsN)	GeneratorIterable)IOAnyTypeVar)dates	localtime_TzIterable[_T]zGenerator[_T, None, None])iterablereturnc             c  s4   t  }x(t| D ]}||kr|V  || qW 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)r   seenitem r   </var/www/html/venv/lib/python3.7/site-packages/babel/util.pydistinct   s
    r   s(   [ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)z	IO[bytes]z
str | None)fpr   c          
   C  s   |   }| d z|  }|tj}|r>|ttjd }t|}|syddl	}|
|d W n tttfk
r   Y nX |  }t|}|r|r|dd}|dkrtd| ddS |r|ddS dS W d| | X dS )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   Nzlatin-1   zutf-8zencoding problem: z	 with BOM)tellseekreadline
startswithcodecsBOM_UTF8lenPYTHON_MAGIC_COMMENT_rematchastparsedecodeImportErrorSyntaxErrorUnicodeEncodeErrorgroup)r   posline1Zhas_bommr    line2Zmagic_comment_encodingr   r   r   parse_encoding5   s4    


r+   z'from\s+__future__\s+import\s+\(*(.+)\)*latin-1strint)r   encodingr   c       
   	   C  s   ddl }|  }| d d}z|  |}tdd|}tdd|}tdd|}xTt|D ]F}d	d
 |	d
dD }x&|D ]}t||d}	|	r||	jO }qW qdW W d| | X |S )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getattrcompiler_flag)
r   r/   r6   r'   flagsbodyr)   namesnamefeaturer   r   r   parse_future_flagsi   s"    

rD   bool)patternfilenamer   c             C  s   ddddddd}|  dr0dg}| d	d
 } n"|  drNdg}| dd
 } ng }xHttd| D ]4\}}|d r|||  qd|rd|t| qdW td| d|t	j
d}|d
k	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   	enumerater8   r<   appendescaper   joinreplaceossep)rF   rG   symbolsbufidxpartr   r   r   r   	pathmatch   s(    '

"rZ   c               @  s   e Zd ZedZdS )TextWrapperz((\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))N)__name__
__module____qualname__r8   compile
wordsep_rer   r   r   r   r[      s   r[   F   rL   z	list[str])textwidthinitial_indentsubsequent_indentr   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)rc   rd   re   break_long_words)r[   wrap)rb   rc   rd   re   wrapperr   r   r   wraptext   s    ri   c               @  sp   e Zd ZdZdddddddZd	d
ddZd	d
ddZdddddZdd	dddZdddddZ	dS )FixedOffsetTimezonez&Fixed offset in minutes east from UTC.Nfloatz
str | NoneNone)offsetrB   r   c             C  s(   t j|d| _|d krd| }|| _d S )N)minutesz
Etc/GMT%+d)datetime	timedelta_offsetzone)selfrm   rB   r   r   r   __init__   s    zFixedOffsetTimezone.__init__r-   )r   c             C  s   | j S )N)rr   )rs   r   r   r   __str__   s    zFixedOffsetTimezone.__str__c             C  s   d| j  d| j dS )Nz<FixedOffset "z" >)rr   rq   )rs   r   r   r   __repr__   s    zFixedOffsetTimezone.__repr__zdatetime.datetimezdatetime.timedelta)dtr   c             C  s   | j S )N)rq   )rs   rx   r   r   r   	utcoffset   s    zFixedOffsetTimezone.utcoffsetc             C  s   | j S )N)rr   )rs   rx   r   r   r   tzname   s    zFixedOffsetTimezone.tznamec             C  s   t S )N)ZERO)rs   rx   r   r   r   dst   s    zFixedOffsetTimezone.dst)N)
r\   r]   r^   __doc__rt   ru   rw   ry   rz   r|   r   r   r   r   rj      s   rj   r   )abc             C  s   | |k| |k  S )Nr   )r~   r   r   r   r   _cmp  s    r   )r,   )ra   rL   rL   ),r}   r6   r   r   collectionsro   rT   r8   textwrapcollections.abcr   r   typingr   r   r   Zbabelr   r	   objectmissingr
   r   r_   VERBOSEr   r+   r:   rD   rZ   r[   ri   OrderedDictZodicttzinforj   UTCZLOCALTZZget_localzoneZ	STDOFFSETZ	DSTOFFSETZDSTDIFFr{   r   r   r   r   r   <module>	   s@   
0 A