Source code for invirtualenv.cli

"""
Command line interface to invirtualenv v2
"""
import argparse
import logging
import os
import sys
from .config import get_configuration_dict
from .contextmanager import InTemporaryDirectory
from .exceptions import PackageGenerationFailure
from .plugin import create_package, create_package_configuration, get_package_plugin, package_formats


LOGGER = logging.getLogger(__name__)


[docs]def parse_cli_arguments(): # Determine the package types we can create on the current system package_choices = package_formats() parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--deploy_conf', default='deploy.conf', help='Deploy configuration filename or url') command_parser = parser.add_subparsers(title='command', dest='command') list_plugins_parser = command_parser.add_parser('list_plugins', help='List the installed invirtualenv plugins') package_config_parser = command_parser.add_parser('create_package_config', help='Generate the packaging configuration file') package_config_parser.add_argument('package_type', choices=package_choices, help='Type of package to create') package_config_parser.add_argument('--outfile', '-o', default=None, help='Output file name') package_create_parser = command_parser.add_parser('create_package', help='Generate a package from a deployment configuration') package_create_parser.add_argument('package_type', choices=package_choices, help='Type of package to create') get_setting_parser = command_parser.add_parser('get_setting', help='Get a setting value from the configuration') get_setting_parser.add_argument('section', help="the configuration section to get the setting from") get_setting_parser.add_argument('item', help='The item to get from the configuration') args = parser.parse_args() return args
[docs]def get_setting_command(args): """ Get the value of a setting in the deploy.conf Parameters ---------- args: argparse.Namespace The argparse parser namespace with the parsed cli settings Returns ------- str: The value of the setting or None """ LOGGER.debug('Getting value for %s=%s', args.section, args.item) rc = 0 config = get_configuration_dict([args.deploy_conf]) try: value = config[args.section][args.item] except KeyError: value = '' rc = 1 LOGGER.debug('Got value %r for %s=%s', value, args.section, args.item) return rc, value
[docs]def create_config_command(args): if not package_formats(): # pragma: no cover raise PackageGenerationFailure('No supported package creation plugins found') outfile = args.outfile if not outfile: plugin = get_package_plugin(args.package_type) outfile = plugin.default_config_filename deploy_config_contents = '' with open(args.deploy_conf) as deploy_conf_handle: deploy_config_contents = deploy_conf_handle.read() with InTemporaryDirectory(): with open('deploy.conf', 'w') as deploy_conf_handle: deploy_conf_handle.write(deploy_config_contents) result = create_package_configuration(args.package_type) if outfile: with open(outfile, 'w') as output_handle: output_handle.write(result) else: sys.stdout.write(result) return 0, outfile
[docs]def create_package_command(args): if not package_formats(): raise PackageGenerationFailure('No supported package creation plugins found') deploy_config_contents = '' with open(args.deploy_conf) as deploy_conf_handle: deploy_config_contents = deploy_conf_handle.read() orig_directory = os.getcwd() with InTemporaryDirectory(): with open(args.deploy_conf, 'w') as deploy_conf_handle: deploy_conf_handle.write(deploy_config_contents) package_file = create_package(args.package_type) dest_package_file = os.path.join(orig_directory, os.path.basename(package_file)) if os.path.exists(package_file): os.rename(package_file, dest_package_file) if package_file: logging.debug('Generated package file: %s' % dest_package_file) return 0, 'Generated package file:' + dest_package_file raise PackageGenerationFailure('Unable to generate a package file using the %r plugin' % args.package_type)
[docs]def list_plugins_command(args): installed_plugins = package_formats() if not installed_plugins: return 0, 'No plugins are installed' result = 'Installed plugins:' + os.linesep for plugin in package_formats(): result += '\t' + plugin + os.linesep return 0, result
[docs]def main(test=False): logging.basicConfig(level=logging.INFO) args = parse_cli_arguments() rc = 0 output = '' if args.command in ['create_package']: rc, output = create_package_command(args) elif args.command in ['create_package_config']: rc, output = create_config_command(args) elif args.command in ['list_plugins']: rc, output = list_plugins_command(args) elif args.command in ['get_setting']: rc, output = get_setting_command(args) if test: return rc, output print(output) sys.exit(rc)