def encode(cls, values): if len(values) != len(cls.encoders): raise ValueOutOfBounds( "Recieved {0} values to encode. Expected {1}".format( len(values), len(cls.encoders), )) raw_head_chunks = [] tail_chunks = [] for value, encoder in zip(values, cls.encoders): if isinstance( encoder, (DynamicArrayEncoder, ByteStringEncoder, TextStringEncoder)): raw_head_chunks.append(None) tail_chunks.append(encoder(value)) else: raw_head_chunks.append(encoder(value)) tail_chunks.append(b'') head_length = sum( (32 if is_null(item) else len(item) for item in raw_head_chunks)) tail_offsets = tuple((sum((len(chunk) for chunk in tail_chunks[:i])) for i in range(len(tail_chunks)))) head_chunks = tuple( ((encode_uint_256(head_length + tail_offsets[idx]) if is_null(head_chunk) else head_chunk) for idx, head_chunk in enumerate(raw_head_chunks))) encoded_value = b''.join( tuple(itertools.chain(head_chunks, tail_chunks))) return encoded_value
def stringify(value): if is_bytes(value): yield value elif is_text(value): yield force_bytes(value) elif is_list_like(value): yield b''.join(( b'(', b','.join((stringify(item) for item in value)), b')', )) elif is_dict(value): yield b''.join(( b'{', b','.join((b":".join((stringify(key), stringify(item))) for key, item in value.items())), b'}', )) elif is_integer(value): yield force_bytes(str(value)) elif is_null(value): yield 'None@{0}'.format(id(value)) else: raise TypeError("Unsupported type for stringification: {0}".format( type(value)))
def bytes_repr(value): if is_bytes(value): yield value elif is_text(value): yield to_bytes(text=value) elif is_list_like(value): yield b''.join(( b'(', b','.join(bytes_repr(item) for item in value), b')', )) elif is_dict(value): yield b''.join(( b'{', b','.join(( b":".join((bytes_repr(key), bytes_repr(item))) for key, item in value.items() )), b'}', )) elif is_integer(value): yield to_bytes(value) elif is_null(value): yield 'None@{}'.format(id(value)) else: raise TypeError("Unsupported type for bytes_repr: {}".format(type(value)))
def generate_cache_key(value): """ Generates a cache key for the *args and **kwargs """ if is_bytes(value): return hashlib.md5(value).hexdigest() elif is_text(value): return generate_cache_key(force_bytes(value)) elif is_boolean(value) or is_null(value) or is_number(value): return generate_cache_key(repr(value)) elif is_dict(value): return generate_cache_key(( (key, value[key]) for key in sorted(value.keys()) )) elif is_list_like(value) or isinstance(value, Generator): return generate_cache_key("".join(( generate_cache_key(item) for item in value ))) else: raise TypeError("Cannot generate cache key for value {0} of type {1}".format( value, type(value), ))
def generate_cache_key(value: Any) -> str: """ Generates a cache key for the *args and **kwargs """ if is_bytes(value): return hashlib.md5(value).hexdigest() elif is_text(value): return generate_cache_key(to_bytes(text=value)) elif is_boolean(value) or is_null(value) or is_number(value): return generate_cache_key(repr(value)) elif is_dict(value): return generate_cache_key( ((key, value[key]) for key in sorted(value.keys()))) elif is_list_like(value) or isinstance(value, collections.abc.Generator): return generate_cache_key("".join( (generate_cache_key(item) for item in value))) else: raise TypeError( f"Cannot generate cache key for value {value} of type {type(value)}" )