diff --git a/singer_sdk/helpers/_typing.py b/singer_sdk/helpers/_typing.py index 6eb7b3879..d778cb275 100644 --- a/singer_sdk/helpers/_typing.py +++ b/singer_sdk/helpers/_typing.py @@ -6,6 +6,7 @@ import datetime import logging import typing as t +from decimal import Decimal from enum import Enum from functools import lru_cache @@ -491,3 +492,15 @@ def _conform_primitive_property( # noqa: PLR0911 if is_boolean_type(property_schema): return None if elem is None else elem != 0 return elem + +def float_to_decimal(value): + """ + Walk the given data structure and turn all instances of float into double. + """ + if isinstance(value, float): + return Decimal(str(value)) + if isinstance(value, list): + return [float_to_decimal(child) for child in value] + if isinstance(value, dict): + return {k: float_to_decimal(v) for k, v in value.items()} + return value diff --git a/singer_sdk/sinks/core.py b/singer_sdk/sinks/core.py index e578c2084..b9e7e3619 100644 --- a/singer_sdk/sinks/core.py +++ b/singer_sdk/sinks/core.py @@ -27,6 +27,7 @@ DatetimeErrorTreatmentEnum, get_datelike_property_type, handle_invalid_timestamp_in_record, + float_to_decimal, ) if t.TYPE_CHECKING: @@ -321,7 +322,7 @@ def _validate_and_parse(self, record: dict) -> dict: Returns: TODO """ - self._validator.validate(record) + self._validator.validate(float_to_decimal(record)) self._parse_timestamps_in_record( record=record, schema=self.schema,