o
    հi>                     @   s  d Z ddlZddlZddlZddlZddlmZmZmZ G dd de	Z
G dd de
Zejdd	 ZG d
d dZejdNddZejdNddZdd Zdd Zdd ZdOddZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCZ*dDdE Z+dNdFdGZ,dNdHdIZ-G dJdK dKZ.dLdM Z/dS )PzA
Backend independent higher level interfaces, common exceptions.
    N)compatutilsutils35c                   @      e Zd ZdZdS )	JSONErrorz0
    Base exception for all parsing errors.
    N__name__
__module____qualname____doc__ r   r   @/home/ubuntu/.local/lib/python3.10/site-packages/ijson/common.pyr          r   c                   @   r   )IncompleteJSONErrorzH
    Raised when the parser can't read expected data from a stream.
    Nr   r   r   r   r   r      r   r   c                 c   s    g }	 dV \}}|dkrd |dd }||d< n?|dkr*d |}|d n0|dkr8|  d |}n"|dkrGd |}|d	 n|d
krU|  d |}nd |}| |||f q)aQ  
    A coroutine dispatching parsing events with the information about their
    location with the JSON object tree. Events are tuples
    ``(prefix, type, value)``.

    Available types and values are:

    ('null', None)
    ('boolean', <True or False>)
    ('number', <int or Decimal>)
    ('string', <unicode>)
    ('map_key', <str>)
    ('start_map', None)
    ('end_map', None)
    ('start_array', None)
    ('end_array', None)

    Prefixes represent the path to the nested elements from the root of the JSON
    document. For example, given this document::

        {
          "array": [1, 2],
          "map": {
            "key": "value"
          }
        }

    the parser would yield events:

      ('', 'start_map', None)
      ('', 'map_key', 'array')
      ('array', 'start_array', None)
      ('array.item', 'number', 1)
      ('array.item', 'number', 2)
      ('array', 'end_array', None)
      ('', 'map_key', 'map')
      ('map', 'start_map', None)
      ('map', 'map_key', 'key')
      ('map.key', 'string', u'value')
      ('map', 'end_map', None)
      ('', 'end_map', None)

    TNmap_key.	start_mapend_mapstart_arrayitem	end_array)joinappendpopsend)targetpatheventvalueprefixr   r   r   parse_basecoro   s,   -




r!   c                   @   s"   e Zd ZdZdddZdd ZdS )ObjectBuilderat  
    Incrementally builds an object from JSON parser events. Events are passed
    into the `event` function that accepts two parameters: event type and
    value. The object being built is available at any time from the `value`
    attribute.

    Example::

        >>> from io import BytesIO
        >>> from ijson import basic_parse
        >>> from ijson.common import ObjectBuilder

        >>> builder = ObjectBuilder()
        >>> f = BytesIO(b'{"key": "value"}')
        >>> for event, value in basic_parse(f):
        ...     builder.event(event, value)
        >>> builder.value == {'key': 'value'}
        True

    Nc                    s"    fdd}|g _ |pt _d S )Nc                    s
   |  _ d S Nr   r$   selfr   r   initial_sett   s   
z+ObjectBuilder.__init__.<locals>.initial_set)
containersdictmap_type)r&   r*   r'   r   r%   r   __init__s   s   zObjectBuilder.__init__c                    s   |dkr	|_ d S |dkr'  jd    fdd}j| d S |dkr=g }jd | j|j d S |dksE|dkrLj  d S jd | d S )	Nr   r   r   c                    s   |  j < d S r#   )keyr$   mappabler&   r   r   setter   s   z#ObjectBuilder.event.<locals>.setterr   r   r   )r,   r*   r(   r   r   )r&   r   r   r/   arrayr   r-   r   r   y   s   
zObjectBuilder.eventr#   )r   r	   r
   r   r+   r   r   r   r   r   r"   ^   s    
r"   c                 c   s    	 dV \}}}||krJ|dv rEd}t |d}|r8||| dV \}}}|dv r.|d7 }n|dv r6|d8 }|s|jdd= | |j n| | q)zo
    An couroutine dispatching native Python objects constructed from the events
    under a given prefix.
    TN)r   r      r*   )r   r   r"   r   r(   r   r   )r   r    r*   currentr   r   object_depthbuilderr   r   r   items_basecoro   s&   


r7   c           	      c   s    d}	 dV \}}}||kr||dkr|d}|}t |d}dV \}}}|dkr)|d7 }|dks1|dkrf|dks9|d	krf||| dV \}}}|dkrN|d7 }n|dkrV|d8 }|dks^|dkrf|dks9|d	ks9|jdd= | ||jf ||kr||dksq)
z
    An coroutine dispatching (key, value) pairs constructed from the events
    under a given prefix. The prefix should point to JSON objects
    NTr   r   r2   r   r1   r   r   r3   )	r   r    r*   r6   r   r   r   r5   r,   r   r   r   kvitems_basecoro   s2   

r8   c                 C   s*   d| v sd| v sd| v st | S t| S )z
    Converts string with a numeric value into an int or a Decimal.
    Used in different backends for consistent number representation.
    r   eE)intdecimalDecimal	str_valuer   r   r   integer_or_decimal   s   
r@   c                 C   s(   d| v sd| v sd| v st | S t| S )z
    Converts string with a numeric value into an int or a float.
    Used in different backends for consistent number representation.
    r   r9   r:   )r;   floatr>   r   r   r   integer_or_float   s   rB   c                 C   s   t dt t| S )Nz4number() function will be removed in a later release)warningswarnDeprecationWarningr@   r>   r   r   r   number   s   rF      c                 c   s(    t | } 	 | |}|V  |sdS q)z4A generator that yields data from a file-like objectTN)r   bytes_readerread)fbuf_sizedatar   r   r   file_source   s   

rM   c                 C   s   | d g |ffS )Nbasic_parse_basecoror   backendconfigr   r   r   _basic_parse_pipeline   s   rR   c                 C   s   | d g i f| d g |ffS )Nr!   rN   r   rO   r   r   r   _parse_pipeline   s   rS   c                 C   .   | d |fd|if| d g i f| d g |ffS )Nr7   r*   r!   rN   r   rP   r    r*   rQ   r   r   r   _items_pipeline      rV   c                 C   rT   )Nr8   r*   r!   rN   r   rU   r   r   r   _kvitems_pipeline   rW   rX   c                        fdd}|S )Nc                       t j| gt |R  S r#   )r   chainrR   r   rQ   rP   r   r   basic_parse_coro   
   z0_make_basic_parse_coro.<locals>.basic_parse_coror   )rP   r^   r   r]   r   _make_basic_parse_coro      r`   c                    rY   )Nc                    rZ   r#   )r   r[   rS   r\   r]   r   r   
parse_coro	  r_   z$_make_parse_coro.<locals>.parse_coror   )rP   rb   r   r]   r   _make_parse_coro  ra   rc   c                       d fdd	}|S )Nc                       t j| gt |||R  S r#   )r   r[   rV   r   r    r*   rQ   r]   r   r   
items_coro  
   z$_make_items_coro.<locals>.items_coror#   r   )rP   rg   r   r]   r   _make_items_coro     ri   c                    rd   )Nc                    re   r#   )r   r[   rX   rf   r]   r   r   kvitems_coro  rh   z(_make_kvitems_coro.<locals>.kvitems_coror#   r   )rP   rk   r   r]   r   _make_kvitems_coro  rj   rl   c                 C   s"   t | pt | o| jjt j@ S )z'True if `func` is an awaitable function)inspectiscoroutinefunctionisgeneratorfunction__code__co_flagsCO_ITERABLE_COROUTINE)funcr   r   r   is_awaitablefunction#  s   

rt   c                 C   s   t | do	t| jS )z-True if `f` has an asynchronous `read` methodrI   )hasattrrt   rI   )rJ   r   r   r   is_async_file,  s   
rv   c                 C   
   t | dS )zTrue if x has a `read` methodrI   ru   xr   r   r   is_file3     
r{   c                 C   rw   )zTrue if x can be iterated over__iter__rx   ry   r   r   r   is_iterable8  r|   r~   c                 C   s,   t | tr
t| S t | trt| S | S r#   )
isinstancebytesioBytesIOstrStringIO)sourcer   r   r   _get_source=  s
   



r   c                       d fdd	}|S )NrG   c                        t jt| |dgt |R  S N)rK   )r   	coros2genrM   rR   file_objrK   rQ   r]   r   r   basic_parse_genF  
   
z._make_basic_parse_gen.<locals>.basic_parse_genrG   r   )rP   r   r   r]   r   _make_basic_parse_genE  rj   r   c                    r   )NrG   c                    r   r   )r   r   rM   rS   r   r]   r   r   	parse_genO  r   z"_make_parse_gen.<locals>.parse_genr   r   )rP   r   r   r]   r   _make_parse_genN  rj   r   c                    r   )NrG   c                    $   t jt| |dgt |||R  S r   )r   r   rM   rV   r   r    r*   rK   rQ   r]   r   r   	items_genX  
   
z"_make_items_gen.<locals>.items_genNrG   r   )rP   r   r   r]   r   _make_items_genW  rj   r   c                    r   )NrG   c                    r   r   )r   r   rM   rX   r   r]   r   r   kvitems_gena  r   z&_make_kvitems_gen.<locals>.kvitems_genr   r   )rP   r   r   r]   r   _make_kvitems_gen`  rj   r   c                    r   )NrG   c                    sX   t | } t| r d | fd|i|S t| r$ d | fd|i|S tdt|  )Nbasic_parse_asyncrK   r   Unknown source type: %r)r   rv   r{   
ValueErrortyper   rK   rQ   r]   r   r   basic_parsej  s$   z&_make_basic_parse.<locals>.basic_parser   r   )rP   r   r   r]   r   _make_basic_parsei  s   r   c                    r   )NrG   c                    sv   t | } t| r d | fd|i|S t| r$ d | fd|i|S t| r3t|  d di fS tdt|  )Nparse_asyncrK   r   r!   r   r   r   rv   r{   r~   r   r   r   r   r   r]   r   r   parsey  s,   z_make_parse.<locals>.parser   r   )rP   r   r   r]   r   _make_parsex     r   c                    r   )NrG   c                       t | } t| r d | |f||d|S t| r( d | |f||d|S t| r:t|  d |fd|ifS tdt|  )Nitems_asyncr*   rK   r   r7   r*   r   r   r   r    r*   rK   rQ   r]   r   r   items  ,   z_make_items.<locals>.itemsr   r   )rP   r   r   r]   r   _make_items  r   r   c                    r   )NrG   c                    r   )Nkvitems_asyncr   r   r8   r*   r   r   r   r]   r   r   kvitems  r   z_make_kvitems.<locals>.kvitemsr   r   )rP   r   r   r]   r   _make_kvitems  r   r   z
Don't use the ijson.common.* functions; instead go directly with the ijson.* ones.
See the documentation for more information.
c                 C   s   t tt t| tdi fS )zXLike ijson.parse, but takes events generated via ijson.basic_parse instead
    of a filer   )rC   rD   _common_functions_warnrE   r   r   r!   )eventsr   r   r   r     s   r   c                 C   $   t tt t| t|fd|ifS )zTLike ijson.kvitems, but takes events generated via ijson.parse instead of
    a filer*   )rC   rD   r   rE   r   r   r8   r   r    r*   r   r   r   r        r   c                 C   r   )zRLike ijson.items, but takes events generated via ijson.parse instead of
    a filer*   )rC   rD   r   rE   r   r   r7   r   r   r   r   r     r   r   c                   @   s(   e Zd ZdZddddddZdd	 Zd
S )BackendCapabilitiesz.
    Capabilities supported by a backend.
    z'C-ctyle comments (non-standard in JSON)z0Multiple top-level values (non-standard in JSON)z>Detection of leading zeros in numbers, marking them as invalidz%Documents with incomplete JSON tokensz>64 bit integers supported when running with ``use_float=True``
c_commentsmultiple_valuesinvalid_leading_zeros_detection incomplete_json_tokens_detectionint64c                 C   s"   d| _ d| _d| _d| _d| _d S )NTr   r%   r   r   r   r+     s
   
zBackendCapabilities.__init__N)r   r	   r
   r   	__slots__r+   r   r   r   r   r     s    r   c           
      K   s  t  }| D ]
\}}t||| q|| d< | d dd | d< | d | d< dD ]]}|d }|| vr:t | | |< |d	 }|| vrOt d
|  }|| | |< |d }|| vrdt d
|  }|| | |< |d }	|	| vryttd
|	 }|| | |	< t d
|  }|| | |< q)dS )z
    Provides a backend with any missing coroutines/generators/async-iterables
    it might be missing by using the generic ones written in python.
    capabilitiesr   r   r   rP   backend_name)r   r   r   r   	_basecoro_coro_make__gen_asyncN)r   r   setattrsplitglobalsgetattrr   )
rP   capabilities_overridesr   namer   basecoro_name	coro_namefactorygen_name
async_namer   r   r   enrich_backend  s2   r   r#   r   )0r   r<   rm   r   rC   ijsonr   r   r   	Exceptionr   r   	coroutiner!   r"   r7   r8   r@   rB   rF   rM   rR   rS   rV   rX   r`   rc   ri   rl   rt   rv   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\    
C.		

									
	
		