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
@@ -55,6 +56,8 @@ def __init__(self,
5556 ignore_type_in_groups = None ,
5657 ignore_string_type_changes = False ,
5758 ignore_numeric_type_changes = False ,
59+ ignore_type_subclasses = False ,
60+ ignore_string_case = False ,
5861 verbose_level = 1 ,
5962 view = TEXT_VIEW ,
6063 hasher = None ,
@@ -64,20 +67,25 @@ def __init__(self,
6467 "The following parameter(s) are not valid: %s\n "
6568 "The valid parameters are ignore_order, report_repetition, significant_digits, "
6669 "exclude_paths, exclude_types, exclude_regex_paths, ignore_type_in_groups, "
67- "ignore_string_type_changes, ignore_numeric_type_changes, verbose_level, view , "
68- "and hasher." ) % ', ' .join (kwargs .keys ()))
70+ "ignore_string_type_changes, ignore_numeric_type_changes, ignore_type_subclasses , "
71+ "verbose_level, view, and hasher." ) % ', ' .join (kwargs .keys ()))
6972
7073 self .ignore_order = ignore_order
7174 self .ignore_type_in_groups = self .get_ignore_types_in_groups (
72- ignore_type_in_groups ,
73- 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 )
7479 self .report_repetition = report_repetition
7580 self .exclude_paths = convert_item_or_items_into_set_else_none (exclude_paths )
7681 self .exclude_regex_paths = convert_item_or_items_into_compiled_regexes_else_none (exclude_regex_paths )
7782 self .exclude_types = set (exclude_types ) if exclude_types else None
7883 self .exclude_types_tuple = tuple (exclude_types ) if exclude_types else None # we need tuple for checking isinstance
7984 self .ignore_string_type_changes = ignore_string_type_changes
8085 self .ignore_numeric_type_changes = ignore_numeric_type_changes
86+ 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
8189 self .hashes = {}
8290 self .hasher = hasher
8391
@@ -383,6 +391,10 @@ def __diff_iterable(self, level, parents_ids=frozenset({})):
383391
384392 def __diff_str (self , level ):
385393 """Compare strings"""
394+ if self .ignore_string_case :
395+ level .t1 = level .t1 .lower ()
396+ level .t2 = level .t2 .lower ()
397+
386398 if type (level .t1 ) == type (level .t2 ) and level .t1 == level .t2 :
387399 return
388400
@@ -407,12 +419,12 @@ def __diff_str(self, level):
407419 return
408420
409421 if do_diff :
410- if u '\n ' in t1_str or u '\n ' in t2_str :
422+ if '\n ' in t1_str or '\n ' in t2_str :
411423 diff = difflib .unified_diff (
412424 t1_str .splitlines (), t2_str .splitlines (), lineterm = '' )
413425 diff = list (diff )
414426 if diff :
415- level .additional ['diff' ] = u '\n ' .join (diff )
427+ level .additional ['diff' ] = '\n ' .join (diff )
416428
417429 self .__report_result ('values_changed' , level )
418430
@@ -451,6 +463,8 @@ def __create_hashtable(self, t, level):
451463 ignore_string_type_changes = self .ignore_string_type_changes ,
452464 ignore_numeric_type_changes = self .ignore_numeric_type_changes ,
453465 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
454468 )
455469 item_hash = hashes_all [item ]
456470 except Exception as e : # pragma: no cover
@@ -580,7 +594,7 @@ def __diff(self, level, parents_ids=frozenset({})):
580594 if get_type (level .t1 ) != get_type (level .t2 ):
581595 report_type_change = True
582596 for type_group in self .ignore_type_in_groups :
583- 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 ) :
584598 report_type_change = False
585599 break
586600 if report_type_change :
0 commit comments