diff --git a/generate-single-file.py b/generate-single-file.py new file mode 100755 index 0000000..5601d79 --- /dev/null +++ b/generate-single-file.py @@ -0,0 +1,52 @@ +#! /usr/bin/env python + +import os +import cPickle +import zlib +import base64 + +def get_last_commit(): + lines = os.popen("git log -1").readlines() + lines = ["# "+x for x in lines] + return "".join(lines) + +def main(): + os.chdir(os.path.dirname(os.path.abspath(__file__))) + + last_commit = get_last_commit() + + + assert os.path.isfile("py.test-in"), "not found" + assert os.path.isdir("py"), "please copy the py directory" + + files = [] + for dirpath, dirnames, filenames in os.walk("py"): + for f in filenames: + if not f.endswith(".py"): + continue + + fn = os.path.join(dirpath, f) + files.append(fn) + + name2src = {} + for f in files: + k = f.replace('/', '.')[:-3] + name2src[k] = open(f).read() + + data = cPickle.dumps(name2src, 2) + data = zlib.compress(data, 9) + data = base64.encodestring(data) + + data = '%s' % (data) + + + exe = open("py.test-in").read() + exe = exe.replace('@SOURCES@', data) + exe = exe.replace('@LAST-COMMIT@', last_commit) + + open("py.test", "w").write(exe) + os.chmod("py.test", 0755) + print "generated", os.path.abspath("py.test") + +if __name__=='__main__': + main() diff --git a/py.test-in b/py.test-in new file mode 100755 index 0000000..23e45fe --- /dev/null +++ b/py.test-in @@ -0,0 +1,53 @@ +#! /usr/bin/env python + +@LAST-COMMIT@ + +sources = """ +@SOURCES@""" + +import sys +import cPickle +import base64 +import zlib +import imp + +sources = cPickle.loads(zlib.decompress(base64.decodestring(sources))) + +class DictImporter(object): + sources = sources + def find_module(self, fullname, path=None): + if fullname in self.sources: + return self + if fullname+'.__init__' in self.sources: + return self + return None + + def load_module(self, fullname): + # print "load_module:", fullname + import new, sys + + try: + s = self.sources[fullname] + is_pkg = False + except KeyError: + s = self.sources[fullname+'.__init__'] + is_pkg = True + + co = compile(s, fullname, 'exec') + module = sys.modules.setdefault(fullname, new.module(fullname)) + module.__file__ = "%s/%s" % (__file__, fullname) + module.__loader__ = self + if is_pkg: + module.__path__ = [fullname] + + exec co in module.__dict__ + return sys.modules[fullname] + return module + +importer = DictImporter() + +sys.meta_path.append(importer) + +if __name__ == "__main__": + import py + py.cmdline.pytest() diff --git a/py/impl/test/conftesthandle.py b/py/impl/test/conftesthandle.py index 6003e5e..f6139db 100644 --- a/py/impl/test/conftesthandle.py +++ b/py/impl/test/conftesthandle.py @@ -41,7 +41,12 @@ class Conftest(object): if path is None: raise ValueError("missing default conftest.") dp = path.dirpath() - if dp == path: + if dp == path: + if not defaultconftestpath.check(): # zip file, single-file py.test? + import defaultconftest + if self._onimport: + self._onimport(defaultconftest) + return [defaultconftest] return [self.importconftest(defaultconftestpath)] clist = self.getconftestmodules(dp) conftestpath = path.join("conftest.py")