Source code for bmi_tester.api
import os
import sys
from collections.abc import Iterable
from collections.abc import Sequence
try:
from gimli._udunits2 import UdunitsError
from gimli.errors import IncompatibleUnitsError
from gimli.errors import UnitNameError
from gimli.units import units
except ImportError:
WITH_GIMLI_UNITS = False
SECONDS = None
else:
WITH_GIMLI_UNITS = True
SECONDS = units.Unit("s")
import pytest
if sys.version_info >= (3, 12): # pragma: no cover (PY12+)
from importlib.resources import files
else: # pragma: no cover (<PY312)
from importlib_resources import files
[docs]
def check_bmi(
package: str,
tests_dir: str | Sequence[str] | None = None,
input_file: str = "",
manifest: str | Sequence[str] | None = None,
bmi_version: str = "2.0",
extra_args: Iterable[str] | None = None,
help_pytest: bool = False,
) -> int:
if tests_dir is None:
tests_dir = str(files(__name__) / "_bootstrap")
if isinstance(tests_dir, str):
args = [tests_dir]
else:
args = list(tests_dir)
os.environ["BMITEST_CLASS"] = package
os.environ["BMITEST_INPUT_FILE"] = input_file
os.environ["BMI_VERSION_STRING"] = bmi_version
if manifest:
if isinstance(manifest, str):
with open(manifest) as fp:
manifest = fp.read()
else:
manifest = os.linesep.join(manifest)
os.environ["BMITEST_MANIFEST"] = manifest
extra_args = list(extra_args or [])
if help_pytest:
extra_args.append("--help")
args += extra_args
return pytest.main(args)
[docs]
def check_unit_is_valid(unit):
try:
units.Unit(unit)
except (UnitNameError, UdunitsError):
return False
else:
return True
[docs]
def check_unit_is_time(unit):
try:
units.Unit(unit).to(SECONDS)
except (IncompatibleUnitsError, UdunitsError):
return False
else:
return True
[docs]
def check_unit_is_dimensionless(unit):
return units.Unit(unit).is_dimensionless