Test and documentation utilities¶
- genno.testing.add_dantzig(c: Computer)[source]¶
Add contents analogous to the ixmp Dantzig scenario.
- genno.testing.add_large_data(c: Computer, num_params, N_dims=6, N_data=0)[source]¶
Add nodes to c that return large-ish data.
The result is a matrix wherein the Cartesian product of all the keys is very large— about 2e17 elements for N_dim = 6—but the contents are very sparse. This can be handled by
SparseDataArray
, but not byxarray.DataArray
backed bynumpy.ndarray
.
- genno.testing.add_test_data(c: Computer)[source]¶
add_test_data()
operating on a Computer, not an ixmp.Scenario.
- genno.testing.assert_logs(caplog, message_or_messages=None, at_level=None)[source]¶
Assert that message_or_messages appear in logs.
Use assert_logs as a context manager for a statement that is expected to trigger certain log messages. assert_logs checks that these messages are generated.
Derived from
ixmp.testing.assert_logs()
.Example
>>> def test_foo(caplog): ... with assert_logs(caplog, 'a message'): ... logging.getLogger(__name__).info('this is a message!')
- genno.testing.assert_qty_allclose(a, b, check_type: bool = True, check_attrs: bool = True, ignore_extra_coords: bool = False, **kwargs)[source]¶
Assert that objects a and b have numerically close values.
- Parameters:
check_type (
bool
, optional) – Assert that a and b are bothQuantity
instances. IfFalse
, the arguments are converted to Quantity.check_attrs (
bool
, optional) – Also assert that check that attributes are identical.ignore_extra_coords (
bool
, optional) – Ignore extra coords that are not dimensions. Only meaningful when Quantity isSparseDataArray
.
- genno.testing.assert_qty_equal(a, b, check_type: bool = True, check_attrs: bool = True, ignore_extra_coords: bool = False, **kwargs)[source]¶
Assert that objects a and b are equal.
- Parameters:
check_type (
bool
, optional) – Assert that a and b are bothQuantity
instances. IfFalse
, the arguments are converted to Quantity.check_attrs (
bool
, optional) – Also assert that check that attributes are identical.ignore_extra_coords (
bool
, optional) – Ignore extra coords that are not dimensions. Only meaningful when Quantity isSparseDataArray
.
- genno.testing.assert_units(qty: AnyQuantity, exp: str) None [source]¶
Assert that qty has units exp.
- genno.testing.get_test_quantity(key: Key) AnyQuantity [source]¶
Computation that returns test data.
- genno.testing.parametrize_copy_on_write(monkeypatch, request)[source]¶
Fixture to run tests with pandas copy-on-write either enabled or disabled.
- genno.testing.parametrize_quantity_class(request)[source]¶
Fixture to run tests twice, for both Quantity implementations.
- genno.testing.pytest_runtest_makereport(item, call)[source]¶
Pytest hook to unwrap
genno.ComputationError
.This allows to “xfail” tests more precisely on the underlying exception, rather than the ComputationError which wraps it.
- genno.testing.raises_or_warns(value, *args, **kwargs) ContextManager [source]¶
Context manager for tests that
pytest.raises()
orpytest.warns()
.If value is a context manager—such as returned by
pytest.raises()
, it is used directly.Examples
@pytest.mark.parametrize( "input, output", (("FOO", 1), ("BAR", pytest.raises(ValueError))) ) def test_myfunc0(input, expected): with raises_or_warns(expected, DeprecationWarning, match="FOO"): assert expected == myfunc(input)
In this example:
myfunc("FOO")
is expected to emitDeprecationWarning
and return 1.myfunc("BAR")
is expected to raiseValueError
and issue no warning.
@pytest.mark.parametrize( "input, output", (("FOO", 1), ("BAR", pytest.raises(ValueError))) ) def test_myfunc1(input, expected): with raises_or_warns(expected, None): assert expected == myfunc(input)
In this example, no warnings are expected from
myfunc("FOO")
.
- genno.testing.random_qty(shape: dict[str, int], **kwargs) AnyQuantity [source]¶
Return a Quantity with shape and random contents.
- Parameters:
- Returns:
Random data with one dimension for each key in shape, and coords along those dimensions like “foo1”, “foo2”, with total length matching the value from shape. If shape is empty, a scalar (0-dimensional) Quantity.
- Return type:
Testing Juypter notebooks.
Copied 2023-04-27 from the corresponding module in ixmp.
- genno.testing.jupyter.get_cell_output(nb, name_or_index, kind='data')[source]¶
Retrieve a cell from nb according to its metadata name_or_index:
The Jupyter notebook format allows specifying a document-wide unique ‘name’ metadata attribute for each cell:
https://nbformat.readthedocs.io/en/latest/format_description.html #cell-metadata
Return the cell matching name_or_index if
str
; or the cell at theint
index; or raiseValueError
.
- genno.testing.jupyter.run_notebook(nb_path, tmp_path, env=None, **kwargs)[source]¶
Execute a Jupyter notebook via
nbclient
and collect output.- Parameters:
nb_path (
os.PathLike
) – The notebook file to execute.tmp_path (
os.PathLike
) – A directory in which to create temporary output.env (
collections.abc.Mapping
, optional) – Execution environment fornbclient
. Default:os.environ
.kwargs –
Keyword arguments for
nbclient.NotebookClient
. Defaults are set for:- ”allow_errors”
Default
False
. IfTrue
, the execution always succeeds, and cell output contains exception information rather than code outputs.- ”kernel_version”
Jupyter kernel to use. Default: either “python2” or “python3”, matching the current Python major version.
Warning
Any existing configuration for this kernel on the local system— such as an IPython start-up file—will be executed when the kernel starts. Code that enables GUI features can interfere with
run_notebook()
.- ”timeout”
in seconds; default 10.
- Returns:
nb (
nbformat.NotebookNode
) – Parsed and executed notebook.errors (
list
) – Any execution errors.
- class genno.compat.sphinx.autodoc_operator.OperatorDocumenter(directive: DocumenterBridge, name: str, indent: str = '')[source]¶
- genno.compat.sphinx.autodoc_operator.setup(app: sphinx.application.Sphinx)[source]¶
Configure
sphinx.ext.autodoc
to handleOperator
as functions.
Resolve missing references using aliased target names, domains, and/or types.
Expanded from and with thanks for https://stackoverflow.com/a/62301461.
- genno.compat.sphinx.rewrite_refs.apply_alias(config: Mapping[str, str], node) bool [source]¶
Apply config to node.
- genno.compat.sphinx.rewrite_refs.resolve_internal_aliases(app: sphinx.application.Sphinx, doctree)[source]¶
Handler for ‘doctree-read’ events.
- genno.compat.sphinx.rewrite_refs.resolve_intersphinx_aliases(app, env, node, contnode)[source]¶
Handler for ‘missing-reference’ (intersphinx) events.
- genno.compat.sphinx.rewrite_refs.setup(app: sphinx.application.Sphinx)[source]¶
Connect
rewrite_refs
event handlers.