reproto 0.0.3__py3-none-any.whl → 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- .git/COMMIT_EDITMSG +24 -0
- .git/HEAD +1 -0
- .git/config +15 -0
- .git/description +1 -0
- .git/hooks/applypatch-msg.sample +15 -0
- .git/hooks/commit-msg.sample +24 -0
- .git/hooks/fsmonitor-watchman.sample +174 -0
- .git/hooks/post-update.sample +8 -0
- .git/hooks/pre-applypatch.sample +14 -0
- .git/hooks/pre-commit.sample +49 -0
- .git/hooks/pre-merge-commit.sample +13 -0
- .git/hooks/pre-push.sample +53 -0
- .git/hooks/pre-rebase.sample +169 -0
- .git/hooks/pre-receive.sample +24 -0
- .git/hooks/prepare-commit-msg.sample +42 -0
- .git/hooks/push-to-checkout.sample +78 -0
- .git/hooks/sendemail-validate.sample +77 -0
- .git/hooks/update.sample +128 -0
- .git/index +0 -0
- .git/info/exclude +6 -0
- .git/logs/HEAD +2 -0
- .git/logs/refs/heads/iyue +2 -0
- .git/logs/refs/remotes/gitlab/iyue +1 -0
- .git/logs/refs/remotes/origin/HEAD +1 -0
- .git/logs/refs/remotes/origin/iyue +1 -0
- .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc +0 -0
- .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1 +0 -0
- .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0 +0 -0
- .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37 +0 -0
- .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d +0 -0
- .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3 +0 -0
- .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f +0 -0
- .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a +0 -0
- .git/objects/ed/fb5bbf938de738d1f658f80e23c675bb8b3fae +0 -0
- .git/objects/ef/4844af55f7f64b8dd24b81b5a8322a8c80208e +0 -0
- .git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454 +0 -0
- .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx +0 -0
- .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack +0 -0
- .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev +0 -0
- .git/packed-refs +2 -0
- .git/refs/heads/iyue +1 -0
- .git/refs/remotes/gitlab/iyue +1 -0
- .git/refs/remotes/origin/HEAD +1 -0
- .git/refs/remotes/origin/iyue +1 -0
- .gitignore +142 -0
- .python-version +1 -0
- ARCHITECTURE.md +266 -0
- README.md +231 -0
- core/info_decoder.py +332 -10
- core/reconstructor.py +107 -3
- generation/proto_generator.py +34 -0
- main.py +172 -0
- parsing/enum_parser.py +4 -4
- parsing/java_parser.py +101 -1
- pyproject.toml +36 -0
- {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/METADATA +1 -1
- reproto-0.0.5.dist-info/RECORD +69 -0
- requirements.txt +3 -0
- reproto-0.0.3.dist-info/RECORD +0 -18
- {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/WHEEL +0 -0
- {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/entry_points.txt +0 -0
main.py
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Protobuf重构器 - 命令行入口
|
4
|
+
|
5
|
+
从JADX反编译的Java源码自动重构Protobuf .proto文件
|
6
|
+
支持任意Android应用,完全基于Java字节码推断
|
7
|
+
|
8
|
+
Usage:
|
9
|
+
python -m proto_reconstructor.main <java_sources_dir> <root_class> <output_dir> [--log-dir LOG_DIR]
|
10
|
+
|
11
|
+
Example:
|
12
|
+
python -m proto_reconstructor.main ./out_jadx/sources com.example.Model ./protos_generated --log-dir ./logs
|
13
|
+
|
14
|
+
Author: AI Assistant
|
15
|
+
"""
|
16
|
+
|
17
|
+
import sys
|
18
|
+
import argparse
|
19
|
+
from pathlib import Path
|
20
|
+
|
21
|
+
# 导入项目模块
|
22
|
+
import os
|
23
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
24
|
+
from core.reconstructor import ProtoReconstructor
|
25
|
+
from utils.logger import setup_logger, get_logger
|
26
|
+
|
27
|
+
|
28
|
+
def parse_arguments():
|
29
|
+
"""解析命令行参数"""
|
30
|
+
parser = argparse.ArgumentParser(
|
31
|
+
description='从JADX反编译的Java源码重构Protobuf .proto文件',
|
32
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
33
|
+
epilog="""
|
34
|
+
示例:
|
35
|
+
%(prog)s ./out_jadx/sources com.example.Model ./protos_generated
|
36
|
+
%(prog)s ./out_jadx/sources com.example.Model ./output --log-dir ./my_logs
|
37
|
+
%(prog)s /path/to/jadx/sources com.example.messaging.v1.models.MessageData ./output
|
38
|
+
"""
|
39
|
+
)
|
40
|
+
|
41
|
+
parser.add_argument(
|
42
|
+
'sources_dir',
|
43
|
+
type=str,
|
44
|
+
help='JADX反编译的Java源码目录路径'
|
45
|
+
)
|
46
|
+
|
47
|
+
parser.add_argument(
|
48
|
+
'root_class',
|
49
|
+
type=str,
|
50
|
+
help='要重构的根类完整类名 (如: com.example.Model)'
|
51
|
+
)
|
52
|
+
|
53
|
+
parser.add_argument(
|
54
|
+
'output_dir',
|
55
|
+
type=str,
|
56
|
+
help='生成的proto文件输出目录路径'
|
57
|
+
)
|
58
|
+
|
59
|
+
parser.add_argument(
|
60
|
+
'--log-dir',
|
61
|
+
type=str,
|
62
|
+
default='./logs',
|
63
|
+
help='日志文件输出目录 (默认: ./logs)'
|
64
|
+
)
|
65
|
+
|
66
|
+
parser.add_argument(
|
67
|
+
'--verbose', '-v',
|
68
|
+
action='store_true',
|
69
|
+
help='显示详细的处理信息'
|
70
|
+
)
|
71
|
+
|
72
|
+
return parser.parse_args()
|
73
|
+
|
74
|
+
|
75
|
+
def validate_arguments(args):
|
76
|
+
"""验证命令行参数"""
|
77
|
+
logger = get_logger("main")
|
78
|
+
|
79
|
+
# 验证源码目录
|
80
|
+
sources_path = Path(args.sources_dir)
|
81
|
+
if not sources_path.exists():
|
82
|
+
logger.error(f"源码目录不存在: {sources_path}")
|
83
|
+
sys.exit(1)
|
84
|
+
|
85
|
+
if not sources_path.is_dir():
|
86
|
+
logger.error(f"源码路径不是目录: {sources_path}")
|
87
|
+
sys.exit(1)
|
88
|
+
|
89
|
+
# 验证根类名格式
|
90
|
+
if not args.root_class or '.' not in args.root_class:
|
91
|
+
logger.error(f"根类名格式无效: {args.root_class}")
|
92
|
+
logger.error("应该是完整的类名,如: com.example.Model")
|
93
|
+
sys.exit(1)
|
94
|
+
|
95
|
+
# 输出目录可以不存在,会自动创建
|
96
|
+
output_path = Path(args.output_dir)
|
97
|
+
if output_path.exists() and not output_path.is_dir():
|
98
|
+
logger.error(f"输出路径存在但不是目录: {output_path}")
|
99
|
+
sys.exit(1)
|
100
|
+
|
101
|
+
# 验证日志目录
|
102
|
+
log_path = Path(args.log_dir)
|
103
|
+
try:
|
104
|
+
log_path.mkdir(parents=True, exist_ok=True)
|
105
|
+
except Exception as e:
|
106
|
+
logger.error(f"无法创建日志目录 {log_path}: {e}")
|
107
|
+
sys.exit(1)
|
108
|
+
|
109
|
+
return sources_path.resolve(), args.root_class, output_path.resolve()
|
110
|
+
|
111
|
+
|
112
|
+
def main():
|
113
|
+
"""主函数"""
|
114
|
+
args = None
|
115
|
+
try:
|
116
|
+
# 解析参数
|
117
|
+
args = parse_arguments()
|
118
|
+
|
119
|
+
# 初始化日志系统
|
120
|
+
setup_logger(args.log_dir)
|
121
|
+
logger = get_logger("main")
|
122
|
+
|
123
|
+
# 验证参数
|
124
|
+
sources_dir, root_class, output_dir = validate_arguments(args)
|
125
|
+
|
126
|
+
# 显示启动信息
|
127
|
+
logger.info("🚀 开始Proto重构任务")
|
128
|
+
logger.info(f"📁 源码目录: {sources_dir}")
|
129
|
+
logger.info(f"📁 输出目录: {output_dir}")
|
130
|
+
logger.info(f"📁 日志目录: {args.log_dir}")
|
131
|
+
logger.info(f"🎯 根类: {root_class}")
|
132
|
+
|
133
|
+
# 创建重构器并执行
|
134
|
+
reconstructor = ProtoReconstructor(sources_dir, output_dir)
|
135
|
+
results = reconstructor.reconstruct_from_root(root_class)
|
136
|
+
|
137
|
+
# 输出结果统计
|
138
|
+
if results:
|
139
|
+
logger.success("✅ 重构完成!")
|
140
|
+
logger.info(f"📊 处理统计: 共处理 {len(results)} 个类型")
|
141
|
+
|
142
|
+
message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
|
143
|
+
enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
|
144
|
+
|
145
|
+
logger.info(f" - 消息类型: {message_count} 个")
|
146
|
+
logger.info(f" - 枚举类型: {enum_count} 个")
|
147
|
+
else:
|
148
|
+
logger.warning("⚠️ 没有生成任何proto文件")
|
149
|
+
|
150
|
+
except KeyboardInterrupt:
|
151
|
+
if args:
|
152
|
+
logger = get_logger("main")
|
153
|
+
logger.warning("⚠️ 操作被用户中断")
|
154
|
+
else:
|
155
|
+
print("\n⚠️ 操作被用户中断")
|
156
|
+
sys.exit(1)
|
157
|
+
except Exception as e:
|
158
|
+
if args:
|
159
|
+
logger = get_logger("main")
|
160
|
+
logger.error(f"❌ 重构失败: {e}")
|
161
|
+
if args.verbose:
|
162
|
+
logger.exception("详细错误信息:")
|
163
|
+
else:
|
164
|
+
print(f"\n❌ 重构失败: {e}")
|
165
|
+
if hasattr(args, 'verbose') and args.verbose:
|
166
|
+
import traceback
|
167
|
+
traceback.print_exc()
|
168
|
+
sys.exit(1)
|
169
|
+
|
170
|
+
|
171
|
+
if __name__ == "__main__":
|
172
|
+
main()
|
parsing/enum_parser.py
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
import re
|
9
9
|
import os
|
10
10
|
from typing import List, Optional, Dict, Tuple
|
11
|
-
from
|
12
|
-
from
|
11
|
+
from models.message_definition import EnumDefinition, EnumValueDefinition
|
12
|
+
from utils.logger import get_logger
|
13
13
|
|
14
14
|
|
15
15
|
class EnumParser:
|
@@ -129,7 +129,7 @@ class EnumParser:
|
|
129
129
|
|
130
130
|
return enum_def
|
131
131
|
|
132
|
-
def _extract_enum_values(self, content: str) -> List[
|
132
|
+
def _extract_enum_values(self, content: str) -> List[EnumValueDefinition]:
|
133
133
|
"""
|
134
134
|
从Java内容中提取枚举值
|
135
135
|
|
@@ -161,7 +161,7 @@ class EnumParser:
|
|
161
161
|
|
162
162
|
try:
|
163
163
|
value = int(value_str)
|
164
|
-
enum_values.append(
|
164
|
+
enum_values.append(EnumValueDefinition(name=name, value=value))
|
165
165
|
except ValueError:
|
166
166
|
continue
|
167
167
|
|
parsing/java_parser.py
CHANGED
@@ -253,4 +253,104 @@ class JavaParser:
|
|
253
253
|
# 按数值排序
|
254
254
|
enum_values.sort(key=lambda x: x[1])
|
255
255
|
|
256
|
-
return enum_values
|
256
|
+
return enum_values
|
257
|
+
|
258
|
+
def get_raw_field_type(self, java_file_path: Path, field_name_raw: str) -> Optional[str]:
|
259
|
+
"""
|
260
|
+
从Java文件中获取指定字段的原始类型
|
261
|
+
|
262
|
+
Args:
|
263
|
+
java_file_path: Java文件路径
|
264
|
+
field_name_raw: 原始字段名(如 latitude_)
|
265
|
+
|
266
|
+
Returns:
|
267
|
+
字段的Java原始类型,如果找不到则返回None
|
268
|
+
"""
|
269
|
+
try:
|
270
|
+
# 读取Java文件内容
|
271
|
+
content = java_file_path.read_text(encoding='utf-8')
|
272
|
+
|
273
|
+
# 查找字段声明
|
274
|
+
field_type = self._extract_field_type_from_content(content, field_name_raw)
|
275
|
+
return field_type
|
276
|
+
|
277
|
+
except Exception as e:
|
278
|
+
self.logger.debug(f"获取字段类型失败 {java_file_path} - {field_name_raw}: {e}")
|
279
|
+
return None
|
280
|
+
|
281
|
+
def _extract_field_type_from_content(self, content: str, field_name_raw: str) -> Optional[str]:
|
282
|
+
"""
|
283
|
+
从Java文件内容中提取指定字段的类型
|
284
|
+
|
285
|
+
Args:
|
286
|
+
content: Java文件内容
|
287
|
+
field_name_raw: 原始字段名(如 latitude_)
|
288
|
+
|
289
|
+
Returns:
|
290
|
+
字段的Java类型,如果找不到则返回None
|
291
|
+
"""
|
292
|
+
# 构建字段声明的正则表达式模式
|
293
|
+
# 匹配: private Type fieldName_ = ...;
|
294
|
+
# 或: private Type fieldName_;
|
295
|
+
|
296
|
+
# 转义字段名中的特殊字符
|
297
|
+
escaped_field_name = re.escape(field_name_raw)
|
298
|
+
|
299
|
+
# 字段声明模式
|
300
|
+
patterns = [
|
301
|
+
# 标准字段声明: private Type fieldName_ = value;
|
302
|
+
rf'private\s+([^\s]+(?:<[^>]*>)?(?:\[\])?)\s+{escaped_field_name}\s*=',
|
303
|
+
# 简单字段声明: private Type fieldName_;
|
304
|
+
rf'private\s+([^\s]+(?:<[^>]*>)?(?:\[\])?)\s+{escaped_field_name}\s*;',
|
305
|
+
# 其他访问修饰符
|
306
|
+
rf'(?:public|protected|package)\s+([^\s]+(?:<[^>]*>)?(?:\[\])?)\s+{escaped_field_name}\s*[=;]',
|
307
|
+
# 无访问修饰符
|
308
|
+
rf'([^\s]+(?:<[^>]*>)?(?:\[\])?)\s+{escaped_field_name}\s*[=;]',
|
309
|
+
]
|
310
|
+
|
311
|
+
for pattern in patterns:
|
312
|
+
matches = re.finditer(pattern, content, re.MULTILINE)
|
313
|
+
for match in matches:
|
314
|
+
field_type = match.group(1).strip()
|
315
|
+
|
316
|
+
# 清理类型字符串
|
317
|
+
cleaned_type = self._clean_field_type(field_type)
|
318
|
+
if cleaned_type:
|
319
|
+
self.logger.debug(f"找到字段类型: {field_name_raw} -> {cleaned_type}")
|
320
|
+
return cleaned_type
|
321
|
+
|
322
|
+
self.logger.debug(f"未找到字段类型: {field_name_raw}")
|
323
|
+
return None
|
324
|
+
|
325
|
+
def _clean_field_type(self, field_type: str) -> Optional[str]:
|
326
|
+
"""
|
327
|
+
清理和标准化字段类型字符串
|
328
|
+
|
329
|
+
Args:
|
330
|
+
field_type: 原始字段类型字符串
|
331
|
+
|
332
|
+
Returns:
|
333
|
+
清理后的字段类型,如果无效则返回None
|
334
|
+
"""
|
335
|
+
if not field_type:
|
336
|
+
return None
|
337
|
+
|
338
|
+
# 移除多余的空白字符
|
339
|
+
field_type = field_type.strip()
|
340
|
+
|
341
|
+
# 跳过明显不是类型的字符串
|
342
|
+
if field_type in ['private', 'public', 'protected', 'static', 'final', 'volatile', 'transient']:
|
343
|
+
return None
|
344
|
+
|
345
|
+
# 处理泛型类型,保留完整的泛型信息
|
346
|
+
# 例如: MapFieldLite<String, Contact> 保持不变
|
347
|
+
|
348
|
+
# 处理数组类型
|
349
|
+
# 例如: String[] 保持不变
|
350
|
+
|
351
|
+
# 处理完全限定类名,提取简单类名
|
352
|
+
if '.' in field_type and not field_type.startswith('java.'):
|
353
|
+
# 对于非java包的类,保留完整路径以便后续处理
|
354
|
+
pass
|
355
|
+
|
356
|
+
return field_type
|
pyproject.toml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
[build-system]
|
2
|
+
requires = ["poetry-core>=1.0.0"]
|
3
|
+
build-backend = "poetry.core.masonry.api"
|
4
|
+
|
5
|
+
[tool.poetry]
|
6
|
+
name = "reproto"
|
7
|
+
version = "0.0.5"
|
8
|
+
description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
|
9
|
+
readme = "README.md"
|
10
|
+
license = "MIT"
|
11
|
+
authors = ["iyue <ys1231@126.com>"]
|
12
|
+
# 从当前目录自动包含所有包
|
13
|
+
packages = [
|
14
|
+
{include = "*", from = "."}
|
15
|
+
]
|
16
|
+
# 手动指定包
|
17
|
+
# packages = [
|
18
|
+
# {include = "main.py"},
|
19
|
+
# {include = "core"},
|
20
|
+
# {include = "generation"},
|
21
|
+
# {include = "models"},
|
22
|
+
# {include = "parsing"},
|
23
|
+
# {include = "utils"}
|
24
|
+
# ]
|
25
|
+
|
26
|
+
[tool.poetry.dependencies]
|
27
|
+
python = ">=3.12,<4.0"
|
28
|
+
loguru = ">=0.7.3"
|
29
|
+
|
30
|
+
[tool.poetry.scripts]
|
31
|
+
reproto = "main:main"
|
32
|
+
|
33
|
+
[[tool.poetry.source]]
|
34
|
+
name = "mirrors"
|
35
|
+
url = "https://mirrors.cernet.edu.cn/pypi/web/simple/"
|
36
|
+
priority = "supplemental"
|
@@ -0,0 +1,69 @@
|
|
1
|
+
.git/COMMIT_EDITMSG,sha256=eROlL1VVBatf_PiY_3hmrOpchaVnCVgES7IGoVDEn1A,847
|
2
|
+
.git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
|
3
|
+
.git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
|
4
|
+
.git/description,sha256=hatsFj1DoX6pz3eIMIvKFGbxsKjRzJLibpv2PaQGKu4,73
|
5
|
+
.git/hooks/applypatch-msg.sample,sha256=AiNJeguLAzqlijpSG4YphpOGz3qw4vEBlj0yiqYhk_c,478
|
6
|
+
.git/hooks/commit-msg.sample,sha256=H3TV6SkpebVz69WXQdRsuT_zkazdCD00C5Q3B1PZJDc,896
|
7
|
+
.git/hooks/fsmonitor-watchman.sample,sha256=4FSZZOk4l7UZvY4zPAN-Uf_w-IuhPghqMxWSv4AfodA,4726
|
8
|
+
.git/hooks/post-update.sample,sha256=gXZa8trvMjBh3LxeYfwWSBy3SzusmtihdLGGUjWG9sU,189
|
9
|
+
.git/hooks/pre-applypatch.sample,sha256=4VxbRp6j4KaVvqbyyCvPjmKCEHSTnd2Ft34AB_8WVHU,424
|
10
|
+
.git/hooks/pre-commit.sample,sha256=Vxhbe58FI516tS2wRfW4nrMTSNeyF36rIU9euHLhlxs,1649
|
11
|
+
.git/hooks/pre-merge-commit.sample,sha256=04JacDN5QOu9ClwHKYThMkWSDN-ImL0iXI0npt_Jy1M,416
|
12
|
+
.git/hooks/pre-push.sample,sha256=7M6cfgTT9d2ditqBdT3R1UmpY0smdwBCtY3aACF9CGo,1374
|
13
|
+
.git/hooks/pre-rebase.sample,sha256=T-vOhneQBSM4B29OZsxH77FIedGAl9HWHIJhhZ6qp7M,4898
|
14
|
+
.git/hooks/pre-receive.sample,sha256=pMPSuce7P9jRRBwxvU7nGlldZrRPz0ndsxAlIyAWmYk,544
|
15
|
+
.git/hooks/prepare-commit-msg.sample,sha256=6d3KpBif3dJe2X_Ix4nsp7bKFjkLI5KuMnbwyOGqRhk,1492
|
16
|
+
.git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
|
17
|
+
.git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
|
18
|
+
.git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
|
19
|
+
.git/index,sha256=vafB2CPLN6DtS2sNyYsT6ezg1J5KdoqHeurhmH_udRg,1991
|
20
|
+
.git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
|
21
|
+
.git/logs/HEAD,sha256=vqOm5IqxIdbLY2R6C-Y_3p5MRnlylPGWSMjIajNQnS0,364
|
22
|
+
.git/logs/refs/heads/iyue,sha256=vqOm5IqxIdbLY2R6C-Y_3p5MRnlylPGWSMjIajNQnS0,364
|
23
|
+
.git/logs/refs/remotes/gitlab/iyue,sha256=szYrNg8W1hzlkBCUhr5l9ZQzFTnTPf_wz1p-8uKEpIg,136
|
24
|
+
.git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
|
25
|
+
.git/logs/refs/remotes/origin/iyue,sha256=0czN8nX3e7mlLppzfYlDm9oxDCvoFUiUunKOftd18so,136
|
26
|
+
.git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
|
27
|
+
.git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
|
28
|
+
.git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
|
29
|
+
.git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
|
30
|
+
.git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
|
31
|
+
.git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
|
32
|
+
.git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f,sha256=twhhaZbfU_mgu5LIlt9ZeGjp_PT_gri_9H231H5nrNc,2172
|
33
|
+
.git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
|
34
|
+
.git/objects/ed/fb5bbf938de738d1f658f80e23c675bb8b3fae,sha256=MOYiuXKTxnd9YcqU3-HUVUq2g9fPU1-AKZOQ-3xsWCk,4237
|
35
|
+
.git/objects/ef/4844af55f7f64b8dd24b81b5a8322a8c80208e,sha256=hO8yllVMOtIE4HeOvwKSqQUByH6lvaA4L-RYrSU4vlg,167
|
36
|
+
.git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454,sha256=goQNyEV3NqzS28mMXuus1SWzwb8yXnvEPef14Ugzh5Q,750
|
37
|
+
.git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx,sha256=KRv1SBEe9bYL9d5V301LwPOBqFs3tMnB0dl4PriMMIw,2416
|
38
|
+
.git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
|
39
|
+
.git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
|
40
|
+
.git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
|
41
|
+
.git/refs/heads/iyue,sha256=22oC0TvD5HZ85ulpFJRKvJXLVn1iTlVP0VRyfYc8md0,41
|
42
|
+
.git/refs/remotes/gitlab/iyue,sha256=22oC0TvD5HZ85ulpFJRKvJXLVn1iTlVP0VRyfYc8md0,41
|
43
|
+
.git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
|
44
|
+
.git/refs/remotes/origin/iyue,sha256=22oC0TvD5HZ85ulpFJRKvJXLVn1iTlVP0VRyfYc8md0,41
|
45
|
+
.gitignore,sha256=ThRUL1E38Z_Q4Lww0xYYl9ziFaPUvvwwqxbmp2cuwco,2068
|
46
|
+
.python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
|
47
|
+
ARCHITECTURE.md,sha256=JALnUdREwdLRAmcUit5CGAPLpeZ6UfoYpAQkxil3NJc,8322
|
48
|
+
README.md,sha256=P71PU1DNUaLUAR15ja18AdZL0gobBh7xrUJeVZdlCbc,6067
|
49
|
+
core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
50
|
+
core/bytecode_parser.py,sha256=87ZGhnyBNGP-gRjIyRUcGfWS2HR1YA_e1OBKafLEEDc,11532
|
51
|
+
core/info_decoder.py,sha256=DgXDlMaNudOYXKJiPKfE3PeIrzN3Da-PlsQkkrnV2Hs,33959
|
52
|
+
core/reconstructor.py,sha256=eOJg6rx0Gkb3bzeuIKB_myt3mC61dsn7AP30EAJyqfg,29377
|
53
|
+
generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
54
|
+
generation/proto_generator.py,sha256=nd9rkjoOAJiY-aOSJz8RQd0z5WLN28zOi_vavwvpjes,16131
|
55
|
+
main.py,sha256=3hQ-_YmW5Weq14h040V48_W5DSb-xTXpMMb6vRjCbF8,5296
|
56
|
+
models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
|
57
|
+
models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
|
58
|
+
parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
59
|
+
parsing/enum_parser.py,sha256=4BjMk1NIYgt2FDZUjTZyOvFfC1uJp_MBZipVdk1tqes,6175
|
60
|
+
parsing/java_parser.py,sha256=6J16XlLIV-qktPDT1ccY70BngpP9VhwlXH0Z76TWHqM,11714
|
61
|
+
pyproject.toml,sha256=U09t6X16qaPcBoctTGXYc-B5T9CwQDZVNV86zUc07wo,901
|
62
|
+
requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
|
63
|
+
utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
64
|
+
utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
|
65
|
+
utils/logger.py,sha256=TaDXUHq5BQAsolswwHDeFUbXAfgL_fhXgxAcs901xmQ,2471
|
66
|
+
reproto-0.0.5.dist-info/METADATA,sha256=M380z-HVwHqJugxx93sJDruhxO3k0lIcG_FMxyElFmI,6625
|
67
|
+
reproto-0.0.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
68
|
+
reproto-0.0.5.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
|
69
|
+
reproto-0.0.5.dist-info/RECORD,,
|
requirements.txt
ADDED
reproto-0.0.3.dist-info/RECORD
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
2
|
-
core/bytecode_parser.py,sha256=87ZGhnyBNGP-gRjIyRUcGfWS2HR1YA_e1OBKafLEEDc,11532
|
3
|
-
core/info_decoder.py,sha256=n_U7c4syhDkfez5WXOxXi-CVQ3AMUISpGqixcHqzHHA,19214
|
4
|
-
core/reconstructor.py,sha256=9mNV_6YRLNjlSGxzrS4lU3yE8bzu-mwCD3zmw973nIk,25666
|
5
|
-
generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
6
|
-
generation/proto_generator.py,sha256=en-BAgikOzkDH7gdagX97iNIb5pTBN0ieVt5MnuL_BI,14535
|
7
|
-
models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
|
8
|
-
models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
|
9
|
-
parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
10
|
-
parsing/enum_parser.py,sha256=tBflR9bjC8LRe4cWw19i_ibCedWWB7ICQtbOQdpiWVc,6149
|
11
|
-
parsing/java_parser.py,sha256=Rk5_S02rqlqNU3OF7BMK57NynFAoxIHINyhnA6rUuhI,7897
|
12
|
-
utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
|
13
|
-
utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
|
14
|
-
utils/logger.py,sha256=TaDXUHq5BQAsolswwHDeFUbXAfgL_fhXgxAcs901xmQ,2471
|
15
|
-
reproto-0.0.3.dist-info/METADATA,sha256=gMKobujRFan-lqWGzhNmGARmWnzeBQxG2Jzsj6uK8XM,6625
|
16
|
-
reproto-0.0.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
17
|
-
reproto-0.0.3.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
|
18
|
-
reproto-0.0.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|