
    
3jB                        S SK r S SKrS SKJrJrJrJrJrJrJ	r	J
r
Jr  S SKJrJr  S SKJr  S SK Jr  S SKJr  S SKJrJr  S SKJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(  S S	K)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  S S
K2J3r3  S SK4J5r5  \Rl                  " \75      r8Sr9Sr:Sr;Sr<Sr=Sr>Sr?Sr@SrASrBSrCSrDSrESrFSrGSrH\" S5      rI " S S\J5      rK " S S\J5      rL " S  S!5      rM\7S":X  a  S SKNrN\NR                  " 5         gg)#    N)	ListDictIOCallableSetUnionOptionalAnycast)partial
cmp_to_key)Mapping)deepcopy)DeepDiff)pickle_loadpickle_dump)stringsnumbers
np_ndarraynp_array_factorynumpy_dtypesget_doc	not_foundnumpy_dtype_string_to_typedict_OpcodeFlatDeltaRowFlatDeltaDictUnkownValueCodeFlatDataActionOPCODE_TAG_TO_FLAT_DATA_ACTIONFLAT_DATA_ACTION_TO_OPCODE_TAG
SetOrdered)_path_to_elements_get_nested_obj_get_nested_obj_and_forceGETGETATTR
check_elem
parse_pathstringify_path)AnySet)	summarizezExpected the old value for {} to be {} but it is {}. Error found on: {}. You may want to set force=True, especially if this delta is created by passing flat_rows_list or flat_dict_listz=Key or index of {} is not found for {} for setting operation.z=Unable to do the type change for {} from to type {} due to {}zsYou have applied the delta to an object that has different values than the original object the delta was made from.zEFailed to remove index[{}] on {}. It was expected to be {} but got {}zA numpy ndarray is most likely being added to a delta. Due to Numpy override the + operator, you can only do: delta + ndarray and NOT ndarray + deltaz^Please open the file in the binary mode and pass to Delta by passing 'b' in open(..., 'b'): {}zOAt least one of the diff, delta_path or delta_file arguments need to be passed.zDinvalid action of {} when calling _get_elem_and_compare_to_old_valuez8invalid action of {} when calling _simple_set_elem_valuez Unable to get the item at {}: {}zUnable to get the item at {}zdDelta added to an incompatible object. Unable to add the following items at the specific indexes. {}NUMPY_TO_LISTz{} is not a valid numpy type.z	delta.rstc                       \ rS rSrSrSrg)
DeltaError4   z
Delta specific errors
 N__name__
__module____qualname____firstlineno____doc____static_attributes__r2       H/home/wildlama/miniconda3/lib/python3.13/site-packages/deepdiff/delta.pyr0   r0   4        	r:   r0   c                       \ rS rSrSrSrg)DeltaNumpyOperatorOverrideError;   z%
Delta Numpy Operator Override Error
r2   Nr3   r2   r:   r;   r>   r>   ;   r<   r:   r>   c            %       ~   \ rS rSr\rSSSSSS\SSSS\SSSSS\4S\	\
\\\S4   S\\   S\\   S\\   S	\\\      S
\\\      S\S\S\S\S\\\      S\S\\   S\S\S\\   S\S\4$S jjrS rS rS r\rS rSGS jrS r    SHS jr SIS jr!S  r"S! r#SJS" jr$S# r%S$ r&S% r'S& r(\)S' 5       r*\)S( 5       r+SKS) jr,S* r-S+ r.S, r/S- r0S. r1SLS/ jr2S0 r3S1 r4S2 r5S3 r6S4 r7S5 r8S6 r9S7 r:S8 r;S9 r<S: r=S; r>S< r?S= r@S> rAS? rB\)SMS@ j5       rC\)S
\\   4SA j5       rD\)SB 5       rESLSC\\F   4SD jjrGSLSC\\   4SE jjrHSFrIg)NDeltaB   NTFdiff
delta_path
delta_file
delta_diffflat_dict_listflat_rows_listdeserializer
log_errorsmutateraise_errorssafe_to_import
serializerverify_symmetrybidirectionalalways_include_valuesiterable_compare_func_was_usedforcefillc                 r  ^ [        TS5      (       a&  S[        TR                  R                  5      ;   a  TnOSU4S jjnS U l        Ub  [
        R                  S5        UnXl        U(       a  SU l        OXl        Uby  [        U[        5      (       a&  UR                  U(       + U R                  S9U l        GO[        U[        5      (       a  Xl        GO [        U[        5      (       a  U" XS9U l        OU(       a2  [        US5       nUR!                  5       nS S S 5        U" WUS9U l        OU(       a  X@l        OU(       a   UR!                  5       nU" UUS9U l        OsU(       a+  U R+                  [,        R.                  " U5      5      U l        OAU(       a+  U R1                  [,        R.                  " U5      5      U l        O[%        [2        5      eXl        Xl        Xl        U R                  R;                  S	S
5      U l        U R                  R;                  SU5      U l        Xl         TU l!        UU l"        UU l#        U(       a  [H        U l%        O[L        U l%        U RO                  5         g ! , (       d  f       GN`= f! ["         a$  n[%        [&        R)                  U5      5      S eS nAff = f)N__code__rM   c           	         > T" U 5      nUR                  S5      (       aK  0 nUS   R                  5        H.  u  pE/ X4'   U H  nX4   R                  [        S0 UD65        M!     M0     X2S'   U$ )N_iterable_opcodesr2   )getitemsappendr   )objrM   resultrX   pathop_codesop_coderI   s          r;   _deserializer%Delta.__init__.<locals>._deserializer_   s    %c*::122(*%*01D*E*K*K*M24)/'/G-3:: & !"&-!" (0 +N 3D./r:   zMDeepDiff Deprecation: use bidirectional instead of verify_symmetry parameter.T)directedrQ   )rM   rb_numpy_pathsF_iterable_compare_func_was_usedN)(hasattrsetrV   co_varnames_reversed_diffloggerwarningrP   rQ   
isinstancer   _to_delta_dictrC   r   r   openreadUnicodeDecodeError
ValueErrorBINIARY_MODE_NEEDED_MSGformat_from_flat_dictscopyr   _from_flat_rowsDELTA_AT_LEAST_ONE_ARG_NEEDEDrK   rL   rJ   rY   re   rf   rN   rI   rS   rT   r&   get_nested_objr%   reset)selfrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   ra   the_filecontentes          `               r;   __init__Delta.__init__F   s#   , <,,1ASI^I^IjIjEk1k(M  #&NN_ ,M*)-D&)>&$)) //]9Jbfb|b|/}	D'** 	D'**)$N	j$'8"--/ (%gnMDI"IN$//+ &gnMDI--dmmN.KLDI,,T]]>-JKDI:;;($ IIMM.%@ 04yy}}=^`~/,$(
	";D"1D

E (' & N !8!?!?!BCMNs$   I6J 6
J
J6J11J6c                 H    SR                  [        U R                  SS95      $ )Nz<Delta: {}>d   )
max_length)ru   r-   rC   r|   s    r;   __repr__Delta.__repr__   s    ##IdiiC$HIIr:   c                 "    [        5       U l        g rg   )r   post_process_paths_to_convertr   s    r;   r{   Delta.reset   s    -2W*r:   c                    [        U[        5      (       a   U R                  (       a  [        [        5      eU R
                  (       a  Xl        O[        U5      U l        U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R!                  5         U R#                  5         U R%                  5         U R'                  5         U R)                  5         U R+                  5         U R                  nU ?U R-                  5         U$ rg   )rn   r   re   r>   !DELTA_NUMPY_OPERATOR_OVERRIDE_MSGrK   rootr   _do_pre_process_do_values_changed_do_set_item_added_do_set_item_removed_do_type_changes_do_iterable_opcodes_do_iterable_item_removed_do_iterable_item_added_do_ignore_order_do_dictionary_item_added_do_dictionary_item_removed_do_attribute_added_do_attribute_removed_do_post_processr{   )r|   others     r;   __add__Delta.__add__   s    eW%%$*;*;12STT;;I DI!!!!# 	!!#&&($$&&&(((*  """$		I

r:   c                     U R                   c  U R                  5       U l         U R                   U R                  sU l        U l         U R                  U5      nU R                   U R                  sU l        U l         U$ rg   )rk   _get_reverse_diffrC   r   )r|   r   r]   s      r;   __rsub__Delta.__rsub__   sh    &"&"8"8":D)-)<)<dii&	4&e$)-)<)<dii&	4&r:   c                     U R                   (       a  [        [        U5      " U5        U R                  (       a  [	        U5      eg rg   )rJ   getattrrl   rL   r0   )r|   msglevels      r;   _raise_or_logDelta._raise_or_log   s0    ??FE"3'S/! r:   c                     U R                   (       aY  X#:w  aS  [        U[        5      (       a  UnO[        US[        4S9nU R                  [        R                  XBU[        5      5        g g g )N root_element)	rP   rn   strr+   r(   r   VERIFICATION_MSGru   VERIFY_BIDIRECTIONAL_MSG)r|   r^   expected_old_valuecurrent_old_valuepath_strs        r;   _do_verify_changesDelta._do_verify_changes   sc    "4"I$$$)$b']K/66.?AY [ \ #Jr:   c           	         [        U5         U[        :X  a  X   nU$ U[        :X  a  [        X5      nU$ [	        [
        R                  U5      5      e! [        [        [        [        4 Gag  n	U R                  (       a  Uc  Ub  [        U[        5      (       a  0 n
O/ n
OUn
U[        :X  aU  [        U[        5      (       a;  [        U[        5      (       a  U[!        U5      :  a  XU'   O-UR#                  U
5        OXU'   OU[        :X  a  [%        XU
5        U
s S n	A	$ [&        n[        U[        [(        45      (       a*  SR+                  U Vs/ s H  oS   PM	     Os  snf sn5      nU R,                  (       a,  U R/                  [0        R                  UX8U	5      5         S n	A	U$ U R/                  [2        R                  U5      5         S n	A	U$ S n	A	ff = f)N.r   )r)   r'   r(   r   r0   $INVALID_ACTION_WHEN_CALLING_GET_ELEMru   KeyError
IndexErrorAttributeError	TypeErrorrS   rn   r   listintlenr[   setattrr   tuplejoinrP   r   r   UNABLE_TO_GET_PATH_MSG)r|   r\   path_for_err_reportingr   elemactionforced_old_valuenext_elementr   r   _forced_old_valueis               r;   "_get_elem_and_compare_to_old_value(Delta._get_elem_and_compare_to_old_value   s    	4$	-}$'I!F ! E 7"$+C$6!B ! ? !!E!L!LV!TUU*ni@ 	-zz#+#+z,/L/L,.),.)(8%S=!#t,,%dC00TCH_(9IJJ'89$5D	w&C'89(( )04-@@),AW2XAWAQ4AW2X)Y&!!""#3#:#:*&1$> ? ? !  ""#9#@#@*$, - -  =	-sA   A A A G-B*GG0GE
AG%$GGc                 &    U[         :X  a   XAU'   gU[        :X  a  [        XU5        g[        [        R                  U5      5      e! [         a    U[        U5      :X  a  UR                  U5         gU R                  [
        La  Ub  U[        U5      :  a  [        U5      U:  ah  [        U R                  5      (       a"  UR                  U R	                  XU5      5        OUR                  U R                  5        [        U5      U:  a  Mh  UR                  U5         gU R                  [        R                  X25      5         gf = f! [        [        [        [         4 a*  nU R                  SR                  X&5      5         SnAgSnAff = f)z-
Set the element value directly on an object
NFailed to set {} due to {})r'   r   r   r[   rT   r   callabler   ELEM_NOT_FOUND_TO_ADD_MSGru   r(   r   r0   +INVALID_ACTION_WHEN_CALLING_SIMPLE_SET_ELEMr   r   r   )r|   r\   r   r   valuer   r   s          r;   _simple_set_elem_valueDelta._simple_set_elem_value  sB   	_}k %I 7"5) !L!S!STZ![\\ " ks3x'

5))38HTTWX[T\_!#ho'		22 #

499SAW+X Y #

499 5	 "#ho
 

5)**+D+K+KD+ijk  *ni@ 	_;BBCY]^^	_s]   
E A E E *E	1E 3BE	E	 E "$E	E E		E F& FFc	                 n    XxS.U R                   USS '   U" U5      nU(       a  U R                  XUX%S9  U$ )z
Coerce obj and mark it in post_process_paths_to_convert for later to be converted back.
Also reassign it to its parent to replace the old object.
old_typenew_typeNr\   r   r   r   r   )r   r   )	r|   parentr\   r^   parent_to_obj_elemparent_to_obj_actionelementsto_type	from_types	            r;   _coerce_objDelta._coerce_obj4  sP     JQ<h**8CR=9
 cl ''FVh.1 ( P
r:   c
                    [        U[        5      (       as  [        US5      (       aG  [        US5      (       a6  U[        :X  a+  UR                  " S0 Xy0D6nU(       a  U R                  XX$US9  gU R                  XXbX5[        [        S9nUS:w  aH  U R                  (       a7  [        U[        5      (       a"  [        U5      S:X  a  0 nU R                  XUXCS9  U R                  XFUXS9  g)zc
Set the element value on an object and if necessary convert the object to the proper mutable type
_fields_replacer   N)r   r   r   r2   )
rn   r   rh   r(   r   r   r   r   rS   r   )
r|   r   r   r   r\   r   r^   r   r   	new_values
             r;   _set_new_valueDelta._set_new_valueH  s    
 c5!!sI&&73
+C+CW$,,;$):;C339K;O 4 Q  &&( E ' 3 19
3(=(=#c(a-C''FVh.1 ( P##t*3 	$ 	Dr:   c                     U[         :X  a  X	 gU[        :X  a  UR                  U	 g[        [        R                  U5      5      e! [        [        [        4 a*  nU R                  SR                  X%5      5         SnAgSnAff = f)z*
Delete the element directly on an object
r   N)
r'   r(   __dict__r0   .INVALID_ACTION_WHEN_CALLING_SIMPLE_DELETE_ELEMru   r   r   r   r   )r|   r\   r   r   r   r   s         r;   _simple_delete_elemDelta._simple_delete_eleme  sw    	_}I7"LL& !O!V!VW]!^__*n5 	_;BBCY]^^	_s!   A A A B A??Bc	                     Sn	[        U[        5      (       a*  [        [        S.U R                  USS '   [        U5      nSn	U R	                  XFXxS9  U	(       a  U(       a  U R                  XUXCS9  ggg)zf
Delete the element value on an object and if necessary convert the object to the proper mutable type
Fr   Nr   T)r\   r   r   r   r   )rn   r   r   r   r   r   )
r|   r   r   r   r\   r   r^   r   r   
obj_is_news
             r;   	_del_elemDelta._del_elems  s}    
 
c5!!MQ_d@eD..x}=s)CJ  SD `& ''FVh.1 ( P !:r:   c                    [        U R                  R                  S0 5      5      nU R                  R                  S5      nU(       a9  UR                  5        VVs0 s H  u  p4US   S _M     nnnUR	                  U5        U(       a  U R                  USS9  U(       a<  UR                  5        VVs0 s H  u  p4US   US   _M     nnnU R                  USS9  g g s  snnf s  snnf )Niterable_item_addediterable_item_movednew_pathT)insertr   F)dictrC   rY   rZ   update_do_item_added)r|   r   r   kv
added_dicts         r;   r   Delta._do_iterable_item_added  s    "499==1F#KL"iimm,AB
 :M:S:S:UV:U$!!J--:UJV&&z2 3DA@S@Y@Y@[\@[!J-73@[J\
59  W ]s   C2C"c                 j    U R                   R                  S5      nU(       a  U R                  USS9  g g )Ndictionary_item_addedF)sortrC   rY   r   )r|   r   s     r;   r   Delta._do_dictionary_item_added  s2     $		.E F  5EB !r:   c                 l    U R                   R                  S5      nU(       a  U R                  U5        g g )Nattribute_addedr   )r|   r  s     r;   r   Delta._do_attribute_added  s+    ))--(9:0 r:   c                 R    [        U S   5      nU Vs/ s H  o"S   PM	     sn$ s  snf )Nr   )r$   )path_and_valuer   r   s      r;   _sort_key_for_item_addedDelta._sort_key_for_item_added  s-    $^A%67 ''h!h'''s   $c                    [        U S   SS9 Vs/ s H  o"S   PM	     nn[        US   SS9 Vs/ s H  o"S   PM	     nn X4:  a  gX4:  a  ggs  snf s  snf ! [         a    [        U5      [        U5      :  a  US[        U5       nO&[        U5      [        U5      :  a  US[        U5       n[        X45       H  u  pV[	        U5      [	        U5      :w  d  Ub  Uc  [        U5      n[        U5      n XV:  a     gXV:  a     gML  ! [         a,    [        U5      n[        U5      nXV:  a      gXV:  a      g M  f = f    gf = f)z
We use sort comparison instead of _sort_key_for_item_added when we run into comparing element types that can not
be compared with each other, such as None to None. Or integer to string.
r   Nr   r      )r$   r   r   ziptyper   )leftrightr   	left_path
right_pathl_elemr_elems          r;   _sort_comparisonDelta._sort_comparison  sO    $5T!W4#PQ#PaqT#P	Q$5eAhT$RS$Rqd$R
S	!%' RS  	!9~J/%&6s:7	Z3y>1'Y8
"%i"<<4</6>V^ [F [F!!  )  ! [F [F!  )! #=  +	!sk   AA A A BE3D8E;D EE%D;*E.D;3E7E:D;;EEc                    U(       a$   [        UR                  5       U R                  S9nOUR                  5       nU Hd  u  pEU R                  U5      nU(       a  Uu  pxppnOM'  U(       a!  U[        U5      :  a  UR                  US 5        U R                  XU
XXLX5	        Mf     g ! [         a.    [        UR                  5       [	        U R
                  5      S9n Nf = f)N)key)
sortedrZ   r  r   r   r  _get_elements_and_detailsr   r   r   )r|   rZ   r   r   r^   r   elem_and_detailsr   r   r   r   r\   r   r   s                 r;   r   Delta._do_item_added  s    Uu{{}$2O2OP KKME$OD#==dC`p]"4CW] $S/

4&<P #t6N  %  Uu{{}*T=R=R2STUs   "B' '5CCc                 l    U R                   R                  S5      nU(       a  U R                  U5        g g )Nvalues_changedrC   rY   _do_values_or_type_changed)r|   r  s     r;   r   Delta._do_values_changed  s+    '78++N; r:   c                 j    U R                   R                  S5      nU(       a  U R                  USS9  g g )Ntype_changesTis_type_changer  )r|   r!  s     r;   r   Delta._do_type_changes  s/    yy}}^4++L+N r:   c                 ^    U R                   (       a  U R                  U R                   SSS9  g g )NTF)r#  verify_changes)r   r  r   s    r;   r   Delta._do_post_process  s/    -- ++D,N,N_cty+z .r:   c                    U R                   (       a  SU R                  ;   d  SU R                  ;   aw  [        5       nU R                   R                  5        H6  u  p#[        [
        S.X'    [        U5      n[
        US.U R                  U'   M8     U(       a  U R                  USS9  g g g g ! [         a/  nU R                  [        R                  U5      5         S nAM  S nAff = f)Nr   iterable_item_removedr   Tr"  )re   rC   r   rZ   r   r   r   	Exceptionr   NOT_VALID_NUMPY_TYPEru   r   r  )r|   preprocess_pathsr^   type_r   s        r;   r   Delta._do_pre_process  s    "7499"DH_cgclclHl$w#006686@d)S &6u=E IMZ_;`2248  9  //0@QU/V   Im ! &&';'B'B1'EFs   +B++
C$5$CC$c           	          [        U5      nU H  u  p4[        U5        M     [        U5      S:  aZ  US S n[        U5      [        U5      :w  a  US   S   nUS   S   nOS nU R                  XUS9nUS   u  pU R	                  XS XWS9nOS =n=pU nUS   u  p<U[
        L a  g X(XXU4$ ! [         aS  n[        U[        5      (       a  [        U5      S:X  a  e U R                  [        R                  X5      5         S nAg S nAff = f)Nr
  r   r   )r\   r   r   )r\   r   r   r   r   r   z+traversing dunder attributes is not allowed)r$   r)   r   rz   r   r   r*  rn   rs   r   r   UNABLE_TO_GET_ITEM_MSGru   )r|   r^   r   r   _elements_subsetr   next2_elementr   r   r   r\   r   r   s                 r;   r  Delta._get_elements_and_details	  s=   !	a(.H#4  $8}q "*3B-'3x=8#+B<?L$,RLOM#'L,,^j,k;CB<8"==PT+Wd > f FJII+#B<LD i%7sZ```  	!Z((SV7d-d5<<TEF		s   BB* *
D4A	DDc                    U R                   R                  SS5      nUR                  5        H  u  pVU(       a  UR                  S5      (       a  US   OUnU R                  U5      nU(       a  Uu  pppnOMK  UR                  S[        5      nU R                  XUXS9nU[        L a  M}  U(       a,  SU;  a&   US   nU[        ;   a  [        UU5      nOU" U5      nOUS   nU R                  XUXX^UU5	        U(       d  M  U R                  UUU5        M     g ! [         aD  nU R                  [        R                  X   UR                  SS5      U5      5         S nAGM5  S nAff = f)	Nrf   Fr   	old_value)r\   r   r   r   r   r   r   unknown)rC   rY   rZ   r  r   r   r   r   r*  r   TYPE_CHANGE_FAIL_MSGru   r   r   )r|   changesr#  r&  compare_func_was_usedr^   r   
apply_pathr  r   r   r   r   r\   r   r   r   r   r   r   r   s                        r;   r   Delta._do_values_or_type_changed-  ss    $		.OQV W"==?KD
 0ES]I^I^z*eiJ#==jI`p]"4CW]!&;	!B $ G GI[bf !H !w I- +U":	$Z0H</$45F$Q	$,->$?	
 "+.	<P #t69N ~''.@BSTM +8 ! &&';'B'B39eiiXbdmNnpq'rss   8DD
E'#8E""E'c                     [        UR                  5       U R                  SS9nU H  u  p4U R                  U5      nU(       a  Uu  pgppnOM'  Sn[        n U[        :X  a  X   nOU[        :X  a  [        X5      nX:g  nU(       a=  [        U
[        5      (       a(  U R                   (       d  U R#                  XU5      nUb  UnU[        L d  Uc  M  U R%                  XxU	XX;U5        U R'                  X4U5        M     g! [         a0    [        UR                  5       [	        U R
                  5      SS9n GNf = f! [        [        [        [        4 a    Sn Nf = f)z
Handle removing items.
T)r  reverseFN)r  rZ   r  r   r   r  r  r   r'   r(   r   r   r   r   rn   r   rf   (_find_closest_iterable_element_for_indexr   r   )r|   rZ   sorted_itemr^   r   r  r   r   r   r   r\   r   r   look_for_expected_old_valuer   s                  r;   _do_item_removedDelta._do_item_removedW  sW   	e D4Q4Q[_`K )4$D#==dC`p]"4CW]*/' )3S=(+	%w&(/(:%.?.U+ +z#t/D/DTMqMqDDSPbc#(:% I-NN67K$f>##D>OP9 )4  	e Jt?T?T4U_cdK	e" j.)D 3.2+3s#   #C= (D:=6D76D7:EEc                     S n[        S5      n[        U5       H,  u  pg[        Xb-
  5      nX:  a    U$ Xs:X  d  M!  X:  d  M(  UnUnM.     U$ )Ninf)float	enumerateabs)	r|   r\   r   r   closest_elemclosest_distanceindexr   dists	            r;   r@  .Delta._find_closest_iterable_element_for_index  s^     <%cNLEu|$D&  *t/F$#'  + r:   c           	         U R                   R                  S0 5      nU(       GaP  UR                  5        GH:  u  p#/ nU R                  U5      nU(       a!  Uu  pgppnUc  U nU R                  n
Sn[
        n	OMC  U R                  XS9n
[        U
[        5      nU H  nUR                  S:X  a  UR                  UR                  5        M0  UR                  S:X  a  MB  UR                  S:X  a  UR                  UR                  5        Mo  UR                  S:X  d  M  UR                  XR                  UR                   5        M     U(       a  [        U5      n
U R                  XrUXS9  GM6  XJS S & GM=     g g )	NrX   r   r\   r   replacedeleter   equalr   )rC   rY   rZ   r  r   r(   rz   rn   r   tagextend
new_valuest1_from_indext1_to_indexr   )r|   rX   r^   opcodestransformedr  r   r   r   r   r\   r   r   is_obj_tupleopcodes                  r;   r   Delta._do_iterable_opcodes  s\    IIMM*=rB!2!8!8!: #'#A#A$#G #dtaH&8PS[a~!%"ii-3*/6,))d)F)#u5%FzzY.#**6+<+<=x/ x/#**6+<+<=w.#**3/C/CFDVDV+WX &  ,C //F^p69 0 X )FI "; r:   c                 .   U R                   R                  S0 5      nU R                   R                  S5      nU(       a8  UR                  5        VVs0 s H
  u  p4X4S   _M     nnnUR                  U5        U(       a  U R	                  U5        g g s  snnf )Nr)  r   r   )rC   rY   rZ   r   rC  )r|   r)  r   r   r   removed_dicts         r;   r   Delta._do_iterable_item_removed  s     $		.Er J"iimm,AB6I6O6O6QR6QdaAzM6QLR!((6 !!"78 ! Ss   Bc                 l    U R                   R                  S5      nU(       a  U R                  U5        g g )Ndictionary_item_removedrC   rY   rC  )r|   rb  s     r;   r   !Delta._do_dictionary_item_removed  s-    "&))--0I"J"!!"9: #r:   c                 l    U R                   R                  S5      nU(       a  U R                  U5        g g )Nattribute_removedrc  )r|   rf  s     r;   r   Delta._do_attribute_removed  s-     IIMM*=>!!"34 r:   c                 j    U R                   R                  S5      nU(       a  U R                  USS9  g g )Nset_item_addedunionfuncrC   rY   _do_set_or_frozenset_itemr|   rZ   s     r;   r   Delta._do_set_item_added  s0    		./**5w*? r:   c                 j    U R                   R                  S5      nU(       a  U R                  USS9  g g )Nset_item_removed
differencerk  rm  ro  s     r;   r   Delta._do_set_item_removed  s0    		01**5|*D r:   c           
         UR                  5        H  u  p4U R                  U5      nU(       d  M  Uu  pgppnU R                  XS X[        5       S9n
[	        X5      " U5      nU R                  XS S S9n[	        USS 5      n[        US5      (       a9  [        U5      (       a)  U" S0 X0D6nUc	  UU l        M  U R                  XsUUU	S9  M  U R                  XXUS9  M     g )N)r   r   r   r   r   r   rP  r   r   )r   r   r   r   r2   )
rZ   r  r   ri   r   rz   rh   r   r   r   )r|   rZ   rl  r^   r   r  r   r   r   r   r\   r   r   r   
set_parentrQ  
new_parents                    r;   rn  Delta._do_set_or_frozenset_item  s     ;;=KD#==dC#\lYH0SY99TPTvyv{ : }C*51I,,",NJj*d;Gz9--(72C2C$9'89
> *DI//Zl6@I] 0 _ ++JZ^x~+% )r:   c              #      #    Sn[        U5      S-
  nXV:  a^  US-  nX   nXs;   a  M  XR;   a=  UR                  U5      nXx:X  a  M2  U R                  [        R	                  XTX5      5        Uv   XV:  a  M]  gg7f)z`
A generator that gets the old values in an iterable when the order was supposed to be ignored.
r   r
  N)r   popr   $FAIL_TO_REMOVE_ITEM_IGNORE_ORDER_MSGru   )	r|   r\   remove_indexes_per_pathfixed_indexes_valuesr   old_obj_indexmax_lencurrent_old_objexpected_obj_to_deletes	            r;   _do_ignore_order_get_oldDelta._do_ignore_order_get_old  s      c(Q,%QM!0O67)@)D)D])S&"<&&'K'R'R%?U(h i!! %s   A1A75A7c           	         U R                   R                  S[        5       5      nU R                   R                  S[        5       5      n[        UR	                  5       5      [        UR	                  5       5      -  nU GH  nU R                  SR                  U5      5      nU(       a	  Uu  pgpn
  nOM6  UR                  U[        5       5      R                  5       nUR                  U[        5       5      R                  5       n[        UR                  5       5      n/ n[        U
[        5      (       a  U
R                  S:  nO[        U
5      nU R                  XXS9nU(       d  U(       a  [        U5      nUU;   a#  UR!                  U5      nUR#                  U5        O}U(       a   [%        U5      nUR#                  U5        OXU R)                  [*        R                  U5      5        UR!                  [%        [-        U5      5      5      nUR#                  U5        U(       a  M  U(       a  M  [        U
[.        5      (       a  [/        U5      nU R1                  XtUXS9  GM     g! [&         a    Sn NWf = f)	z

't1': [5, 1, 1, 1, 6],
't2': [7, 1, 1, 1, 8],

'iterable_items_added_at_indexes': {
    'root': {
        0: 7,
        4: 8
    }
},
'iterable_items_removed_at_indexes': {
    'root': {
        4: 6,
        0: 5
    }
}

iterable_items_added_at_indexes!iterable_items_removed_at_indexesz{}[0]r   )r   Fr   N)rC   rY   r   r#   keysr  ru   rw   r,   valuesrn   r   sizeboolr  r   rz  r[   nextStopIterationr   #INDEXES_NOT_FOUND_WHEN_IGNORE_ORDERiterr   r   )r|   fixed_indexesremove_indexespathsr^   r  r2  r   r   r   r\   fixed_indexes_per_pathr|  r}  new_objthere_are_old_itemsold_item_gennew_obj_indexnew_items                      r;   r   Delta._do_ignore_order  s    ( 		&GQ'JEGT=--/0:n>Q>Q>S3TTD  $==gnnT>RSQaN-S!Q%2%6%6tUW%E%J%J%L"&4&8&8uw&G&L&L&N##)*@*G*G*I#J G#z**&)hhl#&*3i#88.B 9 aL%)? #G $::599-HHNN8,(1#'#5  x0 &&'J'Q'QRh'ij599$tDZ?[:\]HNN8,! &%)?)?$ #u%%. ''FVh.5 ( TW : ) 4.3+4s   )I''I65I6c                    U R                   (       d  [        S5      eSSSSSS.n[        UR                  5       5       H	  nX!X   '   M     0 nU R                  R                  5        GH  u  pEUR                  U5      nU(       a  XSU'   M$  US:X  aL  0 X4'   UR                  5        H2  u  pxUR                  S	5      (       a  US	   OUn	US
   US   S.X4   U	'   M4     Mv  US:X  at  0 X4'   UR                  5        HZ  u  pxUR                  S	5      (       a  US	   OUn	US   US   S.X4   U	'   SU;   a  US   X4   U	   S
'   S
U;   d  MM  US
   X4   U	   S'   M\     M  US:X  a1  0 X4'   UR                  5        H  u  pxUS	   n
XxS   S.X4   U
'   M     GM'  US:X  d  GM0  0 X4'   UR                  5        H  u  p{/ X4   U'   U H  nUR                  nSSS.R                  X5      n[        UUR                  UR                  UR                  UR                  UR                  UR                  S9nX4   U   R                  U5        M     M     GM     U$ )Nz1Please recreate the delta with bidirectional=Truer)  r  rf  rr  rb  )r   r  r  ri  r   r  r   r7  r   r   r7  r!  r   r   r   r   r   )r   r   rX   r   rR  )rR  r   rT  rW  rX  t2_from_indext2_to_indexrV  
old_values)rP   rs   r   r  rC   rZ   rY   rT  r   r  r  rW  rX  r  rV  r[   )r|   SIMPLE_ACTION_TO_REVERSEr  r_diffr   inforeverse_actionr^   	path_inforeverse_pathold_pathr_   r`   rT  new_op_codes                  r;   r   Delta._get_reverse_diffH  s   !!PQQ $;/R20%>$
  05578CFI%=%BC 9  IIOO-LF599&AN)-~&++!#'+zz|OD<EMM*<U<U9Z#8[_L%.{%;)T_J`4FN<0 (4
 >)!#'+zz|OD<EMM*<U<U9Z#8[_L$-j$9yQ[G\4FN<0 #i/DMkDZ|4[A"i/DMkDZ|4[A (4 00!#'+zz|OD(4H$(W3E0FN8, (4
 ..!#&*jjlND+-FN4(#+#*;;)1XFJJ3T&, #*1*?*?(/(;(;*1*?*?(/(;(;'.'9'9'.'9'9' t,33K@ $, '3? .\ r:   c                     [        U R                  R                  R                  5      nSU;   a  U R                  U R                  US9  gUR                  U R                  5       5        g)z
Dump into file object
file_obj)r  N)ri   rN   rV   rj   rC   writedumps)r|   fileparam_names_of_serializers      r;   dump
Delta.dump  sN     %((@(@(L(L$M!22OODIIO5JJtzz|$r:   c                 8    U R                  U R                  5      $ )zh
Return the serialized representation of the object as a bytes object, instead of writing it to a file.
)rN   rC   r   s    r;   r  Delta.dumps  s     tyy))r:   c                 ,    [        U R                  5      $ rg   )r   rC   r   s    r;   to_dictDelta.to_dict  s    DIIr:   c                    / nU R                   S   R                  5        H  u  p4U H  nUR                  [        U" U5      [        UR
                     UR                  UR                  [        UR                  5      [        UR                  5      SUR                  UR                  UR                  UR                  S95        M     M     U$ )z$
Converts op_codes to FlatDeltaRows
rX   N)r^   r   r   r7  r  r   r   rW  rX  r  r  )rC   rZ   r[   r   r!   rT  rV  r  r  rW  rX  r  r  )r|   _parse_pathr]   r^   r_   r`   s         r;   _flatten_iterable_opcodesDelta._flatten_iterable_opcodes  s     "ii(;<BBDND# (.=gkkJ%00")"4"4!'"4"45!%g&8&8!9!%&-&;&;$+$7$7&-&;&;$+$7$7 $ E$ r:   c              #   L  #    UR                  5        H  u  pVU" U5      U S.nU H(  u  pn
X;   d  M  U
(       a  U
" Xh   5      Xy'   M"  Xh   Xy'   M*     U(       a:  SU;   a  SU;  a  [        US   5      US'   SU;   a  SU;  a  [        US   5      US'   [        S0 UD6v   M     g 7f)N)r^   r   r   r  r7  r   r2   )rZ   r  r   )r   r  r  keys_and_funcsreport_type_changesr^   detailsrowr  new_keyrl  s              r;   _get_flat_rowDelta._get_flat_row  s     !ZZ\MD&t,?C&4"d>'+GL'9'.| '5 #c>fC&7"&s7|"4CK#%*C*?&*3{+;&<C
O%%% *s   ,B$A2B$c                 >    S U  5       n[         R                  U5      $ )Nc              3   @   #    U  H  oR                  5       v   M     g 7frg   )_asdict).0r   s     r;   	<genexpr>(Delta._from_flat_rows.<locals>.<genexpr>  s     >~!))++~s   )rA   rv   )rH   rG   s     r;   rx   Delta._from_flat_rows  s    >~>%%n55r:   c                 >   0 nSSS.nU  GH  nSnUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S	[        5      n	U(       d  [        S
5      eUc  [        S5      eXR;   a  X%   nUR                  5       nU[        R
                  [        R                  1;   a	  S[        4n
OS[        4n
[        U[        5      (       a  UnO	[        XjS9nU(       a  X:w  a
  [        XS9nOSnXQ;  a  0 X'   US;   a  XU   ;  a  0 X   U'   XqU   U   U'   GOIU[        R                  [        R                  1;   a/  XU   ;  a  [        5       X   U'   X   U   R                  U5        GOU[        R                   [        R"                  [        R                  [        R
                  [        R$                  [        R&                  1;   a	  XqU   U'   GOUS:X  a   U	[        :X  a  SU0X   U'   GOrXyS.X   U'   GOgUS:X  aa  UR                  S[        5      nUR                  S[        5      nSU0X   U'   SU4SU4S	U	44 H  u  pU[        :w  d  M  XU   U   U'   M     GO U[        R(                  :X  a
  SU0X   U'   OU[        R*                  [        R,                  [        R.                  [        R0                  1;   a  SU;  a  0 US'   XS   ;  a  / US   U'   US   U   R3                  [5        [6        U   UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S	5      S95        U(       d  GM  XU   U   S'   GM     U$ )z8
Create the delta's diff object from the flat_dict_list
r  r  )unordered_iterable_item_addedunordered_iterable_item_removedNr   r^   r   r   r7  z'Flat dict need to include the 'action'.z%Flat dict need to include the 'path'.r   r   >   r  r  r  r   r  r!  r  r   r   rX   rW  rX  r  r  r  )rY   r   rs   rz  r    r  rf  r(   r'   rn   r   r+   ri  rr  ri   addr   rb  r   r)  r   iterable_items_insertediterable_items_deletediterable_items_replacediterable_items_equalr[   r   r"   )rG   r]   FLATTENING_NEW_ACTION_MAP	flat_dictrL  r   r^   r   r   r7  r   r   r-  r   r   
elem_values                   r;   rv   Delta._from_flat_dicts  s   
 -N/R%
! (IE]]8,F==(DMM'*E }}Z0H!k?CI !JKK| !HII22:
..00  !'0 &}$$$)$JH,)(N#!#   &>1/1FN8,27vx(/--//  &>1/2uFN8,x(,,U3446600..2244  ,1vx(++/0;U/CFN8,=B/[FN8,>)!fo>$==_E,7+?x('* ),)$D
 "_49Cvx06) >===,3U+;x(66556633	  'f424F./*=#>><>F./9*+H5<<:6B&/mmO&D$-MM-$@&/mmO&D$-MM-$@#,==#9#,==#=
 x7?vx(4 (B r:   returnc                     [        [        [           U R                  XS9 Vs/ s H  o3R	                  5       PM     sn5      $ s  snf )a|  
Returns a flat list of actions that is easily machine readable.

For example:
    {'iterable_item_added': {'root[3]': 5, 'root[2]': 3}}

Becomes:
    [
        {'path': [3], 'value': 5, 'action': 'iterable_item_added'},
        {'path': [2], 'value': 3, 'action': 'iterable_item_added'},
    ]


**Parameters**

include_action_in_path : Boolean, default=False
    When False, we translate DeepDiff's paths like root[3].attribute1 into a [3, 'attribute1'].
    When True, we include the action to retrieve the item in the path: [(3, 'GET'), ('attribute1', 'GETATTR')]
    Note that the "action" here is the different than the action reported by to_flat_dicts. The action here is just about the "path" output.

report_type_changes : Boolean, default=True
    If False, we don't report the type change. Instead we report the value change.

Example:
    t1 = {"a": None}
    t2 = {"a": 1}

    dump = Delta(DeepDiff(t1, t2)).dumps()
    delta = Delta(dump)
    assert t2 == delta + t1

    flat_result = delta.to_flat_dicts()
    flat_expected = [{'path': ['a'], 'action': 'type_changes', 'value': 1, 'new_type': int, 'old_type': type(None)}]
    assert flat_expected == flat_result

    flat_result2 = delta.to_flat_dicts(report_type_changes=False)
    flat_expected2 = [{'path': ['a'], 'action': 'values_changed', 'value': 1}]

**List of actions**

Here are the list of actions that the flat dictionary can return.
    iterable_item_added
    iterable_item_removed
    iterable_item_moved
    values_changed
    type_changes
    set_item_added
    set_item_removed
    dictionary_item_added
    dictionary_item_removed
    attribute_added
    attribute_removed
)include_action_in_pathr  )r   r   r   to_flat_rowsr  )r|   r  r  r   s       r;   to_flat_dictsDelta.to_flat_dicts<  sR    l D'!%!2!2J`!2  "K*
 "KAIIK  "K*
  	 *
s   A
c                    / nU(       a  [        [        SS9nO[        nU(       a  SSSSSSSU4/nO%U R                  (       d  [        S	5      eSSSSSU4/nS
SS.nU R                  R                  5        GH\  u  pxUS:X  a   UR                  U R                  US95        M,  UR                  S5      (       a  MD  Xv;   a  Xg   n	UR                  5        H  u  pU" U
5      n
UR                  5        Hx  u  pU
R                  5       nU(       a  UR                  US45        OUR                  U5        U(       a  [        XU	[        U5      S9nO
[        XU	S9nUR                  U5        Mz     M     M  US;   ae  UR                  5        HN  u  n
nU" U
5      n
U H:  nU(       a  [        XU[        U5      S9nO
[        XUS9nUR                  U5        M<     MP     GMg  US:X  Ga%  UR                  5        GH  u  pU" U
5      n
[        U[        5      (       a:  [        U5      S:X  a+  [!        [#        U5      5      nU
R                  U5        UU   nOy[        U[$        [&        45      (       a(  [        U5      S:X  a  US   nU
R                  S5        SnO6[        U[(        5      (       a!  [        U5      S:X  a  UR+                  5       nSnU(       a  [        XU[        U5      S9nO
[        XUS9nUR                  U5        GM     GM  US;   a[  UR                  5        HD  u  pU" U
5      n
U(       a  [        XU[        U5      S9nO
[        XUS9nUR                  U5        MF     GM  US:X  a7  U(       d  SnU R-                  UUUUUS9 H  nUR                  U5        M     GM1  U R-                  UUUUUS9 H  nUR                  U5        M     GM_     U$ )z?
Just like to_flat_dicts but returns FlatDeltaRow Named Tuples
T)include_actions)r   r   N)r   r   N)r7  r7  N)r   r  N)r   r   Nr   zWhen converting to flat dictionaries, if report_type_changes=False and there are type changes, you must set the always_include_values=True at the delta object creation. Otherwise there is nothing to include.r  r  )r  r  rX   )r  r2  r'   )r^   r   r   r  )r^   r   r   >   ri  rr  r   r
  r   r   ri  >   r  rf  r   r)  rb  r!  r  )r   r  r  r  r  )r   r*   rQ   rs   rC   rZ   rU  r  
startswithrw   r[   r   r  rn   r   r   r  r  r   r   ri   rz  r  )r|   r  r  r]   r  r  r  r   r  
new_actionr^   index_to_valuerL  r   path2r  r  r  s                     r;   r  Delta.to_flat_rowsv  s    !!*dCK$K(,0*.Z5N -- G 
 ),0Z5	N 0O1R%
! !IIOO-LF,,d<<<UV  %%26>
,0JJL(D&t,D(6(<(<(> $		1!LL%8!LL/.".Ez`dej`k"lC".Ez"ZCc* )? -9 AA$(JJLLD&&t,D!'.".Df[_`e[f"gC".Df"UCc* "( %1 22#'::<KD&t,D!%..3u:?"&tE{"3G, %g#ED%=99c%jAo %aA!6#E3//CJ!O %		!1**&W[\aWbc*&QMM#&# $0$    $(::<KD&t,D**&W[\aWbc*&QMM#& $0 >)*-F--! +#1(; . C MM#&  --! +#1(; . C MM#&S .b r:   )rf   re   rk   rQ   rP   rI   rC   rT   rS   rz   rJ   rK   r   rL   r   rN   )error)NNNN)NNN)NN)TF)FT)T)Jr4   r5   r6   r7   docr8   r   r   r   r   r   r   r   bytesr	   r   r   r   r   r   r   r  r   r
   r   r   r{   r   __radd__r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr  r  r   r   r   r   r   r  r  rC  r@  r   r   r   r   r   r   rn  r  r   r   r  r  r  r  r  rx   rv   r   r  r  r9   r2   r:   r;   rA   rA   B   s   G :>"&!%#'-159* +/((,!$)7;'aHgsE478a SMa RL	a
 TNa !d,a !l!34a a a a a !S*a a "$a a   $!a" )1#a$ %a& 'aFJ5< H"\ 1!f_6(D:_P$:$C
1
 ( ( % %PN4<
O
{W"aH(UT&QP
')^
9;
5
@
E
@*"(CTJ>@%*2 & &  6\(: 6 6 j jX8W[\iWj 8ttVZ[gVh t tr:   rA   __main__)Prw   loggingtypingr   r   r   r   r   r   r	   r
   r   	functoolsr   r   collections.abcr   r   deepdiffr   deepdiff.serializationr   r   deepdiff.helperr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   deepdiff.pathr$   r%   r&   r'   r(   r)   r*   r+   deepdiff.anysetr,   deepdiff.summarizer-   	getLoggerr4   rl   r   r   r9  r   r{  r   rt   ry   r   r   r   r1  r   r  r.   r+  r  rs   r0   r>   rA   doctesttestmodr2   r:   r;   <module>r     s     L L L ) #   ;       # (			8	$ N [ V a 'n $ " {  q 'm $.h +1k .; 7  'M #6 k	 		j 	h hV% zOO r:   