def to_dict()

in horton_helpers/src/dictionary_object.py [0:0]


    def to_dict(self, defaults=None):
        """
        convert this object to a dict
        """

        try:
            defaults = defaults or type(self)._defaults
        except AttributeError:
            pass

        def dict_from_native_object(native_object, default_object):
            dict_object = {}
            for native_key in native_object._get_attribute_names():
                dict_key = inflection.camelize(native_key, uppercase_first_letter=False)

                default_value = None
                if default_object:
                    default_value = getattr(default_object, native_key, None)

                native_value = getattr(native_object, native_key)

                if _is_scalar(native_value):
                    # always include None, even if it's the default.  This is
                    # because None has a special meaning if we're using this to send a
                    # twin patch.
                    if (default_value is None) or (native_value != default_value):
                        dict_object[dict_key] = native_value
                elif _is_tostring_object(native_value):
                    if native_value != default_value:
                        dict_object[dict_key] = str(native_value)
                elif isinstance(native_value, object):
                    new_value = dict_from_native_object(native_value, default_value)
                    if new_value:
                        dict_object[dict_key] = new_value
                else:
                    raise ValueError(
                        "{} must be a scalar value or an object".format(native_key)
                    )
            return dict_object

        return dict_from_native_object(self, defaults)