o
    tBh)                     @   sf   d dl 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 dgZG dd deZd	S )
    )AnyDictListSet   )GraphQLError)FragmentDefinitionNodeFragmentSpreadNodeVisitorActionSKIP   )ASTValidationContextASTValidationRuleNoFragmentCyclesRulec                       sd   e Zd ZdZdef fddZededefddZ	d	e
dedefd
dZde
ddfddZ  ZS )r   a1  No fragment cycles

    The graph of fragment spreads must not form any cycles including spreading itself.
    Otherwise an operation could infinitely spread or infinitely execute on cycles in
    the underlying data.

    See https://spec.graphql.org/draft/#sec-Fragment-spreads-must-not-form-cycles
    contextc                    s$   t  | t | _g | _i | _d S N)super__init__setvisited_fragsspread_pathspread_path_index_by_name)selfr   	__class__ /var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/graphql/validation/rules/no_fragment_cycles.pyr      s   
zNoFragmentCyclesRule.__init___argsreturnc                  G   s   t S r   )r   )r   r   r   r   enter_operation_definition   s   z/NoFragmentCyclesRule.enter_operation_definitionnodec                 G   s   |  | tS r   )detect_cycle_recursiver   )r   r    r   r   r   r   enter_fragment_definition"   s   
z.NoFragmentCyclesRule.enter_fragment_definitionfragmentNc                 C   s  |j j| jv r	d S |j j}| j}|| | j|j}|s d S | j}| j}t	|||< | jj
}|D ]N}|j j}	||	}
|| |
d u rR||	}|rQ| | n*||
d  }ddd |d d D }| td|	 d|rvd| dnd | |  q2||= d S )	Nz, c                 s   s     | ]}d |j j d  V  qdS )'N)namevalue).0sr   r   r   	<genexpr>G   s    z>NoFragmentCyclesRule.detect_cycle_recursive.<locals>.<genexpr>zCannot spread fragment 'z' within itselfz via .)r%   r&   r   addr   get_fragment_spreadsselection_setr   r   lenget_fragmentgetappendr!   joinreport_errorr   pop)r   r#   fragment_namer   spread_nodesr   spread_path_indexr0   spread_nodespread_namecycle_indexspread_fragment
cycle_pathvia_pathr   r   r   r!   (   sB   






z+NoFragmentCyclesRule.detect_cycle_recursive)__name__
__module____qualname____doc__r   r   staticmethodr   r
   r   r   r"   r!   __classcell__r   r   r   r   r   
   s    	

N)typingr   r   r   r   errorr   languager   r	   r
   r    r   r   __all__r   r   r   r   r   <module>   s    