o
    +i                  	   @   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   Q/var/www/html/psymed-ai/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   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   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   )selfr/   r   r   r   
mask_nodes8   s    zStringNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r1   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
   
deep_cloneN)r   r   r   r   r   r   r   boolr   r   r   r   r2   =   s   
 r2   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   r5   G   s   
 
r5   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 )r6   r7   z
[redacted])r6   r7   )r    r8   r9   compiler   r   ).0ruler   r   r   
<listcomp>]   s    

z.RuleNodeProcessor.__init__.<locals>.<listcomp>Nr;   )r0   r;   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   r6   r7   r   r   )r;   subr#   r   )r0   r/   r&   r,   	new_valuer>   r   r   r   r1   m   s   
zRuleNodeProcessor.mask_nodesN)
r   r   r   r   r   r5   r   rA   r   r1   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)rE   leninspect	signature
parametersrF   )r0   rE   r   r   r   rA      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   )rF   rE   r#   r   )r0   r/   retvalnode	candidater   r   r   r1      s   z CallableNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r   r   r   r4   rA   r   r1   r   r   r   r   rD   y   s   
 2,
rD   replacerc                 C   s*   t | tr
t| dS t| rt| dS | S )Nr@   )rE   )r    r   r:   callablerD   )rO   r   r   r   _get_node_processor   s
   


rQ   )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-   r1   )r   r/   mutate_value	to_updaterM   temppart	last_partr
   	processorr   r   
anonymizer   s   


z%create_anonymizer.<locals>.anonymizer)rQ   r   )rO   r
   rZ   r   rX   r   create_anonymizer   s   r[   )r8   rI   abcr   collectionsr   typingr   r   r   r   r   r	   r   r   r-   r.   r2   r5   r:   rD   r   r   ReplacerTyperQ   r[   r   r   r   r   <module>   s8    


(&