o
    .^dU[G  ã                   @   sø   d dl mZ d dlZd dlZd dlmZ d dlmZ e d¡Z	dd„ Z
d%d
d„Zd&dd„Zdd„ Zd'dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd&dd„Zdd „ Zze ¡ j d!d"„ ZW n eyk   d#d"„ ZY nw ed$krzd dlZe ¡  dS dS )(é    )ÚdivisionN)ÚDecimal)Úsixz([dgGhHis])c                 C   s   d|   ¡  S )Nz%%(%s)s)Úgroup)Úx© r   úC/var/www/html/env/lib/python3.10/site-packages/timedelta/helpers.pyÚ<lambda>
   s    r	   Úlongú, c              	   C   sÒ  t | tjƒs
J dƒ‚g }t| jd ƒ}| jd }t| jd ƒ}t| jd d ƒ}| jd }|dkr?||d 7 }d||||f S |dkrGt| ƒS |dkrPg d	¢}	nE|d
krYg d¢}	n<|dkrbg d¢}	n3t t	|¡|||dkro|nd| ||dkry|nd| |dkr‚|nd| |dkrŽ|dœ S d| dœ S |||||g}
t
t|
ƒƒD ]2}|
| rÔ|
| dkrÇt|	| ƒdkrÇ| d|
| |	|  d¡f ¡ q¢| d|
| |	| f ¡ q¢t|ƒdkrä| d|	d  ¡ | |¡S )a»  
    Turns a datetime.timedelta object into a nice string repr.

    display can be "sql", "iso8601", "minimal", "short" or "long" [default].

    >>> from datetime import timedelta as td
    >>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4))
    '1 day, 2 hours, 3 minutes, 4 seconds'
    >>> nice_repr(td(days=1, seconds=1), "minimal")
    '1d, 1s'
    >>> nice_repr(datetime.timedelta(days=1))
    '1 day'
    >>> nice_repr(datetime.timedelta(days=0))
    '0 seconds'
    >>> nice_repr(datetime.timedelta(seconds=1))
    '1 second'
    >>> nice_repr(datetime.timedelta(seconds=10))
    '10 seconds'
    >>> nice_repr(datetime.timedelta(seconds=30))
    '30 seconds'
    >>> nice_repr(datetime.timedelta(seconds=60))
    '1 minute'
    >>> nice_repr(datetime.timedelta(seconds=150))
    '2 minutes, 30 seconds'
    >>> nice_repr(datetime.timedelta(seconds=1800))
    '30 minutes'
    >>> nice_repr(datetime.timedelta(seconds=3600))
    '1 hour'
    >>> nice_repr(datetime.timedelta(seconds=3601))
    '1 hour, 1 second'
    >>> nice_repr(datetime.timedelta(seconds=19800))
    '5 hours, 30 minutes'
    >>> nice_repr(datetime.timedelta(seconds=91800))
    '1 day, 1 hour, 30 minutes'
    >>> nice_repr(datetime.timedelta(seconds=302400))
    '3 days, 12 hours'

    Tests for handling zero:
    >>> nice_repr(td(seconds=0), 'minimal')
    '0s'
    >>> nice_repr(td(seconds=0), 'short')
    '0 sec'
    >>> nice_repr(td(seconds=0), 'long')
    '0 seconds'
    ú#First argument must be a timedelta.é   é  é<   Úsqlz%i %02i:%02i:%02iÚiso8601Úminimal)ÚwÚdÚhÚmÚsÚshort)z wksú daysz hrsz minz secr
   )z weeksr   z hoursz minutesz secondsé	   z0%s)r   ÚgÚGr   ÚHÚir   é   z%i%sr   r   éÿÿÿÿ)Ú
isinstanceÚdatetimeÚ	timedeltaÚintÚdaysÚsecondsÚiso8601_reprÚSTRFDATETIMEÚsubÚSTRFDATETIME_REPLÚrangeÚlenÚappendÚrstripÚjoin)r#   ÚdisplayÚsepÚresultÚweeksr%   ÚhoursÚminutesr&   ÚwordsÚvaluesr   r   r   r   Ú	nice_repr   sN   /






ùù
"€
r8   c                 C   s  t | jd ƒ}t | jd d ƒ}| jd }t | jd ƒ}t | jd d ƒ}| jd }|dkr?|s4|s4|r8tdƒ‚d |||¡S dd	|fd
|fd|fffdd|fd|fd|ffff}g }	|D ]\}
}|	|
7 }	|D ]\}}|rv|	 d||f ¡ qgq]|	d dkr„|	dd… }	d |	¡S )a=  
    Represent a timedelta as an ISO8601 duration.
    http://en.wikipedia.org/wiki/ISO_8601#Durations

    >>> from datetime import timedelta as td
    >>> iso8601_repr(td(days=1, hours=2, minutes=3, seconds=4))
    'P1DT2H3M4S'

    >>> iso8601_repr(td(hours=1, minutes=10, seconds=20), 'alt')
    'PT01:10:20'
    im  r   r   r   Úaltz1Does not support alt format for durations > 1 dayzPT{0:02d}:{1:02d}:{2:02d}ÚPÚYÚWÚDÚTr   ÚMÚSz%d%cr    NÚ )r$   r%   r&   Ú
ValueErrorÚformatr-   r/   )r#   rC   Úyearsr3   r%   r4   r5   r&   Ú
formattingr2   ÚcategoryÚsubcatsÚvaluer   r   r   r'   o   s@   

ýýú€þ
r'   c                 C   s¾   |   ¡ } | dkrtd|  ƒ‚t dt | ¡¡}|r8| d¡}|d dkr1dD ]
}d||  ||< q&| dd¡ nt d	t | ¡¡}|sItd|  ƒ‚| d¡}tj	di t
d
d„ | ¡ D ƒƒ¤ŽS )aÿ  
    Parse a string into a timedelta object.

    >>> parse("1 day")
    datetime.timedelta(1)
    >>> parse("2 days")
    datetime.timedelta(2)
    >>> parse("1 d")
    datetime.timedelta(1)
    >>> parse("1 hour")
    datetime.timedelta(0, 3600)
    >>> parse("1 hours")
    datetime.timedelta(0, 3600)
    >>> parse("1 hr")
    datetime.timedelta(0, 3600)
    >>> parse("1 hrs")
    datetime.timedelta(0, 3600)
    >>> parse("1h")
    datetime.timedelta(0, 3600)
    >>> parse("1wk")
    datetime.timedelta(7)
    >>> parse("1 week")
    datetime.timedelta(7)
    >>> parse("1 weeks")
    datetime.timedelta(7)
    >>> parse("2 wks")
    datetime.timedelta(14)
    >>> parse("1 sec")
    datetime.timedelta(0, 1)
    >>> parse("1 secs")
    datetime.timedelta(0, 1)
    >>> parse("1 s")
    datetime.timedelta(0, 1)
    >>> parse("1 second")
    datetime.timedelta(0, 1)
    >>> parse("1 seconds")
    datetime.timedelta(0, 1)
    >>> parse("1 minute")
    datetime.timedelta(0, 60)
    >>> parse("1 min")
    datetime.timedelta(0, 60)
    >>> parse("1 m")
    datetime.timedelta(0, 60)
    >>> parse("1 minutes")
    datetime.timedelta(0, 60)
    >>> parse("1 mins")
    datetime.timedelta(0, 60)
    >>> parse("2 ws")
    Traceback (most recent call last):
    ...
    TypeError: '2 ws' is not a valid time interval
    >>> parse("2 ds")
    Traceback (most recent call last):
    ...
    TypeError: '2 ds' is not a valid time interval
    >>> parse("2 hs")
    Traceback (most recent call last):
    ...
    TypeError: '2 hs' is not a valid time interval
    >>> parse("2 ms")
    Traceback (most recent call last):
    ...
    TypeError: '2 ms' is not a valid time interval
    >>> parse("2 ss")
    Traceback (most recent call last):
    ...
    TypeError: '2 ss' is not a valid time interval
    >>> parse("")
    Traceback (most recent call last):
    ...
    TypeError: '' is not a valid time interval
    >>> parse("1.5 days")
    datetime.timedelta(1, 43200)
    >>> parse("3 weeks")
    datetime.timedelta(21)
    >>> parse("4.2 hours")
    datetime.timedelta(0, 15120)
    >>> parse(".5 hours")
    datetime.timedelta(0, 1800)
    >>> parse(" hours")
    Traceback (most recent call last):
        ...
    TypeError: 'hours' is not a valid time interval
    >>> parse("1 hour, 5 mins")
    datetime.timedelta(0, 3900)

    >>> parse("-2 days")
    datetime.timedelta(-2)
    >>> parse("-1 day 0:00:01")
    datetime.timedelta(-1, 1)
    >>> parse("-1 day, -1:01:01")
    datetime.timedelta(-2, 82739)
    >>> parse("-1 weeks, 2 days, -3 hours, 4 minutes, -5 seconds")
    datetime.timedelta(-5, 11045)

    >>> parse("0 seconds")
    datetime.timedelta(0)
    >>> parse("0 days")
    datetime.timedelta(0)
    >>> parse("0 weeks")
    datetime.timedelta(0)

    >>> zero = datetime.timedelta(0)
    >>> parse(nice_repr(zero))
    datetime.timedelta(0)
    >>> parse(nice_repr(zero, 'minimal'))
    datetime.timedelta(0)
    >>> parse(nice_repr(zero, 'short'))
    datetime.timedelta(0)
    >>> parse('  50 days 00:00:00   ')
    datetime.timedelta(50)
    rA   z!'%s' is not a valid time intervalzj^((?P<days>[-+]?\d+) days?,? )?(?P<sign>[-+]?)(?P<hours>\d+):(?P<minutes>\d+)(:(?P<seconds>\d+(\.\d+)?))?$r   Úsignú-)r4   r5   r&   Na  ^((?P<weeks>-?((\d*\.\d+)|\d+))\W*w((ee)?(k(s)?)?)(,)?\W*)?((?P<days>-?((\d*\.\d+)|\d+))\W*d(ay(s)?)?(,)?\W*)?((?P<hours>-?((\d*\.\d+)|\d+))\W*h(ou)?(r(s)?)?(,)?\W*)?((?P<minutes>-?((\d*\.\d+)|\d+))\W*m(in(ute)?(s)?)?(,)?\W*)?((?P<seconds>-?((\d*\.\d+)|\d+))\W*s(ec(ond)?(s)?)?)?\W*$c                 s   s    � | ]\}}|t |ƒfV  qd S ©N)Úfloat)Ú.0ÚkÚvr   r   r   Ú	<genexpr>-  s   € zparse.<locals>.<genexpr>r   )ÚstripÚ	TypeErrorÚreÚmatchr   Ú	text_typeÚ	groupdictÚpopr"   r#   ÚdictÚitems)Ústringr   rN   r   r   r   Úparse    s(   qþ
ú
"r[   Fc                 C   s¦   t | tjƒs
J dƒ‚t |tjtttfƒsJ dƒ‚| jd | j }t |tjƒr:|jd |j }|| }|r6|S t|ƒS |r@J dƒ‚|| }t |tƒrMt|ƒ}tj|d�S )aÿ  
    Allows for the division of timedeltas by other timedeltas, or by
    floats/Decimals

    >>> from datetime import timedelta as td
    >>> divide(td(1), td(1))
    1
    >>> divide(td(2), td(1))
    2
    >>> divide(td(32), 16)
    datetime.timedelta(2)
    >>> divide(datetime.timedelta(1), datetime.timedelta(hours=6))
    4
    >>> divide(datetime.timedelta(2), datetime.timedelta(3))
    0
    >>> divide(datetime.timedelta(8), datetime.timedelta(3), as_float=True)
    2.6666666666666665
    >>> divide(datetime.timedelta(8), 2.0)
    datetime.timedelta(4)
    >>> divide(datetime.timedelta(8), 2, as_float=True)
    Traceback (most recent call last):
        ...
    AssertionError: as_float=True is inappropriate when dividing timedelta by a number.

    r   z-Second argument must be a timedelta or numberé€Q NzCas_float=True is inappropriate when dividing timedelta by a number.©r&   ©r!   r"   r#   r$   rL   r   r%   r&   )Úobj1Úobj2Úas_floatÚsec1Úsec2rH   Úsecsr   r   r   Údivide0  s   
re   c                 C   sx   t | tjƒs
J dƒ‚t |tjtfƒsJ dƒ‚| jd | j }t |tjƒr4|jd |j }tj|| d�S tj|| d�S )a<  
    Allows for remainder division of timedelta by timedelta or integer.

    >>> from datetime import timedelta as td
    >>> modulo(td(5), td(2))
    datetime.timedelta(1)
    >>> modulo(td(6), td(3))
    datetime.timedelta(0)
    >>> modulo(td(15), 4 * 3600 * 24)
    datetime.timedelta(3)

    >>> modulo(5, td(1))
    Traceback (most recent call last):
        ...
    AssertionError: First argument must be a timedelta.
    >>> modulo(td(1), 2.8)
    Traceback (most recent call last):
        ...
    AssertionError: Second argument must be a timedelta or int.
    r   z+Second argument must be a timedelta or int.r\   r]   )r!   r"   r#   r$   r%   r&   )r_   r`   rb   rc   r   r   r   Úmodulo\  s   rf   c                 C   s:   t | tjƒs
J dƒ‚t |tjƒsJ dƒ‚t| d |dd�S )zÞ
    What percentage of obj2 is obj1? We want the answer as a float.
    >>> percentage(datetime.timedelta(4), datetime.timedelta(2))
    200.0
    >>> percentage(datetime.timedelta(2), datetime.timedelta(4))
    50.0
    r   ú$Second argument must be a timedelta.éd   T)ra   )r!   r"   r#   re   ©r_   r`   r   r   r   Ú
percentage{  s   rj   c                 C   s   t tt| |ƒƒƒS )zÀ
    >>> decimal_percentage(datetime.timedelta(4), datetime.timedelta(2))
    Decimal('200.0')
    >>> decimal_percentage(datetime.timedelta(2), datetime.timedelta(4))
    Decimal('50.0')
    )r   Ústrrj   ri   r   r   r   Údecimal_percentageˆ  s   rl   c                 C   sb   t | tjƒs
J dƒ‚t |tttfƒsJ dƒ‚| jd | j }||9 }t |tƒr+t|ƒ}tj|d�S )a´  
    Allows for the multiplication of timedeltas by float values.
    >>> multiply(datetime.timedelta(seconds=20), 1.5)
    datetime.timedelta(0, 30)
    >>> multiply(datetime.timedelta(1), 2.5)
    datetime.timedelta(2, 43200)
    >>> multiply(datetime.timedelta(1), 3)
    datetime.timedelta(3)
    >>> multiply(datetime.timedelta(1), Decimal("5.5"))
    datetime.timedelta(5, 43200)
    >>> multiply(datetime.date.today(), 2.5)
    Traceback (most recent call last):
        ...
    AssertionError: First argument must be a timedelta.
    >>> multiply(datetime.timedelta(1), "2")
    Traceback (most recent call last):
        ...
    AssertionError: Second argument must be a number.
    r   z!Second argument must be a number.r\   r]   r^   )ÚobjÚvalÚsecr   r   r   Úmultiply’  s   
rp   c                 C   s&  t | tjtjtjfƒsJ dƒ‚t |tjƒsJ dƒ‚d}t | tjƒr't d¡}n8t | tjƒr=tj |  ¡ tjd| jd�¡}n"t | tjƒr_tj tj ¡ tjd| jd�¡}tj tj ¡ | ¡} d}t| | ƒ}|| k ry|}||7 }t| | ƒ}|| k si|| kr€| }n||kr‡|}n|| }|r‘| ¡ S |S )aè	  
    The obj is rounded to the nearest whole number of timedeltas.

    obj can be a timedelta, datetime or time object.

    >>> round_to_nearest(datetime.datetime(2012, 1, 1, 9, 43), datetime.timedelta(1))
    datetime.datetime(2012, 1, 1, 0, 0)
    >>> round_to_nearest(datetime.datetime(2012, 1, 1, 9, 43), datetime.timedelta(hours=1))
    datetime.datetime(2012, 1, 1, 10, 0)
    >>> round_to_nearest(datetime.datetime(2012, 1, 1, 9, 43), datetime.timedelta(minutes=15))
    datetime.datetime(2012, 1, 1, 9, 45)
    >>> round_to_nearest(datetime.datetime(2012, 1, 1, 9, 43), datetime.timedelta(minutes=1))
    datetime.datetime(2012, 1, 1, 9, 43)

    >>> td = datetime.timedelta(minutes=30)
    >>> round_to_nearest(datetime.timedelta(minutes=0), td)
    datetime.timedelta(0)
    >>> round_to_nearest(datetime.timedelta(minutes=14), td)
    datetime.timedelta(0)
    >>> round_to_nearest(datetime.timedelta(minutes=15), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(minutes=29), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(minutes=30), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(minutes=42), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(hours=7, minutes=22), td)
    datetime.timedelta(0, 27000)

    >>> td = datetime.timedelta(minutes=15)
    >>> round_to_nearest(datetime.timedelta(minutes=0), td)
    datetime.timedelta(0)
    >>> round_to_nearest(datetime.timedelta(minutes=14), td)
    datetime.timedelta(0, 900)
    >>> round_to_nearest(datetime.timedelta(minutes=15), td)
    datetime.timedelta(0, 900)
    >>> round_to_nearest(datetime.timedelta(minutes=29), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(minutes=30), td)
    datetime.timedelta(0, 1800)
    >>> round_to_nearest(datetime.timedelta(minutes=42), td)
    datetime.timedelta(0, 2700)
    >>> round_to_nearest(datetime.timedelta(hours=7, minutes=22), td)
    datetime.timedelta(0, 26100)

    >>> td = datetime.timedelta(minutes=30)
    >>> round_to_nearest(datetime.datetime(2010,1,1,9,22), td)
    datetime.datetime(2010, 1, 1, 9, 30)
    >>> round_to_nearest(datetime.datetime(2010,1,1,9,32), td)
    datetime.datetime(2010, 1, 1, 9, 30)
    >>> round_to_nearest(datetime.datetime(2010,1,1,9,42), td)
    datetime.datetime(2010, 1, 1, 9, 30)

    >>> round_to_nearest(datetime.time(0,20), td)
    datetime.time(0, 30)

    TODO: test with tzinfo (non-naive) datetimes/times.
    z3First argument must be datetime, time or timedelta.rg   Fr   )ÚtzinfoT)	r!   r"   r#   ÚtimeÚcombineÚdaterq   ÚtodayÚabs)rm   r#   Ú	time_onlyÚcounterÚdiffÚold_diffr2   r   r   r   Úround_to_nearest±  s2   =  ýr{   c                 C   s<   t | jd ƒt | jƒd  }|r| t td|  ƒƒ¡S |S )za
    Return a decimal value of the number of hours that this timedelta
    object refers to.
    é   r   é
   )r   r%   r&   Úquantizerk   )r#   Údecimal_placesr4   r   r   r   Údecimal_hours  s   r€   c                 C   s,   |   ¡ r| t |   ¡ ¡8 } | | t d¡ fS )Né   )Úweekdayr"   r#   )rt   r   r   r   Úweek_containing  s   rƒ   c                 C   s   |   ¡ S rK   )Útotal_seconds©r#   r   r   r   r„     s   r„   c                 C   s   | j d | j S )zM
        Python < 2.7 does not have datetime.timedelta.total_seconds
        r\   )r%   r&   r…   r   r   r   r„   "  s   Ú__main__)r
   r   rK   )F)Ú
__future__r   rS   r"   Údecimalr   Údjango.utilsr   Úcompiler(   r*   r8   r'   r[   re   rf   rj   rl   rp   r{   r€   rƒ   r#   r„   ÚAttributeErrorÚ__name__ÚdoctestÚtestmodr   r   r   r   Ú<module>   s:    


c1 
,

\

ÿþ