diff --git a/src/caoscrawler/converters/converters.py b/src/caoscrawler/converters/converters.py index 5e9f172e1d08ecf6cb9590db2de307c1bf453b18..a8b7e918d234f41a9e3d967048dab8ad17596416 100644 --- a/src/caoscrawler/converters/converters.py +++ b/src/caoscrawler/converters/converters.py @@ -170,8 +170,10 @@ Parameters value: Union[dict, str, list] - If *str*, the value to be interpreted. E.g. "4", "hello" or "$a" etc. - - If *dict*, must have keys ``value`` and ``collection_mode``. The returned tuple is directly - created from the corresponding values. + - If *dict*, it must have a ``value`` key and may ``unit``, and + ``collection_mode``. The returned tuple is directly created from + the corresponding values whereby unit defaults to None and + collection_mode defaults to "single". - If *list*, each element is checked for replacement and the resulting list will be used as (list) value for the property @@ -195,7 +197,10 @@ out: tuple if "unit" in value: propunit = value["unit"] # can be "single", "list" or "multiproperty" - collection_mode = value["collection_mode"] + if "collection_mode" in value: + collection_mode = value["collection_mode"] + else: + collection_mode = "single" elif isinstance(value, str): propvalue = value collection_mode = "single" @@ -221,13 +226,13 @@ out: tuple else: propvalue.append(element) - return (propvalue, collection_mode) + return (propvalue, propunit, collection_mode) else: # value is another simple type collection_mode = "single" propvalue = value # Return it immediately, otherwise variable substitution would be done and fail: - return (propvalue, collection_mode) + return (propvalue, propunit, collection_mode) propvalue = replace_variables(propvalue, values) if propunit: diff --git a/unittests/test_converters.py b/unittests/test_converters.py index f1b74d89ffd367849b85433e0e456ae8a78134a8..f1a4b2c9d880e77a6761a8768c590b201f7b2079 100644 --- a/unittests/test_converters.py +++ b/unittests/test_converters.py @@ -352,6 +352,7 @@ def test_variable_replacement(): values = GeneralStore() values["a"] = 4 values["b"] = "68" + values["my_unit"] = "m" # basic values stay unchanged assert replace_variables(5, values) is 5 @@ -359,28 +360,33 @@ def test_variable_replacement(): assert replace_variables("$a", values) is 4 assert replace_variables("${b}", values) == "68" - assert handle_value("b", values) == ("b", "single") - assert handle_value("+b", values) == ("b", "list") - assert handle_value("*b", values) == ("b", "multiproperty") - assert handle_value("$b", values) == ("68", "single") - assert handle_value("+$b", values) == ("68", "list") - assert handle_value("*$b", values) == ("68", "multiproperty") + # values given as simple strings never have units + assert handle_value("b", values) == ("b", None, "single") + assert handle_value("+b", values) == ("b", None, "list") + assert handle_value("*b", values) == ("b", None, "multiproperty") + assert handle_value("$b", values) == ("68", None, "single") + assert handle_value("+$b", values) == ("68", None, "list") + assert handle_value("*$b", values) == ("68", None, "multiproperty") + # No units in dicts assert handle_value({"value": "b", - "collection_mode": "single"}, values) == ("b", "single") + "collection_mode": "single"}, values) == ("b", None, "single") assert handle_value({"value": "b", - "collection_mode": "list"}, values) == ("b", "list") + "collection_mode": "list"}, values) == ("b", None, "list") assert handle_value({"value": "b", - "collection_mode": "multiproperty"}, values) == ("b", "multiproperty") + "collection_mode": "multiproperty"}, values) == ("b", None, "multiproperty") assert handle_value({"value": "$b", - "collection_mode": "single"}, values) == ("68", "single") + "collection_mode": "single"}, values) == ("68", None, "single") assert handle_value({"value": "$b", - "collection_mode": "list"}, values) == ("68", "list") + "collection_mode": "list"}, values) == ("68", None, "list") assert handle_value({"value": "$b", - "collection_mode": "multiproperty"}, values) == ("68", "multiproperty") + "collection_mode": "multiproperty"}, values) == ("68", None, "multiproperty") - assert handle_value(["a", "b"], values) == (["a", "b"], "single") - assert handle_value(["$a", "$b"], values) == ([4, "68"], "single") + # Unit specified in the same way as value: + assert handle_value({"value": 5, "unit": "m"}, values) == (5, "m", "single") + + assert handle_value(["a", "b"], values) == (["a", "b"], None, "single") + assert handle_value(["$a", "$b"], values) == ([4, "68"], None, "single") def test_apply_transformers(converter_registry): diff --git a/unittests/test_scalars_cfood.py b/unittests/test_scalars_cfood.py index ba604fe4f5b695506bf8df9dab79fc23232c546a..4375ba199d64c3a24d07b3ea1cc4d221d967954b 100644 --- a/unittests/test_scalars_cfood.py +++ b/unittests/test_scalars_cfood.py @@ -24,15 +24,15 @@ def test_handle_value(): store = GeneralStore() # This one should work: - assert handle_value("bla", store) == ("bla", "single") + assert handle_value("bla", store) == ("bla", None, "single") # These failed: - assert handle_value(4, store) == (4, "single") - assert handle_value(4.2, store) == (4.2, "single") - assert handle_value(True, store) == (True, "single") + assert handle_value(4, store) == (4, None, "single") + assert handle_value(4.2, store) == (4.2, None, "single") + assert handle_value(True, store) == (True, None, "single") # List test: - assert handle_value([4, 3, 2], store) == ([4, 3, 2], "single") + assert handle_value([4, 3, 2], store) == ([4, 3, 2], None, "single") def test_record_structure_generation():