Source code for cfn_pyplates.cli

# Copyright (c) 2013 MetaMetrics, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

"""CLI Entry points for handy bins

Documentation for CLI methods defined in this file will be that method's
usage information as seen on the command-line.

"""
import sys

import yaml
from docopt import docopt
from schema import Schema, Use, Or

from cfn_pyplates import core
from cfn_pyplates.options import OptionsMapping


def _open_outfile(outfile_name):
    'Helper function for Schema to open the outfile'
    if outfile_name == '-':
        return sys.stdout
    else:
        return open(outfile_name, 'w')


def _open_optionfile(optionfile_name):
    'Helper function for Schema to open the option file'
    if optionfile_name == '-':
        return sys.stdin
    else:
        return open(optionfile_name)


[docs]def generate(): """Generate CloudFormation JSON Template based on a Pyplate Usage: cfn_py_generate <pyplate> [<outfile>] [-o/--options=<options_mapping>] cfn_py_generate (-h|--help) cfn_py_generate --version Arguments: pyplate Input pyplate file name outfile File in which to place the compiled JSON template (if omitted or '-', outputs to stdout) Options: -o --options=<options_mapping> Input JSON or YAML file for options mapping exposed in the pyplate as "options_mapping" (if '-', accepts input from stdin) -h --help This usage information WARNING! Do not use pyplates that you haven't personally examined! A pyplate is a crazy hybrid of JSON-looking python. exec is used to read the pyplate, so any code in there is going to run, even potentailly harmful things. Be careful. """ from pkg_resources import require version = require("cfn-pyplates")[0].version args = docopt(generate.__doc__, version=version) scheme = Schema({ '<pyplate>': Use(open), '<outfile>': Or(None, Use(_open_outfile)), '--options': Or(None, Use(_open_optionfile)), '--help': Or(True, False), '--version': Or(True, False), }) args = scheme.validate(args) options_file = args['--options'] if options_file: options = yaml.load(options_file) else: options = {} output = core.generate_pyplate(args['<pyplate>'], OptionsMapping(options)) if not output: return 1 if not args['<outfile>'] or args['<outfile>'] == '-': print output else: args['<outfile>'].write(output) # Explicitly return a posixy "EVERYTHING IS OKAY" 0 return 0