Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def compare_ordereddict(self, X, Y):
"""Compares two instances of an OrderedDict."""
# check if OrderedDict instances have the same keys and values
child = self.compare_dicts(X, Y)
if isinstance(child, DeepExplanation):
return child
# check if the order of the keys is the same
for i, j in zip(X.items(), Y.items()):
if i[0] != j[0]:
c = self.get_context()
msg = "X{0} and Y{1} are in a different order".format(
red(c.current_X_keys), green(c.current_Y_keys)
)
return DeepExplanation(msg)
return True
def compare_generic(self, X, Y, msg_format='X{0} != Y{1}'):
c = self.get_context()
if X == Y:
return True
else:
m = msg_format.format(red(c.current_X_keys), green(c.current_Y_keys))
return DeepExplanation(m)
"""compares given object ``X`` with an expected ``Y`` object.
It primarily assures that the compared objects are absolute equal ``==``.
:param what: the expected value
:param epsilon: a delta to leverage upper-bound floating point permissiveness
"""
try:
comparison = DeepComparison(self.obj, what, epsilon).compare()
error = False
except AssertionError as e:
error = e
comparison = None
if isinstance(comparison, DeepExplanation):
error = comparison.get_assertion(self.obj, what)
if self.negative:
if error:
return True
msg = '%s should differ from %s, but is the same thing'
raise AssertionError(msg % (safe_repr(self.obj), safe_repr(what)))
else:
if not error:
return True
raise error
def compare_dicts(self, X, Y):
c = self.get_context()
x_keys = list(X.keys())
y_keys = list(Y.keys())
diff_x = list(set(x_keys).difference(set(y_keys)))
diff_y = list(set(y_keys).difference(set(x_keys)))
if diff_x:
msg = "X{0} has the key {1!r} whereas Y{2} does not".format(
red(c.current_X_keys),
safe_repr(diff_x[0]),
green(c.current_Y_keys))
return DeepExplanation(msg)
elif diff_y:
msg = "X{0} does not have the key {1!r} whereas Y{2} has it".format(
red(c.current_X_keys),
safe_repr(diff_y[0]),
green(c.current_Y_keys))
return DeepExplanation(msg)
elif X == Y:
return True
else:
for key_X in x_keys:
self.key_X = key_X
self.key_Y = key_X
value_X = X[key_X]
def compare_iterables(self, X, Y):
len_X, len_Y = map(len, (X, Y))
if len_X > len_Y:
msg = "X has {0} items whereas Y has only {1}".format(len_X, len_Y)
return DeepExplanation(msg)
elif len_X < len_Y:
msg = "Y has {0} items whereas X has only {1}".format(len_Y, len_X)
return DeepExplanation(msg)
elif X == Y:
return True
else:
for i, (value_X, value_Y) in enumerate(zip(X, Y)):
self.key_X = self.key_Y = i
child = DeepComparison(
value_X,
value_Y,
epsilon=self.epsilon,
parent=self,
).compare()
if isinstance(child, DeepExplanation):
return child
# NOTE: str.replace() automatically converted the 'string' to 'unicode' in Python 2
return orig_str_type(safe_repr)
# get safe representation for X and Y
safe_X, safe_Y = safe_format_repr(X), safe_format_repr(Y)
# maintaining backwards compatibility between error messages
kwargs = {}
if self.is_simple(X) and self.is_simple(Y):
kwargs['msg_format'] = 'X{{0}} is {0!r} whereas Y{{1}} is {1!r}'.format(safe_X, safe_Y)
elif type(X) is not type(Y):
kwargs['msg_format'] = 'X{{0}} is a {0} and Y{{1}} is a {1} instead'.format(
type(X).__name__, type(Y).__name__)
exp = self.compare_generic(X, Y, **kwargs)
if isinstance(exp, DeepExplanation):
original_X, original_Y = c.parent.operands
raise exp.as_assertion(original_X, original_Y)
return exp
def compare_floats(self, X, Y):
c = self.get_context()
if self.epsilon is None:
return self.compare_generic(X, Y)
if abs(X - Y) <= self.epsilon:
return True
else:
m = 'X{0}±{1} != Y{2}±{3}'.format(
red(c.current_X_keys), self.epsilon, green(c.current_Y_keys), self.epsilon)
return DeepExplanation(m)