|
|
|
#!/usr/bin/env python
|
|
|
|
"""
|
|
|
|
|
|
|
|
"""
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from os import listdir, walk
|
|
|
|
from os.path import dirname, isdir, abspath, split, join, exists
|
|
|
|
|
|
|
|
|
|
|
|
samplerpath = dirname(abspath(__file__))
|
|
|
|
packagepath, packagename = split(samplerpath)
|
|
|
|
|
|
|
|
samplerpath += os.path.sep
|
|
|
|
packagepath += os.path.sep
|
|
|
|
|
|
|
|
|
|
|
|
def namedimport(name):
|
|
|
|
""" import a module given a dotted package name
|
|
|
|
|
|
|
|
Taken directly from the Python library docs for __import __
|
|
|
|
"""
|
|
|
|
mod = __import__(name)
|
|
|
|
components = name.split('.')
|
|
|
|
for comp in components[1:]:
|
|
|
|
mod = getattr(mod, comp)
|
|
|
|
return mod
|
|
|
|
|
|
|
|
|
|
|
|
def ispackage(path):
|
|
|
|
return isdir(path) and exists(join(path, '__init__.py'))
|
|
|
|
|
|
|
|
|
|
|
|
def ismodule(path):
|
|
|
|
head, tail = os.path.split(path)
|
|
|
|
if tail in ('__init__.py', '__init__.pyc', '__init__.pyo'):
|
|
|
|
return False
|
|
|
|
head, tail = os.path.splitext(path)
|
|
|
|
return tail in ('.py', ) # don't use these, which filters them out dupes ( '.pyc', '.pyo')
|
|
|
|
|
|
|
|
|
|
|
|
def listimports(top):
|
|
|
|
top = abspath(top)
|
|
|
|
yield top
|
|
|
|
for path in listdir(top):
|
|
|
|
path = join(top, path)
|
|
|
|
if ispackage(path):
|
|
|
|
yield path
|
|
|
|
for subpath in listimports(path):
|
|
|
|
yield subpath
|
|
|
|
elif ismodule(path):
|
|
|
|
yield path
|
|
|
|
|
|
|
|
|
|
|
|
def listmodules():
|
|
|
|
if samplerpath not in sys.path:
|
|
|
|
sys.path.append(samplerpath)
|
|
|
|
|
|
|
|
dirs = [join(samplerpath, d) for d in listdir(samplerpath)]
|
|
|
|
dirs = [d for d in dirs if exists(join(d, '__init__.py'))]
|
|
|
|
|
|
|
|
modules = []
|
|
|
|
for dirname in dirs:
|
|
|
|
dirpath = join(samplerpath, dirname)
|
|
|
|
for path in listimports(dirpath):
|
|
|
|
path = path.replace('.py', '')
|
|
|
|
path = path.replace(samplerpath, '').replace(os.path.sep, '.')
|
|
|
|
try:
|
|
|
|
module = namedimport(path)
|
|
|
|
except (ValueError, ImportError, ) as exc:
|
|
|
|
print(('Exception %s importing %s' % (exc, path, )))
|
|
|
|
else:
|
|
|
|
modules.append((path, module))
|
|
|
|
modules.sort()
|
|
|
|
return [(path, SamplerModule(module)) for path, module in modules]
|
|
|
|
|
|
|
|
|
|
|
|
class SamplerModule(object):
|
|
|
|
defaultIcon = 'filenew'
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, module):
|
|
|
|
self.module = module
|
|
|
|
|
|
|
|
|
|
|
|
def name(self):
|
|
|
|
return self.module.__name__.split('.')[-1]
|
|
|
|
|
|
|
|
|
|
|
|
def labelText(self):
|
|
|
|
return getattr(self.module, 'labelText', self.name())
|
|
|
|
|
|
|
|
|
|
|
|
def icon(self):
|
|
|
|
return getattr(self.module, 'iconName', self.defaultIcon)
|
|
|
|
|
|
|
|
|
|
|
|
def builder(self):
|
|
|
|
for name in ('buildWidget', 'buildDialog', 'buildApp', 'MainFrame'):
|
|
|
|
try:
|
|
|
|
return getattr(self.module, name)
|
|
|
|
except (AttributeError, ):
|
|
|
|
pass
|
|
|
|
raise AttributeError('No builder found')
|