U
    kufI                     @  s  U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 ddl
mZmZmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZ eeef Ze	eef Z ee  Z!ee  Z"e Z#d	e$d
< eG dd de%Z&dddddZ'dddddZ(dddddZ)ddddddZ*ddddddZ+dddddd Z,d!dd"dd#d$Z-e. e. e. fd%d%d%d&d'd(Z/e. e. e. fd%d%d%d&d)d*Z0e. e. e. fd%d%d%d&d+d,Z1e. e. e. fd%d%d%d&d-d.Z2e. e. e. fd%d%d%d&d/d0Z3e. e. e. fd%d%d%d&d1d2Z4e. e. e. fd%d%d%d&d3d4Z5ed5e'e/d6d7d8d9d:d;d<d=d>d?d@hdAdBdCdDhdEdFdGdHdIhdJe*e3d6d7d8d9d:d;d<d=d>d?d@hdAdBdCdDhdEdFdGdHdIhdJdKZ6edLe'e0dMd6d7d8d9d:d<d=d>d?d@hdAdBdChdEdFdGdHdIhdJe+e4dMd6d7d8d9d:d<d=d>d?d@hdAdBdChdEdFdGdHdIhdJdKZ7edNe(e1dMd6d7d9d:d<d=d>hdAdBdChdFdHdIhdJe,e5dMd6d7d9d:d<d=d>hdAdBdChdFdHdIhdJdKZ8edOe(e1dMd6d7d<d=hdAdBdChdFdHdIhdJe,e5dMd6d7d<d=hdAdBdChdFdHdIhdJdKZ9edPe)e2d<hdAdBdChdFdHdIhdJe-e5dMd6d<hdAdBdChdFdHdIhdJdKZ:edQe)e2dRhdFdHdIhdSe-e5dMd6hdRhdFdHdIhdJdKZ;edTdU dVe6fdWe7fdXe8fdYe9fdZe:fd[e;ffD Z<d\e$d]< efd^d_d`dadbdcZ=eG ddde deZ>dfdgdhdidjZ?dkS )lzI
Referencing implementations for JSON Schema specs (historic & current).
    )annotations)SequenceSet)AnyIterableUnion)AnchorRegistryResourceSpecification
exceptions)frozen)_UNSETResolvedResolver_Unset)URIr   MappingSchemaRegistryEMPTY_REGISTRYc                   @  s   e Zd ZU dZded< dS )UnknownDialectz
    A dialect identifier was found for a dialect unknown by this library.

    If it's a custom ("unofficial") dialect, be sure you've registered it.
    r   uriN)__name__
__module____qualname____doc____annotations__ r   r   :/tmp/pip-unpacked-wheel-g5oy8ly_/referencing/jsonschema.pyr   $   s   
r   Schemaz
URI | Nonecontentsreturnc                 C  s   t | trd S | dS )N$id)
isinstanceboolget)r!   r   r   r   
_dollar_id/   s    
r'   c                 C  s:   t | tsd| krd S | d}|d k	r6|ds6|S d S )N$refr#   #)r$   r%   r&   
startswithr!   idr   r   r   _legacy_dollar_id5   s
    
r-   ObjectSchemac                 C  s0   d| krd S |  d}|d k	r,|ds,|S d S )Nr(   r,   r)   )r&   r*   r+   r   r   r   
_legacy_id=   s
    
r/   zSpecification[Schema]zIterable[AnchorType[Schema]])specificationr!   r"   c                 c  s^   t |trd S |d}|d k	r4t|| |dV  |d}|d k	rZt|| |dV  d S )N$anchornameresourcez$dynamicAnchor)r$   r%   r&   r   create_resourceDynamicAnchor)r0   r!   anchorZdynamic_anchorr   r   r   _anchorE   s    


r8   zIterable[Anchor[Schema]]c                 C  s8   t |trg S |d}|d kr$g S t|| |dgS )Nr1   r2   )r$   r%   r&   r   r5   )r0   r!   r7   r   r   r   _anchor_2019Z   s    

r9   c                 C  sD   t |trg S |dd}|ds(g S t|dd  | |dgS )Nr#    r)      r2   )r$   r%   r&   r*   r   r5   r0   r!   r,   r   r   r   _legacy_anchor_in_dollar_idk   s    


r=   zSpecification[ObjectSchema]zIterable[Anchor[ObjectSchema]]c                 C  s6   | dd}|dsg S t|dd  | |dgS )Nr,   r:   r)   r;   r2   )r&   r*   r   r5   r<   r   r   r   _legacy_anchor_in_id|   s    

r>   zSet[str])in_valuein_subvaluesin_subarrayc                   s   ddd fdd}|S )z
    Create a callable returning JSON Schema specification-style subschemas.

    Relies on specifying the set of keywords containing subschemas in their
    values, in a subobject's values, or in a subarray.
    r   Iterable[ObjectSchema]r    c                 3  sr   t | trd S D ]}|| kr| | V  q D ]}|| kr.| | E d H  q.D ]}|| krN| |  E d H  qNd S N)r$   r%   values)r!   eachrA   r@   r?   r   r   subresources_of   s    
z)_subresources_of.<locals>.subresources_ofr   r?   r@   rA   rG   r   rF   r   _subresources_of   s    rI   c                   s   ddd fdd}|S )O
    Specifically handle older drafts where there are some funky keywords.
    r   rB   r    c                 3  s   t | trd S D ]}|| kr| | V  q D ]}|| kr.| | E d H  q.D ]}|| krN| |  E d H  qN| d}|d k	rt |tr|E d H  n|V  d S Nitems)r$   r%   rD   r&   r   )r!   rE   rL   rF   r   r   rG      s     


z:_subresources_of_with_crazy_items.<locals>.subresources_ofr   rH   r   rF   r   !_subresources_of_with_crazy_items   s    	rM   c                   s   ddd fdd}|S )rJ   r   rB   r    c                 3  s   t | trd S D ]}|| kr| | V  q D ]}|| kr.| | E d H  q.D ]}|| krN| |  E d H  qN| d}|d k	rt |tr|E d H  n|V  | d}|d k	rt| }t|d }t |tr|V  |E d H  d S )NrL   dependencies)r$   r%   rD   r&   r   iternextr   r!   rE   rL   rN   rD   valuerF   r   r   rG      s.    





zG_subresources_of_with_crazy_items_dependencies.<locals>.subresources_ofr   rH   r   rF   r   ._subresources_of_with_crazy_items_dependencies   s    	rS   c                   s   ddd fdd}|S )zT
    Specifically handle even older drafts where there are some funky keywords.
    r.   rB   r    c                 3  s   D ]}|| kr| | V  q D ]}|| kr | | E d H  q D ]}|| kr@| |   E d H  q@| d}|d k	rt|tr|E d H  n|V  | d}|d k	rt|  }t|d }t|tr|V  |E d H  dD ]}| |}t|tr|V  qd S )NrL   rN   )additionalItemsadditionalProperties)rD   r&   r$   r   rO   rP   r   rQ   rF   r   r   rG      s2    







zJ_subresources_of_with_crazy_aP_items_dependencies.<locals>.subresources_ofr   rH   r   rF   r   1_subresources_of_with_crazy_aP_items_dependencies   s    	rV   c                   s&   ||B  ddddd fdd}|S )NSequence[int | str]_Resolver[Any]Resource[Any]segmentsresolversubresourcer"   c                   sB   t | }|D ]*}|kr| ks.t|d d kr|  S q||S rC   )rO   rP   in_subresourcer[   r\   r]   Z	_segmentssegmentZin_childr?   r   r   maybe_in_subresource  s    
z3_maybe_in_subresource.<locals>.maybe_in_subresourcer   r?   r@   rA   rb   r   ra   r   _maybe_in_subresource  s    rd   c                   s&   ||B  ddddd fdd}|S )NrW   rX   rY   rZ   c                   sd   t | }|D ]L}|dkr2t|jtr2||  S |kr| ksPt|d d kr|  S q||S rK   rO   r$   r!   r   r^   rP   r_   ra   r   r   rb   6  s    

z?_maybe_in_subresource_crazy_items.<locals>.maybe_in_subresourcer   rc   r   ra   r   !_maybe_in_subresource_crazy_items/  s    rf   c                   s&   ||B  ddddd fdd}|S )NrW   rX   rY   rZ   c                   sd   t | }|D ]L}|dkr2t|jtr2||  S |kr| ksPt|d d kr|  S q||S )N>   rL   rN   re   r_   ra   r   r   rb   R  s    

zL_maybe_in_subresource_crazy_items_dependencies.<locals>.maybe_in_subresourcer   rc   r   ra   r   ._maybe_in_subresource_crazy_items_dependenciesK  s    rg   zdraft2020-12rU   containsZcontentSchemaelseifrL   notZpropertyNamesZthenZunevaluatedItemsZunevaluatedPropertiesZallOfZanyOfoneOfZprefixItemsz$defsZdefinitionsZdependentSchemasZpatternPropertiesZ
properties)r?   rA   r@   )r3   Zid_ofrG   Z
anchors_inrb   zdraft2019-09rT   zdraft-07zdraft-06zdraft-04zdraft-03Zextends)rA   r@   c                 C  s   i | ]\}}|t |qS r   )r
   opaque).0
dialect_idr0   r   r   r   
<dictcomp>/  s    rp   z,https://json-schema.org/draft/2020-12/schemaz,https://json-schema.org/draft/2019-09/schemaz&http://json-schema.org/draft-07/schemaz&http://json-schema.org/draft-06/schemaz&http://json-schema.org/draft-04/schemaz&http://json-schema.org/draft-03/schemazRegistry[Specification[Schema]]_SPECIFICATIONSr   zSpecification[Any] | _UnsetzSpecification[Any])ro   defaultr"   c                 C  s2   t | d}|dk	r|jS |tkr.t| |S )z
    Retrieve the `Specification` with the given dialect identifier.

    Raises:

        `UnknownDialect`

            if the given ``dialect_id`` isn't known

    r)   N)rq   r&   rstripr!   r   r   )ro   rr   r4   r   r   r   specification_with=  s    rt   c                   @  s2   e Zd ZU dZded< ded< dddd	d
ZdS )r6   z4
    Dynamic anchors, introduced in draft 2020.
    strr3   SchemaResourcer4   _Resolver[Schema]_Resolved[Schema]r\   r"   c              	   C  sl   | j }| D ]H\}}z||| jj}W n tjk
rD   Y qY nX t|tr|j }qt	|j
||dS )z2
        Resolve this anchor dynamically.
        )r!   r\   )r4   dynamic_scoper7   r3   rR   r   ZNoSuchAnchorr$   r6   	_Resolvedr!   r^   )selfr\   lastr   registryr7   r   r   r   resolve\  s    

zDynamicAnchor.resolveN)r   r   r   r   r   r   r   r   r   r   r6   S  s   
r6   rw   rx   ry   c                 C  sb   |  d}t|jtr^|jdr^|  D ]2\}}|  |}t|jtrT|jdsX q^|}q*|S )u   
    Recursive references (via recursive anchors), present only in draft 2019.

    As per the 2019 specification (§ 8.2.4.2.1), only the ``#`` recursive
    reference is supported (and is therefore assumed to be the relevant
    reference).
    r)   z$recursiveAnchor)lookupr$   r!   r   r&   rz   )r\   Zresolvedr   _Znext_resolvedr   r   r   lookup_recursive_refn  s    


r   N)@r   
__future__r   collections.abcr   r   typingr   r   r   Zreferencingr   r	   r
   r   r   Zreferencing._attrsr   Zreferencing._corer   r   r{   r   Z	_Resolverr   Zreferencing.typingr   Z
AnchorTyper   ru   r.   r%   r   rv   r   r   r   	Exceptionr   r'   r-   r/   r8   r9   r=   r>   	frozensetrI   rM   rS   rV   rd   rf   rg   ZDRAFT202012ZDRAFT201909ZDRAFT7ZDRAFT6ZDRAFT4ZDRAFT3rq   rt   r6   r   r   r   r   r   <module>   s  
!(+

44

"