
    _Di              	       r   S SK r S SKrS SKJr  S SKJr  S SKJrJrJ	r	J
r
Jr   " S S\
5      r " S S\
5      rS	\S
\S\\   4S jr " S S5      r " S S\
5      r " S S\
5      r " S S\5      r " S S\5      r\\\\\\\4      /\4   \\   \4   rS\S\4S jrSS.S\S\	\   S\\/\4   4S jjrg)    N)abstractmethod)defaultdict)AnyCallableOptional	TypedDictUnionc                   &    \ rS rSr% \\   \S'   Srg)_ExtractOptions   	max_depth N)__name__
__module____qualname____firstlineno__r   int__annotations____static_attributes__r       \/var/www/html/Aiprofessor/professorTrac/lib/python3.13/site-packages/langsmith/anonymizer.pyr   r      s    }r   r   c                   @    \ rS rSr% Sr\\S'    \\\\	4      \S'   Sr
g)
StringNode   z$String node extracted from the data.valuepathr   N)r   r   r   r   __doc__strr   listr	   r   r   r   r   r   r   r      s#    .J
uS#X
.r   r   dataoptionsreturnc                 8   UR                  S5      =(       d    SnU S/ 4/n/ nU(       a  UR                  S5      nUc  M  Uu  pgn[        U[        [        45      (       a:  Xr:  a  MD  UR                  5        H  u  pUR                  XS-   X/-   45        M      Ow[        U[        5      (       a5  Xr:  a  M  [        U5       H  u  pUR                  XS-   X/-   45        M      O-[        U[        5      (       a  UR                  [        XhS95        U(       a  M  U$ )Nr   
   r      r   r   )getpop
isinstancedictr   itemsappendr   	enumerater   r   )r    r!   r   queueresulttaskr   depthr   keynested_valueiitems                r   _extract_string_nodesr6      s    K(.BI<@!R=/E!F
yy|<!dedK011!%*[[]!lAIte|DE &3t$$!$U+dAItcz:; ,s##MM*5<=# %& Mr   c                   @    \ rS rSrSr\S\\   S\\   4S j5       rSr	g)StringNodeProcessor5   z-Processes a list of string nodes for masking.nodesr"   c                     g)z6Accept and return a list of string nodes to be masked.Nr   )selfr:   s     r   
mask_nodesStringNodeProcessor.mask_nodes8   s    r   r   N)
r   r   r   r   r   r   r   r   r=   r   r   r   r   r8   r8   5   s3    7EZ 0 ET*5E E Er   r8   c                   <    \ rS rSr% Sr\\   \S'    \\   \S'   Sr	g)ReplacerOptions=   z3Configuration options for replacing sensitive data.r   
deep_cloner   N)
r   r   r   r   r   r   r   r   boolr   r   r   r   r@   r@   =   s    =}?/r   r@   c                   J    \ rS rSr% Sr\R                  \S'    \\	   \S'   Sr
g)StringNodeRuleG   z3Declarative rule used for replacing sensitive data.patternreplacer   N)r   r   r   r   r   rePatternr   r   r   r   r   r   r   rE   rE   G   s    =ZZ!c]Gr   rE   c                   ^    \ rS rSr% Sr\\   \S'    S\\   4S jrS\\	   S\\	   4S jr
Srg	)
RuleNodeProcessorQ   zJString node processor that uses a list of rules to replace sensitive data.rulesc           	         U Vs/ s Ho  n[        US   [        R                  5      (       a  US   O[        R                  " US   5      [        UR	                  S5      [
        5      (       a  US   OSS.PMq     snU l        gs  snf )z.Initialize the processor with a list of rules.rG   rH   z
[redacted])rG   rH   N)r)   rI   rJ   compiler'   r   rN   )r<   rN   rules      r   __init__RuleNodeProcessor.__init__[   s     
  "$y/2::>> ODO4 "$((9"5s;; O% 

 
s   A6Br:   r"   c                     / nU HX  nUS   nU R                    H  nUS   R                  US   U5      nM     XCS   :w  d  M=  UR                  [        XCS   S95        MZ     U$ )zMask nodes using the rules.r   rG   rH   r   r&   )rN   subr,   r   )r<   r:   r/   r5   	new_valuerQ   s         r   r=   RuleNodeProcessor.mask_nodesm   sh    DWI

 O//YK	 #M)jyF|LM  r   rN   N)r   r   r   r   r   r   rE   r   rR   r   r=   r   r   r   r   rL   rL   Q   sC    T
d>2 
$	Z 0 	T*5E 	r   rL   c            	           \ rS rSr% Sr\\\/\4   \\\\\\	4      /\4   4   \
S'    \\
S'    S\\\/\4   \\\\\\	4      /\4   4   4S jrS\\   S\\   4S jrS	rg
)CallableNodeProcessory   zNString node processor that uses a callable function to replace sensitive data.funcaccepts_pathc                 r    Xl         [        [        R                  " U5      R                  5      S:H  U l        g)z2Initialize the processor with a callable function.   N)r\   leninspect	signature
parametersr]   )r<   r\   s     r   rR   CallableNodeProcessor.__init__   s,    
 	 1 1$ 7 B BCqHr   r:   r"   c                     / nU He  nU R                   (       a  U R                  US   US   5      OU R                  US   5      nXCS   :w  d  MJ  UR                  [        XCS   S95        Mg     U$ )z'Mask nodes using the callable function.r   r   r&   )r]   r\   r,   r   )r<   r:   retvalnode	candidates        r   r=    CallableNodeProcessor.mask_nodes   sq    #%D $$ 		$w-f6YYtG}- 
 M)jyF|LM  r   )r]   r\   N)r   r   r   r   r   r	   r   r   r   r   r   rC   rR   r   r=   r   r   r   r   rZ   rZ   y   s    X
#$hT%S/5J/KS/P&QQ
RR G
IHcUCZ((CeCHo9N3OQT3T*UUVIZ 0 T*5E r   rZ   replacerc                 t    [        U [        5      (       a	  [        U S9$ [        U 5      (       a	  [	        U S9$ U $ )NrX   )r\   )r)   r   rL   callablerZ   )rj   s    r   _get_node_processorrm      s5    (D!! x00	(		$(33r   )r   r   c                J   ^^ [        U 5      mS[        S[        4UU4S jjnU$ )zCreate an anonymizer function.r    r"   c                    > [        U ST=(       d    S05      nU nT	R                  U5      nU H8  nUS   (       d  US   nM  UnUS   S S  H  nXV   nM	     US   S   nUS   XW'   M:     U$ )Nr   r$   r   r   )r6   r=   )
r    r:   mutate_value	to_updaterg   temppart	last_partr   	processors
           r   
anonymizer%create_anonymizer.<locals>.anonymizer   s    %d[)/r,JK((/	D<#G}# L"-D:D . !L,	"&w-  r   )rm   r   )rj   r   rw   rv   s    ` @r   create_anonymizerry      s/     $H-I   $ r   )rI   ra   abcr   collectionsr   typingr   r   r   r   r	   r   r   r   r6   r8   r@   rE   rL   rZ   r   r   ReplacerTyperm   ry   r   r   r   <module>r~      s   	   # < <i / / o $zBR 8E E0i 0HY H%+ %P#/ #L c4c3h()3./, 3F   $ } seSj	r   