Source code for nipype.interfaces.mixins.reporting

# -*- coding: utf-8 -*-
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vi: set ft=python sts=4 ts=4 sw=4 et:
""" class mixin and utilities for enabling reports for nipype interfaces """
from __future__ import (print_function, division, unicode_literals,
                        absolute_import)

import os
from abc import abstractmethod

from ... import logging
from ..base import (
    File, BaseInterface, BaseInterfaceInputSpec, TraitedSpec)

iflogger = logging.getLogger('nipype.interface')


class ReportCapableInputSpec(BaseInterfaceInputSpec):
    out_report = File('report', usedefault=True, hash_files=False,
                      desc='filename for the visual report')


class ReportCapableOutputSpec(TraitedSpec):
    out_report = File(desc='filename for the visual report')


class ReportCapableInterface(BaseInterface):
    """Mixin to enable reporting for Nipype interfaces"""
    _out_report = None

    def __init__(self, generate_report=False, **kwargs):
        super(ReportCapableInterface, self).__init__(**kwargs)
        self.generate_report = generate_report

    def _post_run_hook(self, runtime):
        runtime = super(ReportCapableInterface, self)._post_run_hook(runtime)

        # leave early if there's nothing to do
        if not self.generate_report:
            return runtime

        self._out_report = self.inputs.out_report
        if not os.path.isabs(self._out_report):
            self._out_report = os.path.abspath(os.path.join(runtime.cwd,
                                                            self._out_report))

        self._generate_report()

        return runtime

    def _list_outputs(self):
        try:
            outputs = super(ReportCapableInterface, self)._list_outputs()
        except NotImplementedError:
            outputs = {}
        if self._out_report is not None:
            outputs['out_report'] = self._out_report
        return outputs

    @abstractmethod
    def _generate_report(self):
        """
        Saves report to file identified by _out_report instance variable
        """
        raise NotImplementedError