11import json
2- from pprint import pprint
2+
33
44class Stack :
55 def __init__ (self ):
@@ -52,23 +52,23 @@ def _generate_pprint_json(value):
5252def _is_dict_same (expected , actual , ignore_value_of_keys ):
5353 # DAN - I had to flip flop this
5454 for key in expected :
55- if not key in actual :
55+ if key in ignore_value_of_keys :
56+ continue
57+ if key not in actual :
5658 return False , \
5759 Stack ().append (
5860 StackItem ('Expected key "{0}" Missing from Actual'
5961 .format (key ),
6062 expected ,
6163 actual ))
6264
63- if not key in ignore_value_of_keys :
64- # have to change order
65- #are_same_flag, stack = _are_same(actual[key], expected[key], ignore_value_of_keys)
66- are_same_flag , stack = _are_same (expected [key ], actual [key ],ignore_value_of_keys )
67- if not are_same_flag :
68- return False , \
69- stack .append (StackItem ('Different values' , expected [key ], actual [key ]))
65+ are_same_flag , stack = _are_same (expected [key ], actual [key ],ignore_value_of_keys )
66+ if not are_same_flag :
67+ return False , \
68+ stack .append (StackItem ('Different values' , expected [key ], actual [key ]))
7069 return True , Stack ()
7170
71+
7272def _is_list_same (expected , actual , ignore_value_of_keys ):
7373 for i in xrange (len (expected )):
7474 are_same_flag , stack = _are_same (expected [i ], actual [i ], ignore_value_of_keys )
@@ -78,6 +78,7 @@ def _is_list_same(expected, actual, ignore_value_of_keys):
7878 StackItem ('Different values (Check order)' , expected [i ], actual [i ]))
7979 return True , Stack ()
8080
81+
8182def _bottom_up_sort (unsorted_json ):
8283 if isinstance (unsorted_json , list ):
8384 new_list = []
@@ -94,6 +95,7 @@ def _bottom_up_sort(unsorted_json):
9495 else :
9596 return unsorted_json
9697
98+
9799def _are_same (expected , actual , ignore_value_of_keys , ignore_missing_keys = False ):
98100 # Check for None
99101 if expected is None :
@@ -112,29 +114,12 @@ def _are_same(expected, actual, ignore_value_of_keys, ignore_missing_keys=False)
112114 if type (expected ) in (int , str , bool , long , float , unicode ):
113115 return expected == actual , Stack ()
114116
115- # Ensure collections have the same length (if applicable)
116- if ignore_missing_keys :
117- # Ensure collections has minimum length (if applicable)
118- # This is a short-circuit condition because (b contains a)
119- if len (expected ) > len (actual ):
120- return False , \
121- Stack ().append (
122- StackItem ('Length Mismatch: Minimum Expected Length: {0}, Actual Length: {1}'
123- .format (len (expected ), len (actual )),
124- expected ,
125- actual ))
126-
127- else :
128- # Ensure collections has same length
129- if len (expected ) != len (actual ):
130- return False , \
131- Stack ().append (
132- StackItem ('Length Mismatch: Expected Length: {0}, Actual Length: {1}'
133- .format (len (expected ), len (actual )),
134- expected ,
135- actual ))
136-
137-
117+ if not ignore_missing_keys and len (expected ) > len (actual ):
118+ stack = Stack ().append (StackItem ('Length Mismatch: Expected Length: {0}, Actual Length: {1}'
119+ .format (len (expected ), len (actual )), expected , actual ))
120+ if isinstance (expected , dict ):
121+ stack .append ('Missing keys: {0}' .format (get_missing_keys (expected , actual )))
122+ return False , stack
138123
139124 if isinstance (expected , dict ):
140125 return _is_dict_same (expected , actual , ignore_value_of_keys )
@@ -144,25 +129,26 @@ def _are_same(expected, actual, ignore_value_of_keys, ignore_missing_keys=False)
144129
145130 return False , Stack ().append (StackItem ('Unhandled Type: {0}' .format (type (expected )), expected , actual ))
146131
147- def are_same (original_a , original_b , ignore_list_order_recursively = False , ignore_missing_keys = False , ignore_value_of_keys = []):
148- if ignore_list_order_recursively :
149- a = _bottom_up_sort (original_a )
150- b = _bottom_up_sort (original_b )
151- else :
152- a = original_a
153- b = original_b
132+
133+ def get_missing_keys (expected , actual ):
134+ return [key for key in expected if key not in actual ]
135+
136+
137+ def are_same (original_a , original_b , ignore_list_order_recursively = False , ignore_missing_keys = False , ignore_value_of_keys = None ):
138+ ignore_value_of_keys = ignore_value_of_keys if ignore_value_of_keys else []
139+ a = _bottom_up_sort (original_a ) if ignore_list_order_recursively else original_a
140+ b = _bottom_up_sort (original_b ) if ignore_list_order_recursively else original_b
154141 return _are_same (a , b , ignore_value_of_keys , ignore_missing_keys )
155142
156143
157- def contains (expected_original , actual_original , ignore_list_order_recursively = False , ignore_value_of_keys = []):
158- if ignore_list_order_recursively :
159- actual = _bottom_up_sort (actual_original )
160- expected = _bottom_up_sort (expected_original )
161- else :
162- actual = actual_original
163- expected = expected_original
144+ def contains (expected_original , actual_original , ignore_list_order_recursively = False , ignore_value_of_keys = None ):
145+ ignore_value_of_keys = ignore_value_of_keys if ignore_value_of_keys else []
146+ actual = _bottom_up_sort (actual_original ) if ignore_list_order_recursively else actual_original
147+ expected = _bottom_up_sort (expected_original ) if ignore_list_order_recursively else expected_original
164148 return _are_same (expected , actual , ignore_value_of_keys , True )
165149
166- def json_are_same (a , b , ignore_list_order_recursively = False , ignore_value_of_keys = []):
150+
151+ def json_are_same (a , b , ignore_list_order_recursively = False , ignore_value_of_keys = None ):
152+ ignore_value_of_keys = ignore_value_of_keys if ignore_value_of_keys else []
167153 return are_same (json .loads (a ), json .loads (b ), ignore_list_order_recursively , ignore_value_of_keys )
168154
0 commit comments