Source code for capsul.engine.module.attributes
# -*- coding: utf-8 -*-
'''
Attributes completion config module
'''
from __future__ import absolute_import
import os
import six
from capsul.attributes.attributes_factory import AttributesFactory
from capsul.attributes.attributes_schema import AttributesSchema, \
ProcessAttributes
from capsul.attributes.completion_engine \
import ProcessCompletionEngineFactory, PathCompletionEngineFactory
from capsul.engine import settings
import capsul.engine
import os.path as osp
from functools import partial
import weakref
def init_settings(capsul_engine):
default_paths = ['capsul.attributes.completion_engine_factory']
init_att = {
'attributes_schema_paths': default_paths,
'attributes_schemas': {},
'process_completion': 'builtin',
capsul_engine.settings.config_id_field: 'attributes',
}
with capsul_engine.settings as session:
session.ensure_module_fields('attributes',
[dict(name='attributes_schema_paths',
type='list_string',
description='attributes shchemas modules names'),
dict(name='attributes_schemas',
type='json',
description='attributes shchemas names'),
dict(name='process_completion',
type='string',
description='process completion model name'),
dict(name='path_completion',
type='string',
description='path completion model name'),
])
config = session.config('attributes', 'global')
if not config:
session.new_config('attributes', 'global', init_att)
if not hasattr(capsul_engine, '_modules_data'):
capsul_engine._modules_data = {}
data = capsul_engine._modules_data.setdefault('attributes', {})
factory = AttributesFactory()
data['attributes_factory'] = factory
factory.class_types['schema'] = AttributesSchema
factory.class_types['process_completion'] \
= ProcessCompletionEngineFactory
factory.class_types['path_completion'] \
= PathCompletionEngineFactory
factory.class_types['process_attributes'] \
= ProcessAttributes
factory.module_path = default_paths
capsul_engine.settings.module_notifiers.setdefault(
'capsul.engine.module.attributes', []).append(
partial(_sync_attributes_factory, weakref.proxy(capsul_engine)))
# link with StudyConfig
if hasattr(capsul_engine, 'study_config') \
and 'AttributesConfig' not in capsul_engine.study_config.modules:
scmod = capsul_engine.study_config.load_module('AttributesConfig', {})
scmod.initialize_module()
scmod.initialize_callbacks()
#def check_configurations():
#'''
#Checks if the activated configuration is valid to use BrainVisa and returns
#an error message if there is an error or None if everything is good.
#'''
#return None
#def complete_configurations():
#'''
#Try to automatically set or complete the capsul.engine.configurations for
#the attributes module.
#'''
#config = capsul.engine.configurations
#config = config.setdefault('attributes', {})
#attributes_schema_paths = config.get('attributes_schema_paths', None)
#if attributes_schema_paths is None:
#config['attributes_schema_paths'] \
#= ['capsul.attributes.completion_engine_factory']
#attributes_schemas = config.get('attributes_schemas', None)
#if attributes_schemas is None:
#config['attributes_schemas'] = {}
def _sync_attributes_factory(capsul_engine, param=None, value=None):
factory = capsul_engine._modules_data['attributes']['attributes_factory']
with capsul_engine.settings as session:
config = session.config('attributes', 'global')
if config:
factory.module_path = config.attributes_schema_paths
[docs]
def edition_widget(engine, environment, config_id='attributes'):
''' Edition GUI for attributes 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}
values['attributes_schema_paths'] \
= controller.attributes_schema_paths
values['attributes_schemas'] = controller.attributes_schemas
values['process_completion'] = controller.process_completion
if controller.process_completion is traits.Undefined:
values['process_completion'] = None
values['path_completion'] = controller.path_completion
if controller.path_completion is traits.Undefined:
values['path_completion'] = None
if conf is None:
session.new_config(config_id, widget.environment, values)
else:
for k in ('attributes_schema_paths', 'attributes_schemas',
'process_completion', 'path_completion'):
setattr(conf, k, values[k])
controller = Controller()
controller.add_trait(
'attributes_schema_paths',
traits.List(traits.Str(), desc='attributes shchemas modules names'))
controller.add_trait(
'attributes_schemas',
traits.DictStrStr(desc='attributes shchemas names'))
controller.add_trait(
'process_completion',
traits.Str(desc='process completion model name'))
controller.add_trait(
'path_completion',
traits.Str(desc='path completion model name',
optional=True))
conf = engine.settings.select_configurations(
environment, {'attributes': 'any'})
if conf:
aconf = conf.get(
'capsul.engine.module.attributes', {})
controller.attributes_schema_paths = aconf.get(
'attributes_schema_paths', [])
controller.attributes_schemas = aconf.get(
'attributes_schemas', {})
controller.process_completion = aconf.get(
'process_completion', 'builtin')
controller.path_completion = aconf.get(
'path_completion', traits.Undefined)
widget = ScrollControllerWidget(controller, live=True)
widget.engine = engine
widget.environment = environment
widget.accept = types.MethodType(validate_config, widget)
return widget