
    h                     p    S r SSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  S rS rS	 rS
 r " S S5      rg)z
JSON Schema URI resolution scopes and dereferencing

https://tools.ietf.org/id/draft-zyp-json-schema-04.html#rfc.section.7

Code adapted from https://github.com/Julian/jsonschema
    N)parse)unquote   )JsonSchemaDefinitionExceptionc                 F    U R                  SU R                  SS5      5      $ )z1
Originally ID was `id` and since v7 it's `$id`.
$idid )get)schemas    nC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\fastjsonschema/ref_resolver.pyget_idr      s      ::eVZZb122    c                 T   UR                  S5      nU(       a  [        U5      R                  S5      O/ nU Hm  nUR                  SS5      R                  SS5      n[	        U [
        5      (       a  U [        U5         n MJ  X0;   a  X   n MU  [        SR                  U5      5      e   U $ )z_
Return definition from path.

Path is unescaped according https://tools.ietf.org/html/rfc6901
/~1~0~zUnresolvable ref: {})	lstripr   splitreplace
isinstancelistintr   format)r   fragmentpartsparts       r   resolve_pathr      s     s#H,4GH##C("E||D#&..tS9fd##CI&F^\F/0F0M0Md0STT  Mr   c                 J    [         R                  " U 5      R                  5       $ N)urlparseurlsplitgeturl)uris    r   	normalizer&   ,   s    S!((**r   c                    [         R                  " U 5      R                  nX!;   a  X   " U 5      nU$ SSKJn  U" U 5      nUR                  5       R                  5       =(       d    Sn [        R                  " UR                  5       R                  U5      5      n UR                  5         U$ ! [         a  n[        SR                  X5      5      eSnAff = f! UR                  5         f = f)z
Resolve a remote ``uri``.

.. note::

    urllib library is used to fetch requests from the remote ``uri``
    if handlers does notdefine otherwise.
r   )urlopenzutf-8z{} failed to decode: {}N)r"   r#   schemeurllib.requestr(   infoget_content_charsetjsonloadsreaddecode
ValueErrorr   r   close)r%   handlersr)   resultr(   reqencodingexcs           r   resolve_remoter8   0   s     s#**F!#& M 	+cl88:113>w	ZZ
 1 1( ;=F IIKM	  	\/0I0P0PQT0Z[[	\ IIKs$   (3B. .
C8CCC C,c                       \ rS rSrSr0 S0 4S jr\0 4S j5       r\R                  S\
4S j5       r\R                  S\
4S	 j5       rS
 rS rS\4S jrSrg)RefResolverJ   z
Resolve JSON References.
Tc                 n    Xl         Xl        X l        X0l        X@l        XPl        U R                  U5        g)ah  
`base_uri` is URI of the referring document from the `schema`.
`store` is an dictionary that will be used to cache the fetched schemas
(if `cache=True`).

Please notice that you can have caching problems when compiling schemas
with colliding `$ref`. To force overwriting use `cache=False` or
explicitly pass the `store` argument (with a brand new dictionary)
N)base_uriresolution_scoper   storecacher3   walk)selfr=   r   r?   r@   r3   s         r   __init__RefResolver.__init__P   s/     ! (

 		&r   c                 Z    U " [        U[        5      (       a  [        U5      OSU4SU0UD6$ )z1
Construct a resolver from a JSON schema object.
r
   r3   )r   dictr   )clsr   r3   kwargss       r   from_schemaRefResolver.from_schemab   s=    
 (66F6NB
 
 	
 	
r   scopec              #      #    U R                   n[        R                  " X!5      U l          Sv   X l         g! X l         f = f7f)z*
Context manager to handle current scope.
N)r>   r"   urljoin)rB   rK   	old_scopes      r   in_scopeRefResolver.in_scopen   s9     
 ))	 ( 0 0 B	.$-!I!s   (A6 A>Arefc              #     #    [         R                  " U R                  U5      n[         R                  " U5      u  p4U(       a2  [	        U5      U R
                  ;   a  U R
                  [	        U5         nO`U(       a  X0R                  :X  a  U R                  nO=[        X0R                  5      nU R                  (       a  XPR
                  [	        U5      '   U R                  U R                  pvX5sU l        U l         U R                  U5         [        XT5      v   SSS5        XgsU l        U l        g! , (       d  f       N= f! XgsU l        U l        f = f7f)z\
Context manager which resolves a JSON ``ref`` and enters the
resolution scope of this ref.
N)r"   rM   r>   	urldefragr&   r?   r=   r   r8   r3   r@   rO   r   )rB   rQ   new_urir%   r   r   old_base_uri
old_schemas           r   	resolvingRefResolver.resolvingz   s      ""4#8#8#> **739S>TZZ/ZZ	#/F}},[[F#C7Fzz-3

9S>*#'==$++j%("t{	Bs#"644 $ *6&DM4; $# *6&DM4;s6   C8E;E D1E "E1
D?;E EEc                 ,    [        U R                  5      $ r!   )r&   r>   )rB   s    r   get_uriRefResolver.get_uri   s    ..//r   c                    S[        U R                  5      R                  SS5      R                  SS5      R                  SS5      -   n[        R                  " SSU5      nUR                  5       R                  S5      nU$ )z;
Get current scope and return it as a valid function name.
	validate_r   _r   "r
   z($[^a-zA-Z]|[^a-zA-Z0-9]))r   r>   r   resublowerrstrip)rB   names     r   get_scope_nameRefResolver.get_scope_name   sr     WT%:%:;CCD#NVVW[]`aiijmoqrrvv2C>zz|""3'r   nodec                    [        U[        5      (       a  gSU;   aB  [        US   [        5      (       a*  US   n[        R                  " U R
                  U5      US'   gSU;   d  SU;   a  [        [        U5      [        5      (       a  U R                  [        U5      5         XR                  [        U R
                  5      '   UR                  5        H-  u  p4[        U[        5      (       d  M  U R                  U5        M/     SSS5        gUR                  5        H-  u  p4[        U[        5      (       d  M  U R                  U5        M/     g! , (       d  f       g= f)zB
Walk thru schema and dereferencing ``id`` and ``$ref`` instances
z$refr   r	   N)r   boolstrr"   rM   r>   r   rO   r?   r&   itemsrF   rA   )rB   rg   rQ   r^   items        r   rA   RefResolver.walk   s     dD!!t^
4< = =v,C#++D,A,A3GDLtmtt|F4L#1N1Nvd|,?C

9T%:%:;<#zz|GA!$--		$  , -,  ::<dD))IIdO ( -,s   #A
E1E
E)r=   r@   r3   r>   r   r?   N)__name__
__module____qualname____firstlineno____doc__rC   classmethodrI   
contextlibcontextmanagerrj   rO   rW   rZ   re   rF   rA   __static_attributes__ r   r   r:   r:   J   s    
 02 $ *, 	
 	
 	.c 	. 	. BS B B20$ $r   r:   )rr   rt   r-   r`   urllibr   r"   urllib.parser   
exceptionsr   r   r   r&   r8   r:   rw   r   r   <module>r{      s>      	 $   53&+4h$ h$r   