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.
Files changed (61) hide show
  1. .git/COMMIT_EDITMSG +24 -0
  2. .git/HEAD +1 -0
  3. .git/config +15 -0
  4. .git/description +1 -0
  5. .git/hooks/applypatch-msg.sample +15 -0
  6. .git/hooks/commit-msg.sample +24 -0
  7. .git/hooks/fsmonitor-watchman.sample +174 -0
  8. .git/hooks/post-update.sample +8 -0
  9. .git/hooks/pre-applypatch.sample +14 -0
  10. .git/hooks/pre-commit.sample +49 -0
  11. .git/hooks/pre-merge-commit.sample +13 -0
  12. .git/hooks/pre-push.sample +53 -0
  13. .git/hooks/pre-rebase.sample +169 -0
  14. .git/hooks/pre-receive.sample +24 -0
  15. .git/hooks/prepare-commit-msg.sample +42 -0
  16. .git/hooks/push-to-checkout.sample +78 -0
  17. .git/hooks/sendemail-validate.sample +77 -0
  18. .git/hooks/update.sample +128 -0
  19. .git/index +0 -0
  20. .git/info/exclude +6 -0
  21. .git/logs/HEAD +2 -0
  22. .git/logs/refs/heads/iyue +2 -0
  23. .git/logs/refs/remotes/gitlab/iyue +1 -0
  24. .git/logs/refs/remotes/origin/HEAD +1 -0
  25. .git/logs/refs/remotes/origin/iyue +1 -0
  26. .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc +0 -0
  27. .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1 +0 -0
  28. .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0 +0 -0
  29. .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37 +0 -0
  30. .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d +0 -0
  31. .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3 +0 -0
  32. .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f +0 -0
  33. .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a +0 -0
  34. .git/objects/ed/fb5bbf938de738d1f658f80e23c675bb8b3fae +0 -0
  35. .git/objects/ef/4844af55f7f64b8dd24b81b5a8322a8c80208e +0 -0
  36. .git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454 +0 -0
  37. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx +0 -0
  38. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack +0 -0
  39. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev +0 -0
  40. .git/packed-refs +2 -0
  41. .git/refs/heads/iyue +1 -0
  42. .git/refs/remotes/gitlab/iyue +1 -0
  43. .git/refs/remotes/origin/HEAD +1 -0
  44. .git/refs/remotes/origin/iyue +1 -0
  45. .gitignore +142 -0
  46. .python-version +1 -0
  47. ARCHITECTURE.md +266 -0
  48. README.md +231 -0
  49. core/info_decoder.py +332 -10
  50. core/reconstructor.py +107 -3
  51. generation/proto_generator.py +34 -0
  52. main.py +172 -0
  53. parsing/enum_parser.py +4 -4
  54. parsing/java_parser.py +101 -1
  55. pyproject.toml +36 -0
  56. {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/METADATA +1 -1
  57. reproto-0.0.5.dist-info/RECORD +69 -0
  58. requirements.txt +3 -0
  59. reproto-0.0.3.dist-info/RECORD +0 -18
  60. {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/WHEEL +0 -0
  61. {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 ..models.message_definition import EnumDefinition, EnumValue
12
- from ..utils.logger import get_logger
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[EnumValue]:
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(EnumValue(name=name, value=value))
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: reproto
3
- Version: 0.0.3
3
+ Version: 0.0.5
4
4
  Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
5
  License: MIT
6
6
  Author: iyue
@@ -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
@@ -0,0 +1,3 @@
1
+ # 项目依赖
2
+ # 使用 loguru 库来提供强大且易于配置的日志记录功能。
3
+ loguru
@@ -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,,