python 自动生成文档
python 自动生成文档
- python 自动生成文档
- 一、配置文档
- 二、protobuf
- 三、代码
python 自动生成文档
一、配置文档
- 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}
- 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 自动生成文档相关推荐
- django集成Sphinx,为项目自动生成文档
Sphinx是一个工具,可以轻松创建智能和漂亮的文档,他与Python自带的pydoc是同一类产品,但比pydoc更加优秀,还有很多主题可以选择,平时在开发过程中,我们看到的第三方包的文档,基本上都是 ...
- Matlab联合wps的API生成文档,让API自动生成文档
原标题:让API自动生成文档 程序员最苦恼的事情莫过于写文档.由于业务口径频繁变更,因此很多接口也会频繁变更,频繁变更导致文档的维护是一件相当费时的事情,当优先级更高的事情袭来,更新文档反到成了次要工 ...
- Objective-C自动生成文档工具:appledoc
作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective-C自动生成文 ...
- Objective-C 自动生成文档工具:appledoc
来源:iOS_小松哥 www.jianshu.com/p/fd4d8d6b6177 如有好文章投稿,请点击 → 这里了解详情 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective ...
- java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录
[Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...
- docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档
为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...
- java动态生成sdk_android、java制作sdk以及自动生成文档
最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...
- java如何写安卓接口文档_android、java制作sdk以及自动生成文档
最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...
- php代码自动生成文档-phpDocumentor
概述 PHPDocumentor 能够由你的代码自动生成文档.是一个用PHP写的强盛的文档主动生成对象,可以直接使用命令来处理.对有范例解释的php顺序,可以快速生成具有布局清楚.彼此参照.索引等功效 ...
最新文章
- 与交换机延迟相关的各种“秒”的单位
- Tengine编译安装config项目清单
- mysql事件调度定时任务_详解MySQL用事件调度器Event Scheduler创建定时任务
- 由小游戏跳一跳想到的
- 详解数据挖掘与机器学习的区别与联系
- java自动生成代码框架_DodoFramework- 一个基于代码生成引擎的Java Web系统自动化开发框架...
- mfc文字闪烁如何解决_男同胞福音!如何解决尿尿时最尴尬的难题?建议偷偷收藏(文字版)...
- java集合多个最大值_Java 8 Stream 求集合元素每个属性的最大值
- 利用反射将IDataReader读取到实体类中效率低下的解决办法
- 双系统移动硬盘备份方案:macOS Catalina 10.15.5, Win10
- JavaWeb(二)Servlet和JSP简介
- 最新Discuz模板二次元动漫C风格+C风格门户版1.1 UTF8+GBK
- 购物车结算页面案例jQuery
- win10 高分屏显示模糊的解决办法
- 试验数据管理平台解决方案--MDM
- 体验共享单车后对于Locman技术实现的几点思考
- Selenium自动化下载文件Firefox配置教程
- 洛谷 P2191 小Z的情书
- STM32传感器外设集--温湿度模块(DHT11)
- matlab滞环比较控制器,滞环比较跟踪控制技术