diff --git a/airbyte_cdk/sources/declarative/interpolation/jinja.py b/airbyte_cdk/sources/declarative/interpolation/jinja.py index 558ee0add..415a0c857 100644 --- a/airbyte_cdk/sources/declarative/interpolation/jinja.py +++ b/airbyte_cdk/sources/declarative/interpolation/jinja.py @@ -124,8 +124,8 @@ def eval( def _literal_eval(self, result: Optional[str], valid_types: Optional[Tuple[Type[Any]]]) -> Any: try: - evaluated = ast.literal_eval(result) # type: ignore # literal_eval is able to handle None - except (ValueError, SyntaxError): + evaluated = ast.literal_eval(result) # type: ignore # result may be None; on error we return it unchanged + except (ValueError, SyntaxError, TypeError): return result if (not valid_types and not isinstance(evaluated, complex)) or ( valid_types and isinstance(evaluated, valid_types) diff --git a/unit_tests/sources/declarative/interpolation/test_jinja.py b/unit_tests/sources/declarative/interpolation/test_jinja.py index 330c938b0..c358fe4aa 100644 --- a/unit_tests/sources/declarative/interpolation/test_jinja.py +++ b/unit_tests/sources/declarative/interpolation/test_jinja.py @@ -345,6 +345,16 @@ def test_interpolation_private_partition_attribute(): assert actual_output == expected_output +def test_literal_eval_handles_unhashable_set_typeerror(): + """Test that _literal_eval gracefully handles TypeError from ast.literal_eval for nested sets.""" + # ast.literal_eval("{{'web'}, {'discover'}}") raises TypeError: unhashable type: 'set' + # The interpolation should return the string as-is instead of propagating the error. + config = {"query": "{{'web'}, {'discover'}}"} + s = "{{ config['query'] }}" + val = interpolation.eval(s, config) + assert val == "{{'web'}, {'discover'}}" + + def test_given_complex_when_eval_then_return_string(): s = "9173710294242221J" config = {}