From cc82f1601cffffcbb3794b4654b64b837c070e5a Mon Sep 17 00:00:00 2001 From: Ralf Schmitt Date: Sun, 27 Dec 2009 23:03:04 +0100 Subject: [PATCH] add script to generate standalone py.test --HG-- branch : trunk --- bin-for-dist/generate_standalone_pytest.py | 42 ++++++++++++++++++ bin-for-dist/py.test-in | 50 ++++++++++++++++++++++ py/impl/test/conftesthandle.py | 7 ++- 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100755 bin-for-dist/generate_standalone_pytest.py create mode 100755 bin-for-dist/py.test-in diff --git a/bin-for-dist/generate_standalone_pytest.py b/bin-for-dist/generate_standalone_pytest.py new file mode 100755 index 000000000..32a48e9af --- /dev/null +++ b/bin-for-dist/generate_standalone_pytest.py @@ -0,0 +1,42 @@ +#! /usr/bin/env python + +import os +import cPickle +import zlib +import base64 +import sys + +def main(): + here = os.path.dirname(os.path.abspath(__file__)) + outfile = os.path.join(here, "py.test") + infile = outfile+"-in" + + os.chdir(os.path.dirname(here)) + + 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, "rb").read() + + data = cPickle.dumps(name2src, 2) + data = zlib.compress(data, 9) + data = base64.encodestring(data) + + exe = open(infile, "rb").read() + exe = exe.replace("@SOURCES@", data) + + open(outfile, "wb").write(exe) + os.chmod(outfile, 493) # 0755 + sys.stdout.write("generated %s\n" % outfile) + +if __name__=="__main__": + main() diff --git a/bin-for-dist/py.test-in b/bin-for-dist/py.test-in new file mode 100755 index 000000000..8388f7bd1 --- /dev/null +++ b/bin-for-dist/py.test-in @@ -0,0 +1,50 @@ +#! /usr/bin/env python + +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 + + 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] + +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 6003e5ecf..f6139db67 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")