You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.py 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #! /usr/bin/env python3
  2. import sys
  3. import argparse
  4. import jinja2
  5. import pydantic
  6. import yaml
  7. def to_yaml(value):
  8. value_str = yaml.safe_dump(value, default_style='"', default_flow_style=True)
  9. return value_str[:-1] if value_str and value_str[-1] == '\n' else value_str
  10. class ConfigBase(pydantic.BaseModel):
  11. pass
  12. class ConfigRoot(ConfigBase):
  13. answer: str = pydantic.Field()
  14. class Options(pydantic.BaseModel):
  15. config_path: str = pydantic.Field(alias='config')
  16. def main(argv):
  17. default_options = Options(**{
  18. 'config': './config.yml'
  19. })
  20. parser = argparse.ArgumentParser(description='Some awesome project')
  21. parser.add_argument('-c', '--config', type=str, default=default_options.config_path, help='Path to config file')
  22. args = parser.parse_args(argv[1:])
  23. options = Options(**vars(args))
  24. with open(options.config_path, 'r') as f:
  25. config_template = f.read()
  26. jinja_env = jinja2.Environment(
  27. loader=jinja2.PrefixLoader({
  28. 'config': jinja2.DictLoader({
  29. 'config.yml': config_template
  30. }),
  31. 'config.d': jinja2.FileSystemLoader('{}.d'.format(options.config_path))
  32. }),
  33. extensions=["jinja2.ext.do"]
  34. )
  35. jinja_env.filters['yaml'] = to_yaml
  36. template = jinja_env.get_template('config/config.yml')
  37. config_yml = template.render(options=options)
  38. config_dict = yaml.safe_load(config_yml)
  39. config = ConfigRoot(**config_dict)
  40. print(options.config_path)
  41. print(config.answer)
  42. return 0
  43. if __name__ == '__main__':
  44. sys.exit(main(sys.argv))