

def _addplugin(plugin, _larch=None, **kws):
    'add plugin components from plugin directory'
    if (_larch is None):
        raise Warning('cannot add plugins. larch broken?')
    write = _larch.writer.write
    errmsg = 'is not a valid larch plugin\n'
    pjoin = os.path.join
    path = site_config.plugins_path
    _sysconf = _larch.symtable._sys.config
    if (not hasattr(_larch.symtable._sys, 'import_ok')):
        _larch.symtable._sys.import_ok = True
    if (not _larch.symtable._sys.import_ok):
        return
    if (not hasattr(_sysconf, 'plugins_path')):
        _sysconf.plugins_path = site_config.plugins_path

    def _find_plugin(plugin, p_path):
        'find the plugin from path\n        returns True, package name for packages\n                False, (fh, modpath, desc) for imported modules\n                None, None for Not Found\n        '
        if (not _larch.symtable._sys.import_ok):
            return
        if (plugin == '__init__'):
            return (None, None)
        (mod, is_pkg) = (None, False)
        try:
            mod = imp.find_module(plugin, [p_path])
        except ImportError:
            is_pkg = os.path.isdir(pjoin(p_path, plugin))
        if (is_pkg or ((mod is not None) and (mod[2][2] == imp.PKG_DIRECTORY))):
            return (True, pjoin(p_path, plugin))
        elif (mod is not None):
            return (False, mod)
        else:
            return (None, None)

    def on_error(msg):
        _larch.raise_exception(None, exc=ImportError, msg=msg)
        _larch.symtable._sys.import_ok = False

    def _check_requirements(ppath):
        'check for requirements.txt, return True only if all\n        requirements are met\n        '
        req_file = os.path.abspath(os.path.join(ppath, PLUGINSREQ))
        if (not os.path.exists(req_file)):
            return True
        if os.path.exists(req_file):
            with open(req_file, 'r') as fh:
                for line in fh.readlines():
                    line = line[:(- 1)]
                    if line.startswith('#'):
                        continue
                    match = REQMATCH(line)
                    if (match is None):
                        continue
                    ok = False
                    (modname, cmp, req_vers) = match.groups()
                    try:
                        mod = __import__(modname)
                        vers = getattr(mod, '__version__', None)
                        if (cmp == '>'):
                            ok = (vers > req_vers)
                        elif (cmp == '<'):
                            ok = (vers < req_vers)
                        elif (cmp == '>='):
                            ok = (vers >= req_vers)
                        elif (cmp == '<='):
                            ok = (vers <= req_vers)
                        elif (cmp == '=='):
                            ok = (vers == req_vers)
                        elif (cmp == '='):
                            ok = (vers == req_vers)
                        elif (cmp == '!='):
                            ok = (vers != req_vers)
                    except:
                        ok = False
                    if (not ok):
                        return False
        return True

    def _plugin_file(plugin, path=None):
        'defined here to allow recursive imports for packages'
        fh = None
        if (plugin == '__init__'):
            return
        if (not _larch.symtable._sys.import_ok):
            return
        if (path is None):
            try:
                path = _larch.symtable._sys.config.plugins_path
            except:
                path = site_config.plugins_path
        for p_path in path:
            (is_pkg, mod) = _find_plugin(plugin, p_path)
            if (is_pkg is not None):
                break
        if ((is_pkg is None) and (mod is None)):
            write(('Warning: plugin %s not found\n' % plugin))
            return False
        retval = True
        if is_pkg:
            if _check_requirements(plugin):
                filelist = []
                if (PLUGINSTXT in sorted(os.listdir(mod))):
                    pfile = os.path.abspath(os.path.join(mod, PLUGINSTXT))
                    try:
                        with open(pfile, 'r') as pluginsfile:
                            for name in pluginsfile:
                                name = name[:(- 1)].strip()
                                if ((not name.startswith('#')) and name.endswith('.py') and (len(name) > 3)):
                                    filelist.append(name)
                    except:
                        write(('Warning:: Error reading plugin file:\n %s\n' % pfile))
                if (len(filelist) == 0):
                    for fname in sorted(os.listdir(mod)):
                        if (fname.endswith('.py') and (len(fname) > 3)):
                            filelist.append(fname)
                retvals = []
                for fname in filelist:
                    if (not _larch.symtable._sys.import_ok):
                        return
                    try:
                        ret = _plugin_file(fname[:(- 3)], path=[mod])
                    except:
                        (err, exc, tback) = sys.exc_info()
                        write(('Warning: %s is =not= a valid plugin\n' % pjoin(mod, fname)))
                        write(('   error:  %s\n' % repr(sys.exc_info()[1])))
                        ret = False
                        _larch.symtable._sys.import_ok = False
                    retvals.append(ret)
                retval = all(retvals)
        else:
            (fh, modpath, desc) = mod
            try:
                out = imp.load_module(plugin, fh, modpath, desc)
                _larch.symtable.add_plugin(out, on_error, **kws)
            except:
                (err, exc, tback) = sys.exc_info()
                lineno = getattr(exc, 'lineno', 0)
                offset = getattr(exc, 'offset', 0)
                etext = getattr(exc, 'text', '')
                emsg = getattr(exc, 'message', '')
                try:
                    write(traceback.print_tb(tback))
                except:
                    pass
                write(("Python Error at plugin '%s', line %d\n  %s %s^\n%s: %s\n" % (modpath, lineno, etext, (' ' * offset), err.__name__, emsg)))
                retval = False
                _larch.symtable._sys.import_ok = False
        if _larch.error:
            retval = False
            err = _larch.error.pop(0)
            (fname, lineno) = (err.fname, err.lineno)
            output = [('Error Adding Plugin %s from file %s' % (plugin, fname)), ('%s' % err.get_error()[1])]
            for err in _larch.error:
                if (((err.fname != fname) or (err.lineno != lineno)) and (err.lineno > 0) and (lineno > 0)):
                    output.append(('%s' % err.get_error()[1]))
            write('\n'.join(output))
        if (fh is not None):
            fh.close()
        return retval
    return _plugin_file(_sysconf)

dataset/ETHPy150Open xraypy/xraylarch/lib/builtins.py _addplugin/VarMisuse@1509/2103 `plugin`->`_sysconf`