digitalrounin/py-lambda-packer

View on GitHub
plpacker/cli.py

Summary

Maintainability
A
0 mins
Test Coverage
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse
import logging
import logging.config
import os
import sys

import pkg_resources
import yaml

from plpacker.config import Configuration
from plpacker.virtualenv import VirtualEnv
from plpacker.packager import Packager
from plpacker.fileset import FileSet
from plpacker.pylambdapacker import PyLambdaPacker


LOGGER = logging.getLogger()


def setup_logging():
    file_path = pkg_resources.resource_filename(__name__, 'conf/logging.yaml')
    with open(file_path, 'r') as stream:
        logging.config.dictConfig(yaml.load(stream))
    LOGGER.info('Logging configuration read from "%s".', file_path)


def parse_args(*argv):
    parser = argparse.ArgumentParser(description='TODO')

    parser.add_argument('--config-file',
                        dest='config_file',
                        default=None,
                        help=('location of configuration file (default: '
                              './py-lambda-packer.yaml)'))

    parser.add_argument('--include',
                        dest='includes',
                        action='append',
                        default=None,
                        help=('glob pattern of what to include, multiple '
                              'allowed (default is empty)'))

    parser.add_argument('--exclude',
                        dest='excludes',
                        action='append',
                        default=None,
                        help=('glob pattern of what to exclude, multiple '
                              'allowed (default is empty)'))

    parser.add_argument('--followlinks',
                        dest='followlinks',
                        action='store_true',
                        default=None,
                        help=('follows symbolic links (default=False)'))

    parser.add_argument('--virtualenv-dir',
                        dest='virtualenv_dir',
                        default=None,
                        help=('directory to build the virtualenv in '
                              '(default is a tmp dir)'))

    parser.add_argument('--keep-virtualenv',
                        dest='keep_virtualenv',
                        default=None,
                        action='store_true',
                        help=('do not delete virtualenv build directory when '
                              'set (default=False)'))

    parser.add_argument('--python',
                        dest='python',
                        default=None,
                        help=('version of python to build virtualenv with '
                              '(default is python2.7)'))

    parser.add_argument('--requirement', '-r',
                        dest='requirements',
                        action='append',
                        default=None,
                        help=('pip requirements file to read, multiple '
                              'allowed (default is empty)'))

    parser.add_argument('--package', '-p',
                        dest='packages',
                        action='append',
                        default=None,
                        help=('pip package index options, multiple '
                              'allowed (default is empty)'))

    parser.add_argument('--output', '-o',
                        dest='output',
                        default=None,
                        help=('name of output zip file (default is '
                              'py-lambda-packer.zip)'))

    parser.add_argument('--archive-dir',
                        dest='archive_dir',
                        default=None,
                        help=('directory to build the archive in '
                              '(default is a tmp dir)'))

    parser.add_argument('--keep-archive',
                        dest='keep_archive',
                        default=None,
                        action='store_true',
                        help=('do not delete archive build directory when '
                              'set (default=False)'))

    parser.add_argument('--generate-config',
                        dest='generate_config',
                        action='store_true',
                        help=('prints thedefault configuration to help create '
                              'one'))

    namespace = parser.parse_args(*argv)
    LOGGER.debug('Command line arguments: %s', namespace)
    return namespace


def entry_point():
    # Only here to be quiet and dump out the config.  Have to do this before
    # activating logging.
    if '--generate-config' in sys.argv[1:]:
        Configuration.print_default_config()
        sys.exit(0)

    # General configuration
    setup_logging()
    cli_args = parse_args(sys.argv[1:])
    config = Configuration(vars(cli_args))
    cwd = os.getcwd()

    # Information for the VirtualEnv
    pip_requirements = config.data['virtualenv']['pip']['requirements']
    fileset_excludes = config.data['virtualenv']['default_excludes']

    # Information for the PyLambdaPacker
    filesets = []
    if config.data['packager']['includes']:
        filesets = [
            FileSet(cwd,
                    includes=config.data['packager']['includes'],
                    excludes=config.data['packager']['excludes']
                    + config.data['packager']['default_excludes'])]

    # Build!
    with VirtualEnv(python=config.data['virtualenv']['python'],
                    path=config.data['virtualenv']['path'],
                    keep=config.data['virtualenv']['keep'],
                    packages=config.data['virtualenv']['pip']['packages'],
                    requirements=pip_requirements,
                    fileset_excludes=fileset_excludes) as virtual_env, \
            Packager(
                zip_file=config.data['packager']['target'],
                build_path=config.data['packager']['build_path'],
                keep=config.data['packager']['keep']) as packager:

        packer = PyLambdaPacker(virtual_env, packager, filesets)
        packer.build()