From 434799d1f1ec1c8031cd87c32e3b609049ed616f Mon Sep 17 00:00:00 2001 From: Matthew Brett Date: Sat, 13 Apr 2013 13:40:29 -0700 Subject: [PATCH 1/3] NF: add script to build dmg files from buildbots The buildbots build mpkgs; this script builds dmgs from the mpkgs and sets the permissions correctly. --- tools/build_dmgs.py | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100755 tools/build_dmgs.py diff --git a/tools/build_dmgs.py b/tools/build_dmgs.py new file mode 100755 index 0000000000..d4186d8d38 --- /dev/null +++ b/tools/build_dmgs.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +"""Script to build dmgs for buildbot builds + +Example +------- +%(prog)s "dipy-dist/dipy*-0.6.0-py*mpkg" + +Note quotes around the globber first argument to protect it from shell +globbing. + +""" +import os +from os.path import join as pjoin, isfile, isdir +import sys +import shutil +from glob import glob +from functools import partial +from subprocess import check_call +import warnings + +from argparse import ArgumentParser, RawDescriptionHelpFormatter + +my_call = partial(check_call, shell=True) + +BUILDBOT_LOGIN = "buildbot@nipy.bic.berkeley.edu" +BUILDBOT_HTML = "nibotmi/public_html/" + +def main(): + parser = ArgumentParser(description=__doc__, + formatter_class=RawDescriptionHelpFormatter) + parser.add_argument('globber', type=str, + help='glob to serch for build mpkgs') + parser.add_argument('--out-path', type=str, default='mpkg-dist', + help='path for output files (default="mpkg-dist")', + metavar='OUTPATH') + parser.add_argument('--clobber', action='store_true', + help='Delete OUTPATH if exists') + args = parser.parse_args() + globber = args.globber + out_path = args.out_path + address = "{0}:{1}{2}".format(BUILDBOT_LOGIN, BUILDBOT_HTML, globber) + if isdir(out_path): + if not args.clobber: + raise RuntimeError('Path {0} exists and "clobber" not set'.format( + out_path)) + shutil.rmtree(out_path) + os.mkdir(out_path) + cwd = os.path.abspath(os.getcwd()) + os.chdir(out_path) + try: + my_call('scp -r {0} .'.format(address)) + found_mpkgs = sorted(glob('*.mpkg')) + for mpkg in found_mpkgs: + pkg_name, ext = os.path.splitext(mpkg) + assert ext == '.mpkg' + my_call('sudo reown_mpkg {0} root admin'.format(mpkg)) + os.mkdir(pkg_name) + pkg_moved = pjoin(pkg_name, mpkg) + os.rename(mpkg, pkg_moved) + readme = pjoin(pkg_moved, 'Contents', 'Resources', 'ReadMe.txt') + if isfile(readme): + shutil.copy(readme, pkg_name) + else: + warnings.warn("Could not find readme with " + readme) + my_call('sudo hdiutil create {0}.dmg -srcfolder ./{0}/ -ov'.format(pkg_name)) + finally: + os.chdir(cwd) + + +if __name__ == '__main__': + main() From e68c7b5eeecb28cbddba97a10bcb14d3c3bd8a62 Mon Sep 17 00:00:00 2001 From: Matthew Brett Date: Sat, 13 Apr 2013 14:01:24 -0700 Subject: [PATCH 2/3] NF: add tool for doctest for extensions Fetched from the dipy/tools directory. --- tools/doctest_extmods.py | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 tools/doctest_extmods.py diff --git a/tools/doctest_extmods.py b/tools/doctest_extmods.py new file mode 100755 index 0000000000..2ca439321f --- /dev/null +++ b/tools/doctest_extmods.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +"""Run doctests in extension modules of + +Collect extension modules in + +Run doctests in each extension module + +Example: + + %prog dipy +""" + +import sys +import os +from os.path import dirname, relpath, sep, join as pjoin, splitext, abspath + +from distutils.sysconfig import get_config_vars + +import doctest +from optparse import OptionParser + +EXT_EXT = get_config_vars('SO')[0] + + +def get_ext_modules(pkg_name): + pkg = __import__(pkg_name, fromlist=['']) + pkg_dir = abspath(dirname(pkg.__file__)) + # pkg_root = __import__(pkg_name) + ext_modules = [] + for dirpath, dirnames, filenames in os.walk(pkg_dir): + reldir = relpath(dirpath, pkg_dir) + if reldir == '.': + reldir = '' + for filename in filenames: + froot, ext = splitext(filename) + if ext == EXT_EXT: + mod_path = pjoin(reldir, froot) + mod_uri = pkg_name + '.' + mod_path.replace(sep, '.') + # fromlist=[''] results in submodule being returned, rather than the + # top level module. See help(__import__) + mod = __import__(mod_uri, fromlist=['']) + ext_modules.append(mod) + return ext_modules + + +def main(): + usage = "usage: %prog [options] \n\n" + __doc__ + parser = OptionParser(usage=usage) + opts, args = parser.parse_args() + if len(args) == 0: + parser.print_help() + sys.exit(1) + mod_name = args[0] + mods = get_ext_modules(mod_name) + for mod in mods: + print("Testing module: " + mod.__name__) + doctest.testmod(mod) + + +if __name__ == '__main__': + main() From 86bb1b2fc274929673e0e5d69e106b01a13fcd02 Mon Sep 17 00:00:00 2001 From: Matthew Brett Date: Wed, 24 Apr 2013 16:07:57 -0700 Subject: [PATCH 3/3] DOC: fix typo; change dipy to nipy From comments by Bertrand --- tools/build_dmgs.py | 6 ++---- tools/doctest_extmods.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/build_dmgs.py b/tools/build_dmgs.py index d4186d8d38..57aefd9c04 100755 --- a/tools/build_dmgs.py +++ b/tools/build_dmgs.py @@ -3,15 +3,13 @@ Example ------- -%(prog)s "dipy-dist/dipy*-0.6.0-py*mpkg" +%(prog)s "nipy-dist/nipy*-0.4.0-py*mpkg" Note quotes around the globber first argument to protect it from shell globbing. - """ import os from os.path import join as pjoin, isfile, isdir -import sys import shutil from glob import glob from functools import partial @@ -29,7 +27,7 @@ def main(): parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter) parser.add_argument('globber', type=str, - help='glob to serch for build mpkgs') + help='glob to search for build mpkgs') parser.add_argument('--out-path', type=str, default='mpkg-dist', help='path for output files (default="mpkg-dist")', metavar='OUTPATH') diff --git a/tools/doctest_extmods.py b/tools/doctest_extmods.py index 2ca439321f..54eb6f2b86 100755 --- a/tools/doctest_extmods.py +++ b/tools/doctest_extmods.py @@ -7,7 +7,7 @@ Example: - %prog dipy + %prog nipy """ import sys