# coding: utf-8 """ This module provides command-line access to pystache. Run this script using the -h option for command-line help. """ try: import json except: # The json module is new in Python 2.6, whereas simplejson is # compatible with earlier versions. try: import simplejson as json except ImportError: # Raise an error with a type different from ImportError as a hack around # this issue: # http://bugs.python.org/issue7559 from sys import exc_info ex_type, ex_value, tb = exc_info() new_ex = Exception("%s: %s" % (ex_type.__name__, ex_value)) raise new_ex.__class__, new_ex, tb # The optparse module is deprecated in Python 2.7 in favor of argparse. # However, argparse is not available in Python 2.6 and earlier. from optparse import OptionParser import sys # We use absolute imports here to allow use of this script from its # location in source control (e.g. for development purposes). # Otherwise, the following error occurs: # # ValueError: Attempted relative import in non-package # from pystache.common import TemplateNotFoundError from pystache.renderer import Renderer USAGE = """\ %prog [-h] template context Render a mustache template with the given context. positional arguments: template A filename or template string. context A filename or JSON string.""" def parse_args(sys_argv, usage): """ Return an OptionParser for the script. """ args = sys_argv[1:] parser = OptionParser(usage=usage) options, args = parser.parse_args(args) template, context = args return template, context # TODO: verify whether the setup() method's entry_points argument # supports passing arguments to main: # # http://packages.python.org/distribute/setuptools.html#automatic-script-creation # def main(sys_argv=sys.argv): template, context = parse_args(sys_argv, USAGE) if template.endswith('.mustache'): template = template[:-9] renderer = Renderer() try: template = renderer.load_template(template) except TemplateNotFoundError: pass try: context = json.load(open(context)) except IOError: context = json.loads(context) rendered = renderer.render(template, context) print rendered if __name__=='__main__': main()