cmd.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # mako/cmd.py
  2. # Copyright 2006-2025 the Mako authors and contributors <see AUTHORS file>
  3. #
  4. # This module is part of Mako and is released under
  5. # the MIT License: http://www.opensource.org/licenses/mit-license.php
  6. from argparse import ArgumentParser
  7. from os.path import dirname
  8. from os.path import isfile
  9. import sys
  10. from mako import exceptions
  11. from mako.lookup import TemplateLookup
  12. from mako.template import Template
  13. def varsplit(var):
  14. if "=" not in var:
  15. return (var, "")
  16. return var.split("=", 1)
  17. def _exit():
  18. sys.stderr.write(exceptions.text_error_template().render())
  19. sys.exit(1)
  20. def cmdline(argv=None):
  21. parser = ArgumentParser()
  22. parser.add_argument(
  23. "--var",
  24. default=[],
  25. action="append",
  26. help="variable (can be used multiple times, use name=value)",
  27. )
  28. parser.add_argument(
  29. "--template-dir",
  30. default=[],
  31. action="append",
  32. help="Directory to use for template lookup (multiple "
  33. "directories may be provided). If not given then if the "
  34. "template is read from stdin, the value defaults to be "
  35. "the current directory, otherwise it defaults to be the "
  36. "parent directory of the file provided.",
  37. )
  38. parser.add_argument(
  39. "--output-encoding", default=None, help="force output encoding"
  40. )
  41. parser.add_argument(
  42. "--output-file",
  43. default=None,
  44. help="Write to file upon successful render instead of stdout",
  45. )
  46. parser.add_argument("input", nargs="?", default="-")
  47. options = parser.parse_args(argv)
  48. output_encoding = options.output_encoding
  49. output_file = options.output_file
  50. if options.input == "-":
  51. lookup_dirs = options.template_dir or ["."]
  52. lookup = TemplateLookup(lookup_dirs)
  53. try:
  54. template = Template(
  55. sys.stdin.read(),
  56. lookup=lookup,
  57. output_encoding=output_encoding,
  58. )
  59. except:
  60. _exit()
  61. else:
  62. filename = options.input
  63. if not isfile(filename):
  64. raise SystemExit("error: can't find %s" % filename)
  65. lookup_dirs = options.template_dir or [dirname(filename)]
  66. lookup = TemplateLookup(lookup_dirs)
  67. try:
  68. template = Template(
  69. filename=filename,
  70. lookup=lookup,
  71. output_encoding=output_encoding,
  72. )
  73. except:
  74. _exit()
  75. kw = dict(varsplit(var) for var in options.var)
  76. try:
  77. rendered = template.render(**kw)
  78. except:
  79. _exit()
  80. else:
  81. if output_file:
  82. open(output_file, "wt", encoding=output_encoding).write(rendered)
  83. else:
  84. sys.stdout.write(rendered)
  85. if __name__ == "__main__":
  86. cmdline()