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")
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)
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
def setUp(self): self.settings = Settings(opj(this_dir, 'test.ini'), use_argv=False)
def has_tox(pdir): return ope(opj(pdir, "tox.ini"))
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