o
    #a,                     @   s   d Z ddlZddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZ G dd dZdS )z
Implements the :class:`ArrowFactory <arrow.factory.ArrowFactory>` class,
providing factory methods for common :class:`Arrow <arrow.arrow.Arrow>`
construction scenarios.

    N)datedatetimetzinfo)Decimal)struct_time)AnyListOptionalTupleTypeUnionoverload)tz)parser)TZ_EXPRArrow)DEFAULT_LOCALE)is_timestampiso_to_gregorianc                   @   sl  e Zd ZU dZee ed< efdee ddfddZee	dddd	e
d
ee dedefddZee	ddddeeeeeeeee
eeeef f	 d	e
d
ee dedef
ddZee	ddddeeef ded	e
d
ee dedefddZee	dddde
dee
ee
 f d	e
d
ee dedefddZdededefddZdefddZddee defddZdS )ArrowFactoryzA factory for generating :class:`Arrow <arrow.arrow.Arrow>` objects.

    :param type: (optional) the :class:`Arrow <arrow.arrow.Arrow>`-based class to construct from.
        Defaults to :class:`Arrow <arrow.arrow.Arrow>`.

    typereturnNc                 C   s
   || _ d S N)r   )selfr    r   1usr/lib/python3.10/site-packages/arrow/factory.py__init__"   s   
zArrowFactory.__init__F)localer   normalize_whitespacer   r   r   c                C      d S r   r   )r   r   r   r   r   r   r   get%   s   zArrowFactory.get_ArrowFactory__objc                C   r    r   r   )r   r"   r   r   r   r   r   r   r!   /   s   _ArrowFactory__arg1_ArrowFactory__arg2c                C   r    r   r   r   r#   r$   r   r   r   r   r   r   r!   D      
c                C   r    r   r   r%   r   r   r   r!   P   r&   argskwargsc                 O   s
  t |}|dt}|dd}|dd}t |dkrd}t |dkr*|du r*d}|dkrQt|tr@tj|}| j	j
|d	S t|trL| j	j
|d	S | j	 S |dkr|d }t|trbt|}|du rjtd
t|tst|r|du r{t }| j	j||d	S t|tr| j	j|j|d	S t|tr| j	j||d	S t|tr| j	j||d	S t|tr| j	j
|d	S t|trt|||}| j	j||d	S t|tr| j	t|S t|trt |dkrt | }	| j	j|	|d	S tdt	|d|dkr}|d |d }
}t|
tr*t|ttfr | j	j|
|d	S tdt	|dt|
trJt|ttfr@| j	j|
|d	S tdt	|dt|
trnt|tt!frnt||d |d |}| j	j||d	S tdt	|
dt	|d| j	|i |S )a  Returns an :class:`Arrow <arrow.arrow.Arrow>` object based on flexible inputs.

        :param locale: (optional) a ``str`` specifying a locale for the parser. Defaults to 'en-us'.
        :param tzinfo: (optional) a :ref:`timezone expression <tz-expr>` or tzinfo object.
            Replaces the timezone unless using an input form that is explicitly UTC or specifies
            the timezone in a positional argument. Defaults to UTC.
        :param normalize_whitespace: (optional) a ``bool`` specifying whether or not to normalize
            redundant whitespace (spaces, tabs, and newlines) in a datetime string before parsing.
            Defaults to false.

        Usage::

            >>> import arrow

        **No inputs** to get current UTC time::

            >>> arrow.get()
            <Arrow [2013-05-08T05:51:43.316458+00:00]>

        **One** :class:`Arrow <arrow.arrow.Arrow>` object, to get a copy.

            >>> arw = arrow.utcnow()
            >>> arrow.get(arw)
            <Arrow [2013-10-23T15:21:54.354846+00:00]>

        **One** ``float`` or ``int``, convertible to a floating-point timestamp, to get
        that timestamp in UTC::

            >>> arrow.get(1367992474.293378)
            <Arrow [2013-05-08T05:54:34.293378+00:00]>

            >>> arrow.get(1367992474)
            <Arrow [2013-05-08T05:54:34+00:00]>

        **One** ISO 8601-formatted ``str``, to parse it::

            >>> arrow.get('2013-09-29T01:26:43.830580')
            <Arrow [2013-09-29T01:26:43.830580+00:00]>

        **One** ISO 8601-formatted ``str``, in basic format, to parse it::

            >>> arrow.get('20160413T133656.456289')
            <Arrow [2016-04-13T13:36:56.456289+00:00]>

        **One** ``tzinfo``, to get the current time **converted** to that timezone::

            >>> arrow.get(tz.tzlocal())
            <Arrow [2013-05-07T22:57:28.484717-07:00]>

        **One** naive ``datetime``, to get that datetime in UTC::

            >>> arrow.get(datetime(2013, 5, 5))
            <Arrow [2013-05-05T00:00:00+00:00]>

        **One** aware ``datetime``, to get that datetime::

            >>> arrow.get(datetime(2013, 5, 5, tzinfo=tz.tzlocal()))
            <Arrow [2013-05-05T00:00:00-07:00]>

        **One** naive ``date``, to get that date in UTC::

            >>> arrow.get(date(2013, 5, 5))
            <Arrow [2013-05-05T00:00:00+00:00]>

        **One** time.struct time::

            >>> arrow.get(gmtime(0))
            <Arrow [1970-01-01T00:00:00+00:00]>

        **One** iso calendar ``tuple``, to get that week date in UTC::

            >>> arrow.get((2013, 18, 7))
            <Arrow [2013-05-05T00:00:00+00:00]>

        **Two** arguments, a naive or aware ``datetime``, and a replacement
        :ref:`timezone expression <tz-expr>`::

            >>> arrow.get(datetime(2013, 5, 5), 'US/Pacific')
            <Arrow [2013-05-05T00:00:00-07:00]>

        **Two** arguments, a naive ``date``, and a replacement
        :ref:`timezone expression <tz-expr>`::

            >>> arrow.get(date(2013, 5, 5), 'US/Pacific')
            <Arrow [2013-05-05T00:00:00-07:00]>

        **Two** arguments, both ``str``, to parse the first according to the format of the second::

            >>> arrow.get('2013-05-05 12:30:45 America/Chicago', 'YYYY-MM-DD HH:mm:ss ZZZ')
            <Arrow [2013-05-05T12:30:45-05:00]>

        **Two** arguments, first a ``str`` to parse and second a ``list`` of formats to try::

            >>> arrow.get('2013-05-05 12:30:45', ['MM/DD/YYYY', 'YYYY-MM-DD HH:mm:ss'])
            <Arrow [2013-05-05T12:30:45+00:00]>

        **Three or more** arguments, as for the direct constructor of an ``Arrow`` object::

            >>> arrow.get(2013, 5, 5, 12, 30, 45)
            <Arrow [2013-05-05T12:30:45+00:00]>

        r   r   Nr   F      r   r   z#Cannot parse argument of type None.z%Cannot parse single argument of type .   z0Cannot parse two arguments of types 'datetime', z,Cannot parse two arguments of types 'date', z$Cannot parse two arguments of types z and )"lenpopr   r!   
isinstancestrr   TzinfoParserparser   now	dt_tzinfoutcnowr   float	TypeErrorr   dateutil_tzZtzutcfromtimestampr   Zfromdatetimer   r   ZfromdateZDateTimeParserZ	parse_isor   utcfromtimestampcalendartimegmtupler   list)r   r'   r(   Z	arg_countr   r   r   argdtdZarg_1Zarg_2r   r   r   r!   \   s   h











c                 C   s
   | j  S )zReturns an :class:`Arrow <arrow.arrow.Arrow>` object, representing "now" in UTC time.

        Usage::

            >>> import arrow
            >>> arrow.utcnow()
            <Arrow [2013-05-08T05:19:07.018993+00:00]>
        )r   r5   )r   r   r   r   r5   5  s   

zArrowFactory.utcnowr   c                 C   s4   |du r	t  }nt|tstj|}| j|S )ai  Returns an :class:`Arrow <arrow.arrow.Arrow>` object, representing "now" in the given
        timezone.

        :param tz: (optional) A :ref:`timezone expression <tz-expr>`.  Defaults to local time.

        Usage::

            >>> import arrow
            >>> arrow.now()
            <Arrow [2013-05-07T22:19:11.363410-07:00]>

            >>> arrow.now('US/Pacific')
            <Arrow [2013-05-07T22:19:15.251821-07:00]>

            >>> arrow.now('+02:00')
            <Arrow [2013-05-08T07:19:25.618646+02:00]>

            >>> arrow.now('local')
            <Arrow [2013-05-07T22:19:39.130059-07:00]>
        N)	r8   Ztzlocalr/   r4   r   r1   r2   r   r3   )r   r   r   r   r   r3   A  s
   

zArrowFactory.nowr   )__name__
__module____qualname____doc__r   r   __annotations__r   r   r   r0   r
   r   boolr!   r   r   r   r   r4   intr6   r   r	   r   r5   r3   r   r   r   r   r      s   
 	
 Zr   ) rE   r;   r   r   r   r4   Zdecimalr   timer   typingr   r	   r
   r   r   r   r   Zdateutilr   r8   arrowr   Zarrow.arrowr   r   Zarrow.constantsr   Z
arrow.utilr   r   r   r   r   r   r   <module>   s    $