@@ -510,6 +510,32 @@ def _skip_this(self, level):
510510
511511        return  skip 
512512
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+ 
513539    def  _get_clean_to_keys_mapping (self , keys , level ):
514540        """ 
515541        Get a dictionary of cleaned value of keys to the keys themselves. 
@@ -570,11 +596,11 @@ def _diff_dict(
570596            rel_class  =  DictRelationship 
571597
572598        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 ) ])
575601        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 )] )
578604        if  self .ignore_string_type_changes  or  self .ignore_numeric_type_changes  or  self .ignore_string_case :
579605            t1_clean_to_keys  =  self ._get_clean_to_keys_mapping (keys = t1_keys , level = level )
580606            t2_clean_to_keys  =  self ._get_clean_to_keys_mapping (keys = t2_keys , level = level )
0 commit comments