From 309312f38679b5c5dbcf1def8a7e90b8b0fb5a45 Mon Sep 17 00:00:00 2001 From: Yotam Shapira Date: Mon, 13 Apr 2026 18:14:14 +0300 Subject: [PATCH] Fix decimal.Decimal serialization in process_record singer-sdk 0.40+ passes decimal.Decimal values in records for numeric fields. orjson.dumps() does not natively handle Decimal, causing a TypeError crash. Add a default serializer that converts Decimal to float. Fixes #72 Co-Authored-By: Claude Opus 4.6 (1M context) --- target_gcs/sinks.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/target_gcs/sinks.py b/target_gcs/sinks.py index f8b2325..fe47c61 100644 --- a/target_gcs/sinks.py +++ b/target_gcs/sinks.py @@ -9,6 +9,8 @@ from io import FileIO from typing import Optional +import decimal + import orjson import smart_open from google.cloud.storage import Client @@ -82,5 +84,16 @@ def process_record(self, record: dict, context: dict) -> None: passed `context` dict from the current batch. """ self.gcs_write_handle.write( - orjson.dumps(record, option=orjson.OPT_APPEND_NEWLINE) + orjson.dumps( + record, + option=orjson.OPT_APPEND_NEWLINE, + default=_default_serializer, + ) ) + + +def _default_serializer(obj): + """Handle types that orjson cannot serialize natively.""" + if isinstance(obj, decimal.Decimal): + return float(obj) + raise TypeError(f"Type is not JSON serializable: {type(obj)}")