U
    h                     @   s4  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eee	e d	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eedddZddee
e eegef d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   8/tmp/pip-unpacked-wheel-cqvhoa9t/langsmith/anonymizer.pyr      s   
r   c                   @   s.   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 }|r|d}|d kr6q|\}}}t|ttfr||krXq| D ]"\}	}
||
|d ||	g f q`qt|tr||krqt|D ]"\}}|||d ||g f qqt|t	r|t
||d q|S )Nr   
   r      r   r   )getpop
isinstancedictr   itemsappendlist	enumerater   r   )r   r   r   queueresultZtaskr   depthr   keyZnested_valueiitemr   r   r   _extract_string_nodes   s*    



r-   c                   @   s,   e Zd ZdZeee ee d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   )selfr0   r   r   r   
mask_nodes8   s    zStringNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r2   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   r3   =   s   
r3   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                   @   sH   e Zd ZU dZee ed< ee dddZee ee dddZ	d	S )
RuleNodeProcessorzJString node processor that uses a list of rules to replace sensitive data.rulesr;   c                 C   s   dd |D | _ dS )z.Initialize the processor with a list of rules.c                 S   sP   g | ]H}t |d  tjr |d  nt|d  t |dtrD|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>Nr<   )r1   r;   r   r   r   __init__[   s    zRuleNodeProcessor.__init__r/   c                 C   s\   g }|D ]N}|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   )r1   r0   r(   r,   	new_valuer?   r   r   r   r2   m   s    
zRuleNodeProcessor.mask_nodesN)
r   r   r   r   r   r5   r   rA   r   r2   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< eeegef eeeeeef  gef f dddZee ee ddd	Zd
S )CallableNodeProcessorzNString node processor that uses a callable function to replace sensitive data.funcaccepts_pathrE   c                 C   s    || _ tt|jdk| _dS )z2Initialize the processor with a callable function.   N)rE   leninspect	signature
parametersrF   )r1   rE   r   r   r   rA      s    zCallableNodeProcessor.__init__r/   c                 C   s\   g }|D ]N}| 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   )r1   r0   retvalnode	candidater   r   r   r2      s    z CallableNodeProcessor.mask_nodesN)r   r   r   r   r
   r   r   r   r   r   r4   rA   r   r2   r   r   r   r   rD   y   s   
2,rD   )replacerr   c                 C   s.   t | trt| dS t| r&t| dS | S d S )Nr<   rG   )r!   r%   r:   callablerD   )rP   r   r   r   _get_node_processor   s
    


rR   )r   )rP   r   r   c                   s"   t | ttd fdd}|S )zCreate an anonymizer function.)r   r   c                    sz   t | d pdi}| }|}|D ]P}|d s:|d }q$|}|d d d D ]}|| }qN|d d }|d ||< q$|S )Nr   r   r   r   )r-   r2   )r   r0   Zmutate_valueZ	to_updaterN   temppartZ	last_partr   	processorr   r   
anonymizer   s    


z%create_anonymizer.<locals>.anonymizer)rR   r   )rP   r   rX   r   rV   r   create_anonymizer   s    rY   )r8   rJ   abcr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r-   r.   r3   r5   r:   rD   r   r   ZReplacerTyperR   rY   r   r   r   r   <module>   s2   $


(&