summaryrefslogtreecommitdiffstats
path: root/examples/pykde-sampler/lib.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pykde-sampler/lib.py')
-rw-r--r--examples/pykde-sampler/lib.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/examples/pykde-sampler/lib.py b/examples/pykde-sampler/lib.py
new file mode 100644
index 0000000..875ae1a
--- /dev/null
+++ b/examples/pykde-sampler/lib.py
@@ -0,0 +1,105 @@
+#!/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, ), 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')