示例#1
0
    def test_sudo(self):
        sh.aliases['sudo'] = sh.path.join(sh.pwd(), 'sudo')
        old_path = sh.env.path
        sh.env.path = []
        self.assertRaises(OSError, sh.check_sudo)
        sh.env.path = old_path

        sh.stdin(six.b('#!/bin/bash\necho root')) > 'sudo'
        self.assertEqual(sh.chmod('+x sudo').succeeded, True)
        self.assertEqual(sh.check_sudo(), None)
示例#2
0
def generate(arguments, filename):
    if not os.path.isfile(filename):
        mod = __import__(filename, globals(), locals(), [''])
        filename = mod.__file__
        name = mod.__name__
    else:
        dirname = os.path.dirname(filename)
        sys.path.insert(0, dirname)
        name = inspect.getmodulename(filename)
        mod = __import__(name)

    filenames = []
    for k, v in mod.__dict__.items():
        if getattr(v, 'console_script', False) is True:
            filenames.append(k)

    if arguments['--list-entry-points']:
        for name in filenames:
            print(('%s = %s:%s' % (name.replace('_', '-'),
                                   mod.__name__, name)))
        sys.exit(0)

    dest = os.path.expanduser(arguments['--destination'])
    sh.mkdir('-p', dest)

    modules = [six, 'docopt', 'ConfigObject', sh] + arguments['<MODULE>']
    modules = ''.join([encode_module(m) for m in modules])
    for name in filenames:
        script = os.path.join(dest, name.replace('_', '-'))
        with open(script, 'w') as fd:
            fd.write(SCRIPT_HEADER + modules + LOAD_MODULES)
            fd.write(inspect.getsource(mod).replace('__main__',
                                                    '__chutified__'))
            fd.write("if __name__ == '__main__':\n    %s()\n" % name)
        executable = sh.chmod('+x', script)
        if executable:
            print(executable.commands_line)
        else:
            print('failed to generate %s' % script)
示例#3
0
def post_render(config):

    target_directory = os.path.abspath(config.target_directory)
    pkg = config.variables['package.directory']

    pkg_dir = os.path.join(target_directory, pkg)
    if not test.d(pkg_dir):
        mkdir(pkg_dir)
        with open(os.path.join(pkg_dir, '__init__.py'), 'wb') as fd:
            fd.write('#  package\n')

    doc_root = os.path.join(target_directory, 'docs')
    vars = config.variables
    d = dict(path=doc_root, author=vars['author.name'],
             project=vars['package.name'],
             version='', ext_autodoc='y', ext_viewcode='y',
             batchfile=False)

    quickstart_do_prompt = quickstart.do_prompt

    def do_prompt(d, key, text, default=None, validator=quickstart.nonempty):
        print(key)
        if key in use_defaults:
            if default == 'y':
                default = True
            elif default == 'n':
                default = False
            d[key] = default
        elif key not in d:
            quickstart_do_prompt(d, key, text, default, validator)

    quickstart.do_prompt = do_prompt

    if not os.path.isdir(doc_root):
        # launch sphinx
        quickstart.ask_user(d)
        quickstart.generate(d)
        filename = os.path.join(doc_root, 'conf.py')

        # patch some files
        with open(filename, 'ab') as fd:
            fd.write('''
html_theme = 'nature'
import pkg_resources
version = pkg_resources.get_distribution("%s").version
release = version
''' % vars['package.name'])
        filename = os.path.join(doc_root, 'Makefile')
        with open(filename, 'rb') as fd:
            data = fd.read()
        data = data.replace('sphinx-build', '../bin/sphinx-build')
        with open(filename, 'wb') as fd:
            fd.write(data)

    # launch buildout
    cd(target_directory)
    if not test.f('bootstrap.py'):
        wget('-O bootstrap.py',
             'https://bootstrap.pypa.io/bootstrap-buildout.py') > 1
        chmod('+x bootstrap.py')

    sh.python('bootstrap.py --allow-site-packages') > 1
    if test.f('bin/buildout'):
        sh.python('bin/buildout') > 1
示例#4
0
def chutify(args):
    """
    Usage: %prog [options] [<location>]

    Generate binary scripts from all @console_script contained in <location>
    <location> can be a directory, a python file or a dotted name.

    If <location> is .git then generate a pre-commit hook which generate script
    from the current directory.

    <location> and --destination can be set in a .chut file:

        [chut]
        destination = bin/
        location = scripts

    Options:

    -l, --loop                    Generate scripts when the source change
    -s NAME, --section NAME       Use NAME section in .chut [default: chut]
    --devel                       Install develop scripts in bin/
    --upgrade                     Upgrade virtualenv dependencies
    -d DIR, --destination=DIR     Destination [default: dist/scripts]
    -i X, --interpreter=X         Python interpreter to use
    -n X, --new-version=X         Set new scripts version
    %options-30s
    """
    config = sh.ini(".chut")
    if sh.env.git_dir:  # pragma: no cover
        cfg = config["githook"] or config[args["--section"]]
    else:
        cfg = config[args["--section"]]

    interpreter = args["--interpreter"] or cfg.interpreter or "python"
    if interpreter in ("2", "3"):  # pragma: no cover
        interpreter = "python" + interpreter
    args["--interpreter"] = interpreter

    location = args.get("<location>") or cfg.location or os.getcwd()
    location = os.path.expanduser(location)

    if location.endswith(".git"):
        hooks = sh.path.join(location, "hooks")
        hook = sh.path.join(hooks, "pre-commit")
        args["destination"] = hooks
        generator = sh.Generator(**args)
        if not __file__.endswith("chutify"):
            filename = __file__.replace(".pyc", ".py")
            script = generator(filename)[0]
            sh.mv(script, hook)
        else:  # pragma: no cover
            # install git hook
            sh.cp(__file__, hook)
        executable = sh.chmod("+x", hook)
        if executable:
            print(executable.commands_line)
        return 0

    if cfg.destination and args["--destination"] == "dist/scripts":
        args["--destination"] = cfg.destination

    if os.path.isfile("setup.py"):
        version = sh.grep("-E ^version setup.py")
        if version:
            version = str(version).split("=")[1].strip("'\" ")
            if "dev" in version:
                version = version.split("dev")[0].strip(".")
            args["version"] = version

    generator = sh.Generator(**args)

    commands = cfg.run.as_list("\n")
    commands = [c.strip() for c in commands if c.strip()]

    def gen():
        scripts = generator(location)
        for cmd in commands:
            print("$ %s" % cmd)
            if " " in cmd:
                binary, args = cmd.split(" ", 1)
                sh[binary](args) > 2
            else:
                sh[cmd]() > 2
        return scripts

    if args["--loop"]:  # pragma: no cover
        import time

        while True:
            try:
                gen()
                time.sleep(0.1)
            except KeyboardInterrupt:
                return 0
    else:
        scripts = gen()
        if sh.env.git_dir:  # pragma: no cover
            sh.git("add -f", *scripts) > 1
    return 0