Source code for oct.utilities.newproject

from __future__ import print_function
import os
import six
import sys
import shutil
import tarfile
from jinja2 import Environment, PackageLoader

BASE_DIR = os.path.abspath(os.path.dirname(__file__))


[docs]def get_members(tar, prefix): if not prefix.endswith('/'): prefix += '/' offset = len(prefix) for tarinfo in tar.getmembers(): if tarinfo.name.startswith(prefix): tarinfo.name = tarinfo.name[offset:] yield tarinfo
[docs]def check_template(members, prefix=None): required_members = [ 'config.json', 'test_scripts', 'templates', 'templates/report.html' ] for fname in required_members: if prefix is not None: fname = os.path.join(prefix, fname) assert fname in members, "Required file %s not in archive" % fname return True
[docs]def from_template(args): """Create a new oct project from existing template :param Namespace args: command line arguments """ project_name = args.name template = args.template with tarfile.open(template) as tar: prefix = os.path.commonprefix(tar.getnames()) check_template(tar.getnames(), prefix) tar.extractall(project_name, members=get_members(tar, prefix))
[docs]def from_oct(args): """Create a new oct project :param Namespace args: the command line arguments """ project_name = args.name env = Environment(loader=PackageLoader('oct.utilities', 'templates')) config_content = env.get_template('configuration/config.json').render(script_name='v_user.py') script_content = env.get_template('scripts/v_user.j2').render() try: os.makedirs(project_name) os.makedirs(os.path.join(project_name, 'test_scripts')) os.makedirs(os.path.join(project_name, 'templates')) os.makedirs(os.path.join(project_name, 'templates', 'img')) shutil.copytree(os.path.join(BASE_DIR, 'templates', 'css'), os.path.join(project_name, 'templates', 'css')) shutil.copytree(os.path.join(BASE_DIR, 'templates', 'javascript'), os.path.join(project_name, 'templates', 'scripts')) shutil.copytree(os.path.join(BASE_DIR, 'templates', 'fonts'), os.path.join(project_name, 'templates', 'fonts')) shutil.copy(os.path.join(BASE_DIR, 'templates', 'html', 'report.html'), os.path.join(project_name, 'templates')) except OSError: print('ERROR: can not create directory for %r' % project_name, file=sys.stderr) raise with open(os.path.join(project_name, 'config.json'), 'w') as f: f.write(config_content) with open(os.path.join(project_name, 'test_scripts', 'v_user.py'), 'w') as f: f.write(script_content)
[docs]def create_project(args): if os.path.exists(args.name): raise OSError("Project %s already exists" % args.name) if args.template is not None: from_template(args) else: from_oct(args)
[docs]def new_project(sp): if six.PY2: parser = sp.add_parser('new-project', help="create a new oct project") else: parser = sp.add_parser('new-project', help="create a new oct project", aliases=['new']) parser.add_argument('name', type=str) parser.add_argument('-t', '--template', type=str, default=None, help="use existing project template") parser.set_defaults(func=create_project)