
    $g&              	         d dl mZ d dlZd dlmZ d dlmZmZ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mZmZmZmZmZmZmZmZmZmZ d dlmZm Z  d dl!m"Z" d d	l#m$Z$ eee%ge&f         ej'        e%f         Z(ee&e)e*e%e	d
         ee%d
f         f         Z+ee%e+f         Z,e G d d                      Z-ee-ge&f         Z. G d de"          Z/	 d2d3dZ0d4dZ1d5dZ2d6d!Z3d7d$Z4d8d&Z5d9d-Z6d2d:d1Z7dgZ8dS );    )annotationsN)	dataclass)CallableDictIterableListOptionalTypeUnion)GraphQLError)BooleanValueNodeDefinitionNode	FieldNodeFloatValueNodeFragmentDefinitionNodeFragmentSpreadNodeInlineFragmentNodeIntValueNodeListValueNodeNodeObjectValueNodeOperationDefinitionNodeStringValueNode	ValueNode)ValidationContextValidationRule)AddValidationRules)is_introspection_keyFieldArgumentTypec                  8    e Zd ZU ded<   ded<   ded<   ded<   d	S )
IgnoreContextstr
field_nameFieldArgumentsType
field_argsr   noder   contextN)__name__
__module____qualname____annotations__     i/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/strawberry/extensions/query_depth_limiter.pyr!   r!   H   s<         OOO""""JJJr-   r!   c                  *     e Zd ZdZ	 	 dd fdZ xZS )QueryDepthLimitera"  Add a validator to limit the query depth of GraphQL operations.

    Example:

    ```python
    import strawberry
    from strawberry.extensions import QueryDepthLimiter

    schema = strawberry.Schema(
        Query,
        extensions=[QueryDepthLimiter(max_depth=4)],
    )
    ```
    N	max_depthintcallback*Optional[Callable[[Dict[str, int]], None]]should_ignoreOptional[ShouldIgnoreType]returnNonec                    |t          |          st          d          t          |||          }t                                          |g           dS )a  Initialize the QueryDepthLimiter.

        Args:
            max_depth: The maximum allowed depth for any operation in a GraphQL document.
            callback: Called each time validation runs.
                Receives an Object which is a map of the depths for each operation.
            should_ignore: Stops recursive depth checking based on a field name and arguments.
                A function that returns a boolean and conforms to the ShouldIgnoreType function signature.
        NzGThe `should_ignore` argument to `QueryDepthLimiter` must be a callable.)callable	TypeErrorcreate_validatorsuper__init__)selfr1   r3   r5   	validator	__class__s        r.   r>   zQueryDepthLimiter.__init__c   sb     $Xm-D-D$:   %YxHH	)%%%%%r-   )NN)r1   r2   r3   r4   r5   r6   r7   r8   )r(   r)   r*   __doc__r>   __classcell__)rA   s   @r.   r0   r0   S   sV         $ @D48	& & & & & & & & & & &r-   r0   r1   r2   r5   r6   r3   r4   r7   Type[ValidationRule]c                :      G  fddt                     }|S )Nc                  (     e Zd Zd fdZ xZS )-create_validator.<locals>.DepthLimitValidatorvalidation_contextr   r7   r8   c           
     "   |j         }|j        }t          |          }t          |          }i }|D ]!}t	          ||         |d
||          ||<   "t          	          r 	|           t                                          |           d S )Nr   r&   	fragmentsdepth_so_farr1   r'   operation_namer5   )documentdefinitionsget_fragmentsget_queries_and_mutationsdetermine_depthr:   r=   r>   )r?   rH   rN   rO   rK   queriesquery_depthsqueryrA   r3   r1   r5   s           r.   r>   z6create_validator.<locals>.DepthLimitValidator.__init__   s    )2H".K%k22I/<<GL  	 	&5 '!"'.#("/' ' 'U## !! '&&&GG/00000r-   )rH   r   r7   r8   )r(   r)   r*   r>   rC   )rA   r3   r1   r5   s   @r.   DepthLimitValidatorrG      sM        	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1r-   rV   )r   )r1   r5   r3   rV   s   ``` r.   r<   r<   {   sK    
1 1 1 1 1 1 1 1 1n 1 1 10 r-   rO   Iterable[DefinitionNode]!Dict[str, FragmentDefinitionNode]c                \    i }| D ]&}t          |t                    r|||j        j        <   '|S N)
isinstancer   namevalue)rO   rK   
definitions      r.   rP   rP      sA     I! : :
j"899 	:/9Ijo+,r-   "Dict[str, OperationDefinitionNode]c                r    i }| D ]1}t          |t                    r|j        r|j        j        nd}|||<   2|S )N	anonymous)r[   r   r\   r]   )rO   
operationsr^   	operations       r.   rQ   rQ      sR     J! / /
j"9:: 	/1;Q
--kI$.Jy!r-   r&   r   r"   c                @    | j         r| j         j        n| j        j        S rZ   )aliasr]   r\   )r&   s    r.   get_field_namerf      s      $z>4:ty>r-   r]   r   c                   t          | t                    r| j        S t          | t                    rt	          | j                  S t          | t
                    rt          | j                  S t          | t                    r| j        S t          | t                    rd | j	        D             S t          | t                    rd | j        D             S i S )Nc                ,    g | ]}t          |          S r,   )resolve_field_value.0vs     r.   
<listcomp>z'resolve_field_value.<locals>.<listcomp>   s!    ===1#A&&===r-   c                L    i | ]!}|j         j        t          |j                  "S r,   )r\   r]   ri   rj   s     r.   
<dictcomp>z'resolve_field_value.<locals>.<dictcomp>   s)    QQQq1!'::QQQr-   )r[   r   r]   r   r2   r   floatr   r   valuesr   fields)r]   s    r.   ri   ri      s     %)) {	E<	(	( 5;	E>	*	* 	U[!!!	E+	,	, {	E=	)	) ======	E?	+	+ QQELQQQQ	r-   r$   c                `    i }| j         D ]#}t          |j                  ||j        j        <   $|S rZ   )	argumentsri   r]   r\   )r&   	args_dictargs      r.   get_field_argumentsrw      s=     %'I~ C C$7	$B$B	#(.!!r-   r   rK   rL   r'   r   rM   c                    k    r,                     t          d d | g                     S t          | t                    rt	          | j        j                  p85 t          t          |           t          |           |                     nd}|s| j
        sdS dt          t          fd| j
        j                            z   S t          | t                    r&t          | j        j                           S t          | t           t"          t$          f          r/t          t          fd| j
        j                            S t'          d	| j                   )
N'z%' exceeds maximum operation depth of Fr      c           	     6    t          | dz             S )Nrz   rJ   rR   	selectionr'   rL   rK   r1   rM   r5   s    r.   <lambda>z!determine_depth.<locals>.<lambda>   s0    /"'!-!1'##1"/# # # r-   rJ   c           	     0    t          |           S )NrJ   r|   r}   s    r.   r   z!determine_depth.<locals>.<lambda>  s+    /"'!-'##1"/# # # r-   zDepth crawler cannot handle: )report_errorr   r[   r   r   r\   r]   r!   rf   rw   selection_setmaxmap
selectionsr   rR   r   r   r   r;   kind)r&   rK   rL   r1   r'   rM   r5   should_ignore_fields    `````` r.   rR   rR      s.    iTNTTTT 	
 	
 	
 $	"" =E 349?CC 
 ( M"4(('--	     	  	d&8 	13         "- 
 
 
 	
 
D,	-	- E49?+%)'
 
 
 	
 
!#9;RS
 
 E          "- 
 
 	
 C	CCDDDr-   ignoreOptional[List[IgnoreType]]boolc                2   |dS |D ]}| j         j        }t          |t                    r
||k    r dS -t          |t          j                  r|                    |          r dS `t          |          r ||          r dS ~t          d|           dS )NFTzInvalid ignore option: )	r\   r]   r[   r"   rePatternmatchr:   r;   )r&   r   ruler#   s       r.   
is_ignoredr   )  s    ~u > >Y_
dC   
	>T!!tt "bj)) 	>zz*%% ttd^^ 	>tJ tt <d<<===5r-   rZ   )r1   r2   r5   r6   r3   r4   r7   rD   )rO   rW   r7   rX   )rO   rW   r7   r_   )r&   r   r7   r"   )r]   r   r7   r   )r&   r   r7   r$   )r&   r   rK   rX   rL   r2   r1   r2   r'   r   rM   r"   r5   r6   r7   r2   )r&   r   r   r   r7   r   )9
__future__r   r   dataclassesr   typingr   r   r   r   r	   r
   r   graphqlr   graphql.languager   r   r   r   r   r   r   r   r   r   r   r   r   r   graphql.validationr   r   strawberry.extensionsr   strawberry.extensions.utilsr   r"   r   r   
IgnoreTyper2   rp   r   r$   r!   ShouldIgnoreTyper0   r<   rP   rQ   rf   ri   rw   rR   r   __all__r,   r-   r.   <module>r      s  8 # " " " " " 				 ! ! ! ! ! !                  !                                           A @ @ @ @ @ @ @ 4 4 4 4 4 4 < < < < < <8SE4K("*c9:
#uc4 34d3@S;S6TT  #001          ]OT12 %& %& %& %& %&* %& %& %&V <@    @   
 
 
 
? ? ? ?   &   OE OE OE OEd    * 
r-   