From a0ab8115fc25982a124cfa94899a3b75bbe932e0 Mon Sep 17 00:00:00 2001 From: Taylor Barstow Date: Sat, 11 Nov 2023 10:24:37 -0500 Subject: [PATCH] fix: convert floats to decimals before schema validation --- singer_sdk/helpers/_typing.py | 13 +++++++++++++ singer_sdk/sinks/core.py | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) 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,