o
    ,ig                  	   @   s>  d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZ G dd deZG dd deZd	ed
ede	e fddZG dd dZG dd deZG dd deZG dd deZG dd deZeeee	eeef  gef e	e ef ZdedefddZdddede
e deegef fddZdS )    N)abstractmethod)defaultdict)AnyCallableListOptionalTuple	TypedDictUnionc                   @   s   e Zd ZU ee ed< dS )_ExtractOptions	max_depthN)__name__
__module____qualname__r   int__annotations__ r   r   n/var/www/eduai.edurigo.com/doc_train/edurigo_ai/Puru/venv/lib/python3.10/site-packages/langsmith/anonymizer.pyr      s   
 r   c                   @   s0   e Zd ZU dZeed< 	 eeeef  ed< dS )
StringNodez$String node extracted from the data.valuepathN)	r   r   r   __doc__strr   r   r
   r   r   r   r   r   r      s   
 r   dataoptionsreturnc                 C   s   | dpd}| dg fg}g }|rt|d}|d u rq|\}}}t|ttfrC||kr,q| D ]\}	}
||
|d ||	g f q0n/t|trd||krMqt|D ]\}}|||d ||g f qQnt|t	rr|t
||d |s|S )Nr   
   r      r   r   )getpop
isinstancedictr   itemsappendlist	enumerater   r   )r   r   r   queueresulttaskr   depthr   keynested_valueiitemr   r   r   _extract_string_nodes   s0   



r/   c                   @   s.   e Zd ZdZedee dee fddZdS )StringNodeProcessorz-Processes a list of string nodes for masking.nodesr   c                 C   s   dS )z6Accept and return a list of string nodes to be masked.Nr   )selfr1   r   r   r   
mask_nodes8   s    zStringNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r3   r   r   r   r   r0   5   s     r0   c                   @   s,   e Zd ZU dZee ed< 	 ee ed< dS )ReplacerOptionsz3Configuration options for replacing sensitive data.r   
deep_cloneN)r   r   r   r   r   r   r   boolr   r   r   r   r4   =   s   
 r4   c                   @   s*   e Zd ZU dZejed< 	 ee ed< dS )StringNodeRulez3Declarative rule used for replacing sensitive data.patternreplaceN)	r   r   r   r   rePatternr   r   r   r   r   r   r   r7   G   s   
 
r7   c                   @   sL   e Zd ZU dZee ed< 	 dee fddZdee dee fddZ	d	S )
RuleNodeProcessorzJString node processor that uses a list of rules to replace sensitive data.rulesc                 C   s   dd |D | _ dS )z.Initialize the processor with a list of rules.c                 S   sP   g | ]$}t |d  tjr|d  nt|d  t |dtr"|d nddqS )r8   r9   z
[redacted])r8   r9   )r!   r:   r;   compiler   r   ).0ruler   r   r   
<listcomp>]   s    

z.RuleNodeProcessor.__init__.<locals>.<listcomp>Nr=   )r2   r=   r   r   r   __init__[   s   zRuleNodeProcessor.__init__r1   r   c                 C   s\   g }|D ]'}|d }| j D ]}|d |d |}q||d kr+|t||d d q|S )zMask nodes using the rules.r   r8   r9   r   r   )r=   subr$   r   )r2   r1   r(   r.   	new_valuer@   r   r   r   r3   m   s   
zRuleNodeProcessor.mask_nodesN)
r   r   r   r   r   r7   r   rC   r   r3   r   r   r   r   r<   Q   s   
 r<   c                	   @   s   e Zd ZU dZeeegef eeeeeef  gef f e	d< 	 e
e	d< 	 deeegef eeeeeef  gef f fddZdee dee fdd	Zd
S )CallableNodeProcessorzNString node processor that uses a callable function to replace sensitive data.funcaccepts_pathc                 C   s    || _ tt|jdk| _dS )z2Initialize the processor with a callable function.   N)rG   leninspect	signature
parametersrH   )r2   rG   r   r   r   rC      s   zCallableNodeProcessor.__init__r1   r   c                 C   s\   g }|D ]'}| j r| |d |d n| |d }||d kr+|t||d d q|S )z'Mask nodes using the callable function.r   r   r   )rH   rG   r$   r   )r2   r1   retvalnode	candidater   r   r   r3      s   z CallableNodeProcessor.mask_nodesN)r   r   r   r   r
   r   r   r   r   r   r6   rC   r   r3   r   r   r   r   rF   y   s   
 2,
rF   replacerc                 C   s*   t | tr
t| dS t| rt| dS | S )NrB   )rG   )r!   r%   r<   callablerF   )rQ   r   r   r   _get_node_processor   s
   


rS   )r   r   c                   s$   t | dtdtf fdd}|S )zCreate an anonymizer function.r   r   c                    sz   t | d pdi}| }|}|D ](}|d s|d }q|}|d d d D ]}|| }q'|d d }|d ||< q|S )Nr   r   r   r   )r/   r3   )r   r1   mutate_value	to_updaterO   temppart	last_partr   	processorr   r   
anonymizer   s   


z%create_anonymizer.<locals>.anonymizer)rS   r   )rQ   r   r\   r   rZ   r   create_anonymizer   s   r]   )r:   rK   abcr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r/   r0   r4   r7   r<   rF   r   r   ReplacerTyperS   r]   r   r   r   r   <module>   s8    $


(&