From 4c4b1ceb335f56b93041dc0ecaa26dc48382c0cb Mon Sep 17 00:00:00 2001 From: Kayvan Zahiri <123409429+Kayvan-Zahiri@users.noreply.github.com> Date: Wed, 21 Oct 2026 13:02:47 -0700 Subject: [PATCH] fix: Correct scalar validity for null timestamps and empty lists --- cloudquery/sdk/scalar/list.py | 2 +- cloudquery/sdk/scalar/timestamp.py | 1 + tests/scalar/list.py | 22 ++++++++++++++++++++++ tests/scalar/timestamp.py | 29 ++++++++++++++++++++++++++++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/cloudquery/sdk/scalar/list.py b/cloudquery/sdk/scalar/list.py index 0d0f1df..31baffe 100644 --- a/cloudquery/sdk/scalar/list.py +++ b/cloudquery/sdk/scalar/list.py @@ -42,7 +42,7 @@ def set(self, value: Any): scalar = self._type() scalar.set(item) self._value.append(scalar) - self._valid = True + self._valid = True return raise ScalarInvalidTypeError(f"Invalid type {type(value)} for List") diff --git a/cloudquery/sdk/scalar/timestamp.py b/cloudquery/sdk/scalar/timestamp.py index 1f14780..fcd0eec 100644 --- a/cloudquery/sdk/scalar/timestamp.py +++ b/cloudquery/sdk/scalar/timestamp.py @@ -18,6 +18,7 @@ def value(self): def set(self, value: Any): if value is None: + self._valid = False return if isinstance(value, Timestamp): diff --git a/tests/scalar/list.py b/tests/scalar/list.py index 5819537..f0b3cb1 100644 --- a/tests/scalar/list.py +++ b/tests/scalar/list.py @@ -1,3 +1,5 @@ +import pytest + from cloudquery.sdk.scalar import String, Bool, List @@ -41,3 +43,23 @@ def test_list_eq_invalid(): l2.set([String(False)]) assert l1 == l2 + + +@pytest.mark.parametrize("empty", [[], ()]) +@pytest.mark.parametrize("previous", [None, ["old value"]]) +def test_empty_list_is_valid_independent_of_previous_value(empty, previous): + scalar = List(String) + if previous is not None: + scalar.set(previous) + scalar.set(empty) + assert scalar.is_valid + assert len(scalar) == 0 + assert str(scalar) == "[]" + + scalar.set(None) + assert not scalar.is_valid + assert str(scalar) == "null" + + scalar.set(empty) + assert scalar.is_valid + assert str(scalar) == "[]" diff --git a/tests/scalar/timestamp.py b/tests/scalar/timestamp.py index 2350b68..cb7f70a 100644 --- a/tests/scalar/timestamp.py +++ b/tests/scalar/timestamp.py @@ -1,5 +1,5 @@ import pytest -from datetime import datetime +from datetime import datetime, time from cloudquery.sdk.scalar import Timestamp import pandas as pd @@ -56,3 +56,30 @@ def test_timestamp_set(input_value, expected_scalar): b = Timestamp() b.set(input_value) assert b == expected_scalar, f"{b} and {expected_scalar} are not equal" + + +@pytest.mark.parametrize( + "input_value", + [ + "2026-10-21T10:00:00Z", + datetime(2026, 10, 21, 10), + pd.Timestamp("2026-10-21T10:00:00Z"), + time(10, 30), + ], +) +def test_timestamp_set_none_invalidates_and_can_be_reused(input_value): + scalar = Timestamp() + assert not scalar.is_valid + scalar.set(input_value) + assert scalar.is_valid + + scalar.set(None) + assert not scalar.is_valid + assert str(scalar) == "null" + + scalar.set(None) + assert not scalar.is_valid + + scalar.set(input_value) + assert scalar.is_valid + assert scalar == Timestamp(True, input_value)