o
    Zh                  	   @   s6  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 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Optional	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   K/var/www/html/lang_env/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   listr   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appendr   	enumerater   r   )r   r   r
   queueresulttaskr   depthr   keyZ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   )selfr.   r   r   r   
mask_nodes8   s    zStringNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r0   r   r   r   r   r-   5   s     r-   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
   Z
deep_cloneN)r   r   r   r   r   r   r   boolr   r   r   r   r1   =   s   
 r1   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   r3   G   s   
 
r3   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 )r4   r5   z
[redacted])r4   r5   )r    r6   r7   compiler   r   ).0ruler   r   r   
<listcomp>]   s    

z.RuleNodeProcessor.__init__.<locals>.<listcomp>Nr9   )r/   r9   r   r   r   __init__[   s   zRuleNodeProcessor.__init__r.   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   r4   r5   r   r   )r9   subr#   r   )r/   r.   r&   r+   	new_valuer<   r   r   r   r0   m   s   
zRuleNodeProcessor.mask_nodesN)
r   r   r   r   r   r3   r   r?   r   r0   r   r   r   r   r8   Q   s   
 r8   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)rC   leninspect	signature
parametersrD   )r/   rC   r   r   r   r?      s   zCallableNodeProcessor.__init__r.   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   )rD   rC   r#   r   )r/   r.   retvalnode	candidater   r   r   r0      s   z CallableNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r   r   r   r2   r?   r   r0   r   r   r   r   rB   y   s   
 2,
rB   replacerc                 C   s*   t | tr
t| dS t| rt| dS | S )Nr>   )rC   )r    r   r8   callablerB   )rM   r   r   r   _get_node_processor   s
   


rO   )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,   r0   )r   r.   Zmutate_valueZ	to_updaterK   temppartZ	last_partr
   	processorr   r   
anonymizer   s   


z%create_anonymizer.<locals>.anonymizer)rO   r   )rM   r
   rU   r   rS   r   create_anonymizer   s   rV   )r6   rG   abcr   collectionsr   typingr   r   r   r   r   r	   r   r   r,   r-   r1   r3   r8   rB   r   r   ZReplacerTyperO   rV   r   r   r   r   <module>   s8    


(&