gen_template.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from jinja2 import Environment, FileSystemLoader, Template, select_autoescape
  4. from pydantic.alias_generators import to_pascal, to_snake
  5. from app.generator.conf import generator_settings
  6. from app.generator.model import GenBusiness, GenModel
  7. from core.path_conf import JINJA2_TEMPLATE_DIR
  8. class GenTemplate:
  9. def __init__(self):
  10. self.env = Environment(
  11. loader=FileSystemLoader(JINJA2_TEMPLATE_DIR),
  12. autoescape=select_autoescape(enabled_extensions=['jinja']),
  13. trim_blocks=True,
  14. lstrip_blocks=True,
  15. keep_trailing_newline=True,
  16. enable_async=True,
  17. )
  18. self.init_content = '#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n'
  19. def get_template(self, jinja_file: str) -> Template:
  20. """
  21. 获取模版文件
  22. :param jinja_file:
  23. :return:
  24. """
  25. return self.env.get_template(jinja_file)
  26. @staticmethod
  27. def get_template_paths() -> list[str]:
  28. """
  29. 获取模版文件路径
  30. :return:
  31. """
  32. return [
  33. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/api.jinja',
  34. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/crud.jinja',
  35. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/model.jinja',
  36. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/schema.jinja',
  37. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/service.jinja',
  38. ]
  39. @staticmethod
  40. def get_code_gen_paths(business: GenBusiness) -> list[str]:
  41. """
  42. 获取代码生成路径列表
  43. :param business:
  44. :return:
  45. """
  46. app_name = business.app_name
  47. module_name = business.table_name_en
  48. target_files = [
  49. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/{app_name}/api/{business.api_version}/{module_name}.py',
  50. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/{app_name}/crud/crud_{module_name}.py',
  51. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/{app_name}/model/{module_name}.py',
  52. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/{app_name}/schema/{module_name}.py',
  53. f'{generator_settings.TEMPLATE_BACKEND_DIR_NAME}/{app_name}/service/{module_name}_service.py',
  54. ]
  55. return target_files
  56. def get_code_gen_path(self, tpl_path: str, business: GenBusiness) -> str:
  57. """
  58. 获取代码生成路径
  59. :param tpl_path:
  60. :param business:
  61. :return:
  62. """
  63. target_files = self.get_code_gen_paths(business)
  64. code_gen_path_mapping = dict(zip(self.get_template_paths(), target_files))
  65. return code_gen_path_mapping[tpl_path]
  66. @staticmethod
  67. def get_vars(business: GenBusiness, models: list[GenModel]) -> dict:
  68. """
  69. 获取模版变量
  70. :param business:
  71. :param models:
  72. :return:
  73. """
  74. return {
  75. 'app_name': business.app_name,
  76. 'table_name_en': to_snake(business.table_name_en),
  77. 'table_name_class': to_pascal(business.table_name_en),
  78. 'table_name_zh': business.table_name_zh,
  79. 'table_simple_name_zh': business.table_simple_name_zh,
  80. 'table_comment': business.table_comment,
  81. 'schema_name': to_pascal(business.schema_name),
  82. 'have_datetime_column': business.default_datetime_column,
  83. 'permission_sign': str(business.table_name_en.replace('_', ':')),
  84. 'models': models,
  85. }
  86. gen_template = GenTemplate()