a
    `g                     @   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   b/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/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 u 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result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   )selfr1   r   r   r   
mask_nodes8   s    zStringNodeProcessor.mask_nodesN)r   r   r   r   r   r   r   r3   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   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   r6   G   s   

r6   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 )r7   r8   z
[redacted])r7   r8   )r!   r9   r:   compiler   r   ).0ruler   r   r   
<listcomp>]   s   

z.RuleNodeProcessor.__init__.<locals>.<listcomp>Nr=   )r2   r<   r   r   r   __init__[   s    zRuleNodeProcessor.__init__r0   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   r7   r8   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   r6   r   rB   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< 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rF   c                 C   s    || _ tt|jdk| _dS )z2Initialize the processor with a callable function.   N)rF   leninspect	signature
parametersrG   )r2   rF   r   r   r   rB      s    zCallableNodeProcessor.__init__r0   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   )rG   rF   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   r5   rB   r   r3   r   r   r   r   rE   y   s   
2,rE   )replacerr   c                 C   s.   t | trt| dS t| r&t| dS | S d S )Nr=   rH   )r!   r%   r;   callablerE   )rQ   r   r   r   _get_node_processor   s
    


rS   )r   )rQ   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.   r3   )r   r1   Zmutate_valueZ	to_updaterO   temppartZ	last_partr   	processorr   r   
anonymizer   s    


z%create_anonymizer.<locals>.anonymizer)rS   r   )rQ   r   rY   r   rW   r   create_anonymizer   s    rZ   )r9   rK   abcr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r.   r/   r4   r6   r;   rE   r   r   ZReplacerTyperS   rZ   r   r   r   r   <module>   s2   $


(&