#!/usr/bin/env python from distutils.core import setup, Command from os.path import splitext, basename, join as pjoin, walk import os, sys import glob from unittest import TestLoader, TextTestRunner, TestSuite from subprocess import Popen COVERAGE_IGNORE=[ "tutorius/apilib", "tutorius/viewer.py", "tutorius/creator.py", "tutorius/overlayer.py", "tutorius/addons", ] class TestCommand(Command): user_options = [('coverage', None, 'enable code coverage reporting'), ('prefix=', 'p', 'set sugar installation prefix, for dependency loading'), ('single=', 't', 'run a single test'), ] description = 'runs tests from the test directory' def initialize_options(self): self._dir = os.getcwd() self.coverage = False self.single = False self.prefix = None def finalize_options(self): if not self.prefix: print sys.exit(1) def run(self): ''' Finds all the tests modules in tests/, and runs them. ''' prefix = os.path.join(self.prefix,'lib', 'python%d.%d'%sys.version_info[:2], 'site-packages') sys.path.insert(1, prefix) os.environ.setdefault('SUGAR_PREFIX', self.prefix) # start another X server so test that manipulates the shell can mess it # up as they wish. # :111 should be high enough, unless we already run sugar-emulator 10 # times. x_server = Popen(executable='Xephyr', args=['Xephyr', ':111']) os.environ['DISPLAY'] = ':111' if self.coverage: import coverage coverage.erase() coverage.start() loader = TestLoader() suite = TestSuite() if not self.single: skipped = file('tests/skip', 'r').read().split('\n') for t in glob.glob(pjoin(self._dir, 'tests', '*.py')): if not t.endswith('__init__.py') and basename(t) not in skipped: modname = '.'.join(['tests', splitext(basename(t))[0]]) mod = __import__(modname, {'sys':sys}, fromlist=[modname]) print "loading %s" % modname suite.addTest(loader.loadTestsFromModule(mod)) else: print "skipping %s" % t else: modname = '.'.join(['tests', self.single]) mod = __import__(modname, {'sys':sys}, fromlist=[modname]) print "loading %s" % modname suite.addTest(loader.loadTestsFromModule(mod)) t = TextTestRunner(verbosity = 1) t.run(suite) if self.coverage: coverage.stop() sources = [] #To reduce report format, change to the tutorius dir before reporting curdir = os.getcwd() os.chdir(os.path.join(prefix, 'sugar')) os.path.walk('tutorius', self._listsources, sources) coverage.report(sources) os.chdir(curdir) coverage.erase() x_server.terminate() def _listsources(self, arg, dirname, fnames): for name in list(fnames): if os.path.join(dirname, name) in COVERAGE_IGNORE: fnames.remove(name) fnames = filter(lambda x:x.endswith('.py'), fnames) for name in fnames: arg.append(pjoin(dirname, name)) setup(name='Tutorius', version='0.0', description='Interactive tutor and Tutorial creator', maintainer='Simon Poirier', maintainer_email='simpoir@gmail.com', author='Tutorius team', author_email='sugar-narratives@googlegroups.com', url='http://tutorius.org', license='GPLv3', packages=[ 'sugar.tutorius', 'sugar.tutorius.uam', 'sugar.tutorius.addons', 'sugar.tutorius.apilib', 'sugar.tutorius.apilib.httplib2', ], package_dir={ 'sugar.tutorius': 'tutorius', 'sugar.tutorius.addons': 'addons', }, cmdclass = {'test': TestCommand}, data_files=[('share/icons/sugar/scalable/actions', glob.glob('data/icons/*.svg')), ('share/icons/sugar/scalable/device', ['data/icons/tutortool.svg']), ('share/tutorius/ui', glob.glob('data/ui/*.glade')), ('share/sugar/extensions/deviceicon', glob.glob('src/extensions/*')), ] ) # vim: set et sw=4 sts=4 ts=4: