# Copyright (C) 2005-2012 Aaron Bentley # Chris Ball # Gianluca Montecchi # Marien Zwart # W. Trevor King # # This file is part of Bugs Everywhere. # # Bugs Everywhere is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation, either version 2 of the License, or (at your option) any # later version. # # Bugs Everywhere is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License along with # Bugs Everywhere. If not, see . """ Allow simple listing and loading of the various becommands and libbe submodules (i.e. "plugins"). """ import os import os.path import sys import zipfile _PLUGIN_PATH = os.path.realpath( os.path.dirname( os.path.dirname( os.path.dirname(__file__)))) if _PLUGIN_PATH not in sys.path: sys.path.append(_PLUGIN_PATH) def import_by_name(modname): """ >>> mod = import_by_name('libbe.bugdir') >>> 'BugDir' in dir(mod) True >>> import_by_name('libbe.highly_unlikely') Traceback (most recent call last): ... ImportError: No module named highly_unlikely """ module = __import__(modname) components = modname.split('.') for comp in components[1:]: module = getattr(module, comp) return module def ziplistdir(path): """Lists items in a directory contained in a zip file""" zipidx=path.find('.zip') zippath=path[:4+zipidx] path=path[5+zipidx:].replace(os.sep, '/') with zipfile.ZipFile(zippath, 'r') as zf: files=[f[len(path)+1:] for f in zf.namelist() if f[:len(path)]==path and '/' not in f[len(path)+1:]] return files def modnames(prefix): """ >>> 'list' in [n for n in modnames('libbe.command')] True >>> 'plugin' in [n for n in modnames('libbe.util')] True """ components = prefix.split('.') modfilespath=os.path.join(_PLUGIN_PATH, *components) # Cope if we are executing from inside a zip archive full of precompiled .pyc's modfiles=ziplistdir(modfilespath) if '.zip' in modfilespath else os.listdir(modfilespath) modfiles.sort() # Eliminate .py/.pyc duplicates print modfiles x=1 while x