Source code for dispel.sphinxext.dispel_measures
"""Extensions to Sphinx to automatically document measures."""
from importlib import import_module
from docutils.parsers.rst import directives  # type: ignore
from sphinx.application import Sphinx
from dispel.processing.trace import (
    MeasureTrace,
    get_ancestor_source_graph,
    get_edge_parameters,
    get_traces,
    inspect,
)
from dispel.sphinxext.dispel_directive import DispelDirective
from dispel.sphinxext.templates import MEASURES_DETAIL
[docs]
def get_variable(path):
    """Get the actual variable for a specified string.
    Parameters
    ----------
    path
        The full module path and variable name of the variable of interest.
    Returns
    -------
    object
        The actual value at the specified ``path``.
    """
    module_path, variable = path.rsplit(".", 1)
    module = import_module(module_path)
    return getattr(module, variable) 
[docs]
class MeasureListDirective(DispelDirective):
    """A directive to automatically document measure lists."""
    option_spec = {
        "steps": directives.unchanged_required,
        "name": directives.unchanged_required,
    }
[docs]
    def run(self):
        """Run the directive."""
        # determine measures
        steps_path = self.options["steps"]
        steps = get_variable(steps_path)
        graph = inspect(steps)  # type: ignore
        def _trace_to_tuple(trace: MeasureTrace):
            agg = get_ancestor_source_graph(graph, trace)
            parameters = get_edge_parameters(agg)
            return trace.step, trace.measure, parameters
        measures = list(_trace_to_tuple(t) for t in get_traces(graph, MeasureTrace))
        rst_text = MEASURES_DETAIL.render(
            name=self.options["name"], measures=measures, graph=graph
        )
        return self._parse(rst_text, "<measure-list>") 
 
[docs]
def setup(app: Sphinx):
    """Run the set-up of the extension."""
    app.add_directive("measure-list", MeasureListDirective)