Top

goulash.bin.boiler module

goulash.bin.pybpgen

#!/usr/bin/env python
""" goulash.bin.pybpgen
"""
import shutil
import os, sys
import logging
import argparse

from fabric.colors import red
from fabric import api

from goulash import version
from goulash import goulash_data
from goulash._fabric import require_bin
from goulash._os import touch, makedirs, copy_tree

root = logging.getLogger()
root.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
root.addHandler(ch)

def get_parser():
    """ build the default parser """
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--docs", default=False, dest='docs',
        action='store_true',
        help=("create docs boilerplate for python project"))
    parser.add_argument(
        "--project", default='', dest='project',
        required=True,
        help=("project name"))
    parser.add_argument(
        'dir', nargs='?', default=os.getcwd(),
        help=("base directory to generate boilerplate in"))
    parser.add_argument(
        "-v", '--version', default=False, dest='version',
        action='store_true',
        help=("show version information"))
    return parser

def gen_docs(args):
    print red('generating docs boilerplate..')
    SRC_ROOT = args.dir
    DOCS_ROOT = os.path.join(SRC_ROOT, 'docs')
    DOCS_API_ROOT = os.path.join(DOCS_ROOT, 'api')
    DOCS_SITE_DIR = os.path.join(DOCS_ROOT, 'site')
    PROJECT_NAME = args.project
    ctx = locals().copy()
    ctx.pop('args')
    create_docs(**ctx)

def create_docs(DOCS_ROOT=None, **ctx):
    """ """
    if not os.path.exists(DOCS_ROOT):
        msg = red('..docs root ') +\
              '"{0}"'.format(DOCS_ROOT) + \
              red(' does not exist, creating it')
        print msg
        api.local('mkdir -p "{0}"'.format(DOCS_ROOT))
    else:
        msg = '.. docs root already exists:'
        print red(msg) + ' {0}'.format(DOCS_ROOT)
    shutil.copy(
        os.path.join(goulash_data, 'docs_requirements.txt'),
        os.path.join(DOCS_ROOT, 'requirements.txt'))
    _create_docs(DOCS_ROOT=DOCS_ROOT, **ctx)
    _create_api_docs(DOCS_ROOT=DOCS_ROOT, **ctx)

def _refresh_api_docs(
    PROJECT_NAME=None,
    DOCS_ROOT=None,
    DOCS_API_ROOT=None,
    DOCS_SITE_DIR=None, **ctx):
    if os.environ.get('GOULASH_DOCS_API', 'true').lower() == 'false':
        print red('skipping API documentation')
        return
    err = ('Missing required command.  '
           '"pip install pdoc" and try again')
    require_bin('pdoc', err)
    cmd = 'pdoc {0} --html --overwrite'
    err = 'refresh requires --project'
    assert PROJECT_NAME is not None, err
    cmd = cmd.format(PROJECT_NAME)
    with api.lcd(DOCS_API_ROOT):
        api.local(cmd)
        src = os.path.join(DOCS_API_ROOT, PROJECT_NAME)
        copy_tree(src, DOCS_API_ROOT)
        shutil.rmtree(os.path.join(DOCS_API_ROOT, PROJECT_NAME))
    if os.path.exists(DOCS_SITE_DIR):
        print red(str([DOCS_API_ROOT, DOCS_SITE_DIR]))
        src = DOCS_API_ROOT
        dest = os.path.join(DOCS_SITE_DIR, 'api')
        copy_tree(src, dest)
        dest = os.path.join(DOCS_ROOT, 'docs', 'api')
        copy_tree(src, dest)
    print red(".. finished generating api docs")

def _create_docs(PROJECT_NAME=None, DOCS_ROOT=None, **ctx):
    mkdocs_config = os.path.join(DOCS_ROOT, 'mkdocs.yml')
    assert PROJECT_NAME is not None
    def dl_bp():
        shutil.copy(
            os.path.join(goulash_data,
                         'mkdocs.yml'),
            mkdocs_config)
        with open(mkdocs_config, 'r') as fhandle:
            tmp = fhandle.read().format(project_name=PROJECT_NAME)
        with open(mkdocs_config, 'w') as fhandle:
            fhandle.write(tmp)
    require_bin('mkdocs',
                'Missing required command.  "pip install mkdocs" and try again')
    print red(".. generating mkdocs: ") + DOCS_ROOT
    if not os.path.exists(DOCS_ROOT):
        msg = red('.. mkdocs dir at "{0}" '.format(DOCS_ROOT)) + \
              red(' does not exist, creating it')
        print msg
        os.mkdir(DOCS_ROOT)
    cmd = ('mkdocs new {0}').format(DOCS_ROOT)
    api.local(cmd)

    print red("creating placeholder for API documentation..")
    makedirs(os.path.join(DOCS_ROOT, 'docs', 'api'))
    touch(os.path.join(DOCS_ROOT, 'docs', 'api', 'index.html'))

    if not os.path.exists(mkdocs_config):
        print red(' .. {0} not found '.format(mkdocs_config))
        print red(' .. no config for docs, using standard boilerplate')
        dl_bp()
    with open(mkdocs_config, 'r') as fhandle:
        if fhandle.read().strip().endswith('My Docs'):
            msg = red(' .. brand new docs!')
            msg += ' using standard boilerplate'
            print msg
            #default_config = True
            dl_bp()
    print red(".. copying custom mkdocs theme")
    from goulash._os import copy_tree
    src = os.path.join(goulash_data, 'glsh')
    dest = os.path.join(DOCS_ROOT, 'glsh')
    copy_tree(src, dest)
    print red(".. refreshing docs")
    _refresh_docs(DOCS_ROOT=DOCS_ROOT, **ctx)
    print red(".. finished with mkdocs")

def _create_api_docs(DOCS_API_ROOT=None, **ctx):
    msg = red("..generating api documentation to")
    msg += " {0}".format(DOCS_API_ROOT)
    print msg
    if not os.path.exists(DOCS_API_ROOT):
        msg = red('.. api dir at "{0}" '.format(DOCS_API_ROOT))
        msg += red(' does not exist, creating it')
        print msg
        os.mkdir(DOCS_API_ROOT)
    _refresh_api_docs(DOCS_API_ROOT=DOCS_API_ROOT, **ctx)

def _refresh_docs(DOCS_ROOT=None, **ctx):
    with api.lcd(DOCS_ROOT):
        api.local('mkdocs build --clean')

def docs_refresh(**ctx):
    _refresh_docs(**ctx)
    _refresh_api_docs(**ctx)

def docs_deploy(DOCS_ROOT=None, **ctx):
    """ """
    import mkdocs
    from mkdocs.config import load_config
    from mkdocs.gh_deploy import gh_deploy
    mkdocs_config = os.path.join(DOCS_ROOT, 'mkdocs.yml')
    assert os.path.exists(mkdocs_config)
    os.chdir(DOCS_ROOT)
    try:
        config = load_config(
            config_file=mkdocs_config,
        )
        gh_deploy(config)
    except mkdocs.exceptions.ConfigurationError as e:
        # Avoid ugly, unhelpful traceback
        raise SystemExit('\n' + str(e))

def entry():
    parser = get_parser()
    options, args = [parser.parse_args()] * 2
    if args.version:
        print version.__version__
        raise SystemExit()
    elif args.docs:
        gen_docs(args)

if __name__ == '__main__':
    entry()

Module variables

var goulash_data

Functions

def create_docs(

DOCS_ROOT=None, **ctx)

def create_docs(DOCS_ROOT=None, **ctx):
    """ """
    if not os.path.exists(DOCS_ROOT):
        msg = red('..docs root ') +\
              '"{0}"'.format(DOCS_ROOT) + \
              red(' does not exist, creating it')
        print msg
        api.local('mkdir -p "{0}"'.format(DOCS_ROOT))
    else:
        msg = '.. docs root already exists:'
        print red(msg) + ' {0}'.format(DOCS_ROOT)
    shutil.copy(
        os.path.join(goulash_data, 'docs_requirements.txt'),
        os.path.join(DOCS_ROOT, 'requirements.txt'))
    _create_docs(DOCS_ROOT=DOCS_ROOT, **ctx)
    _create_api_docs(DOCS_ROOT=DOCS_ROOT, **ctx)

def docs_deploy(

DOCS_ROOT=None, **ctx)

def docs_deploy(DOCS_ROOT=None, **ctx):
    """ """
    import mkdocs
    from mkdocs.config import load_config
    from mkdocs.gh_deploy import gh_deploy
    mkdocs_config = os.path.join(DOCS_ROOT, 'mkdocs.yml')
    assert os.path.exists(mkdocs_config)
    os.chdir(DOCS_ROOT)
    try:
        config = load_config(
            config_file=mkdocs_config,
        )
        gh_deploy(config)
    except mkdocs.exceptions.ConfigurationError as e:
        # Avoid ugly, unhelpful traceback
        raise SystemExit('\n' + str(e))

def docs_refresh(

**ctx)

def docs_refresh(**ctx):
    _refresh_docs(**ctx)
    _refresh_api_docs(**ctx)

def entry(

)

def entry():
    parser = get_parser()
    options, args = [parser.parse_args()] * 2
    if args.version:
        print version.__version__
        raise SystemExit()
    elif args.docs:
        gen_docs(args)

def gen_docs(

args)

def gen_docs(args):
    print red('generating docs boilerplate..')
    SRC_ROOT = args.dir
    DOCS_ROOT = os.path.join(SRC_ROOT, 'docs')
    DOCS_API_ROOT = os.path.join(DOCS_ROOT, 'api')
    DOCS_SITE_DIR = os.path.join(DOCS_ROOT, 'site')
    PROJECT_NAME = args.project
    ctx = locals().copy()
    ctx.pop('args')
    create_docs(**ctx)

def get_parser(

)

build the default parser

def get_parser():
    """ build the default parser """
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--docs", default=False, dest='docs',
        action='store_true',
        help=("create docs boilerplate for python project"))
    parser.add_argument(
        "--project", default='', dest='project',
        required=True,
        help=("project name"))
    parser.add_argument(
        'dir', nargs='?', default=os.getcwd(),
        help=("base directory to generate boilerplate in"))
    parser.add_argument(
        "-v", '--version', default=False, dest='version',
        action='store_true',
        help=("show version information"))
    return parser