Source code for capsul.engine.module.matlab

# -*- coding: utf-8 -*-
from __future__ import absolute_import

import capsul.engine
import os

# from soma.controller import Controller
# from traits.api import File, Undefined, Instance


def init_settings(capsul_engine):
    with capsul_engine.settings as settings:
        settings.ensure_module_fields(
            "matlab",
            [
                dict(
                    name="executable",
                    type="str",
                    description="Full path of the matlab executable",
                ),
                dict(
                    name="mcr_directory",
                    type="str",
                    description="Full path of the matlab MCR directory, for use "
                    "with standalone binaries",
                ),
            ],
        )


[docs] def check_configurations(): """ Check if the activated configuration is valid for Matlab and return an error message if there is an error or None if everything is good. """ matlab_executable = capsul.engine.configurations.get( "capsul.engine.module.matlab", {} ).get("executable") mcr = capsul.engine.configurations.get("capsul.engine.module.matlab", {}).get( "mcr_directory" ) if not matlab_executable and not mcr: return "both matlab.executable and matlab.mcr_directory are not defined" if matlab_executable and not os.path.exists(matlab_executable): return ( 'Matlab executable is defined as "%s" but this path does not exist' % matlab_executable ) return None
[docs] def check_notably_invalid_config(conf): """ Checks if the given module config is obviously invalid, for instance if a mandatory path is not filled Returns ------- invalid: list list of invalid config keys """ invalid = [] for k in ("executable", "mcr_directory"): if conf.get(k) is None: invalid.append(k) if len(invalid) == 1: # if one of the paths is filled, then it should be OK. # however it may depend on uses (SPM standalone needs mcr_directory, # for instance) return [] return invalid
[docs] def edition_widget(engine, environment, config_id="matlab"): """Edition GUI for matlab config - see :class:`~capsul.qt_gui.widgets.settings_editor.SettingsEditor` """ from soma.qt_gui.controller_widget import ScrollControllerWidget from soma.controller import Controller import types import traits.api as traits def validate_config(widget): widget.update_controller() controller = widget.controller_widget.controller with widget.engine.settings as session: conf = session.config(config_id, widget.environment) values = {"config_id": config_id} if controller.executable in (None, traits.Undefined, ""): values["executable"] = None else: values["executable"] = controller.executable if controller.mcr_directory in (None, traits.Undefined, ""): values["mcr_directory"] = None else: values["mcr_directory"] = controller.mcr_directory if conf is None: session.new_config(config_id, widget.environment, values) else: for k in ( "executable", "mcr_directory", ): # don't check invalid files: they may be valid on a remote # server # if (k == 'mcr_directory' and # values[k] and # not os.path.isdir(values[k])): # raise NotADirectoryError('\nMatlab mcr_directory ' #'was not updated:\n{} is ' #'not existing!'.format( # values[k])) # elif (k == 'executable' and # values[k] and # not os.path.isfile(values[k])): # raise FileNotFoundError('\nMatlab executable ' #'was not updated:\n{} is ' #'not existing!'.format( # values[k])) # else: setattr(conf, k, values[k]) controller = Controller() controller.add_trait( "executable", traits.File(desc="Full path of the matlab executable") ) controller.add_trait( "mcr_directory", traits.Directory( desc="Full path of the matlab MCR " "directory, or use with standalone " "binaries" ), ) conf = engine.settings.select_configurations(environment, {"matlab": "any"}) if conf: controller.executable = conf.get("capsul.engine.module.matlab", {}).get( "executable", traits.Undefined ) controller.mcr_directory = conf.get("capsul.engine.module.matlab", {}).get( "mcr_directory", traits.Undefined ) widget = ScrollControllerWidget(controller, live=True) widget.engine = engine widget.environment = environment widget.accept = types.MethodType(validate_config, widget) return widget