import doctest import gc import os import sys import time import zipfile LOOPS = 10 test_src = """\ def get_name(): return __name__ def get_file(): return __file__ """ TESTMOD = "ziptestmodule" TEMP_ZIP = os.path.abspath("junk95142.zip") pyc_ext = ('.pyc' if __debug__ else '.pyo') compression = zipfile.ZIP_STORED NOW = time.time() def modules_setup(): return sys.modules.copy(), def modules_cleanup(oldmodules): encodings = [(k, v) for k, v in sys.modules.items() if k.startswith('encodings.')] sys.modules.clear() sys.modules.update(encodings) sys.modules.update(oldmodules) def doTest(expected_ext, files, *modules, **kw): z = zipfile.ZipFile(TEMP_ZIP, "w") old_path = sys.path.copy() try: for name, (mtime, data) in files.items(): zinfo = zipfile.ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = compression z.writestr(zinfo, data) z.close() stuff = kw.get("stuff", None) if stuff is not None: with open(TEMP_ZIP, "rb") as f: data = f.read() with open(TEMP_ZIP, "wb") as f: f.write(stuff) f.write(data) sys.path.insert(0, TEMP_ZIP) name = ".".join(modules) mod = __import__(name, globals(), locals(), ["__dummy__"]) call = kw.get('call') if call is not None: call(mod) if expected_ext: file = mod.get_file() finally: z.close() os.remove(TEMP_ZIP) mod = None sys.path = old_path def runDoctest(callback): files = {TESTMOD + ".py": (NOW, test_src), "xyz.txt": (NOW, ">>> log.append(True)\n")} doTest(".py", files, TESTMOD, call=callback) def doDoctestFile( module): log = [] old_master, doctest.master = doctest.master, None try: doctest.testfile( 'xyz.txt', package=module, module_relative=True, globs=locals() ) finally: doctest.master = old_master def doDoctestSuite(module): log = [] doctest.DocFileTest( 'xyz.txt', package=module, module_relative=True, globs=locals() ).run() for _ in range(LOOPS): modules_before=modules_setup() runDoctest(doDoctestSuite) modules_cleanup(*modules_before) modules_before=modules_setup() runDoctest(doDoctestFile) modules_cleanup(*modules_before) gc.collect()