U
    4JeW#                     @   s>  d Z dZddlZddlZddlmZ zddlmZ daW n e	k
rT   dadZY nX dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdddddddddZdd  Zd!d" Zee d#ee d#ee d#ee d#ee d#ee d#ee d#ee ee d#ee d#ee d#ee d#ee d#ee e ee d#ee d#e e e e e gZed#e
 d$ Zd%d& eD Zd'd( Zd)d* Z ej!e ej!e d+d,d-Z"d.efej#e$e%e&f e$ej'e ej!e d/d0d1Z(d2d3 Z)d4d5 Z*d9ej#e$e%e&f e$e+e+ej!ej#e%e&eej,f  d6d7d8Z-dS ):z
(c) Sergey Klyuykov <onegreyonewhite@mail.ru> 3 Nov 2021

Implements a single function, `parse`, which can parse various
kinds of time expressions.
z1.7.1    N)	timedelta)relativedeltaTFz(?P<sign>[+|-]|\+)?z)(?P<years>[\d.]+)\s*(?:ys?|yrs?.?|years?)z/(?P<months>[\d.]+)\s*(?:mos?.?|mths?.?|months?)z%(?P<weeks>[\d.]+)\s*(?:w|wks?|weeks?)z#(?P<days>[\d.]+)\s*(?:d|dys?|days?)z%(?P<hours>[\d.]+)\s*(?:h|hrs?|hours?)z.(?P<minutes>[\d.]+)\s*(?:m|(mins?)|(minutes?))z*(?P<seconds>[\d.]+)\s*(?:s|secs?|seconds?)z=(?P<milliseconds>[\d.]+)\s*(?:ms|msecs?|millis|milliseconds?)z[,/]z:(?P<seconds>\d{2}(?:\.\d+)?)z1(?P<minutes>\d{1,2}):(?P<seconds>\d{2}(?:\.\d+)?)z>(?P<hours>\d+):(?P<minutes>\d{2}):(?P<seconds>\d{2}(?:\.\d+)?)zN(?P<days>\d+):(?P<hours>\d{2}):(?P<minutes>\d{2}):(?P<seconds>\d{2}(?:\.\d+)?)i3i ' i:	 iQ i  <      gMbP?)yearsmonthsweeksdayshoursminutessecondsmillisecondsc                 C   s   dj | dS )Nz(?:{x})?x)formatr    r   0/tmp/pip-unpacked-wheel-ml1m9h7j/pytimeparse2.pyOPTK   s    r   c                 C   s   dj | tdS )Nz(?:{x}\s*(?:{SEPARATORS}\s*)?)?)r   
SEPARATORS)r   r   r   r   r   r   OPTSEPO   s    r   \s*z\s*(?P<unsigned>.*)$c                 C   s"   g | ]}t d | d t jqS )r   z\s*$)recompileI).0timefmtr   r   r   
<listcomp>f   s   r   c                    s   t rLt|trLd kr0t dp$dd  d< |f dd   D  S |f  fdd  D }  D ]`\}}|s~qp| r||t	| t
|d d	7 }qp|d
dd rp||t	| t| d	7 }qp|S )Nr   r   i  microsecondsc                 S   s   i | ]\}}|r|t |qS r   )float)r   kvr   r   r   
<dictcomp>p   s       z_all_digits.<locals>.<dictcomp>c                    s(   i | ] }|d kr|t  |p dqS ))r
   r   r	   r   r   )r   pop)r   keymdictr   r   r!   r   s    
   r   . r   )HAS_RELITIVE_TIMEDELTA
issubclassr   r   r"   items
normalizedcopyisdigitMULTIPLIERSintreplace)r%   delta_classdeltaZ	time_typevaluer   r$   r   _all_digitsl   s    r6   c                 C   s   |  ddkrd| krd|ks*|d dkrd|ks>|d dkrd|ksR|d dkrd|ksf|d dkrd	|ksz|d	 dkr|d
 |d< |d |d
< |d |S )av  
    Times like "1:22" are ambiguous; do they represent minutes and seconds
    or hours and minutes?  By default, parse assumes the latter.  Call
    this function after parsing out a dictionary to change that assumption.

    >>> import pprint
    >>> pprint.pprint(_interpret_as_minutes('1:24', {'seconds': '24', 'minutes': '1'}))
    {'hours': '1', 'minutes': '24'}
    :r   r(   r
   Nr	   r   r   r   r   r   )countr"   )svalr%   r   r   r   _interpret_as_minutes   s*    
*




r:   )r5   returnc                 C   s   t d k	rt| t r|  S | S )N)r   
isinstancer-   )r5   r   r   r   _normilized_relativedelta   s    r=   r   )r9   granularityr3   r;   c                 C   s   t | ttfr t|t| dS | ddddddddd rXt|t| dS t| }| d dkrvdnd}| d	 } t	D ]L}|| }|r|
d
 sq| }|dkrt| |}|t||   S tt| d| S )Nr'   r(   r)   r   -+signZunsignedr   r   )r<   r1   r   r=   r2   r/   COMPILED_SIGNmatch	groupdictCOMPILED_TIMEFORMATSgroupstripr:   r6   r   )r9   r>   r3   rD   rA   r   r%   r   r   r   _parse   s     &


rI   c                   C   s   t d k	stddad S )Nz2Module python-dateutil should be installed before.T)r   AssertionErrorr*   r   r   r   r   enable_dateutil   s    rK   c                   C   s   da d S )NF)r*   r   r   r   r   disable_dateutil   s    rL   )r9   r>   raise_exceptionas_timedeltar;   c                 C   sl   zJt | |tr|rtnt}|sF|dk	rF| }| r@t|W S |W S |W S  tk
rf   |r` Y dS X dS )at  
    Parse a time expression, returning it as a number of seconds.  If
    possible, the return value will be an `int`; if this is not
    possible, the return will be a `float`.  Returns `None` if a time
    expression cannot be parsed from the given string.

    Arguments:
    - `sval`: the string value to parse
    - `granularity`: minimal type of digits after last colon (default is ``seconds``)
    - `raise_exception`: raise exception on parsing errors (default is ``False``)
    - `as_timedelta`: return ``datetime.timedelta`` object instead of ``int`` (default is ``False``)

    >>> parse('1:24')
    84
    >>> parse(':22')
    22
    >>> parse('1 minute, 24 secs')
    84
    >>> parse('1m24s')
    84
    >>> parse('1.2 minutes')
    72
    >>> parse('1.2 seconds')
    1.2

    Time expressions can be signed.

    >>> parse('- 1 minute')
    -60
    >>> parse('+ 1 minute')
    60

    If granularity is specified as ``minutes``, then ambiguous digits following
    a colon will be interpreted as minutes; otherwise they are considered seconds.

    >>> parse('1:30')
    90
    >>> parse('1:30', granularity='minutes')
    5400

    If ``as_timedelta`` is specified as ``True``, then return timedelta object.

    >>> parse('24h', as_timedelta=True)
    relativedelta(days=+1)
    >>> parse('48:00', as_timedelta=True, granularity='minutes')
    relativedelta(days=+2)

    If ``raise_exception`` is specified as ``True``, then exception will raised
    on failed parsing.

    >>> parse(':1.1.1', raise_exception=True)
    Traceback (most recent call last):
        ...
    ValueError: could not convert string to float: ':1.1.1'
    N)rI   r*   r   r   total_seconds
is_integerr1   	Exception)r9   r>   rM   rN   r5   	new_valuer   r   r   parse   s    =
rS   )r   FF).__doc____version__typingr   datetimer   Zdateutil.relativedeltar   r*   ImportErrorZSIGNZYEARSMONTHSZWEEKSDAYSZHOURSZMINSZSECSZMILLISr   ZSECCLOCKZMINCLOCKZ	HOURCLOCKZDAYCLOCKr0   r   r   ZTIMEFORMATSr   rC   rF   r6   r:   Optionalr=   Unionstrr1   r   TyperI   rK   rL   boolNoReturnrS   r   r   r   r   <module>   s   
P<   