HEX
Server: LiteSpeed
System: Linux s787.bom1.mysecurecloudhost.com 4.18.0-477.13.1.lve.el8.x86_64 #1 SMP Thu Jun 1 16:40:47 EDT 2023 x86_64
User: mobilech (5348)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/tempora/__pycache__/__init__.cpython-310.pyc
o

;j G�@stdZddlZddlZddlZddlZddlZddlZddlmZddlm	Z	m
Z
mZddlmZdZ
	dZdZd	Zd
Zd
ZdZeeZeeZeeZejdd
�Zejedd
�ZedZeedZe��defdd��Ze	ejejejfZ e	e
e!dfej"fZ#de dejfdd�Z$de	e e#fdejfdd�Z%de&de	e e'ej"fde&fdd�Z(dXdd�Z)dXdd �Z*d!d"�Z+d#d$�Z,d%d&�Z-d'd(�Z.d)d*�Z/d+e&dee
e&effd,d-�Z0d.d/�Z1d0d1�Z2d2d3�Z3id4d5�d6d5�d7d5�d8d5�d9d5�d:d;�d<d;�d=d;�d>d?�d@d?�dAdB�dCdB�dDdE�dFdE�dGdH�dIdH�dJdK�dLdLdLdM��Z4dNdO�Z5dPdQ�Z6dRdS�Z7GdTdU�dU�Z8dYdVdW�Z9dS)Zz:Objects and routines pertaining to date and time (tempora)�N)�Number)�Union�Tuple�Iterable)�castl�_�Kr4 l�m�G�iL���<����days���returncCstt�ddd��d��dkS)zp
    Some versions of Python render %Y with only three characters :(
    https://bugs.python.org/issue39103
    i�r�%Y�)�len�datetime�date�strftime�rr�D/opt/saltstack/salt/lib/python3.10/site-packages/tempora/__init__.py�_needs_year_help$sr.�obcCsdt|tj�r|Sttj|�}ttj|�}t|tj�rt��}t|tj�r+t�ddd�}tj�||�S)z�
    Given a datetime or date or time object from the ``datetime``
    module, always return a datetime using default values.
    ilr)�
isinstancerrr�time�combine)rrrrrr�ensure_datetime1srcCs*t|tjtf�rtj|dd��}t|�S)N�)rr�struct_time�tuplerr)rrrr�infer_datetimeAsr!�fmt�tcsxt|�}dd|jdfdd|jdffdd|jfft��dd����fd	d
�}d�t||�d���}|�|�S)u�
    Portable strftime.

    In the stdlib, strftime has `known portability problems
    <https://bugs.python.org/issue13305>`_. This function
    aims to smooth over those issues and provide a
    consistent experience across the major platforms.

    >>> strftime('%Y', datetime.datetime(1890, 1, 1))
    '1890'
    >>> strftime('%Y', datetime.datetime(900, 1, 1))
    '0900'

    Supports time.struct_time, tuples, and datetime.datetime objects.

    >>> strftime('%Y-%m-%d', (1976, 5, 7))
    '1976-05-07'

    Also supports date objects

    >>> strftime('%Y', datetime.date(1976, 5, 7))
    '1976'

    Also supports milliseconds using %s.

    >>> strftime('%s', datetime.time(microsecond=20000))
    '020'

    Also supports microseconds (3 digits) using %µ

    >>> strftime('%µ', datetime.time(microsecond=123456))
    '456'

    Historically, %u was used for microseconds, but now
    it honors the value rendered by stdlib.

    >>> strftime('%u', datetime.date(1976, 5, 7))
    '5'

    Also supports microseconds (6 digits) using %f

    >>> strftime('%f', datetime.time(microsecond=23456))
    '023456'

    Even supports time values on date objects (discouraged):

    >>> strftime('%f', datetime.date(1976, 1, 1))
    '000000'
    >>> strftime('%µ', datetime.date(1976, 1, 1))
    '000'
    >>> strftime('%s', datetime.date(1976, 1, 1))
    '000'

    And vice-versa:

    >>> strftime('%Y', datetime.time())
    '1900'
    z%sz%03d��u%µrz%04dcSs
|j|�S�N)�replace)�s�subrrr�doSub�s
zstrftime.<locals>.doSubcst���|�Sr%)�	functools�reduce)r'�r)Zsubsrr�doSubs�szstrftime.<locals>.doSubsz%%)r!�microsecond�yearr�join�map�splitr)r"r#r-rr,rrGs;��
rcCs\|durtj�|��t���}||}dd�}t|||f�\}}tj||d�}||}|S)a�
    Find the time which is the specified date/time truncated to the time delta
    relative to the start date/time.
    By default, the start time is midnight of the same day as the specified
    date/time.

    >>> datetime_mod(datetime.datetime(2004, 1, 2, 3),
    ...     datetime.timedelta(days = 1.5),
    ...     start = datetime.datetime(2004, 1, 1))
    datetime.datetime(2004, 1, 1, 0, 0)
    >>> datetime_mod(datetime.datetime(2004, 1, 2, 13),
    ...     datetime.timedelta(days = 1.5),
    ...     start = datetime.datetime(2004, 1, 1))
    datetime.datetime(2004, 1, 2, 12, 0)
    >>> datetime_mod(datetime.datetime(2004, 1, 2, 13),
    ...     datetime.timedelta(days = 7),
    ...     start = datetime.datetime(2004, 1, 1))
    datetime.datetime(2004, 1, 1, 0, 0)
    >>> datetime_mod(datetime.datetime(2004, 1, 10, 13),
    ...     datetime.timedelta(days = 7),
    ...     start = datetime.datetime(2004, 1, 1))
    datetime.datetime(2004, 1, 8, 0, 0)
    NcSs|jt|jd|jS)N�@B)r�seconds_per_day�seconds�microseconds��tdrrr�get_time_delta_microseconds�sz1datetime_mod.<locals>.get_time_delta_microseconds�r6)rrrrr1�	timedelta)�dt�period�start�deltar9�offset�resultrrr�datetime_mod�srBcCs,t|||�}t||�|dkr||7}|S)a
    Find the nearest even period for the specified date/time.

    >>> datetime_round(datetime.datetime(2004, 11, 13, 8, 11, 13),
    ...     datetime.timedelta(hours = 1))
    datetime.datetime(2004, 11, 13, 8, 0)
    >>> datetime_round(datetime.datetime(2004, 11, 13, 8, 31, 13),
    ...     datetime.timedelta(hours = 1))
    datetime.datetime(2004, 11, 13, 9, 0)
    >>> datetime_round(datetime.datetime(2004, 11, 13, 8, 30),
    ...     datetime.timedelta(hours = 1))
    datetime.datetime(2004, 11, 13, 9, 0)
    r
)rB�abs)r<r=r>rArrr�datetime_round�srDcCs>t��}|j}||jdkr|d8}|j|dkr|d7}|S)aF
    Returns the nearest year to now inferred from a Julian date.

    >>> freezer = getfixture('freezer')
    >>> freezer.move_to('2019-05-20')
    >>> get_nearest_year_for_day(20)
    2019
    >>> get_nearest_year_for_day(340)
    2018
    >>> freezer.move_to('2019-12-15')
    >>> get_nearest_year_for_day(20)
    2020
    �r)r�gmtime�tm_year�tm_yday)�day�nowrArrr�get_nearest_year_for_day�srKcCs&t�|dd�}|tj|dd�7}|S)z�
    Gregorian Date is defined as a year and a julian day (1-based
    index into the days of the year).

    >>> gregorian_date(2007, 15)
    datetime.date(2007, 1, 15)
    rr)rrr;)r/Z
julian_dayrArrr�gregorian_date�srLcCs�t|t�r!zd|��}t�|}W|Sty d}t|��wt|tj�r+|}|St|tj	�r=|j
td�|j}|St
d��)a�
    return the number of seconds in the specified period

    >>> get_period_seconds('day')
    86400
    >>> get_period_seconds(86400)
    86400
    >>> get_period_seconds(datetime.timedelta(hours=24))
    86400
    >>> get_period_seconds('day + os.system("rm -Rf *")')
    Traceback (most recent call last):
    ...
    ValueError: period not in (second, minute, hour, day, month, year)
    Zseconds_per_z6period not in (second, minute, hour, day, month, year)rIz"period must be a string or integer)r�str�lower�globals�KeyError�
ValueError�numbersrrr;r�get_period_secondsr5�	TypeError)r=�namerA�msgrrrrS�s 

����rScsnt|t�r
|��dkr
dSt|��d}d}tttt|f}tt	�fdd�|��}|d|�
d�d�}d	�|�S)
a�
    For a given period (e.g. 'month', 'day', or some numeric interval
    such as 3600 (in secs)), return the format string that can be
    used with strftime to format that time to specify the times
    across that interval, but no more detailed.
    For example,

    >>> get_date_format_string('month')
    '%Y-%m'
    >>> get_date_format_string(3600)
    '%Y-%m-%d %H'
    >>> get_date_format_string('hour')
    '%Y-%m-%d %H'
    >>> get_date_format_string(None)
    Traceback (most recent call last):
        ...
    TypeError: period must be a string or integer
    >>> get_date_format_string('garbage')
    Traceback (most recent call last):
        ...
    ValueError: period not in (second, minute, hour, day, month, year)
    �monthz%Y-%m)rz-%m-%dz %Hz-%Mz-%Srcs�|Sr%r)�interval�Zfile_period_secsrr�<lambda><sz(get_date_format_string.<locals>.<lambda>Nr�)rrMrNrS�seconds_per_yearr4�seconds_per_hour�seconds_per_minute�listr1�indexr0)r=Z
format_pieces�seconds_per_secondZ	intervals�modsrrYr�get_date_format_strings�
rccCs2td�}t|�D]\}}td|�d|���qdS)a*
    >>> monkeypatch = getfixture('monkeypatch')
    >>> import builtins
    >>> monkeypatch.setattr(builtins, 'input', lambda prompt: '3/hour')
    >>> calculate_prorated_values()
    per minute: 0.05
    per hour: 3.0
    per day: 72.0
    per month: 2191.454166666667
    per year: 26297.45
    z#Enter the rate (3/hour, 50/month)> zper z: N)�input�_prorated_values�print)�rater=�valuerrr�calculate_prorated_valuesAs�rirgccs^�t�d|�}ttj|���}t|d�}|t|d�}dD]
}|t|�}||fVqdS)aJ
    Given a rate (a string in units per unit time), and return that same
    rate for various time periods.

    >>> for period, value in _prorated_values('20/hour'):
    ...     print('{period}: {value:0.3f}'.format(**locals()))
    minute: 0.333
    hour: 20.000
    day: 480.000
    month: 14609.694
    year: 175316.333

    z"(?P<value>[\d.]+)/(?P<period>\w+)$rhr=)�minute�hourrIrWr/N)�re�matchr�Match�	groupdict�floatrS)rgrm�resrhZvalue_per_secondr=Zperiod_valuerrrreRs��recCst|���S)um	
    Take a string representing a span of time and parse it to a time delta.
    Accepts any string of comma-separated numbers each with a unit indicator.

    >>> parse_timedelta('1 day')
    datetime.timedelta(days=1)

    >>> parse_timedelta('1 day, 30 seconds')
    datetime.timedelta(days=1, seconds=30)

    >>> parse_timedelta('47.32 days, 20 minutes, 15.4 milliseconds')
    datetime.timedelta(days=47, seconds=28848, microseconds=15400)

    Supports weeks, months, years

    >>> parse_timedelta('1 week')
    datetime.timedelta(days=7)

    >>> parse_timedelta('1 year, 1 month')
    datetime.timedelta(days=395, seconds=58685)

    Note that months and years strict intervals, not aligned
    to a calendar:

    >>> date = datetime.datetime.fromisoformat('2000-01-01')
    >>> later = date + parse_timedelta('1 year')
    >>> diff = later.replace(year=date.year) - date
    >>> diff.seconds
    20940

    >>> parse_timedelta('foo')
    Traceback (most recent call last):
    ...
    ValueError: Unexpected 'foo'

    >>> parse_timedelta('14 seconds foo')
    Traceback (most recent call last):
    ...
    ValueError: Unexpected 'foo'

    Supports abbreviations:

    >>> parse_timedelta('1s')
    datetime.timedelta(seconds=1)

    >>> parse_timedelta('1sec')
    datetime.timedelta(seconds=1)

    >>> parse_timedelta('5min1sec')
    datetime.timedelta(seconds=301)

    >>> parse_timedelta('1 ms')
    datetime.timedelta(microseconds=1000)

    >>> parse_timedelta('1 µs')
    datetime.timedelta(microseconds=1)

    >>> parse_timedelta('1 us')
    datetime.timedelta(microseconds=1)

    And supports the common colon-separated duration:

    >>> parse_timedelta('14:00:35.362')
    datetime.timedelta(seconds=50435, microseconds=362000)

    TODO: Should this be 14 hours or 14 minutes?

    >>> parse_timedelta('14:00')
    datetime.timedelta(seconds=50400)

    >>> parse_timedelta('14:00 minutes')
    Traceback (most recent call last):
    ...
    ValueError: Cannot specify units with composite delta

    Nanoseconds get rounded to the nearest microsecond:

    >>> parse_timedelta('600 ns')
    datetime.timedelta(microseconds=1)

    >>> parse_timedelta('.002 µs, 499 ns')
    datetime.timedelta(microseconds=1)

    Expect ValueError for other invalid inputs.

    >>> parse_timedelta('13 feet')
    Traceback (most recent call last):
    ...
    ValueError: Invalid unit feets
    )�_parse_timedelta_nanos�resolve)rMrrr�parse_timedeltais[rtcCs,t�d|�}t||�}tt|�}t|t��S)Nz)(?P<value>[\d.:]+)\s?(?P<unit>[^\W\d_]+)?)rl�finditer�_check_unmatchedr1�_parse_timedelta_part�sum�	_Saved_NS)rM�partsZ	chk_partsZdeltasrrrrr�s

rrccsN�dd�}d}|D]}||||����|V|��}q	|||d��dS)z3
    Ensure no words appear in unmatched text.
    cSs(t�d|�}|rtd|�d�����dS)Nz\w+zUnexpected r)rl�searchrQ�group)Z	unmatched�foundrrr�check_unmatched�s�z)_check_unmatched.<locals>.check_unmatchedrN)r>�end)�matches�textr~�posrmrrrrv�s�
rvuµsr.uµsec�usZusecZmicros�msZmillisecondZmsecZmillisr'�secondZsec�hrk�hr�mrj�min�w�weekZwk�drIZ
nanosecond)�nsZnsecZnanoscCs |durdS|��}t�||�S)Nr�)rN�_unit_lookup�get)Z	raw_matchr�rrr�
_resolve_unit�sr�cCs@|dkrtd��|�d�}d}d�dd�t||�D��}t|�S)Nr5z)Cannot specify units with composite delta�:)�hours�minutesr5� css"�|]\}}|�d|��VqdS)r�Nr)�.0rh�unitrrr�	<genexpr>s� z-_parse_timedelta_composite.<locals>.<genexpr>)rQr2r0�ziprr)�	raw_valuer��valuesZunitsZcomposedrrr�_parse_timedelta_composite�s
r�cCsxt|�d��}|�d�s|d7}|�d�}d|vrt||�St|�}|dkr,d}|d}|dkr6d}|t}t�||�S)	Nr�r'rhr��monthsZyearsrr)r�r|�endswithr�rp�
days_per_yearry�derive)rmr�r�rhrrrrws


rwc@sVeZdZdZe��ZdZedddd�Z	dd�Z
ed	d
��Zdd�Z
d
d�Zdd�ZdS)ryz�
    Bundle a timedelta with nanoseconds.

    >>> _Saved_NS.derive('microseconds', .001)
    _Saved_NS(td=datetime.timedelta(0), nanoseconds=1)
    riʚ;r3r$)r5Zmillisecondsr6cKst|��|�dSr%)�vars�update)�self�kwargsrrr�__init__)sz_Saved_NS.__init__cCs�|dkr	t|d�Sztjdi||i��}Wnty#td|����wt|d�}t�t��t||j	|�d|_
Wd�|S1sFwY|S)N�nanoseconds)r�z
Invalid unit r7r$r)ryrr;rTrQ�
contextlib�suppressrP�int�
multiplierr�)�clsr�rhZraw_tdrqrrrr�,s
�

��z_Saved_NS.derivecCst|j|j|j|jd�S)N�r8r�)ryr8r�)r��otherrrr�__add__:s�z_Saved_NS.__add__cCs t|jd�}|jtj|d�S)z�
        Resolve any nanoseconds into the microseconds field,
        discarding any nanosecond resolution (but honoring partial
        microseconds).
        r$r:)�roundr�r8rr;)r�Zaddl_microsrrrrs?sz_Saved_NS.resolvecCsd|j�d|j�d�S)Nz
_Saved_NS(td=z, nanoseconds=�)r�)r�rrr�__repr__Hsz_Saved_NS.__repr__N)�__name__�
__module__�__qualname__�__doc__rr;r8r��dictr�r��classmethodr�r�rsr�rrrrrys�

	ryccsN�|durtjdd�}|durtj��}||kr%|V||7}||ksdSdS)a
    Much like the built-in function range, but works with dates

    >>> range_items = date_range(
    ...     datetime.datetime(2005,12,21),
    ...     datetime.datetime(2005,12,25),
    ... )
    >>> my_range = tuple(range_items)
    >>> datetime.datetime(2005,12,21) in my_range
    True
    >>> datetime.datetime(2005,12,22) in my_range
    True
    >>> datetime.datetime(2005,12,25) in my_range
    False
    >>> from_now = date_range(stop=datetime.datetime(2099, 12, 31))
    >>> next(from_now)
    datetime.datetime(...)
    Nrr)rr;rJ)r>�stop�steprrr�
date_rangeLs�
�r�r%)NNN):r�rrrlrRr*r�r�typingrrrrZosc_per_yearZosc_per_secondrar\r^Zminutes_per_hourZ
hours_per_dayr]r4r�r;Zthirty_daysZ
six_monthsZseconds_per_monthZhours_per_month�	lru_cache�boolrrZAnyDatetimer�rZStructDatetimerr!rMr rrBrDrKrLrSrcrirertrrrvr�r�r�rwryr�rrrr�<module>s�"
K
,
*^��������	�
���
������	3