def process( actual: cli.inputpath, desired: cli.inputpath, rtol: float = DEFAULT_TOLERANCE, atol: float = DEFAULT_TOLERANCE, ) -> None: """ Compare two netcdf files Args: actual: path to output data netcdf file desired: path to desired/known good data netcdf file rtol: relative tolerance for data in variables atol: absolute tolerance for data in variables Returns: None """ from improver.utilities import compare compare.compare_netcdfs(actual, desired, rtol=rtol, atol=atol, reporter=print)
def compare( output_path, kgo_path, recreate=True, atol=DEFAULT_TOLERANCE, rtol=DEFAULT_TOLERANCE, exclude_vars=None, ): """ Compare output against expected using KGO file with absolute and relative tolerances. Also recreates KGO if that setting is enabled. Args: output_path (pathlib.Path): Path to output produced by test kgo_path (pathlib.Path): Path to KGO file recreate (bool): False to disable KGO recreation, compare only atol (float): Absolute tolerance rtol (float): Relative tolerance exclude_vars (Iterable[str]): Variables to exclude from comparison Returns: None """ # don't show this function in pytest tracebacks # pylint: disable=unused-variable __tracebackhide__ = True assert output_path.is_absolute() assert kgo_path.is_absolute() if not isinstance(atol, (int, float)): raise ValueError("atol") if not isinstance(rtol, (int, float)): raise ValueError("rtol") difference_found = False message = "" def message_recorder(exception_message): nonlocal difference_found nonlocal message difference_found = True message = exception_message compare_netcdfs( output_path, kgo_path, atol=atol, rtol=rtol, exclude_vars=exclude_vars, reporter=message_recorder, ignored_attributes=IGNORED_ATTRIBUTES, ) if difference_found: if recreate: recreate_if_needed(output_path, kgo_path) raise AssertionError(message) if not checksum_ignore(): verify_checksum(kgo_path)
def test_compare_missing_files(dummy_nc, tmp_path): """Check that comparing missing files raises exception""" actual_nc, expected_nc = dummy_nc messages_reported = [] def message_collector(message): messages_reported.append(message) compare.compare_netcdfs(actual_nc, tmp_path / "missing", reporter=message_collector) assert len(messages_reported) == 1 assert "No such file" in messages_reported[0] compare.compare_netcdfs( tmp_path / "missing", expected_nc, reporter=message_collector ) assert len(messages_reported) == 2 assert "No such file" in messages_reported[1]
def process( actual: cli.inputpath, desired: cli.inputpath, rtol: float = DEFAULT_TOLERANCE, atol: float = DEFAULT_TOLERANCE, *, ignored_attributes: cli.comma_separated_list = None, ) -> None: """ Compare two netcdf files Args: actual: Path to output data netcdf file desired: Path to desired/known good data netcdf file rtol: Relative tolerance for data in variables atol: Absolute tolerance for data in variables ignored_attributes: List of attributes to ignore in the comparison. This option allows for attributes such as "history" to be ignored, where such attributes often vary between files without indicating any differences in the data. Returns: None """ from improver.utilities import compare compare.compare_netcdfs( actual, desired, rtol=rtol, atol=atol, ignored_attributes=ignored_attributes, reporter=print, )
def test_compare_identical_netcdfs(dummy_nc): """Check that comparing identical netCDFs does not raise any exceptions""" actual_nc, expected_nc = dummy_nc for tol in (1.0, 1e-5, 1e-10, 0.0): compare.compare_netcdfs(actual_nc, expected_nc, atol=tol, rtol=tol)