You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pytde/examples/pytde-sampler/lib.py

106 lines
2.6 KiB

#!/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')