Пример #1
0
def test_save3(pref_workbench, app_dir, monkeypatch):
    """Test saving to a specific file.

    """
    pref_workbench.register(PreferencesManifest())
    c_man = PrefContributor()
    pref_workbench.register(c_man)

    contrib = pref_workbench.get_plugin(c_man.id)
    contrib.string = 'test_save'

    prefs_path = os.path.join(app_dir, 'preferences')
    path = os.path.join(prefs_path, 'custom.ini')

    @classmethod
    def answer(*args, **kwargs):
        return path

    with enaml.imports():
        from exopy.app.preferences.manifest import FileDialogEx
    monkeypatch.setattr(FileDialogEx, 'get_save_file_name', answer)
    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.save', {'path': prefs_path,
                                                       'ask_user': True})

    ref = {c_man.id: {'string': 'test_save', 'auto': ''}}
    assert os.path.isfile(path)
    assert ConfigObj(path).dict() == ref
    assert pref_workbench.get_plugin(PLUGIN_ID).last_directory == \
        prefs_path
Пример #2
0
def instr_workbench(workbench, monkeypatch, app_dir, app):
    """Setup the workbench in such a way that the instrs manager can be tested.

    """
    monkeypatch.setattr(ErrorsPlugin, 'exit_error_gathering', exit_on_err)
    workbench.register(CoreManifest())
    workbench.register(AppManifest())
    workbench.register(PreferencesManifest())
    workbench.register(IconManagerManifest())
    workbench.register(ErrorsManifest())
    workbench.register(StateManifest())
    workbench.register(DependenciesManifest())
    workbench.register(InstrumentManagerManifest())

    yield workbench

    for m_id in ('exopy.instruments', 'exopy.app.dependencies',
                 'exopy.app.errors', 'exopy.app.preferences',
                 'exopy.app.icons', 'exopy.app.states', 'exopy.app'):
        try:
            workbench.unregister(m_id)
        except Exception:
            pass

        # Give some time to the os to release resources linked to file
        # monitoring.
        sleep(0.1)
Пример #3
0
def test_load4(pref_workbench, app_dir, monkeypatch):
    """Test loading preferences from non-default file for started plugin.

    """
    pref_workbench.register(PreferencesManifest())
    c_man = PrefContributor()
    pref_workbench.register(c_man)
    contrib = pref_workbench.get_plugin(c_man.id)

    prefs_path = os.path.join(app_dir, 'preferences')
    path = os.path.join(prefs_path, 'custom.ini')
    conf = ConfigObj(path)
    conf[c_man.id] = {}
    conf[c_man.id]['string'] = 'test'
    conf.write()

    assert contrib.string == ''

    @classmethod
    def answer(*args, **kwargs):
        return path

    with enaml.imports():
        from exopy.app.preferences.manifest import FileDialogEx
    monkeypatch.setattr(FileDialogEx, 'get_open_file_name', answer)
    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.load',
                        {'path': prefs_path, 'ask_user': True}, pref_workbench)

    assert contrib.string == 'test'
    assert pref_workbench.get_plugin(PLUGIN_ID).last_directory == \
        prefs_path
Пример #4
0
def test_app_startup3(pref_workbench, tmpdir, exopy_qtbot):
    """Test app start-up when a preference file already exists.

    """
    manifest = PreferencesManifest()
    pref_workbench.register(manifest)

    # Create a trash app_directory.ini file. The global fixture ensure
    # that it cannot be a user file. Don't use app_dir fixture as I need to
    # test directory creation.
    app_pref = os.path.join(exopy_path(), APP_PREFERENCES, APP_DIR_CONFIG)
    app_dir = str(tmpdir.join('exopy'))
    conf = ConfigObj(encoding='utf8')
    conf.filename = app_pref
    conf['app_path'] = app_dir
    conf.write()

    assert not os.path.isdir(app_dir)

    # Start the app and fake a user answer.
    app = pref_workbench.get_plugin('exopy.app')

    app.run_app_startup(object())

    assert os.path.isdir(app_dir)
Пример #5
0
def test_app_startup1(pref_workbench, tmpdir, exopy_qtbot):
    """Test app start-up when no app_directory.ini exists.

    """
    manifest = PreferencesManifest()
    pref_workbench.register(manifest)

    # Remove any trash app_directory.ini file. The global fixture ensure
    # that it cannot be a user file.
    app_pref = os.path.join(exopy_path(), APP_PREFERENCES, APP_DIR_CONFIG)
    if os.path.isfile(app_pref):
        os.remove(app_pref)

    # Start the app and fake a user answer.
    app = pref_workbench.get_plugin('exopy.app')

    app_dir = str(tmpdir.join('exopy'))

    with handle_dialog(exopy_qtbot,
                       handler=lambda bot, d: setattr(d, 'path', app_dir)):
        app.run_app_startup(object())

    assert os.path.isfile(app_pref)
    assert ConfigObj(app_pref)['app_path'] == app_dir
    assert os.path.isdir(app_dir)
Пример #6
0
def measurement_workbench(workbench, monkeypatch, app_dir):
    """Setup the workbench in such a way that the measurement plugin can be
    tested.

    """
    monkeypatch.setattr(ErrorsPlugin, 'exit_error_gathering', exit_on_err)
    workbench.register(CoreManifest())
    workbench.register(AppManifest())
    workbench.register(PreferencesManifest())
    workbench.register(IconManagerManifest())
    workbench.register(ErrorsManifest())
    workbench.register(DependenciesManifest())
    workbench.register(StateManifest())
    workbench.register(MeasureManifest())
    workbench.register(TextMonitorManifest())

    yield workbench

    for m_id in ('exopy.measurement.monitors.text_monitor',
                 'exopy.measurement', 'exopy.app.dependencies',
                 'exopy.app.errors', 'exopy.app.icons',
                 'exopy.app.preferences', 'exopy.app'):
        try:
            workbench.unregister(m_id)
        except ValueError:
            pass

        # Give some time to the os to release resources linked to file
        # monitoring.
        sleep(0.1)
Пример #7
0
 def setup(self):
     self.workbench = Workbench()
     self.workbench.register(CoreManifest())
     self.workbench.register(AppManifest())
     self.workbench.register(PreferencesManifest())
     self.workbench.register(StateManifest())
     self.workbench.register(LogManifest())
Пример #8
0
def test_lifecycle(pref_workbench, app_dir):
    """Test the plugin lifecycle when no default.ini exist in app folder.

    """
    pref_man = PreferencesManifest()
    pref_workbench.register(pref_man)
    c_man = PrefContributor()
    pref_workbench.register(c_man)

    # Start preferences plugin.
    prefs = pref_workbench.get_plugin(PLUGIN_ID)
    assert prefs.app_directory == app_dir
    assert os.path.isdir(os.path.join(app_dir, 'preferences'))
    core = pref_workbench.get_plugin('enaml.workbench.core')
    assert core.invoke_command('exopy.app.preferences.get',
                               dict(plugin_id='test.prefs')) is not None

    pref_workbench.register(PrefContributor2())
    assert core.invoke_command('exopy.app.preferences.get',
                               dict(plugin_id='test.prefs2')) is not None

    # Stopping
    pref_workbench.unregister(c_man.id)
    with pytest.raises(KeyError):
        core.invoke_command('exopy.app.preferences.get',
                            dict(plugin_id='test.prefs'))
    pref_workbench.unregister(pref_man.id)
    assert not prefs._prefs
    assert not prefs._pref_decls
Пример #9
0
def test_app_startup4(pref_workbench, tmpdir, exopy_qtbot):
    """Test app start-up when user request to reset app folder.

    """
    manifest = PreferencesManifest()
    pref_workbench.register(manifest)

    app_dir = str(tmpdir.join('exopy'))

    # Add a app_directory.ini file.
    app_pref = os.path.join(exopy_path(), APP_PREFERENCES, APP_DIR_CONFIG)
    if not os.path.isfile(app_pref):
        conf = ConfigObj(encoding='utf8')
        conf.filename = app_pref
        conf['app_path'] = app_dir
        conf.write()

    # Start the app and fake a user answer.
    app = pref_workbench.get_plugin('exopy.app')

    class DummyArgs(object):

        reset_app_folder = True

    with handle_dialog(exopy_qtbot,
                       handler=lambda bot, x: setattr(x, 'path', app_dir)):
        app.run_app_startup(DummyArgs)

    assert os.path.isfile(app_pref)
    assert ConfigObj(app_pref)['app_path'] == app_dir
    assert os.path.isdir(app_dir)
Пример #10
0
def test_load2(pref_workbench, app_dir):
    """Test loading preferences from non-existing file.

    """
    pref_workbench.register(PreferencesManifest())
    pref_workbench.register(PrefContributor())

    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.load',
                        {'path': ''}, pref_workbench)

    assert not pref_workbench.get_plugin(PLUGIN_ID)._prefs
Пример #11
0
def icon_workbench(workbench, app_dir):
    """Register the icon mannager plugin and dependencies.

    """
    workbench.register(CoreManifest())
    workbench.register(PreferencesManifest())
    workbench.register(IconManagerManifest())

    yield workbench

    for m_id in ('exopy.app.icons', 'exopy.app.preferences'):
        try:
            workbench.unregister(m_id)
        except Exception:
            pass
Пример #12
0
def test_save2(pref_workbench, app_dir):
    """Test saving to a specific file.

    """
    pref_workbench.register(PreferencesManifest())
    c_man = PrefContributor()
    pref_workbench.register(c_man)

    contrib = pref_workbench.get_plugin(c_man.id)
    contrib.string = 'test_save'

    path = os.path.join(app_dir, 'preferences', 'custom.ini')
    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.save', {'path': path})

    ref = {c_man.id: {'string': 'test_save', 'auto': ''}}
    assert os.path.isfile(path)
    assert ConfigObj(path).dict() == ref
Пример #13
0
def test_update_contrib_and_type_checking(pref_workbench, app_dir):
    """Check that the contributions are correctly updated when a new
    plugin is registered and check that the contribution is of the right
    type.

    """
    pref_man = PreferencesManifest()
    pref_workbench.register(pref_man)
    c_man = PrefContributor()
    pref_workbench.register(c_man)

    # Start preferences plugin.
    pref_workbench.get_plugin(PLUGIN_ID)

    # Test observation of extension point and type checking.
    b_man = BadPrefContributor()
    with pytest.raises(TypeError):
        pref_workbench.register(b_man)
Пример #14
0
def test_app_startup2(pref_workbench, tmpdir, exopy_qtbot):
    """Test app start-up when user quit app.

    """
    manifest = PreferencesManifest()
    pref_workbench.register(manifest)

    # Remove any trash app_directory.ini file. The global fixture ensure
    # that it cannot be a user file.
    app_pref = os.path.join(exopy_path(), APP_PREFERENCES, APP_DIR_CONFIG)
    if os.path.isfile(app_pref):
        os.remove(app_pref)

    # Start the app and fake a user answer.
    app = pref_workbench.get_plugin('exopy.app')

    with pytest.raises(SystemExit):
        with handle_dialog(exopy_qtbot, 'reject'):
            app.run_app_startup(object())
Пример #15
0
def test_load_defaultini(pref_workbench, app_dir):
    """Test that a default.ini file found in the app folder under prefs
    is loaded on startup.

    """
    prefs_path = os.path.join(app_dir, 'preferences')
    os.mkdir(os.path.join(app_dir, 'preferences'))

    conf = ConfigObj(os.path.join(prefs_path, 'default.ini'))
    c_man = PrefContributor()
    conf[c_man.id] = {}
    conf[c_man.id]['string'] = 'This is a test'
    conf.write()

    pref_man = PreferencesManifest()
    pref_workbench.register(pref_man)
    pref_workbench.register(c_man)

    c_pl = pref_workbench.get_plugin(c_man.id)

    assert c_pl.string == 'This is a test'
Пример #16
0
def test_load3(pref_workbench, app_dir):
    """Test loading preferences from non-default file for started plugin.

    """
    pref_workbench.register(PreferencesManifest())
    c_man = PrefContributor()
    pref_workbench.register(c_man)
    contrib = pref_workbench.get_plugin(c_man.id)

    path = os.path.join(app_dir, 'preferences', 'custom.ini')
    conf = ConfigObj(path)
    conf[c_man.id] = {}
    conf[c_man.id]['string'] = 'test'
    conf.write()

    assert contrib.string == ''

    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.load',
                        {'path': path}, pref_workbench)

    assert contrib.string == 'test'
Пример #17
0
def test_auto_sync(pref_workbench, app_dir):
    """Check that auito_sync members are correctly handled.

    """
    pref_workbench.register(PreferencesManifest())
    c_man = PrefContributor()
    pref_workbench.register(c_man)

    contrib = pref_workbench.get_plugin(c_man.id)
    contrib.auto = 'test_auto'

    ref = {c_man.id: {'auto': 'test_auto'}}
    path = os.path.join(app_dir, 'preferences', 'default.ini')
    assert os.path.isfile(path)
    assert ConfigObj(path).dict() == ref

    contrib.auto = 'test'

    ref = {c_man.id: {'auto': 'test'}}
    path = os.path.join(app_dir, 'preferences', 'default.ini')
    assert os.path.isfile(path)
    assert ConfigObj(path).dict() == ref
Пример #18
0
def pulses_workbench(monkeypatch, app_dir):
    """Setup the workbench in such a way that the pulses manager can be tested.

    """
    monkeypatch.setattr(ErrorsPlugin, 'exit_error_gathering', exit_on_err)
    workbench = Workbench()
    workbench.register(CoreManifest())
    workbench.register(AppManifest())
    workbench.register(PreferencesManifest())
    workbench.register(ErrorsManifest())
    workbench.register(StateManifest())
    workbench.register(DependenciesManifest())
    workbench.register(MeasureManifest())
    workbench.register(PulsesManagerManifest())

    yield workbench

    for m_id in ('exopy.pulses', 'exopy.app.dependencies', 'exopy.app.errors',
                 'exopy.app.preferences', 'exopy.app'):
        try:
            workbench.unregister(m_id)
        except Exception:
            pass
Пример #19
0
def test_load1(pref_workbench, app_dir):
    """Test loading default preferences for unstarted plugin.

    """
    # Register and start preferences plugin
    pref_workbench.register(PreferencesManifest())
    pref_workbench.get_plugin(PLUGIN_ID)

    c_man = PrefContributor()
    pref_workbench.register(c_man)

    path = os.path.join(app_dir, 'preferences', 'default.ini')
    conf = ConfigObj(path)
    conf[c_man.id] = {}
    conf[c_man.id]['string'] = 'test'
    conf.write()

    core = pref_workbench.get_plugin('enaml.workbench.core')
    core.invoke_command('exopy.app.preferences.load', {})
    assert pref_workbench.get_plugin(c_man.id, False) is None
    contrib = pref_workbench.get_plugin(c_man.id)

    assert contrib.string == 'test'
Пример #20
0
def main(cmd_line_args=None):
    """Main entry point of the Exopy application.

    """
    # Build parser from ArgParser and parse arguemnts
    parser = ArgParser()
    parser.add_choice('workspaces', 'exopy.measurement.workspace',
                      'measurement')
    parser.add_argument("-s",
                        "--nocapture",
                        help="Don't capture stdout/stderr",
                        action='store_true')
    parser.add_argument("-w",
                        "--workspace",
                        help='Select start-up workspace',
                        default='measurement',
                        choices='workspaces')
    parser.add_argument("-r",
                        "--reset-app-folder",
                        help='Reset the application startup folder.',
                        action='store_true')

    modifiers = []
    for i, ep in enumerate(iter_entry_points('exopy_cmdline_args')):

        try:
            modifier, priority = ep.load(require=False)
            modifiers.append((ep, modifier, priority, i))
        except Exception as e:
            text = 'Error loading extension %s' % ep.name
            content = ('The following error occurred when trying to load the '
                       'entry point {} :\n {}'.format(ep.name, e))
            details = format_exc()
            display_startup_error_dialog(text, content, details)

    modifiers.sort(key=itemgetter(1, 2))
    try:
        for m in modifiers:
            m[1](parser)
    except Exception as e:
        text = 'Error modifying cmd line arguments'
        content = ('The following error occurred when the entry point {} '
                   'tried to add cmd line options :\n {}'.format(ep.name, e))
        details = format_exc()
        display_startup_error_dialog(text, content, details)

    try:
        args = parser.parse_args(cmd_line_args)
    except BaseException as e:
        if e.args == (0, ):
            sys.exit(0)
        text = 'Failed to parse cmd line arguments'
        content = ('The following error occurred when trying to parse the '
                   'command line arguments :\n {}'.format(e))
        details = format_exc()
        display_startup_error_dialog(text, content, details)

    # Patch Thread to use sys.excepthook
    setup_thread_excepthook()

    workbench = Workbench()
    workbench.register(CoreManifest())
    workbench.register(UIManifest())
    workbench.register(AppManifest())
    workbench.register(StateManifest())
    workbench.register(ErrorsManifest())
    workbench.register(PreferencesManifest())
    workbench.register(IconManagerManifest())
    workbench.register(LogManifest())
    workbench.register(PackagesManifest())
    workbench.register(DependenciesManifest())
    workbench.register(InstrumentManagerManifest())
    workbench.register(TasksManagerManifest())
    workbench.register(MeasureManifest())
    workbench.register(TextMonitorManifest())

    ui = workbench.get_plugin(u'enaml.workbench.ui')  # Create the application

    try:
        app = workbench.get_plugin('exopy.app')
        app.run_app_startup(args)
    except Exception as e:
        text = 'Error starting plugins'
        content = ('The following error occurred when executing plugins '
                   'application start ups :\n {}'.format(e))
        details = format_exc()
        display_startup_error_dialog(text, content, details)

    core = workbench.get_plugin('enaml.workbench.core')

    # Install global except hook.
    if not args.nocapture:
        core.invoke_command('exopy.app.errors.install_excepthook', {})

    # Select workspace
    core.invoke_command('enaml.workbench.ui.select_workspace',
                        {'workspace': args.workspace}, workbench)

    ui = workbench.get_plugin(u'enaml.workbench.ui')
    ui.show_window()
    ui.window.maximize()
    ui.start_application()

    core.invoke_command('enaml.workbench.ui.close_workspace', {}, workbench)

    # Unregister all contributed packages
    workbench.unregister('exopy.app.packages')
    workbench.unregister('exopy.measurement.monitors.text_monitor')
    workbench.unregister('exopy.measurement')
    workbench.unregister('exopy.tasks')
    workbench.unregister('exopy.instruments')
    workbench.unregister('exopy.app.icons')
    workbench.unregister('exopy.app.preferences')
    workbench.unregister('exopy.app.states')
    workbench.unregister('exopy.app.dependencies')
    workbench.unregister('exopy.app.errors')
    workbench.unregister('exopy.app.logging')
    workbench.unregister('exopy.app')
    workbench.unregister(u'enaml.workbench.ui')
    workbench.unregister(u'enaml.workbench.core')