diff --git a/semantikon/converter.py b/semantikon/converter.py index d76b42f..8526e96 100644 --- a/semantikon/converter.py +++ b/semantikon/converter.py @@ -11,7 +11,6 @@ _to_units_container, _replace_units, ) -from ast import literal_eval from typing import get_origin, get_args __author__ = "Sam Waseda" @@ -44,14 +43,8 @@ def parse_metadata(value): dictionary of the metadata. Available keys are `units`, `label`, `triples`, `uri` and `shape`. See `semantikon.typing.u` for more details. """ - not_use_list = len(value.__metadata__) == 1 and isinstance( - value.__metadata__[0], str - ) - if not_use_list: - return literal_eval(value.__metadata__[0]) - else: - metadata = value.__metadata__[0] - return {k: v for k, v in zip(metadata[::2], metadata[1::2])} + metadata = value.__metadata__[0] + return {k: v for k, v in zip(metadata[::2], metadata[1::2])} def meta_to_dict(value): diff --git a/semantikon/typing.py b/semantikon/typing.py index f50df2a..4a34f3e 100644 --- a/semantikon/typing.py +++ b/semantikon/typing.py @@ -26,7 +26,6 @@ def _type_metadata( uri: str | None = None, shape: tuple[int] | None = None, restrictions: tuple[tuple[str, str]] | None = None, - use_list: bool = True, **kwargs, ): parent_result = {} @@ -45,11 +44,8 @@ def _type_metadata( if result[key] is None: result[key] = value result.update(kwargs) - if use_list: - items = [x for k, v in result.items() for x in [k, v]] - return Annotated[type_, items] - else: - return Annotated[type_, str(result)] + items = [x for k, v in result.items() for x in [k, v]] + return Annotated[type_, items] def _function_metadata( @@ -80,7 +76,6 @@ def u( uri: str | None = None, shape: tuple[int] | None = None, restrictions: tuple[tuple[str, str]] | None = None, - use_list: bool = True, **kwargs, ): is_type_hint = ( @@ -95,7 +90,6 @@ def u( "uri": uri, "shape": shape, "restrictions": restrictions, - "use_list": use_list, } ) if is_type_hint: diff --git a/tests/unit/test_parsers.py b/tests/unit/test_parsers.py index 56dead8..cf43ad1 100644 --- a/tests/unit/test_parsers.py +++ b/tests/unit/test_parsers.py @@ -10,31 +10,60 @@ class TestUnits(unittest.TestCase): def test_basic(self): - for use_list in [True, False]: + @u(uri="abc") + def get_speed( + distance: u(float, units="meter"), + time: u(float, units="second"), + ) -> u(float, units="meter/second", label="speed"): + return distance / time - @u(uri="abc") - def get_speed( - distance: u(float, units="meter", use_list=use_list), - time: u(float, units="second", use_list=use_list), - ) -> u(float, units="meter/second", label="speed", use_list=use_list): - return distance / time + input_args = parse_input_args(get_speed) + for key in ["distance", "time"]: + self.assertTrue(key in input_args) + for key in [ + "units", + "uri", + "triples", + "shape", + "label", + "restrictions", + "dtype", + ]: + self.assertTrue(key in input_args["distance"]) + self.assertEqual(input_args["distance"]["units"], "meter") + self.assertEqual(input_args["time"]["units"], "second") + output_args = parse_output_args(get_speed) + for key in [ + "units", + "uri", + "triples", + "shape", + "label", + "restrictions", + "dtype", + ]: + self.assertTrue(key in output_args) + self.assertEqual(output_args["units"], "meter/second") + self.assertEqual(output_args["label"], "speed") + self.assertEqual(get_speed._semantikon_metadata["uri"], "abc") + self.assertRaises(TypeError, u, "abc") + f_dict = get_function_dict(get_speed) + self.assertEqual(f_dict["uri"], "abc") + self.assertEqual(f_dict["label"], "get_speed") - input_args = parse_input_args(get_speed) - for key in ["distance", "time"]: - self.assertTrue(key in input_args) - for key in [ - "units", - "uri", - "triples", - "shape", - "label", - "restrictions", - "dtype", - ]: - self.assertTrue(key in input_args["distance"]) - self.assertEqual(input_args["distance"]["units"], "meter") - self.assertEqual(input_args["time"]["units"], "second") - output_args = parse_output_args(get_speed) + def test_multiple_output_args(self): + def get_speed( + distance: u(float, units="meter"), + time: u(float, units="second"), + ) -> tuple[ + u(float, units="meter/second", label="speed"), + u(float, units="meter", label="distance"), + ]: + return distance / time, distance + + output_args = parse_output_args(get_speed) + self.assertIsInstance(output_args, tuple) + for output_arg in output_args: for key in [ "units", "uri", @@ -44,44 +73,11 @@ def get_speed( "restrictions", "dtype", ]: - self.assertTrue(key in output_args) - self.assertEqual(output_args["units"], "meter/second") - self.assertEqual(output_args["label"], "speed") - self.assertEqual(get_speed._semantikon_metadata["uri"], "abc") - self.assertRaises(TypeError, u, "abc") - f_dict = get_function_dict(get_speed) - self.assertEqual(f_dict["uri"], "abc") - self.assertEqual(f_dict["label"], "get_speed") - - def test_multiple_output_args(self): - for use_list in [True, False]: - - def get_speed( - distance: u(float, units="meter", use_list=use_list), - time: u(float, units="second", use_list=use_list), - ) -> tuple[ - u(float, units="meter/second", label="speed", use_list=use_list), - u(float, units="meter", label="distance", use_list=use_list), - ]: - return distance / time, distance - - output_args = parse_output_args(get_speed) - self.assertIsInstance(output_args, tuple) - for output_arg in output_args: - for key in [ - "units", - "uri", - "triples", - "shape", - "label", - "restrictions", - "dtype", - ]: - self.assertTrue(key in output_arg) - self.assertEqual(output_args[0]["units"], "meter/second") - self.assertEqual(output_args[0]["label"], "speed") - self.assertEqual(output_args[1]["units"], "meter") - self.assertEqual(output_args[1]["label"], "distance") + self.assertTrue(key in output_arg) + self.assertEqual(output_args[0]["units"], "meter/second") + self.assertEqual(output_args[0]["label"], "speed") + self.assertEqual(output_args[1]["units"], "meter") + self.assertEqual(output_args[1]["label"], "distance") def test_additional_args(self): def get_speed(