
    F	h>                        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e	      Z
 G d de
      Zej                  d        Z G d	 d
      Zej                  d-d       Zej                  d-d       Zd Zd Zd Zd.dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d&Z*d' Z+d-d(Z,d-d)Z- G d* d+      Z.d, Z/y)/zA
Backend independent higher level interfaces, common exceptions.
    N)compatutilsutils35c                       e Zd ZdZy)	JSONErrorz0
    Base exception for all parsing errors.
    N__name__
__module____qualname____doc__     G/var/www/html/backend/venv/lib/python3.12/site-packages/ijson/common.pyr   r           	r   r   c                       e Zd ZdZy)IncompleteJSONErrorzH
    Raised when the parser can't read expected data from a stream.
    Nr   r   r   r   r   r      r   r   r   c              #     K   g }	 d\  }}|dk(  rdj                  |dd       }||d<   n|dk(  r#dj                  |      }|j                  d       n|dk(  r"|j                          dj                  |      }n`|dk(  r#dj                  |      }|j                  d       n8|d	k(  r"|j                          dj                  |      }ndj                  |      }| j                  |||f       w)
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prefixs        r   parse_basecoror%      s     Z D
uIXXd3Bi(FDHk!XXd^FKKiHHJXXd^Fm#XXd^FKKk!HHJXXd^FXXd^FVUE*+' s   C.C0c                       e Zd ZdZddZd Zy)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                 >      fd}|g _         |xs t         _        y )Nc                     | _         y N)r#   )r#   selfs    r   initial_setz+ObjectBuilder.__init__.<locals>.initial_sett   s
    DJr   )
containersdictmap_type)r+   r/   r,   s   `  r   __init__zObjectBuilder.__init__s   s    	&- (Dr   c                     |dk(  r| _         y |dk(  rG j                           j                  d           fd} j                  j                  |       y |dk(  r=g }  j                  d   |        j                  j                  |j                         y |dk(  s|dk(  r j                  j	                          y   j                  d   |       y )Nr   r   r   c                 $    | j                   <   y r*   )key)r#   mappabler+   s    r   setterz#ObjectBuilder.event.<locals>.setter   s    %*"r   r   r   r   )r3   r/   r-   r   r   )r+   r"   r#   r5   arrayr4   s   `    @r   r"   zObjectBuilder.eventy   s    IDHk!}}HDOOB)+OO""6*m#EDOOB&OO""5<<0k!Ui%7OO!DOOB&r   r*   )r	   r
   r   r   r0   r"   r   r   r   r'   r'   ^   s    ()'r   r'   c              #   (  K   	 d\  }}}||k(  r|dv rkd}t        |      }|r0|j                  ||       d\  }}}|dv r|dz  }n	|dv r|dz  }|r0|j                  dd= | j                  |j                         n| j                  |       w)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builders           r   items_basecoror>      s      !&f44 ':"MM%/-2)GUE <<$)"::$) # &&q)GMM*E"! s   AB=Bc              #     K   d}	 d\  }}}||k(  r|dk(  rd}|}t        |      }d\  }}}|dk(  r|dz  }|dk7  s|dk7  rO|dk7  s|dk7  rE|j                  ||       d\  }}}|dk(  r|dz  }n
|dk(  r|dz  }|dk7  s|dk7  r|dk7  r?|dk7  rE|j                  dd= | j                  ||j                  f       ||k(  r|dk(  rŭw)	z
    An coroutine dispatching (key, value) pairs constructed from the events
    under a given prefix. The prefix should point to JSON objects
    Nr   r   r9   r   r8   r   r   r:   )	r    r$   r/   r=   r!   r"   r#   r<   r3   s	            r   kvitems_basecoror@      s     G
#eUfn)!3LC#X6G"'D%#!)#|q'8)#|r'9eU+&+"eUK' A%Li' A%L )#|q'8)#|r'9 ""1%KKgmm,-# fn)!3 s   B
CC6C
Cc                 Z    d| v sd| v sd| v st        |       S t        j                  |       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_values    r   integer_or_decimalrI      s3    
 9y 0C94D9~??9%%r   c                 F    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   rB   rC   )rD   floatrG   s    r   integer_or_floatrL      s/    
 9y 0C94D9~r   c                 L    t        j                  dt               t        |       S )Nz4number() function will be removed in a later release)warningswarnDeprecationWarningrI   rG   s    r   numberrQ      s    MMHJ\]i((r   c              #   h   K   t        j                  |       } 	 | j                  |      }| |syw)z4A generator that yields data from a file-like objectN)r   bytes_readerread)fbuf_sizedatas      r   file_sourcerX      s7     AA
vvh
	 s   02c                     | d   g |ffS )Nbasic_parse_basecoror   backendconfigs     r   _basic_parse_pipeliner^      s    	'	("f5 r   c                 "    | d   g i f| d   g |ffS )Nr%   rZ   r   r[   s     r   _parse_pipeliner`      s,    	!	"B+	'	("f5 r   c                 6    | d   |fd|if| d   g i f| d   g |ffS )Nr>   r/   r%   rZ   r   r\   r$   r/   r]   s       r   _items_pipelinerc      sC    	!	"VI
H/EF	!	"B+	'	("f5 r   c                 6    | d   |fd|if| d   g i f| d   g |ffS )Nr@   r/   r%   rZ   r   rb   s       r   _kvitems_pipelinere      sC    	#	$vi*h1GH	!	"B+	'	("f5 r   c                       fd}|S )Nc                 D    t        j                  | gt        |       S r*   )r   chainr^   r    r]   r\   s     r   basic_parse_coroz0_make_basic_parse_coro.<locals>.basic_parse_coro   s&    {{
"7F3
 	
r   r   )r\   rj   s   ` r   _make_basic_parse_corork      s    

 r   c                       fd}|S )Nc                 D    t        j                  | gt        |       S r*   )r   rh   r`   ri   s     r   
parse_coroz$_make_parse_coro.<locals>.parse_coro	  s&    {{
Wf-
 	
r   r   )r\   rn   s   ` r   _make_parse_cororo     s    

 r   c                      d fd	}|S )Nc           	      H    t        j                  | gt        |||       S r*   )r   rh   rc   r    r$   r/   r]   r\   s       r   
items_coroz$_make_items_coro.<locals>.items_coro  s*    {{
Wfh?
 	
r   r*   r   )r\   rs   s   ` r   _make_items_corort     s    

 r   c                      d fd	}|S )Nc           	      H    t        j                  | gt        |||       S r*   )r   rh   re   rr   s       r   kvitems_coroz(_make_kvitems_coro.<locals>.kvitems_coro  s*    {{
w&A
 	
r   r*   r   )r\   rw   s   ` r   _make_kvitems_cororx     s    

 r   c                     t        j                  |       xs> t        j                  |       xr' | j                  j                  t         j
                  z  S )z'True if `func` is an awaitable function)inspectiscoroutinefunctionisgeneratorfunction__code__co_flagsCO_ITERABLE_COROUTINE)funcs    r   is_awaitablefunctionr   #  sH     	##D) 	


%
%d
+ C==!!G$A$AAr   c                 H    t        | d      xr t        | j                        S )z-True if `f` has an asynchronous `read` methodrT   )hasattrr   rT   )rU   s    r   is_async_filer   ,  s$     	6 	%QVV$r   c                     t        | d      S )zTrue if x has a `read` methodrT   r   xs    r   is_filer   3  s    1fr   c                     t        | d      S )zTrue if x can be iterated over__iter__r   r   s    r   is_iterabler   8  s    1j!!r   c                     t        | t              rt        j                  |       S t        | t              rt        j
                  |       S | S r*   )
isinstancebytesioBytesIOstrStringIO)sources    r   _get_sourcer   =  s9    &% zz&!!	FC	 {{6""Mr   c                      d fd	}|S )Nc                 Z    t        j                  t        | |      gt        |       S N)rV   )r   	coros2genrX   r^   file_objrV   r]   r\   s      r   basic_parse_genz._make_basic_parse_gen.<locals>.basic_parse_genF  s-    84
"7F3
 	
r      r   )r\   r   s   ` r   _make_basic_parse_genr   E  s    

 r   c                      d fd	}|S )Nc                 Z    t        j                  t        | |      gt        |       S r   )r   r   rX   r`   r   s      r   	parse_genz"_make_parse_gen.<locals>.parse_genO  s-    84
Wf-
 	
r   r   r   )r\   r   s   ` r   _make_parse_genr   N      

 r   c                      d fd	}|S )Nc           	      ^    t        j                  t        | |      gt        |||       S r   )r   r   rX   rc   r   r$   r/   rV   r]   r\   s        r   	items_genz"_make_items_gen.<locals>.items_genX  s1    84
Wfh?
 	
r   Nr   r   )r\   r   s   ` r   _make_items_genr   W  r   r   c                      d fd	}|S )Nc           	      ^    t        j                  t        | |      gt        |||       S r   )r   r   rX   re   r   s        r   kvitems_genz&_make_kvitems_gen.<locals>.kvitems_gena  s1    84
w&A
 	
r   r   r   )r\   r   s   ` r   _make_kvitems_genr   `  s    

 r   c                      d fd	}|S )Nc                     t        |       } t        |       r d   | fd|i|S t        |       r d   | fd|i|S t        dt	        |       z        )Nbasic_parse_asyncrV   r   Unknown source type: %r)r   r   r   
ValueErrortyper   rV   r]   r\   s      r   basic_parsez&_make_basic_parse.<locals>.basic_parsej  s    V$ /7./!)-3  V_-7,-!)-3  2T&\ABBr   r   r   )r\   r   s   ` r   _make_basic_parser   i  s    
C r   c                      d fd	}|S )Nc                     t        |       } t        |       r d   | fd|i|S t        |       r d   | fd|i|S t        |       rt	        j
                  | d   di f      S t        dt        |       z        )Nparse_asyncrV   r   r%   r   r   r   r   r   r   r   r   r   r   r   s      r   parsez_make_parse.<locals>.parsey  s    V$ )7=)!)-3  V_'7;'!)-3   ??6)*B3  2T&\ABBr   r   r   )r\   r   s   ` r   _make_parser   x      C Lr   c                      d fd	}|S )Nc                    t        |       } t        |       r d   | |f||d|S t        |       r d   | |f||d|S t        |       rt	        j
                  | d   |fd|if      S t        dt        |       z        )Nitems_asyncr/   rV   r   r>   r/   r   r   r   r$   r/   rV   r]   r\   s        r   itemsz_make_items.<locals>.items  s    V$ )7=))1HHN  V_'7;')1HHN   ??6)*VI
H7MN  2T&\ABBr   r   r   )r\   r   s   ` r   _make_itemsr     r   r   c                      d fd	}|S )Nc                    t        |       } t        |       r d   | |f||d|S t        |       r d   | |f||d|S t        |       rt	        j
                  | d   |fd|if      S t        dt        |       z        )Nkvitems_asyncr   r   r@   r/   r   r   r   s        r   kvitemsz_make_kvitems.<locals>.kvitems  s    V$ +7?+)1HHN  V_)7=))1HHN   ??6+,vi*h9OP  2T&\ABBr   r   r   )r\   r   s   ` r   _make_kvitemsr     s    C Nr   z
Don't use the ijson.common.* functions; instead go directly with the ijson.* ones.
See the documentation for more information.
c                 x    t        j                  t        t               t	        j
                  | t        di f      S )zXLike ijson.parse, but takes events generated via ijson.basic_parse instead
    of a filer   )rN   rO   _common_functions_warnrP   r   r   r%   )eventss    r   r   r     s1     MM(*<=??6	R  r   c                 ~    t        j                  t        t               t	        j
                  | t        |fd|if      S )zTLike ijson.kvitems, but takes events generated via ijson.parse instead of
    a filer/   )rN   rO   r   rP   r   r   r@   r   r$   r/   s      r   r   r     s8     MM(*<=??6	F9z8&<= r   c                 ~    t        j                  t        t               t	        j
                  | t        |fd|if      S )zRLike ijson.items, but takes events generated via ijson.parse instead of
    a filer/   )rN   rO   r   rP   r   r   r>   r   s      r   r   r     s8     MM(*<=??6	&Z$:; r   c                   &    e Zd ZdZddddddZd Zy	)
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                 J    d| _         d| _        d| _        d| _        d| _        y )NTr   )r+   s    r   r0   zBackendCapabilities.__init__  s(    #/3,04-
r   N)r	   r
   r   r   	__slots__r0   r   r   r   r   r     s%    
 @M+k,SQIr   r   c                    t               }|j                         D ]  \  }}t        |||        || d<   | d   j                  d      d   | d<   | d   | d<   dD ]  }|dz   }|| vrt	               |   | |<   |d	z   }|| vrt	               d
|z      } ||       | |<   |dz   }|| vrt	               d
|z      } ||       | |<   |dz   }	|	| vrt        t        d
|	z         } ||       | |	<   t	               d
|z      } ||       | |<    y)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   r\   backend_name)r   r   r   r   	_basecoro_coro_make__gen_asyncN)r   r   setattrsplitglobalsgetattrr   )
r\   capabilities_overridesr   namer#   basecoro_name	coro_namefactorygen_name
async_names
             r   enrich_backendr     sO    '(L-335 +edE*+*GN ,2237;GI%i0GN< ){*'%,Y}%=GM"7N	G#i9 45G!(!1GI&=7"i8 34G ' 0GHH_
W$gx*'<=G")'"2GJ)HtO,(#)r   r*   r   )0r   rE   rz   r   rN   ijsonr   r   r   	Exceptionr   r   	coroutiner%   r'   r>   r@   rI   rL   rQ   rX   r^   r`   rc   re   rk   ro   rt   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s/     	  ( (		 		) 	 @, @,F+' +'\ # #0 . .8&)
"
&&& 
 *)r   