From 8e510f53a86e758d091c9a3933e3510167a7b5c8 Mon Sep 17 00:00:00 2001 From: llakenbr Date: Sun, 4 Jan 2026 18:17:03 +0100 Subject: [PATCH 1/4] Added encoding support for tuples, they will be handled like lists in decode and changed handling of other types to raise an error instead of returning None. --- toon/encoder.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/toon/encoder.py b/toon/encoder.py index 6e1206c..ce76087 100644 --- a/toon/encoder.py +++ b/toon/encoder.py @@ -117,9 +117,11 @@ def _encode_value(value: Any, level: int, opts: EncoderOptions) -> str: return _encode_array(value, level, opts) elif isinstance(value, dict): return _encode_object(value, level, opts) + elif isinstance(value, tuple): + return _encode_tuple(value) else: # Handle other types as null - return 'null' + raise NotImplementedError(f'Encoding for type {type(value)} is not implemented.') def _encode_object(obj: dict, level: int, opts: EncoderOptions) -> str: @@ -177,6 +179,16 @@ def _encode_array(arr: list, level: int, opts: EncoderOptions) -> str: # Mixed array (list format) return _encode_list_array(arr, level, opts, key=None) +def _encode_tuple(value: tuple) -> str: + """Encode a tuple.""" + if not value: + return '[]' + + tuple_data = ','.join(str(v) for v in value) + tuple_string = f'[{tuple_data}]' + + return tuple_string + def _encode_array_with_key(key: str, arr: list, level: int, opts: EncoderOptions) -> str: """Encode an array with its key prefix for object context.""" From be0a54f4d555b44ab99ab175b8e3455c9620029f Mon Sep 17 00:00:00 2001 From: llakenbr Date: Sun, 4 Jan 2026 18:23:42 +0100 Subject: [PATCH 2/4] Test of tuple type --- tests/test_encoder.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_encoder.py b/tests/test_encoder.py index 7f59f25..c9d5643 100644 --- a/tests/test_encoder.py +++ b/tests/test_encoder.py @@ -88,6 +88,17 @@ def test_encode_primitive_array(): result = encode(data) assert result == 'items: [hello,"world, test",foo]' +def test_encode_tuple_array(): + """Test encoding of primitive arrays.""" + # Number tuple + assert encode({'numbers': (1, 2, 3)}) == 'numbers: [1,2,3]' + + # String tuple + assert encode({'names': ('Alice', 'Bob')}) == 'names: [Alice,Bob]' + + # Mixed primitive tuple + assert encode({'mixed': (1, 'text', True, None)}) == 'mixed: [1,text,true,null]' + def test_encode_array_delimiter(): """Test different array delimiters.""" From a9f5d65f58479d8789834ff3191393962b58d80d Mon Sep 17 00:00:00 2001 From: llakenbr Date: Sun, 11 Jan 2026 19:05:29 +0100 Subject: [PATCH 3/4] Test of tuple type --- toon/encoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toon/encoder.py b/toon/encoder.py index ce76087..962314a 100644 --- a/toon/encoder.py +++ b/toon/encoder.py @@ -184,7 +184,7 @@ def _encode_tuple(value: tuple) -> str: if not value: return '[]' - tuple_data = ','.join(str(v) for v in value) + tuple_data = ','.join(_encode_primitive_value(v) for v in value) tuple_string = f'[{tuple_data}]' return tuple_string From bedbd12f47b1c8d57d13b7b28519fe5b9d1850be Mon Sep 17 00:00:00 2001 From: llakenbr Date: Sun, 11 Jan 2026 19:16:55 +0100 Subject: [PATCH 4/4] Change of other type description --- toon/encoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toon/encoder.py b/toon/encoder.py index 962314a..05c410a 100644 --- a/toon/encoder.py +++ b/toon/encoder.py @@ -120,7 +120,7 @@ def _encode_value(value: Any, level: int, opts: EncoderOptions) -> str: elif isinstance(value, tuple): return _encode_tuple(value) else: - # Handle other types as null + # Handle other types with NotImplementedError raise NotImplementedError(f'Encoding for type {type(value)} is not implemented.')