Exemplo n.º 1
0
    def _activate(self, path):
        absfpath = abspath(expanduser(path))
        self.publish(C_PRE_ACTIVATE, name=absfpath)
        if True:
            vbin = to_vbin(absfpath)
            vlib = to_vlib(absfpath)

            # compute e.g. <venv>/lib/python2.6.
            # we call bullshit if they have a more than one dir;
            # it might be a chroot but i dont think it's a venv
            python_dir = glob.glob(opj(vlib, 'python*/'))
            if len(python_dir) == 0:
                raise RuntimeError('no python dir in {0}'.format(vlib))
            if len(python_dir) > 1:
                err = "multiple python dirs matching in {0}".format(vlib)
                raise RuntimeError(err)
            python_dir = python_dir[0]

            # this bit might enable switching between two venv's
            # that are be "no-global-site" vs "use-global-site"
            # .. tabling it for now
            # site_file = opj(python_dir, 'site.py')
            # assert ope(site_file)
            # tmp = dict(__file__=site_file)
            # execfile(site_file, tmp)
            #  tmp['main']()

            # some environment variable manipulation that would
            # normally be done by 'source bin/activate', but is
            # not handled by activate_this.py
            #path = get_path().split(':')
            os.environ['VIRTUAL_ENV'] = absfpath

            sandbox = dict(__file__=opj(vbin, 'activate_this.py'))
            execfile(opj(vbin, 'activate_this.py'), sandbox)
            self.reset_path = sandbox['prev_sys_path']

            # libraries like 'datetime' can very occasionally fail on import
            # if this isnt done, and i'm not sure why activate_this.py doesnt
            # accomplish it.  it might have something to do with venv's using
            # mixed pythons (different versions) or mixed --no-site-packages
            # tabling it for now
            # dynload = opj(python_dir, 'lib-dynload')
            # sys.path.append(dynload)

            # NB: this rehash will update bins but iirc kills aliases!
            msg = '$PATH was adjusted to {0}'.format(os.environ['PATH'])
            smash_log.debug(msg)
            self.report('Adjusting $PATH')
            msg = 'rehashing aliases'
            smash_log.info(msg)
            self.shell.magic('rehashx')
            self.publish(C_POST_ACTIVATE, absfpath)
def update(project):
    build(project)
    proot = opj(src_root, project)
    output = opj(proot, 'output')
    prod_dir = opj(src_root)
    assert ope(output)
    target = opj(ghio_root, project)
    if not ope(target):
        os.mkdir(target)
    cmd = "cp -rfv {0}/* {1}".format(output, target)
    local(cmd)
    local("git add -A {0}".format(target))
    local("cd {0} && git commit {1} -m \"{2}\"".format(
        ghio_root, project,'update '+project))
    local("git push")
Exemplo n.º 3
0
    def load_from_etc(self, fname, schema=None):
        """ if schema is given, validate it.  otherwise
            just load blindly """
        smash_log.info('loading and validating {0}'.format(fname))
        schema = schema or _find_schema(fname)
        absf = opj(DIR_SMASH_ETC, fname)
        try:
            with open(absf) as fhandle:
                data = demjson.decode(fhandle.read())
        except demjson.JSONDecodeError:
            err = "file is not json: {0}".format(absf)
            # boot_log.critical(err)
            raise ConfigError(err)
        except IOError:
            smash_log.info("{0} does not exist..".format(absf))
            if getattr(schema, 'default', None) is not None:
                smash_log.info("..but a default is defined.  writing file")
                default = schema.default
                if not isinstance(default, basestring):
                    default = demjson.encode(schema.default)

                with open(absf, 'w') as fhandle:
                    fhandle.write(default)
                return self.load_from_etc(fname, schema)
            else:
                err = ("{0} does not exist, and no default"
                       " is defined").format(absf)
                # boot_log.critical(err)
                self.log.critical(err)
                raise SystemExit(err)
        try:
            schema(data)
        except voluptuous.Invalid, e:
            raise SystemExit("error validating {0}\n\t{1}".format(absf, e))
def show(project):
    build(project)
    proot = opj(src_root, project)
    report("serving "+proot)
    def f():
        webbrowser.open(URL)
    threading.Thread(target=f).start()
    local("cd {0} && poole --serve".format(proot))
def build(project):
    """ build project from source """
    proot = opj(src_root, 'conf')
    if project == 'all':
        for pdir in [x for x in os.listdir(proot) if x]:
            build(pdir)
        return
    else:
        proot=opj(proot,project)
        report("rebuilding " + proot)
        local("cd {0} && mkdocs build".format(proot))
        dest = os.path.dirname(src_root)
        rendered_site = os.path.join(dest, 'site')
        cmd = 'cp -rfv {0} "{1}"'.format(
            os.path.join(rendered_site, '*'),
            dest)
        local(cmd)
Exemplo n.º 6
0
def get_tox_envs(_dir=None):
    """ """
    ini_file = "tox.ini" if _dir is None else opj(dir, "tox.ini")
    if ope(ini_file):
        config = ConfigParser.ConfigParser()
        with open("tox.ini") as fhandle:
            config.readfp(fhandle)
        env_list = [x.split(":")[-1] for x in config.sections() if ":" in x]
        return env_list
Exemplo n.º 7
0
 def setUp(self):
     self.settings = Settings(opj(this_dir, 'test.ini'), use_argv=False)
Exemplo n.º 8
0
def has_tox(pdir):
    return ope(opj(pdir, "tox.ini"))
Exemplo n.º 9
0
 def setUp(self):
     self.venv1 = opj(TEST_DIR, 'fake_venv')
     self.venv2 = opj(TEST_DIR, 'another_fake_virtual_environment')
 def newf(*args, **kargs):
     project = args[0]
     proot = opj(src_root, project)
     assert ope(proot), "{0} does not exist".format(proot)
     return fxn(*args, **kargs)
from argparse import ArgumentParser

from fabric.api import local

from report import report
from goulash.python import dirname, opj, ope

COMMANDS = 'update build show init'.split()
COMMANDS = 'build'.split()
URL = 'http://localhost:8080/'
USAGE = '{0} subcommands are {1}'.format(
    os.path.split(sys.argv[0])[-1],
    COMMANDS)
USAGE += '\n\nas in: "ghio build project-name"'
ghio_root = dirname(dirname(dirname(__file__)))
src_root  = opj(ghio_root, 'src')

def _require_project_dir(fxn):
    def newf(*args, **kargs):
        project = args[0]
        proot = opj(src_root, project)
        assert ope(proot), "{0} does not exist".format(proot)
        return fxn(*args, **kargs)
    return newf

def build_parser():
    parser = ArgumentParser(usage=USAGE)
    parser.add_argument('command')
    parser.add_argument('project')
    return parser