Source code for mincepy.comparators

import numbers
import collections.abc
from operator import itemgetter

from .helpers import TypeHelper

__all__ = ('SimpleHelper', 'BytesEquator')


[docs]class SimpleHelper(TypeHelper):
[docs] def yield_hashables(self, obj, hasher): yield from obj.yield_hashables(hasher)
[docs] def eq(self, one, other) -> bool: return one == other
[docs] def save_instance_state(self, obj, saver): return obj.save_instance_state(saver)
[docs] def load_instance_state(self, obj, saved_state, loader): return obj.load(saved_state, loader)
[docs]class BytesEquator(SimpleHelper): TYPE = collections.abc.ByteString
[docs] def yield_hashables(self, obj, hasher): yield obj
class StrEquator(SimpleHelper): TYPE = str def yield_hashables(self, obj: str, hasher): yield obj.encode('utf-8') class SequenceEquator(SimpleHelper): TYPE = collections.abc.Sequence def yield_hashables(self, obj: collections.abc.Sequence, hasher): for entry in obj: yield from hasher.yield_hashables(entry) class SetEquator(SimpleHelper): TYPE = collections.abc.Set def yield_hashables(self, obj: collections.abc.Set, hasher): for entry in sorted(obj): yield from hasher.yield_hashables(entry) class MappingEquator(SimpleHelper): TYPE = collections.abc.Mapping def yield_hashables(self, obj, hasher): def hashed_key_mapping(mapping): for key, value in mapping.items(): yield tuple(hasher.yield_hashables(key)), value for key_hashables, value in sorted(hashed_key_mapping(obj), key=itemgetter(0)): # Yield all the key hashables yield from key_hashables # And now all the value hashables for that entry yield from hasher.yield_hashables(value) class OrderedDictEquator(SimpleHelper): TYPE = collections.OrderedDict def yield_hashables(self, obj, hasher): for key, val in sorted(obj, key=itemgetter(0)): yield from hasher.yield_hashables(key) yield from hasher.yield_hashables(val) class RealEquator(SimpleHelper): TYPE = numbers.Real def yield_hashables(self, obj, hasher): yield from hasher.yield_hashables(hasher.float_to_str(obj)) class ComplexEquator(SimpleHelper): TYPE = numbers.Complex def yield_hashables(self, obj: numbers.Complex, hasher): yield from hasher.yield_hashables(obj.real) yield from hasher.yield_hashables(obj.imag) class IntegerEquator(SimpleHelper): TYPE = numbers.Integral def yield_hashables(self, obj: numbers.Integral, hasher): yield from hasher.yield_hashables(u'{}'.format(obj)) class BoolEquator(SimpleHelper): TYPE = bool def yield_hashables(self, obj, hasher): yield b'\x01' if obj else b'\x00' class NoneEquator(SimpleHelper): TYPE = type(None) def yield_hashables(self, obj, hasher): yield from hasher.yield_hashables('None') class TupleEquator(SimpleHelper): TYPE = tuple def yield_hashables(self, obj, hasher): yield from hasher.yield_hashables(obj)