diff --git a/snowfakery/data_generator_runtime_object_model.py b/snowfakery/data_generator_runtime_object_model.py index 6183fcdd..4bedcfa1 100644 --- a/snowfakery/data_generator_runtime_object_model.py +++ b/snowfakery/data_generator_runtime_object_model.py @@ -19,7 +19,10 @@ # objects that represent the hierarchy of a data generator. # roughly similar to the YAML structure but with domain-specific objects Definition = Union["ObjectTemplate", "SimpleValue", "StructuredValue"] -FieldValue = Union[None, Scalar, ObjectRow, tuple, PluginResult, ObjectReference] +FieldValue = Union[ + None, bool, int, float, str, bytes, list, dict, tuple, set, + Scalar, ObjectRow, PluginResult, ObjectReference +] class FieldDefinition(ABC): diff --git a/snowfakery/output_streams.py b/snowfakery/output_streams.py index d10b50b9..ce2c597a 100644 --- a/snowfakery/output_streams.py +++ b/snowfakery/output_streams.py @@ -61,6 +61,11 @@ class OutputStream(ABC): type(None): noop, bool: int, Decimal: str, + list: lambda data: json.dumps(data), + dict: lambda data: json.dumps(data), + bytes: str, + tuple: lambda data: data, + set: lambda data: data, } uses_folder = False uses_path = False diff --git a/tests/test_output_streams.py b/tests/test_output_streams.py index 25de7ae2..b6b08494 100644 --- a/tests/test_output_streams.py +++ b/tests/test_output_streams.py @@ -353,6 +353,7 @@ def do_output(self, yaml): def test_csv_output(self): yaml = """ + - snowfakery_version: 3 - object: foo fields: a: 1 @@ -365,6 +366,13 @@ def test_csv_output(self): fields: barb: 2 bard: 4 + - object: faz + fields: + list_t: ${{fake.json(data_columns={'Spec':'@1.0.1', 'ID':'pyint','Details':{'Name':'name', 'Address':'address'}}, num_rows=2)}} + dict_t: ${{fake.json(data_columns={'Spec':'@1.0.1', 'ID':'pyint','Details':{'Name':'name', 'Address':'address'}}, num_rows=1)}} + bool_t: ${{fake.pybool()}} + tuple_t: ${{(1, 2)}} + bytes_t: ${{fake.binary(length=64)}} """ with TemporaryDirectory() as t: output_stream = CSVOutputStream(Path(t) / "csvoutput") @@ -373,13 +381,15 @@ def test_csv_output(self): assert messages assert "foo.csv" in messages[0] assert "bar.csv" in messages[1] - assert "csvw" in messages[2] + assert "faz.csv" in messages[2] + assert "csvw" in messages[3] assert (Path(t) / "csvoutput" / "foo.csv").exists() with open(Path(t) / "csvoutput" / "csvw_metadata.json") as f: metadata = json.load(f) assert {table["url"] for table in metadata["tables"]} == { "foo.csv", "bar.csv", + "faz.csv", } def test_null(self):