@@ -510,6 +510,32 @@ def _skip_this(self, level):
510
510
511
511
return skip
512
512
513
+ def _skip_this_key (self , level , key ):
514
+ # if include_paths is not set, than treet every path as included
515
+ if self .include_paths is None :
516
+ return False
517
+ if "{}['{}']" .format (level .path (), key ) in self .include_paths :
518
+ return False
519
+ if level .path () in self .include_paths :
520
+ # matches e.g. level+key root['foo']['bar']['veg'] include_paths ["root['foo']['bar']"]
521
+ return False
522
+ for prefix in self .include_paths :
523
+ if "{}['{}']" .format (level .path (), key ) in prefix :
524
+ # matches as long the prefix is longer than this object key
525
+ # eg.: level+key root['foo']['bar'] matches prefix root['foo']['bar'] from include paths
526
+ # level+key root['foo'] matches prefix root['foo']['bar'] from include_paths
527
+ # level+key root['foo']['bar'] DOES NOT match root['foo'] from include_paths This needs to be handled afterwards
528
+ return False
529
+ # check if a higher level is included as a whole (=without any sublevels specified)
530
+ # matches e.g. level+key root['foo']['bar']['veg'] include_paths ["root['foo']"]
531
+ # but does not match, if it is level+key root['foo']['bar']['veg'] include_paths ["root['foo']['bar']['fruits']"]
532
+ up = level .up
533
+ while up is not None :
534
+ if up .path () in self .include_paths :
535
+ return False
536
+ up = up .up
537
+ return True
538
+
513
539
def _get_clean_to_keys_mapping (self , keys , level ):
514
540
"""
515
541
Get a dictionary of cleaned value of keys to the keys themselves.
@@ -570,11 +596,11 @@ def _diff_dict(
570
596
rel_class = DictRelationship
571
597
572
598
if self .ignore_private_variables :
573
- t1_keys = SetOrdered ([key for key in t1 if not (isinstance (key , str ) and key .startswith ('__' ))])
574
- t2_keys = SetOrdered ([key for key in t2 if not (isinstance (key , str ) and key .startswith ('__' ))])
599
+ t1_keys = SetOrdered ([key for key in t1 if not (isinstance (key , str ) and key .startswith ('__' )) and not self . _skip_this_key ( level , key ) ])
600
+ t2_keys = SetOrdered ([key for key in t2 if not (isinstance (key , str ) and key .startswith ('__' )) and not self . _skip_this_key ( level , key ) ])
575
601
else :
576
- t1_keys = SetOrdered (t1 . keys () )
577
- t2_keys = SetOrdered (t2 . keys () )
602
+ t1_keys = SetOrdered ([ key for key in t1 if not self . _skip_this_key ( level , key )] )
603
+ t2_keys = SetOrdered ([ key for key in t2 if not self . _skip_this_key ( level , key )] )
578
604
if self .ignore_string_type_changes or self .ignore_numeric_type_changes or self .ignore_string_case :
579
605
t1_clean_to_keys = self ._get_clean_to_keys_mapping (keys = t1_keys , level = level )
580
606
t2_clean_to_keys = self ._get_clean_to_keys_mapping (keys = t2_keys , level = level )
0 commit comments