U
    ׀d	;                     @   s  d Z ddlZddlZddlZddl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eZej
dLddZej
dMddZdd Zdd Zdd ZdNd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*dOdFdGZ+dPdHdIZ,dJdK Z-dS )QzA
Backend independent higher level interfaces, common exceptions.
    N)compatutilsc                   @   s   e Zd ZdZdS )	JSONErrorz0
    Base exception for all parsing errors.
    N__name__
__module____qualname____doc__ r
   r
   _/mounts/lovelace/software/anaconda3/envs/rescript-2/lib/python3.8/site-packages/ijson/common.pyr      s   r   c                   @   s   e Zd ZdZdS )IncompleteJSONErrorzH
    Raised when the parser can't read expected data from a stream.
    Nr   r
   r
   r
   r   r      s   r   c                 c   s   g }dV \}}|dkr2d |dd }||d< n~|dkrPd |}|d n`|dkrl|  d |}nD|dkrd |}|d n&|d	kr|  d |}n
d |}| |||f qdS )
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)

    N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 )ObjectBuildera~  
    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 ijson import basic_parse
        >>> from ijson.common import ObjectBuilder
        >>> from ijson.compat import BytesIO

        >>> 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_sets   s    z+ObjectBuilder.__init__.<locals>.initial_set)
containersdictmap_type)r#   r'   r$   r
   r"   r   __init__r   s    zObjectBuilder.__init__c                    s   |dkr|_ n|dkrJ  jd    fdd}j| nT|dkrtg }jd | j|j n*|dks|dkrj  njd | d S )	Nr   r   r   c                    s   |  j < d S r    )keyr!   Z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   x   s    zObjectBuilder.event)N)r   r   r   r	   r(   r   r
   r
   r
   r   r   ]   s   
r   c                 c   s   dV \}}}||kr |dkrd}t |d}|rj||| dV \}}}|dkrX|d7 }q*|dkr*|d8 }q*|jdd= | |j q | | q dS )zo
    An couroutine dispatching native Python objects constructed from the events
    under a given prefix.
    N)r   r      r'   )r   r   r   r   r%   r   r   )r   r   r'   currentr   r   object_depthbuilderr
   r
   r   items_basecoro   s    


r3   c           	      c   s   d}dV \}}}||kr|dkrd}|}t |d}dV \}}}|dkrN|d7 }|dks^|dkr|dksn|dkr||| dV \}}}|dkr|d7 }qN|dkrN|d8 }qN|jdd= | ||jf qqdS )	z
    An coroutine dispatching (key, value) pairs constructed from the events
    under a given prefix. The prefix should point to JSON objects
    Nr   r   r.   r   r-   r   r   r/   )	r   r   r'   r2   r   r   r   r1   r)   r
   r
   r   kvitems_basecoro   s2    


r4   c                 C   s*   d| ks d| ks d| k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Z	str_valuer
   r
   r   integer_or_decimal   s    r;   c                 C   s(   d| ks d| ks d| k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   r5   r6   )r7   floatr:   r
   r
   r   integer_or_float   s    r=   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    rA      c                 c   s&   t | } | |}|V  |s
q"q
dS )z4A generator that yields data from a file-like objectN)r   Zbytes_readerread)fbuf_sizedatar
   r
   r   file_source   s
    

rG   c                 C   s   | d g |ffS )Nbasic_parse_basecoror
   backendconfigr
   r
   r   _basic_parse_pipeline   s    rL   c                 C   s   | d g i f| d g |ffS )Nr   rH   r
   rI   r
   r
   r   _parse_pipeline   s    rM   c                 C   s.   | d |fd|if| d g i f| d g |ffS )Nr3   r'   r   rH   r
   rJ   r   r'   rK   r
   r
   r   _items_pipeline   s    rO   c                 C   s.   | d |fd|if| d g i f| d g |ffS )Nr4   r'   r   rH   r
   rN   r
   r
   r   _kvitems_pipeline   s    rP   c                    s    fdd}|S )Nc                    s   t j| ft | S r    )r   chainrL   r   rK   rJ   r
   r   basic_parse_coro   s
    z0_make_basic_parse_coro.<locals>.basic_parse_coror
   )rJ   rT   r
   rS   r   _make_basic_parse_coro   s    rU   c                    s    fdd}|S )Nc                    s   t j| ft | S r    )r   rQ   rM   rR   rS   r
   r   
parse_coro  s
    z$_make_parse_coro.<locals>.parse_coror
   )rJ   rV   r
   rS   r   _make_parse_coro  s    rW   c                    s   d fdd	}|S )Nc                    s   t j| ft ||| S r    )r   rQ   rO   r   r   r'   rK   rS   r
   r   
items_coro  s
    z$_make_items_coro.<locals>.items_coro)Nr
   )rJ   rY   r
   rS   r   _make_items_coro  s    rZ   c                    s   d fdd	}|S )Nc                    s   t j| ft ||| S r    )r   rQ   rP   rX   rS   r
   r   kvitems_coro  s
    z(_make_kvitems_coro.<locals>.kvitems_coro)Nr
   )rJ   r[   r
   rS   r   _make_kvitems_coro  s    r\   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    

rd   c                 C   s   t jot| dot| jS )z-True if `f` has an asynchronous `read` methodrC   )r   IS_PY35hasattrrd   rC   )rD   r
   r
   r   is_async_file+  s    rg   c                 C   s
   t | dS )zTrue if x has a `read` methodrC   rf   xr
   r
   r   is_file2  s    rk   c                 C   s
   t | dS )zTrue if x can be iterated over__iter__rh   ri   r
   r
   r   is_iterable7  s    rm   c                 C   s0   t | tjrt| S t | tjr,t| S | S r    )
isinstancer   ZbytetypeBytesIOZtexttypeStringIO)sourcer
   r
   r   _get_source<  s
    

rr   c                    s   d fdd	}|S )NrB   c                    s   t jt| |dft | S N)rE   )r   	coros2genrG   rL   file_objrE   rK   rS   r
   r   basic_parse_genE  s
    
z._make_basic_parse_gen.<locals>.basic_parse_gen)rB   r
   )rJ   rw   r
   rS   r   _make_basic_parse_genD  s    rx   c                    s   d fdd	}|S )NrB   c                    s   t jt| |dft | S rs   )r   rt   rG   rM   ru   rS   r
   r   	parse_genN  s
    
z"_make_parse_gen.<locals>.parse_gen)rB   r
   )rJ   ry   r
   rS   r   _make_parse_genM  s    rz   c                    s   d fdd	}|S )NrB   c                    s"   t jt| |dft ||| S rs   )r   rt   rG   rO   rv   r   r'   rE   rK   rS   r
   r   	items_genW  s
    
z"_make_items_gen.<locals>.items_gen)NrB   r
   )rJ   r|   r
   rS   r   _make_items_genV  s    r}   c                    s   d fdd	}|S )NrB   c                    s"   t jt| |dft ||| S rs   )r   rt   rG   rP   r{   rS   r
   r   kvitems_gen`  s
    
z&_make_kvitems_gen.<locals>.kvitems_gen)NrB   r
   )rJ   r~   r
   rS   r   _make_kvitems_gen_  s    r   c                    s   d fdd	}|S )NrB   c                    s\   t | } t| r( d | fd|i|S t| rH d | fd|i|S tdt|  d S )Nbasic_parse_asyncrE   rw   Unknown source type: %r)rr   rg   rk   
ValueErrortyperq   rE   rK   rS   r
   r   basic_parsei  s$    z&_make_basic_parse.<locals>.basic_parse)rB   r
   )rJ   r   r
   rS   r   _make_basic_parseh  s    r   c                    s   d fdd	}|S )NrB   c                    sv   t | } t| r( d | fd|i|S t| rH d | fd|i|S t| rbt| tdi fS tdt|  d S )Nparse_asyncrE   ry   r
   r   )	rr   rg   rk   rm   r   rt   r   r   r   r   rS   r
   r   parsex  s,    z_make_parse.<locals>.parse)rB   r
   )rJ   r   r
   rS   r   _make_parsew  s    r   c                    s   d fdd	}|S )NrB   c                    s   t | } t| r, d | |f||d|S t| rP d | |f||d|S t| rtt|  d |fd|ifS tdt|  d S )Nitems_asyncr'   rE   r|   r3   r'   r   rr   rg   rk   rm   r   rt   r   r   rq   r   r'   rE   rK   rS   r
   r   items  s4        z_make_items.<locals>.items)NrB   r
   )rJ   r   r
   rS   r   _make_items  s    r   c                    s   d fdd	}|S )NrB   c                    s   t | } t| r, d | |f||d|S t| rP d | |f||d|S t| rtt|  d |fd|ifS tdt|  d S )Nkvitems_asyncr   r~   r4   r'   r   r   r   rS   r
   r   kvitems  s4        z_make_kvitems.<locals>.kvitems)NrB   r
   )rJ   r   r
   rS   r   _make_kvitems  s    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
   )r>   r?   _common_functions_warnr@   r   rt   r   )eventsr
   r
   r   r     s    r   c                 C   s$   t tt t| t|fd|ifS )zTLike ijson.kvitems, but takes events generated via ijson.parse instead of
    a filer'   )r>   r?   r   r@   r   rt   r4   r   r   r'   r
   r
   r   r     s    r   c                 C   s$   t tt t| t|fd|ifS )zRLike ijson.items, but takes events generated via ijson.parse instead of
    a filer'   )r>   r?   r   r@   r   rt   r3   r   r
   r
   r   r     s    r   c                 C   s   | d  dd | d< dD ]}|d }|| kr<t | | |< |d }|| krft d|  }|| | |< |d	 }|| krt d|  }|| | |< tjrd
dlm} |d }|| krt|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.
    r   r   r   rJ   )r   r   r   r   Z	_basecoro_coroZ_make__genr-   )utils35_asyncN)splitglobalsr   re    r   getattr)rJ   nameZbasecoro_name	coro_namefactoryZgen_namer   Z
async_namer
   r
   r   enrich_backend  s*    r   )N)N)rB   )N)N).r	   r8   r]   r>   ijsonr   r   	Exceptionr   r   	coroutiner   objectr   r3   r4   r;   r=   rA   rG   rL   rM   rO   rP   rU   rW   rZ   r\   rd   rg   rk   rm   rr   rx   rz   r}   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   <module>   sV   
C.		

										
	
	