diff --git a/jinja2cli/cli.py b/jinja2cli/cli.py index 5a3dc0a..31125e2 100644 --- a/jinja2cli/cli.py +++ b/jinja2cli/cli.py @@ -246,7 +246,19 @@ def _load_json5(): } -def render(template_path, data, extensions, strict=False): +def convert_value(value, target_type): + if target_type == bool: + if value.lower() == "true": + return True + if value.lower() == "false": + return False + raise ValueError("not a valid boolean: %s" % value) + if target_type == int: + return int(value) + return value + + +def render(template_path, data, extensions, strict=False, env_opts={}): from jinja2 import ( __version__ as jinja_version, Environment, @@ -272,6 +284,13 @@ def render(template_path, data, extensions, strict=False): ) if strict: env.undefined = StrictUndefined + for key in env_opts: + if hasattr(env, key): + target_type = type(getattr(env, key)) + new_value = convert_value(env_opts[key], target_type) + setattr(env, key, new_value) + else: + raise MalformedEnv("unsupported environment option: %s" % key) # Add environ global env.globals["environ"] = lambda key: force_text(os.environ.get(key)) @@ -356,6 +375,8 @@ def cli(opts, args): data.update(parse_kv_string(opts.D or [])) + env_opts = parse_kv_string(opts.env or []) + if opts.outfile is None: out = sys.stdout else: @@ -366,7 +387,7 @@ def cli(opts, args): out = codecs.getwriter("utf8")(out) - out.write(render(template_path, data, extensions, opts.strict)) + out.write(render(template_path, data, extensions, opts.strict, env_opts)) out.flush() return 0 @@ -465,6 +486,13 @@ def main(): metavar="FILE", action="store", ) + parser.add_option( + "--env-opt", + help="Define jinja2 Environment option in the form of option=value", + dest="env", + action="append", + metavar="option=value", + ) opts, args = parser.parse_args() # Dedupe list