#!/usr/bin/python

"""Simple test runner that automatically finds tests."""

import doctest
import os
import sys
import unittest

def find_modules(path):
    for dirpath, dirnames, filenames in os.walk(path):
        dirnames[:] = [d for d in dirnames
            if os.path.exists(os.path.join(dirpath, d, '__init__.py'))]

        for filename in filenames:
            if filename.endswith('.py'):
                yield (os.path.normpath(os.path.join(dirpath, filename))
                    .replace('.py', '').replace('/', '.'))

class TestProgram(unittest.TestProgram):
    def __init__(self):
        unittest.TestProgram.__init__(self, defaultTest='auto')

    def createTests(self):
        if self.testNames != ('auto',):
            return unittest.TestProgram.createTests(self)

        self.test = unittest.TestSuite()
        loader = unittest.TestLoader()

        for name in find_modules('.'):
            __import__(name)
            module = sys.modules[name]

            try:
                self.test.addTest(doctest.DocTestSuite(module))
            except ValueError:
                pass

            self.test.addTests(loader.loadTestsFromModule(module))

if __name__ == '__main__':
    TestProgram()

