python 自动生成文档

  • python 自动生成文档
    • 一、配置文档
    • 二、protobuf
    • 三、代码

python 自动生成文档

一、配置文档

  1. register.temeprate
# Datetime: ${DATETIME}from proto import ${FILENAME}_pb2
from proto import xCmd_pb2def register_${WRITEFILE}(pbmap):pbmap.register_command(xCmd_pb2.${PROTTOCMD},${FILENAME}_pb2.${PARAMNAME}Param)  # ${NUMBER}
  1. cmd.temperate
   pbmap.register_descriptor(xCmd_pb2.${PROTTOCMD},${FILENAME}_pb2.${CMD})  # ${NUMBER}</securityRealm>

二、protobuf

// scene -> client : puzzle item ntf
message PuzzleItemNtf
{optional Command cmd = 1 [ default = PUZZLE_PROTOCMD ];optional PuzzleParam param = 2 [ default = PUZZLEPARAM_ITEMNTF ];repeated PuzzleItem items = 3;
}// client <-> scene : get reward
message ActivePuzzleCmd
{optional Command cmd = 1 [ default = PUZZLE_PROTOCMD ];optional PuzzleParam param = 2 [ default = PUZZLEPARAM_ACTIVIEPUZZLE ];optional uint32 actid = 3 [ default = 0 ];optional uint32 puzzleid = 4 [ default = 0 ];
}

三、代码

# Author: Allan
# Datetime: 2019-03-15
# 遍历 proto 目录下使用文件,自动在 pbmap 目录下生成相应文件import re
import os
from datetime import datetime
from string import Templateclass AutoCreateFile:def __init__(self):self.file_path = r'./proto/{}.proto'self.command, self.xCmds = self.get_params('xCmd.proto')self.write_file = ''def generate(self, filename):"""自动生成 pbmap 文件:param filename: protobuf 文件:return: None"""flag = False  # 是否存在(PROTOCMD)命令lines = []current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")file_path = self.file_path.format(filename)cmds_detail, count = self.get_commands_detail(file_path)if count > 1:print('{} 存在 {} 个 PROTOCMD 命令'.format(filename, count))if cmds_detail:if filename.endswith('Cmd'):self.write_file = filename.split('Cmd')[0]else:self.write_file = filenamenumber = self.get_protocmd_number(cmds_detail[0]['proto_cmd'])with open(r'register.temperate', 'r') as f:temp_param = Template(f.read())lines.append(temp_param.substitute(DATETIME=current_datetime,WRITEFILE=self.write_file,FILENAME=filename,PARAMNAME=cmds_detail[0]['param_name'],PROTTOCMD=cmds_detail[0]['proto_cmd'],NUMBER=number))with open(r'cmd.temperate', 'r') as f:cmd_params = Template(f.read())for command in cmds_detail:lines.append(cmd_params.substitute(FILENAME=filename,PROTTOCMD=command['proto_cmd'],PARAM=command['param'],CMD=command['cmd_name']))flag = Trueif flag:# 如果有命令(PROTOCMD),生成 pbmap 文件self.write_pbmap(lines)def get_params(self, filename):"""获取 protobuf 文件中的参数:param filename: protobuf 文件:return: param_name, params"""with open(filename, 'r') as f:params = []lines = f.readlines()param_name = re.search(r'^enum .*', ''.join(lines), re.M)param_name = param_name.group().split()[1].split('Param')[0]flag = Falsefor param in lines:# 遍历第一个enum,并过滤空行和注释行if '{' in param:flag = Truecontinueelif "}" in param:breakif flag and param != '\n' and not param.startswith('//'):params.append(param.strip().split(';')[0])return param_name, paramsdef get_protocmd_number(self, proto_param):for param in self.xCmds:if proto_param in param:number = param.replace(' ', '').split('=')[1]return numberdef get_commands_detail(self, filename):"""获取 cmd 详细信息:param filename: protobuf 文件:param param: CmdParam (例如,AchiveParam):return: cmds_detail: [proto_cmd, cmd_name, param_name, param]count: 大于1,则文件存在重复的PROTOCMD"""with open(filename, 'r') as f:count = 0cmds_detail = []temp_proto_cmd = ""lines = f.readlines()for i in range(len(lines)):if 'PROTOCMD' in lines[i] and '//' not in lines[i]:cmd_detail = {'proto_cmd': '', 'cmd_name': '', 'param_name': '', 'param': ''}proto_cmd = lines[i].replace(' ', '').split(']')[0].split('=')[-1]cmd_name = lines[i-2].split()[1]param = lines[i+1].replace(' ', '').split(']')[0].split('=')[-1]if 'Param' not in lines[i+1]:continueparam_name = lines[i+1].strip().split()[1]cmd_detail['proto_cmd'] = proto_cmdif temp_proto_cmd != proto_cmd:"记录重复的PROTOCMD文件"temp_proto_cmd = proto_cmdcount += 1cmd_detail['cmd_name'] = cmd_namecmd_detail['param'] = paramcmd_detail['param_name'] = param_namecmds_detail.append(cmd_detail)return cmds_detail, countdef write_pbmap(self, info):"""写入信息到 pbmap 文件:param info: 信息:return: None"""filename = r'./pbmap/{}.py'.format(self.write_file)with open(filename, 'w') as f:f.writelines(info)def read_directory(self, path):"""遍历目录,查找使用文件名:param path: 目标目录:return: 所有文件名"""results = []path = os.listdir(path)for i, item in enumerate(path):if item.endswith('.proto'):results.append(item)return resultsif __name__ == '__main__':acf = AutoCreateFile()res = acf.read_directory(path=r'./proto')for result in res:path = result.split('.')[0]acf.generate(path)

python 自动生成文档相关推荐

  1. django集成Sphinx,为项目自动生成文档

    Sphinx是一个工具,可以轻松创建智能和漂亮的文档,他与Python自带的pydoc是同一类产品,但比pydoc更加优秀,还有很多主题可以选择,平时在开发过程中,我们看到的第三方包的文档,基本上都是 ...

  2. Matlab联合wps的API生成文档,让API自动生成文档

    原标题:让API自动生成文档 程序员最苦恼的事情莫过于写文档.由于业务口径频繁变更,因此很多接口也会频繁变更,频繁变更导致文档的维护是一件相当费时的事情,当优先级更高的事情袭来,更新文档反到成了次要工 ...

  3. Objective-C自动生成文档工具:appledoc

    作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective-C自动生成文 ...

  4. Objective-C 自动生成文档工具:appledoc

    来源:iOS_小松哥 www.jianshu.com/p/fd4d8d6b6177 如有好文章投稿,请点击 → 这里了解详情 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective ...

  5. java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录

    [Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...

  6. docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档

    为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...

  7. java动态生成sdk_android、java制作sdk以及自动生成文档

    最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...

  8. java如何写安卓接口文档_android、java制作sdk以及自动生成文档

    最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...

  9. php代码自动生成文档-phpDocumentor

    概述 PHPDocumentor 能够由你的代码自动生成文档.是一个用PHP写的强盛的文档主动生成对象,可以直接使用命令来处理.对有范例解释的php顺序,可以快速生成具有布局清楚.彼此参照.索引等功效 ...

最新文章

  1. 与交换机延迟相关的各种“秒”的单位
  2. Tengine编译安装config项目清单
  3. mysql事件调度定时任务_详解MySQL用事件调度器Event Scheduler创建定时任务
  4. 由小游戏跳一跳想到的
  5. 详解数据挖掘与机器学习的区别与联系
  6. java自动生成代码框架_DodoFramework- 一个基于代码生成引擎的Java Web系统自动化开发框架...
  7. mfc文字闪烁如何解决_男同胞福音!如何解决尿尿时最尴尬的难题?建议偷偷收藏(文字版)...
  8. java集合多个最大值_Java 8 Stream 求集合元素每个属性的最大值
  9. 利用反射将IDataReader读取到实体类中效率低下的解决办法
  10. 双系统移动硬盘备份方案:macOS Catalina 10.15.5, Win10
  11. JavaWeb(二)Servlet和JSP简介
  12. 最新Discuz模板二次元动漫C风格+C风格门户版1.1 UTF8+GBK
  13. 购物车结算页面案例jQuery
  14. win10 高分屏显示模糊的解决办法
  15. 试验数据管理平台解决方案--MDM
  16. 体验共享单车后对于Locman技术实现的几点思考
  17. Selenium自动化下载文件Firefox配置教程
  18. 洛谷 P2191 小Z的情书
  19. STM32传感器外设集--温湿度模块(DHT11)
  20. matlab滞环比较控制器,滞环比较跟踪控制技术

热门文章

  1. 赋值运算符重载和日期运算代码
  2. bitbake-2-poky系统结构
  3. 关于github的高级搜索技巧
  4. 【C++】STL——string(两万字详解)
  5. ip地址的概念和作用
  6. 灵汐科技携类脑芯片KA200及类脑系列产品亮相国家“十三五”科技创新成就展
  7. 相亲时候遇到的92年妹子,老衲想下手了
  8. Postman中认证CAS
  9. c++ 字母a~z升序排列编号 字典序问题 递归
  10. SpringBoot动态配置开启关闭定时任务