2323from deepdiff .helper import (strings , bytes_type , numbers , ListItemRemovedOrAdded , notpresent ,
2424 IndexedHash , Verbose , unprocessed , json_convertor_default , add_to_frozen_set ,
2525 convert_item_or_items_into_set_else_none , get_type ,
26- convert_item_or_items_into_compiled_regexes_else_none , current_dir )
26+ convert_item_or_items_into_compiled_regexes_else_none , current_dir ,
27+ type_is_subclass_of_type_group , type_in_type_group )
2728from deepdiff .model import RemapDict , ResultDict , TextResult , TreeResult , DiffLevel
2829from deepdiff .model import DictRelationship , AttributeRelationship
2930from deepdiff .model import SubscriptableIterableRelationship , NonSubscriptableIterableRelationship , SetRelationship
@@ -56,6 +57,7 @@ def __init__(self,
5657 ignore_string_type_changes = False ,
5758 ignore_numeric_type_changes = False ,
5859 ignore_type_subclasses = False ,
60+ ignore_string_case = False ,
5961 verbose_level = 1 ,
6062 view = TEXT_VIEW ,
6163 hasher = None ,
@@ -70,8 +72,10 @@ def __init__(self,
7072
7173 self .ignore_order = ignore_order
7274 self .ignore_type_in_groups = self .get_ignore_types_in_groups (
73- ignore_type_in_groups ,
74- ignore_string_type_changes , ignore_numeric_type_changes )
75+ ignore_type_in_groups = ignore_type_in_groups ,
76+ ignore_string_type_changes = ignore_string_type_changes ,
77+ ignore_numeric_type_changes = ignore_numeric_type_changes ,
78+ ignore_type_subclasses = ignore_type_subclasses )
7579 self .report_repetition = report_repetition
7680 self .exclude_paths = convert_item_or_items_into_set_else_none (exclude_paths )
7781 self .exclude_regex_paths = convert_item_or_items_into_compiled_regexes_else_none (exclude_regex_paths )
@@ -80,6 +84,8 @@ def __init__(self,
8084 self .ignore_string_type_changes = ignore_string_type_changes
8185 self .ignore_numeric_type_changes = ignore_numeric_type_changes
8286 self .ignore_type_subclasses = ignore_type_subclasses
87+ self .type_check_func = type_is_subclass_of_type_group if ignore_type_subclasses else type_in_type_group
88+ self .ignore_string_case = ignore_string_case
8389 self .hashes = {}
8490 self .hasher = hasher
8591
@@ -385,6 +391,10 @@ def __diff_iterable(self, level, parents_ids=frozenset({})):
385391
386392 def __diff_str (self , level ):
387393 """Compare strings"""
394+ if self .ignore_string_case :
395+ level .t1 = level .t1 .lower ()
396+ level .t2 = level .t2 .lower ()
397+
388398 if type (level .t1 ) == type (level .t2 ) and level .t1 == level .t2 :
389399 return
390400
@@ -409,12 +419,12 @@ def __diff_str(self, level):
409419 return
410420
411421 if do_diff :
412- if u '\n ' in t1_str or u '\n ' in t2_str :
422+ if '\n ' in t1_str or '\n ' in t2_str :
413423 diff = difflib .unified_diff (
414424 t1_str .splitlines (), t2_str .splitlines (), lineterm = '' )
415425 diff = list (diff )
416426 if diff :
417- level .additional ['diff' ] = u '\n ' .join (diff )
427+ level .additional ['diff' ] = '\n ' .join (diff )
418428
419429 self .__report_result ('values_changed' , level )
420430
@@ -453,6 +463,8 @@ def __create_hashtable(self, t, level):
453463 ignore_string_type_changes = self .ignore_string_type_changes ,
454464 ignore_numeric_type_changes = self .ignore_numeric_type_changes ,
455465 ignore_type_in_groups = self .ignore_type_in_groups ,
466+ ignore_type_subclasses = self .ignore_type_subclasses ,
467+ ignore_string_case = self .ignore_string_case
456468 )
457469 item_hash = hashes_all [item ]
458470 except Exception as e : # pragma: no cover
@@ -582,7 +594,7 @@ def __diff(self, level, parents_ids=frozenset({})):
582594 if get_type (level .t1 ) != get_type (level .t2 ):
583595 report_type_change = True
584596 for type_group in self .ignore_type_in_groups :
585- if get_type (level .t1 ) in type_group and get_type (level .t2 ) in type_group :
597+ if self . type_check_func (level .t1 , type_group ) and self . type_check_func (level .t2 , type_group ) :
586598 report_type_change = False
587599 break
588600 if report_type_change :
0 commit comments