
    :QgW                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
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mZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" d dl#m$Z$ 	 d dl%Z%	 d dl'Z' ejP                  e)      Z* e+       Z, e-       Z.d
Z/dZ0d Z1d Z2e1Z3d Z4 G d de      Z5	 	 	 	 ddZ6 ed      Z7 G d de$      Z8e)dk(  rd dl9Z9 e9jt                          yy# e&$ r d	Z%Y w xY w# e&$ r d	Z'Y w xY w)    N)IterableMutableMapping)defaultdict)sha1sha256)Path)Enum)stringsnumberstimesunprocessed
not_hashedadd_to_frozen_set(convert_item_or_items_into_set_else_noneget_doc5convert_item_or_items_into_compiled_regexes_else_noneget_idtype_is_subclass_of_type_grouptype_in_type_groupnumber_to_stringdatetime_normalizeKEY_TO_VAL_STR
short_reprget_truncate_datetimedict_add_root_to_paths)BaseF)z[%s]z.%sz"{} is not one of the hashed items.c                 v    t        | t              r| j                  d      } t        |       j	                         S )z#Use Sha256 as a cryptographic hash.utf-8)
isinstancestrencoder   	hexdigestobjs    N/var/www/html/answerous/venv/lib/python3.12/site-packages/deepdiff/deephash.py	sha256hexr'   (   s-    #sjj!#;  ""    c                 v    t        | t              r| j                  d      } t        |       j	                         S )z!Use Sha1 as a cryptographic hash.r   )r    r!   r"   r   r#   r$   s    r&   sha1hexr*   /   s-    #sjj!9  r(   c           
          t        |t              r|j                  d      }d}| D ]?  }|dj                  t	        t
        t        |                  dz   j                  d      z  }A |t        t        |            z   S )z
    Combines lists of hashes into one hash
    This can be optimized in future.
    It needs to work with both murmur3 hashes (int) and sha256 (str)
    Although murmur3 is not used anymore.
    r   r(    z--)	r    bytesdecodejoinmapr!   sortedr"   default_hasher)itemsprefixhashes_bytesitems       r&   combine_hashes_listsr7   9   sy     &% w'L Q 	S&,!784?GGPPQ C|4555r(   c                       e Zd ZdZdZy)BoolObj   r   N)__name__
__module____qualname__TRUEFALSE r(   r&   r9   r9   J   s    DEr(   r9   c                    | j                   j                  }|rdnd}t        | t              rd}|dgn|}d}|D ]  }		 | j	                  |	|      } d} n |s| j	                  dd      }t        |j                  dz
  d	      }d
}|d	kD  rd}|j                  dz   }d}|t        |       k\  rt        |       }d
}t        |j                  |j                  |j                  |j                  |j                   d| |||  | d      d|st        j                  ||       } |r| j                         } | S # t
        $ r}
|
}Y d}
~
d}
~
ww xY w)z 
    Clean type conversions
    ignorestrictNr   F)errorsT   r   r,   z...z in 'zf'. Please either pass ignore_encoding_errors=True or pass the encoding via encodings=['utf-8', '...'].)	__class__r;   r    r-   r.   UnicodeDecodeErrormaxstartendlenencodingobjectreasonr   formatlower)r%   ignore_string_type_changesignore_string_case	encodingsignore_encoding_errorsoriginal_typeerrors_modeerrencodedrL   erobj_decodedrI   start_prefixrJ   
end_suffixs                   r&   prepare_string_for_hashingr]   O   sn    MM**M4((K#u!*!2WI		! 	Hjj+j>		 **WX*>K		B*ELqy$''B,CJc#h#h
$

		::,eL>+eC2H1I*  V|  }  &##M37iikJ1 & s   D44	E
=EE
zdeephash_doc.rstc                      e Zd ZeZddddddddddddddddddddddddddZeZeZddZe	d d	       Z
d
 Zd!dZe	d"d       ZddZd ZeZd ZeZd Zd Zd Zd ZedfdZd ZeddfdZefdZd Zd Zd Zd Zd Z d Z!efdZ"y)#DeepHashNTfFroot)hashesexclude_typesexclude_pathsinclude_pathsexclude_regex_pathshasherignore_repetitionsignificant_digitstruncate_datetimenumber_format_notation
apply_hashignore_type_in_groupsrQ   ignore_numeric_type_changesignore_type_subclassesrR   use_enum_valueexclude_obj_callbacknumber_to_string_funcignore_private_variablesparentrS   rT   ignore_iterable_orderc          	      v   |r+t        ddj                  |j                               z        t        |t              r|| _        n1t        |t              r|j
                  | _        nt               | _        |
t               n
t        |      }t        |      | _
        || _        t        t        |            | _        t        t        |            | _        t!        |      | _        |t$        n|| _        g | j
                  t(        <   || _        | j-                  |	|      | _        t1        |
      | _        || _        | j7                  ||||      | _        || _        || _        || _        || _         || _!        |rtD        ntF        | _$        |xs tJ        | _%        || _&        || _'        || _(        || _)        | jU                  ||tW        tY        |      h             | j
                  t(           r6tZ        j]                  dj_                  | j
                  t(                        y | j
                  t(        = y )Na  The following parameter(s) are not valid: %s
The valid parameters are obj, hashes, exclude_types, significant_digits, truncate_datetime,exclude_paths, include_paths, exclude_regex_paths, hasher, ignore_repetition, number_format_notation, apply_hash, ignore_type_in_groups, ignore_string_type_changes, ignore_numeric_type_changes, ignore_type_subclasses, ignore_string_case number_to_string_func, ignore_private_variables, parent, use_enum_value encodings, ignore_encoding_errorsz, )rm   rQ   rn   ro   rt   parents_idsz%Can not hash the following items: {}.)0
ValueErrorr/   keysr    r   rb   r_   r   settupleexclude_types_tuplerh   r   r   rd   re   r   rf   r2   rg   UNPROCESSED_KEYrp   get_significant_digitsri   r   rj   rk   get_ignore_types_in_groupsrm   rQ   rn   rR   rq   rl   r   r   type_check_funcr   rs   rS   rT   ru   _hash	frozensetr   loggerwarningrO   )selfr%   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rQ   rn   ro   rR   rp   rq   rr   rs   rt   rS   rT   ru   kwargss                              r&   __init__zDeepHash.__init__   s   8 5 9=		&++-8PQR R fn- DK) --DK'DK!.!6C<N#(#7 !2./WXe/fg./WXe/fg#XYl#m (.nF')O$,"&"="=>PRm"n!67H!I&<#%)%D%D"7'A(C#9	 &E &;"
 +E'+F("4$8! %5K1Qo 5 I9I(@%"&<#%:"

3v9fSk]3K
L;;'NNBII$++VeJfghO,r(   c                 T    | j                  | j                  ||| j                        S )Nextract_indexrp   )_getitemrb   rp   )r   r%   r   s      r&   __getitem__zDeepHash.__getitem__   s$    }}T[[#][_[n[n}oor(   c                 r   |}|du rt         j                  }n3|du rt         j                  }n|rt        |t              r|j
                  }d}	 | |   }|t        u rd}||S ||   S # t        t        f$ rA t        |      }	 | |   }n,# t        $ r  t        t        j                  |            dw xY wY bw xY w)z
        extract_index is zero for hash and 1 for count and None to get them both.
        To keep it backward compatible, we only get the hash by default so it is set to zero by default.
        TFNr   N)r9   r>   r?   r    r	   value	TypeErrorKeyErrorr   HASH_LOOKUP_ERR_MSGrO   r~   )rb   r%   r   rp   keyresult_n_counts         r&   r   zDeepHash._getitem   s     $;,,CE\--C
3 5))C"	J#C[N /! M!.!6~YN=<YY 8$ 	J+CJ!' J299#>?TIJ 	Js*   A& &B6BB6)B00B65B6c                     d}	 || j                   v }|st        |      | j                   v }|S # t        t        f$ r d}Y .w xY w)NF)rb   r   r   r   )r   r%   results      r&   __contains__zDeepHash.__contains__   sQ    	DKK'F C[DKK/F	 8$ 	F	s   - A Ac                 @    | j                  | j                  |||      S )z
        Get method for the hashes dictionary.
        It can extract the hash for a given key that is already calculated when extract_index=0
        or the count of items that went to building the object whenextract_index=1.
        )defaultr   )get_keyrb   )r   r   r   r   s       r&   getzDeepHash.get	  s     ||DKKg]|[[r(   c                 ^    	 t         j                  | |||      }|S # t        $ r |}Y |S w xY w)z
        get_key method for the hashes dictionary.
        It can extract the hash for a given key that is already calculated when extract_index=0
        or the count of items that went to building the object whenextract_index=1.
        r   )r_   r   r   )rb   r   r   r   rp   r   s         r&   r   zDeepHash.get_key  sC    	&&vs-`n&oF   	F	s    ,,c                     t               }| j                  j                         D ]  \  }}|t        u r|||<   ||   ||<    |S )z
        A dictionary containing only the objects to hashes,
        or a dictionary of objects to the count of items that went to build them.
        extract_index=0 for hashes and extract_index=1 for counts.
        )r   rb   r3   r~   )r   r   r   r   r   s        r&   _get_objects_to_hashes_dictz$DeepHash._get_objects_to_hashes_dict  sQ     ++++- 	3JCo%#s#M2s		3
 r(   c                 z    t        |t              r| j                  |j                  k(  S | j                         |k(  S N)r    r_   rb   r   )r   others     r&   __eq__zDeepHash.__eq__,  s5    eX&;;%,,.. 335>>r(   c                 <    t        | j                  d      d      S )zn
        Hide the counts since it will be confusing to see them when they are hidden everywhere else.
        r   )r   i  )
max_length)r   r   r   s    r&   __repr__zDeepHash.__repr__5  s      $:::KX[\\r(   c                 ,    t        | j                        S r   )boolrb   r   s    r&   __bool__zDeepHash.__bool__=  s    DKK  r(   c                 6    | j                   j                         S r   )rb   rz   r   s    r&   rz   zDeepHash.keys@  s    {{!!r(   c                 D    d | j                   j                         D        S )Nc              3   &   K   | ]	  }|d      ywr   Nr@   ).0is     r&   	<genexpr>z"DeepHash.values.<locals>.<genexpr>D  s     3!3s   )rb   valuesr   s    r&   r   zDeepHash.valuesC  s    3dkk00233r(   c                 D    d | j                   j                         D        S )Nc              3   0   K   | ]  \  }}||d    f  ywr   r@   )r   r   vs      r&   r   z!DeepHash.items.<locals>.<genexpr>G  s     :daAaD	:s   )rb   r3   r   s    r&   r3   zDeepHash.itemsF  s    :dkk&7&7&9::r(   c                 
   t        |t              st        |      n|}g }|r|j                  d        n|j                  d        t        |d      r|j                  d        n|j                  d        |D ]  }	  ||      } n+ | j
                  t           j                  |       t        dfS |}| j                  |||d|      \  }	}
|rd	j                  |	      nd
j                  |	      }	|	|
fS # t        $ r Y w xY w)zprepping objectsc                 "    | j                         S r   )_asdictos    r&   <lambda>z$DeepHash._prep_obj.<locals>.<lambda>O  s    AIIK r(   c                     | j                   S r   )__dict__r   s    r&   r   z$DeepHash._prep_obj.<locals>.<lambda>Q  s
    AJJ r(   	__slots__c                 V    | j                   D ci c]  }|t        | |       c}S c c}w r   )r   getattr)r   r   s     r&   r   z$DeepHash._prep_obj.<locals>.<lambda>T  s#    q{{4[!Q15E4[ 4[s   &c                 B    t        t        j                  | d             S )Nc                 .    t        j                  |        S r   )inspect	isroutine)ms    r&   r   z6DeepHash._prep_obj.<locals>.<lambda>.<locals>.<lambda>V  s    ]d]n]nop]qYq r(   )dictr   
getmembersr   s    r&   r   z$DeepHash._prep_obj.<locals>.<lambda>V  s    D9K9KAOq9r4s r(   r   T)rt   rx   print_as_attributerU   znt{}zobj{})
r    typeappendhasattrAttributeErrorrb   r~   r   
_prep_dictrO   )r   r%   rt   rx   is_namedtuplerU   obj_to_dict_strategiesget_dictdr   countss              r&   	_prep_objzDeepHash._prep_objI  s   )3C)>S	C!#"))*?@"))*>?3$"))*[\"))*st. 	$HSM	$ KK(//4##V<@P] ) _*7v&W^^F=Sv~ " s   >C66	DDc                    d}| j                   r|| j                   v rd}| j                  r>|dk7  r9|| j                  vr)d}| j                  D ]  }|j                  |      sd} |S  |S | j                  r6t	        | j                  D cg c]  }|j                  |       c}      rd}|S | j                  rt        || j                        rd}|S | j                  r| j                  ||      rd}|S c c}w )NFTra   )	rd   re   
startswithrf   anysearchr}   r    rq   )r   r%   rt   skipr4   exclude_regex_paths         r&   
_skip_thiszDeepHash._skip_thish  s   &D,>,>">D&F"2T///"00 F((0$   %%#MQMeMef7I#**62f+hD
 	 %%*S$:R:R*SD  &&4+D+DS&+QD gs   C3c                 X   g }d}dj                  t        |         }|j                         D ]  \  }	}
|dz  }| j                  r"t	        |	t
              r|	j                  d      r9|st	        |	t              rd|	z  n|	}|||fz  }| j                  |	||      \  }}|sst        |
      }|r||v s| j                  |
|      rt        ||      }| j                  |
||      \  }}t        j                   ||      }|j                  |       ||z  } |j                          dj                  |      }|r]|xs t!        |      }|j"                  }| j$                  D ]2  }| j'                  ||      sdj                  t)        d	 |            } n nd
}dj                  ||      |fS )Nr:   z%s{}__z'%s'rw   rt   ;,c                     | j                   S r   )r;   )xs    r&   r   z%DeepHash._prep_dict.<locals>.<lambda>  s
    ajj r(   r   z	{}:{{{}}})rO   INDEX_VS_ATTRIBUTEr3   rs   r    r!   r   r
   r   r   r   r   r   r   sortr/   r   r;   rm   r   r0   )r   r%   rt   rx   r   rU   r   r   key_textr   r6   key_formattedkey_in_reportkey_hash_item_idparents_ids_addedhashedcounttype_type_str
type_groups                         r&   r   zDeepHash._prep_dict|  s   ==!34F!GH 	ICaKF,,C1E#..Y]J^0BzRUW^G_FSLehM$'>>M**SK*XKHaTlG; 64??4Xe?;f 1+w G JJtMO`JaMFE#**8V<FMM&!eOF%	( 	&!!.T#YE~~H"88 
''z:"xx,@*(MNH
 H!!(F3V;;r(   c                    d}t        t              }t        |      D ]r  \  }}dj                  ||      }| j	                  ||      r,t        |      }	|r|	|v r>t        ||	      }
| j                  |||
      \  }}||xx   dz  cc<   ||z  }t | j                  rt        |j                               }n2|j                         D cg c]  \  }}dj                  ||       }}}t        t        |      }| j                  rt        |      }dj!                  |      }t#        j                  t%        |      j&                  |      }||fS c c}}w )Nr:   z{}[{}]r   rw   z{}|{}r   )r   int	enumeraterO   r   r   r   r   rh   listrz   r3   r0   r!   ru   r1   r/   r   r   r;   )r   r%   rt   rx   r   r   r   r6   
new_parentr   r   r   r   r   s                 r&   _prep_iterablezDeepHash._prep_iterable  sC   S! ~ 	GAt!3JtJ7TlGw+5 1+w G JJtJL]J^MFE6NaNeOF	 !!&++-(F 28)-Aq!$F  S&!%%F^F&!&&tCy'9'96Bv~s   Ec                 F    |rt         j                  S t         j                  S r   )r9   r>   r?   )r   r%   s     r&   
_prep_boolzDeepHash._prep_bool  s    "w||55r(   c                 Z    |j                   j                  }t        j                  ||      S r   )rF   r;   r   rO   r   r%   r   s      r&   
_prep_pathzDeepHash._prep_path  s$    &&$$UC00r(   c                     | j                   rdn|j                  j                  }| j                  (| j	                  || j                  | j
                        }t        j                  ||      S )Nnumber)ri   rk   )rn   rF   r;   ri   r   rk   r   rO   r   s      r&   _prep_numberzDeepHash._prep_number  sc     <<#--BXBX"".''@W@W?C?Z?Z ( \C$$UC00r(   c                 ^    d}t        | j                  |      }t        j                  ||      S Ndatetime)r   rj   r   rO   r   s      r&   _prep_datetimezDeepHash._prep_datetime  s,     !7!7=$$UC00r(   c                 2    d}t        j                  ||      S r   )r   rO   r   s      r&   
_prep_datezDeepHash._prep_date  s    $$UC00r(   c                     	 |j                    | j                  |||d      \  }}||fS # t        $ r | j                  |||      \  }}Y ||fS w xY w)NT)rx   r   r%   rt   rx   )r   r   r   r   )r   r%   rt   rx   r   r   s         r&   _prep_tuplezDeepHash._prep_tuple  sq    	fKK "^^C[`d^eNFFv~  	b!00SU`0aNFF v~	bs   *  AAc                 0   d}t        t              r| j                        d}n/| j                  rt        t              rj
                  nt        }	 | j                     \  }}||fS # t        t        f$ r Y nw xY w| j                  |      ryd}n2t        t              r:t        | j                  | j                  | j                  | j                         }nt        t"              r| j%                        }nt        t&              r| j)                        }nt        t*        j,                        r| j/                        }nut        t0              r| j3                        }nRt        t4              r| j7                  ||      \  }}n)t        t8              r| j;                  ||      \  }}n t<        r<t        t<        j>                        r"fd}| jA                   |       ||      \  }}ntB        r<t        tB        j>                        r"fd}| jA                   |       ||      \  }}n|t        tD              r| jA                  ||      \  }}nTtF        jH                  k(  stF        jJ                  k(  rtF        jH                  u rd	nd
}n| jM                  ||      \  }}|t        u r#| j                  tN           jQ                         n[|tR        u rnR| jT                  rFt        t              r|}n"t        || j                  | j                        }| jW                  |      }	 ||f| j                  <   ||fS # t        $ r" tY              }||f| j                  |<   Y ||fS w xY w)zThe main hash methodr:   Nr   NONE)rQ   rR   rS   rT   r  c               3      K   d j                   f d j                  f  j                         E d {    y 7 w)Ndtypeindex)dtypesr  r3   r$   s   r&   genzDeepHash._hash.<locals>.gen  s4     

++		**99;&&s   4?=?c               3      K    j                   E d {    t         j                  j                               E d {     j	                         E d {    y 7 H7 7 	wr   )columnsr   schemar3   rowsr$   s   r&   r  zDeepHash._hash.<locals>.gen%  sK     ;;&&

 0 0 233388:%% '3%s1   A"A*A"AA"A A"A" A"z	bool:truez
bool:false)rQ   rR   )-r    r   r   rp   r	   r   r   rb   r   r   r   r
   r]   rQ   rR   rS   rT   r   r   r   r  r   dater  r   r   r   r   r|   r  pandas	DataFramer   polarsr   r9   r>   r?   r   r~   r   r   rl   rg   r   )	r   r%   rt   rx   r   r   r  result_cleanedobj_ids	    `       r&   r   zDeepHash._hash  s*   c4 //#&CF  ZT%:))CF	"![[-NFF 6>! 8$ 		
 ??3'[FW%/+/+J+J#'#:#:..'+'B'BF T"__S)FU#((-FX]]+__S)FW%&&s+F^,!__VQ\_]NFFU#!--#fR]-^NFFC)9)9:' "00SU6Wb0cNFFC)9)9:& "00SU6Wb0cNFFX&!00SU`0aNFFGLL C7==$8$'7<<$7[\F!^^FP[^\NFFZKK(//4{"__#w'!'!;t7V7V'+'>'>"@ [[0F
	3 &/DKK
 v~	  	3C[F#)6"2DKKv~		3s$   A. .B ?B M* *%NN)r   )r   Fr   )Nr   F)#r;   r<   r=   doc__doc__r   r'   r*   r   staticmethodr   r   r   r   r   r   __req__r   __str__r   rz   r   r3   EMPTY_FROZENSETr   r   r   r   r   r   r   r  r  r  r   r@   r(   r&   r_   r_      s+   G
 ###%)#'$(#'(+ '+,1-2(-$) %&*'+*.(-'+5R-h IGp Z Z<\ 
 
? G] G!"4; 2APU >( 3BV[ko %<N 7F !F6111
1 .= `r(   r_   __main__)FFNF);r   loggingr   collections.abcr   r   collectionsr   hashlibr   r   pathlibr   enumr	   deepdiff.helperr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   deepdiff.baser   r  ImportErrorr  	getLoggerr;   r   rM   r~   r   r  r   r   r'   r*   r2   r7   r9   r]   r  r_   doctesttestmodr@   r(   r&   <module>r+     s"      4 #    N N N N N N  
		8	$(+$  ; #! 6"d  $) $.b  !Ht HV zGOO u  F
  Fs$    C %C' C$#C$'C10C1