diff --git a/nomenclature/codelist.py b/nomenclature/codelist.py index 45e37ecb..5ba4e0fa 100644 --- a/nomenclature/codelist.py +++ b/nomenclature/codelist.py @@ -18,6 +18,7 @@ VariableRenameArgError, VariableRenameTargetError, ) +from pyam.utils import is_list_like here = Path(__file__).parent.absolute() @@ -450,6 +451,24 @@ class VariableCodeList(CodeList): code_basis: ClassVar = VariableCode validation_schema: ClassVar[str] = "variable" + @property + def units(self): + """Get the list of all units""" + units = set() + + # replace "dimensionless" variables (unit: `None`) with empty string + # for consistency with the yaml file format + def to_dimensionless(u): + return u or "" + + for variable in self.mapping.values(): + if is_list_like(variable.unit): + units.update([to_dimensionless(u) for u in variable.unit]) + else: + units.add(to_dimensionless(variable.unit)) + + return sorted(list(units)) + @validator("mapping") def check_variable_region_aggregation_args(cls, v): """Check that any variable "region-aggregation" mappings are valid""" diff --git a/tests/test_codelist.py b/tests/test_codelist.py index 5ef67c83..3384bec3 100644 --- a/tests/test_codelist.py +++ b/tests/test_codelist.py @@ -17,13 +17,13 @@ def test_simple_codelist(): """Import a simple codelist""" - code = VariableCodeList.from_directory( + codelist = VariableCodeList.from_directory( "variable", TEST_DATA_DIR / "simple_codelist" ) - assert "Some Variable" in code - assert code["Some Variable"].unit is None # this is a dimensionless variable - assert type(code["Some Variable"].bool) == bool # this is a boolean + assert "Some Variable" in codelist + assert codelist["Some Variable"].unit is None # this is a dimensionless variable + assert type(codelist["Some Variable"].bool) == bool # this is a boolean def test_codelist_to_yaml(): @@ -155,12 +155,21 @@ def test_end_whitespace_fails(): ) +def test_variable_codelist_units(): + """Check that the units-attribute works as expected""" + codelist = VariableCodeList.from_directory( + "variable", TEST_DATA_DIR / "validation_nc" / "variable" + ) + assert codelist.units == ["", "EJ/yr"] + + def test_variable_codelist_multiple_units(): """Check that multiple units work in a VariableCodeList""" codelist = VariableCodeList.from_directory( "variable", TEST_DATA_DIR / "multiple_unit_codelist" ) assert codelist["Var1"].unit == ["unit1", "unit2"] + assert codelist.units == ["unit1", "unit2"] def test_to_excel_read_excel_roundtrip(tmpdir):