MonkeyCode做代码天生器:从模板引擎到AI辅助的完备实战

[复制链接]
发表于 昨天 03:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
重复代码是步调员的天敌。MonkeyCode不但能帮你写代码,还能帮你造"写代码的工具"——代码天生器。
代码天生器的代价
  1. 程序员的时间分配:
  2.   写新代码:30%
  3.   写重复代码:40%  ← 这里可以优化!
  4.   调试代码:30%
复制代码
代码天生器把40%的重复劳动变成1次模板设置。
场景1:CRUD代码天生器

痛点

每个数据表都要写:Model、Schema、CURD接口、单位测试……满是模板代码。
让MonkeyCode天生CRUD天生器
  1. # generate_crud.py - 命令行工具
  2. import yaml
  3. import jinja2
  4. import os
  5. from pathlib import Path
  6. # ─── 模板引擎 ───
  7. env = jinja2.Environment(
  8.     loader=jinja2.FileSystemLoader("templates/"),
  9.     trim_blocks=True,
  10.     lstrip_blocks=True
  11. )
  12. # ─── 模型定义(YAML)───
  13. """
  14. # schema/user.yaml
  15. model: User
  16. table: users
  17. fields:
  18.   - name: id
  19.     type: int
  20.     primary_key: true
  21.     auto_increment: true
  22.   - name: email
  23.     type: str
  24.     unique: true
  25.     nullable: false
  26.   - name: nickname
  27.     type: str
  28.     nullable: true
  29.   - name: created_at
  30.     type: datetime
  31.     default: "now()"
  32. """
  33. def load_schema(yaml_path: str) -> dict:
  34.     with open(yaml_path) as f:
  35.         return yaml.safe_load(f)
  36. def generate_model(schema: dict) -> str:
  37.     """生成SQLAlchemy Model"""
  38.     template = env.get_template("model.py.j2")
  39.     return template.render(schema=schema)
  40. def generate_router(schema: dict) -> str:
  41.     """生成FastAPI Router"""
  42.     template = env.get_template("router.py.j2")
  43.     return template.render(schema=schema)
  44. def generate_schemas(schema: dict) -> str:
  45.     """生成Pydantic Schema"""
  46.     template = env.get_template("schemas.py.j2")
  47.     return template.render(schema=schema)
  48. def generate_tests(schema: dict) -> str:
  49.     """生成pytest单元测试"""
  50.     template = env.get_template("tests.py.j2")
  51.     return template.render(schema=schema)
  52. def generate_all(schema_path: str, output_dir: str):
  53.     schema = load_schema(schema_path)
  54.     model_name = schema["model"]
  55.     base = Path(output_dir) / model_name.lower()
  56.     base.mkdir(parents=True, exist_ok=True)
  57.    
  58.     (base / "model.py").write_text(generate_model(schema))
  59.     (base / "router.py").write_text(generate_router(schema))
  60.     (base / "schemas.py").write_text(generate_schemas(schema))
  61.     (base / "tests.py").write_text(generate_tests(schema))
  62.    
  63.     print(f"✅ 生成完成:{base}/")
  64. if __name__ == "__main__":
  65.     import sys
  66.     generate_all(sys.argv[1], sys.argv[2])
复制代码
Jinja2模板示例
  1. {# templates/model.py.j2 #}
  2. from sqlalchemy import Column, Integer, String, DateTime
  3. from sqlalchemy.orm import declarative_base
  4. Base = declarative_base()
  5. class {{ schema.model }}(Base):
  6.     __tablename__ = "{{ schema.table }}"
  7.    
  8.     {% for field in schema.fields %}
  9.     {{ field.name }} = Column(
  10.         {% if field.type == 'int' %}Integer()
  11.         {% elif field.type == 'str' %}String()
  12.         {% elif field.type == 'datetime' %}DateTime()
  13.         {% endif %}
  14.         {% if field.primary_key %}, primary_key=True{% endif %}
  15.         {% if field.auto_increment %}, autoincrement=True{% endif %}
  16.         {% if field.unique %}, unique=True{% endif %}
  17.         {% if field.nullable == false %}, nullable=False{% endif %}
  18.     )
  19.     {% endfor %}
复制代码
  1. {# templates/router.py.j2 #}
  2. from fastapi import APIRouter, Depends
  3. from pydantic import BaseModel
  4. router = APIRouter(prefix="/{{ schema.table }}")
  5. @router.post("/")
  6. async def create_{{ schema.table | singular }}(data: {{ schema.model }}Create):
  7.     # TODO: 实现创建逻辑
  8.     return {"id": 1}
  9. @router.get("/")
  10. async def list_{{ schema.table }}(skip: int = 0, limit: int = 100):
  11.     # TODO: 实现列表查询
  12.     return []
  13. @router.get("/{id}")
  14. async def get_{{ schema.table | singular }}(id: int):
  15.     # TODO: 实现单条查询
  16.     return {"id": id}
  17. @router.put("/{id}")
  18. async def update_{{ schema.table | singular }}(id: int, data: {{ schema.model }}Update):
  19.     # TODO: 实现更新
  20.     return {"id": id}
  21. @router.delete("/{id}")
  22. async def delete_{{ schema.table | singular }}(id: int):
  23.     # TODO: 实现删除
  24.     return {"deleted": True}
复制代码
利用
  1. python generate_crud.py schema/user.yaml ./app/
  2. # 输出:
  3. # ✅ 生成完成:./app/user/
  4. #   ├── model.py
  5. #   ├── router.py
  6. #   ├── schemas.py
  7. #   └── tests.py
复制代码
场景2:GraphQL代码天生

GraphQL有一堆Boilerplate代码,用graphql-code-generator主动天生:
  1. # codegen.yml
  2. overwrite: true
  3. schema: "http://localhost:8000/graphql"
  4. documents: "src/**/*.graphql"
  5. generates:
  6.   src/generated/types.ts:
  7.     plugins:
  8.       - "typescript"
  9.       - "typescript-operations"
  10.       - "typescript-react-apollo"
  11.   src/generated/api.ts:
  12.     plugins:
  13.       - "typescript-generator"
复制代码
运行 npx graphql-codegen,主动天生TypeScript范例界说和API调用代码。
场景3:Protocol Buffers + gRPC
  1. // api/order.proto
  2. syntax = "proto3";
  3. package order.v1;
  4. service OrderService {
  5.   rpc CreateOrder (CreateOrderRequest) returns (CreateOrderResponse);
  6.   rpc GetOrder    (GetOrderRequest)    returns (GetOrderResponse);
  7. }
  8. message CreateOrderRequest {
  9.   string user_id = 1;
  10.   repeated OrderItem items = 2;
  11. }
  12. message OrderItem {
  13.   string sku = 1;
  14.   int32 qty = 2;
  15. }
复制代码
天生Python代码:
  1. python -m grpc_tools.protoc \
  2.   -I. \
  3.   --python_out=. \
  4.   --grpc_python_out=. \
  5.   api/order.proto
复制代码
场景4:AI辅助代码天生器(Swagger/OpenAPI)

从OpenAPI Spec主动天生SDK:
  1. # 安装openapi-generator
  2. # npm install @openapitools/openapi-generator-cli -g
  3. # 生成Python SDK
  4. openapi-generator-cli generate \
  5.   -i http://localhost:8000/openapi.json \
  6.   -g python \
  7.   -o ./sdk/python \
  8.   --additional-properties=packageName=myapi_sdk
  9. # 生成TypeScript SDK
  10. openapi-generator-cli generate \
  11.   -i http://localhost:8000/openapi.json \
  12.   -g typescript-fetch \
  13.   -o ./sdk/ts
复制代码
场景5:MonkeyCode天生MonkeyCode(元编程)

让AI帮你写代码天生器:
  1. 我的项目有20个数据表,每个表都要写:
  2. - SQLAIchemy Model
  3. - Pydantic Schema
  4. - FastAPI CRUD接口
  5. - pytest单元测试
  6. 请帮我写一个代码生成器:
  7. 1. 输入:YAML格式的表结构定义
  8. 2. 输出:上述4个文件
  9. 3. 使用Jinja2模板引擎
  10. 4. 支持一键生成+单表生成
  11. 5. 生成后运行pytest验证
复制代码
高级本事:模板继承
  1. {# templates/base_api.py.j2 #}
  2. from fastapi import APIRouter, HTTPException
  3. from typing import List, Optional
  4. router = APIRouter()
  5. {% block list_endpoint %}{% endblock %}
  6. {% block create_endpoint %}{% endblock %}
  7. {% block get_endpoint %}{% endblock %}
  8. {% block update_endpoint %}{% endblock %}
  9. {% block delete_endpoint %}{% endblock %}
复制代码
  1. {# templates/custom_router.py.j2 #}
  2. {% extends "base_api.py.j2" %}
  3. {% block list_endpoint %}
  4. @router.get("/")
  5. async def list_items():
  6.     return []
  7. {% endblock %}
复制代码
代码天生器的界限
  1. 适合生成:
  2.   ✅ CRUD模板代码
  3.   ✅ 类型定义(protobuf/GraphQL)
  4.   ✅ SDK/客户端绑定
  5.   ✅ 配置文件模板
  6.   ✅ 单元测试模板
  7. 不适合生成:
  8.   ❌ 复杂业务逻辑(会生成错误逻辑)
  9.   ❌ 安全敏感代码(加密/认证)
  10.   ❌ 性能关键路径(需人工优化)
复制代码
MonkeyCode Prompt模板
  1. 用[Python/Go/TypeScript]写一个代码生成器,需求:
  2. 1. 输入格式:[YAML/JSON/Protobuf]
  3. 2. 生成目标:[CRUD代码/SDK/类型定义]
  4. 3. 使用[Jinja2/Go template] 模板引擎
  5. 4. 生成文件列表:[列出所有文件]
  6. 5. 生成后自动运行测试验证
  7. 6. 支持命令行参数:[参数列表]
复制代码
总结

代码天生器的核心是辨认重复模式,抽象为模板
MonkeyCode能帮你:

  • 分析现有代码,辨认可模板化的重复模式
  • 计划YAML/JSON输入格式
  • 编写Jinja2/Go template模板
  • 天生完备的代码天生器(含CLI、测试、文档
记着:代码天生器不是"一次性脚本",而是必要维护的底子办法。模板要清晰、可调试、可覆盖。

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表