def dump_to_dynamodb()

in src/dynamo.py [0:0]


def dump_to_dynamodb(item):
    context = decimal.Context(
        Emin=-128, Emax=126, rounding=None, prec=38,
        traps=[decimal.Clamped, decimal.Overflow, decimal.Underflow]
    )

    # don't catch str/bytes with Iterable check below;
    # don't catch bool with numbers.Number
    if isinstance(item, (str, ByteString, bool)):
        return item

    # ignore inexact, rounding errors
    if isinstance(item, numbers.Number):
        return context.create_decimal(item)

    elif isinstance(item, Dict):
        for key, value in item.items():
            item[key] = dump_to_dynamodb(value)
        return item

    # mappings are also Iterable
    elif isinstance(item, Mapping):
        return {
            key: dump_to_dynamodb(value)
            for key, value in item.values()
        }

    # dynamodb.TypeSerializer checks isinstance(o, Set)
    # so we cannot handle this as a list
    elif isinstance(item, Set):
        return set(map(dump_to_dynamodb, item))

    # may not be a literal instance of List
    elif isinstance(item, Iterable):
        return list(map(dump_to_dynamodb, item))

    # datetime, custom object, None
    return item