reproto 0.1.2__py3-none-any.whl → 0.1.4__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 (87) hide show
  1. .git/COMMIT_EDITMSG +1 -30
  2. .git/index +0 -0
  3. .git/logs/HEAD +4 -0
  4. .git/logs/refs/heads/iyue +4 -0
  5. .git/logs/refs/remotes/gitlab/iyue +4 -0
  6. .git/logs/refs/remotes/origin/iyue +4 -0
  7. .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872 +0 -0
  8. .git/objects/00/885cebf557ff261574deb93cb96449d06db01c +0 -0
  9. .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa +0 -0
  10. .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa +0 -0
  11. .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6 +0 -0
  12. .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
  13. .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162 +0 -0
  14. .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
  15. .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
  16. .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
  17. .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
  18. .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
  19. .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
  20. .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
  21. .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
  22. .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
  23. .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb +0 -0
  24. .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1 +0 -0
  25. .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
  26. .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da +0 -0
  27. .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
  28. .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
  29. .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
  30. .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
  31. .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
  32. .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
  33. .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
  34. .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
  35. .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916 +0 -0
  36. .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
  37. .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
  38. .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
  39. .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
  40. .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
  41. .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
  42. .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
  43. .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
  44. .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
  45. .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2 +1 -0
  46. .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
  47. .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
  48. .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
  49. .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
  50. .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
  51. .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
  52. .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
  53. .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
  54. .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
  55. .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
  56. .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
  57. .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
  58. .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9 +0 -0
  59. .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
  60. .git/refs/heads/iyue +1 -1
  61. .git/refs/remotes/gitlab/iyue +1 -1
  62. .git/refs/remotes/origin/iyue +1 -1
  63. README.md +104 -190
  64. core/__init__.py +23 -0
  65. core/info_decoder.py +13 -4
  66. core/reconstructor.py +25 -16
  67. generation/__init__.py +17 -0
  68. generation/proto_generator.py +11 -5
  69. main.py +59 -56
  70. models/__init__.py +31 -24
  71. parsing/__init__.py +22 -0
  72. parsing/enum_parser.py +10 -2
  73. parsing/java_parser.py +7 -1
  74. pyproject.toml +2 -1
  75. reproto-0.1.4.dist-info/METADATA +210 -0
  76. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/RECORD +85 -31
  77. requirements.txt +3 -1
  78. utils/__init__.py +55 -0
  79. utils/builtin_proto.py +8 -1
  80. utils/file_cache.py +8 -1
  81. utils/report_utils.py +71 -0
  82. utils/type_index.py +8 -1
  83. utils/version_checker.py +311 -0
  84. core/bytecode_parser.py +0 -274
  85. reproto-0.1.2.dist-info/METADATA +0 -295
  86. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/WHEEL +0 -0
  87. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/entry_points.txt +0 -0
core/info_decoder.py CHANGED
@@ -16,9 +16,19 @@ import re
16
16
  from typing import Optional, List, Dict, Tuple
17
17
  from pathlib import Path
18
18
 
19
- from models.message_definition import MessageDefinition, FieldDefinition, OneofDefinition
20
- from utils.logger import get_logger
21
- from utils.type_utils import type_mapper, naming_converter
19
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
20
+ try:
21
+ # 相对导入(包环境)
22
+ from ..models.message_definition import MessageDefinition, FieldDefinition, OneofDefinition
23
+ from ..utils.logger import get_logger
24
+ from ..utils.type_utils import type_mapper, naming_converter
25
+ from ..parsing.java_parser import JavaParser
26
+ except ImportError:
27
+ # 绝对导入(开发环境)
28
+ from models.message_definition import MessageDefinition, FieldDefinition, OneofDefinition
29
+ from utils.logger import get_logger
30
+ from utils.type_utils import type_mapper, naming_converter
31
+ from parsing.java_parser import JavaParser
22
32
 
23
33
 
24
34
  class InfoDecoder:
@@ -40,7 +50,6 @@ class InfoDecoder:
40
50
  self.java_source_analyzer = java_source_analyzer
41
51
 
42
52
  # 导入JavaParser
43
- from parsing.java_parser import JavaParser
44
53
  self.java_parser = JavaParser()
45
54
 
46
55
  # Protobuf字段类型映射表
core/reconstructor.py CHANGED
@@ -15,14 +15,31 @@ from pathlib import Path
15
15
  from collections import deque
16
16
  from typing import Set, Dict, List, Optional, Tuple
17
17
 
18
- from parsing.java_parser import JavaParser
19
- from parsing.enum_parser import EnumParser
20
- from core.info_decoder import InfoDecoder
21
- from generation.proto_generator import ProtoGenerator
22
- from models.message_definition import MessageDefinition, EnumDefinition, EnumValueDefinition
23
- from utils.logger import get_logger
24
- from utils.file_cache import get_file_cache
25
- from utils.type_utils import type_mapper, naming_converter
18
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
19
+ try:
20
+ # 相对导入(包环境)
21
+ from ..parsing.java_parser import JavaParser
22
+ from ..parsing.enum_parser import EnumParser
23
+ from .info_decoder import InfoDecoder
24
+ from ..generation.proto_generator import ProtoGenerator
25
+ from ..models.message_definition import MessageDefinition, EnumDefinition, EnumValueDefinition
26
+ from ..utils.logger import get_logger
27
+ from ..utils.file_cache import get_file_cache
28
+ from ..utils.type_utils import type_mapper, naming_converter, TypeMapper, NamingConverter
29
+ from ..utils.builtin_proto import get_builtin_manager
30
+ from ..utils.type_index import get_type_index
31
+ except ImportError:
32
+ # 绝对导入(开发环境)
33
+ from parsing.java_parser import JavaParser
34
+ from parsing.enum_parser import EnumParser
35
+ from core.info_decoder import InfoDecoder
36
+ from generation.proto_generator import ProtoGenerator
37
+ from models.message_definition import MessageDefinition, EnumDefinition, EnumValueDefinition
38
+ from utils.logger import get_logger
39
+ from utils.file_cache import get_file_cache
40
+ from utils.type_utils import type_mapper, naming_converter, TypeMapper, NamingConverter
41
+ from utils.builtin_proto import get_builtin_manager
42
+ from utils.type_index import get_type_index
26
43
 
27
44
 
28
45
  class JavaSourceAnalyzer:
@@ -359,7 +376,6 @@ class ProtoReconstructor:
359
376
  self.info_decoder.java_source_analyzer = self.java_source_analyzer
360
377
 
361
378
  # 初始化内置proto管理器
362
- from utils.builtin_proto import get_builtin_manager
363
379
  self.builtin_manager = get_builtin_manager(output_dir=str(output_dir))
364
380
 
365
381
  # 🚀 性能优化:移除未使用的索引系统,简化代码
@@ -404,7 +420,6 @@ class ProtoReconstructor:
404
420
  self._generate_all_proto_files()
405
421
 
406
422
  # 5. 输出性能统计信息
407
- from utils.file_cache import get_file_cache
408
423
  file_cache = get_file_cache()
409
424
  file_cache.print_stats()
410
425
 
@@ -1269,8 +1284,6 @@ class ProtoReconstructor:
1269
1284
  是否为基础字段类型
1270
1285
  """
1271
1286
  # 🚀 性能优化:使用缓存的类型检查器,避免重复计算
1272
- from utils.type_utils import TypeMapper
1273
-
1274
1287
  # 直接使用统一的基础类型检查,无需额外逻辑
1275
1288
  return TypeMapper.is_java_basic_type(type_name)
1276
1289
 
@@ -1353,8 +1366,6 @@ class ProtoReconstructor:
1353
1366
  实际的完整类型名
1354
1367
  """
1355
1368
  # 🚀 优化:使用统一的类型检查器
1356
- from utils.type_utils import TypeMapper
1357
-
1358
1369
  if TypeMapper.is_java_basic_type(inferred_type):
1359
1370
  self.logger.debug(f" 跳过基础类型: {inferred_type}")
1360
1371
  return None
@@ -1365,7 +1376,6 @@ class ProtoReconstructor:
1365
1376
 
1366
1377
  try:
1367
1378
  # 使用索引系统进行快速查找,避免文件IO
1368
- from utils.type_index import get_type_index
1369
1379
  type_index = get_type_index(self.sources_dir)
1370
1380
 
1371
1381
  # 构造可能的完整类名
@@ -1523,5 +1533,4 @@ class ProtoReconstructor:
1523
1533
  蛇形命名字符串
1524
1534
  """
1525
1535
  # 🚀 优化:使用统一的命名转换器,避免重复实现
1526
- from utils.type_utils import NamingConverter
1527
1536
  return NamingConverter.to_snake_case(camel_str)
generation/__init__.py CHANGED
@@ -1,3 +1,20 @@
1
+ """
2
+ 代码生成模块
3
+
4
+ 负责将解析得到的消息定义转换为Protobuf .proto文件
5
+ """
6
+
7
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
8
+ try:
9
+ # 相对导入(包环境)
10
+ from .proto_generator import ProtoGenerator
11
+ except ImportError:
12
+ # 绝对导入(开发环境)
13
+ from generation.proto_generator import ProtoGenerator
14
+
15
+ __all__ = [
16
+ 'ProtoGenerator'
17
+ ]
1
18
 
2
19
 
3
20
 
@@ -10,8 +10,17 @@ Author: AI Assistant
10
10
 
11
11
  import re
12
12
  from typing import Dict, Set, List, Union
13
- from models.message_definition import MessageDefinition, FieldDefinition, EnumDefinition, EnumValueDefinition
14
- from utils.type_utils import type_mapper, naming_converter, field_name_processor
13
+
14
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
15
+ try:
16
+ # 相对导入(包环境)
17
+ from ..models.message_definition import MessageDefinition, FieldDefinition, EnumDefinition, EnumValueDefinition
18
+ from ..utils.type_utils import type_mapper, naming_converter, field_name_processor
19
+ from ..utils.logger import get_logger
20
+ except ImportError:
21
+ # 绝对导入(开发环境)
22
+ from models.message_definition import MessageDefinition, FieldDefinition, EnumDefinition, EnumValueDefinition
23
+ from utils.type_utils import type_mapper, naming_converter, field_name_processor
15
24
 
16
25
 
17
26
  class ProtoGenerator:
@@ -70,7 +79,6 @@ class ProtoGenerator:
70
79
  return '\n'.join(lines)
71
80
 
72
81
  except Exception as e:
73
- from utils.logger import get_logger
74
82
  logger = get_logger("proto_generator")
75
83
  logger.error(f"❌ 生成proto文件失败 {message_def.name if message_def else 'Unknown'}: {e}")
76
84
  raise
@@ -118,7 +126,6 @@ class ProtoGenerator:
118
126
  return '\n'.join(lines)
119
127
 
120
128
  except Exception as e:
121
- from utils.logger import get_logger
122
129
  logger = get_logger("proto_generator")
123
130
  logger.error(f"❌ 生成枚举proto文件失败 {enum_def.name if enum_def else 'Unknown'}: {e}")
124
131
  raise
@@ -290,7 +297,6 @@ class ProtoGenerator:
290
297
  return f' {field_type} {field.name} = {field.tag};'
291
298
 
292
299
  except Exception as e:
293
- from utils.logger import get_logger
294
300
  logger = get_logger("proto_generator")
295
301
  logger.error(f"❌ 生成字段定义失败 {field.name if field else 'Unknown'}: {e}")
296
302
  raise
main.py CHANGED
@@ -16,17 +16,35 @@ Author: AI Assistant
16
16
 
17
17
  import sys
18
18
  import argparse
19
+ import traceback
19
20
  from pathlib import Path
20
21
 
21
- # 导入项目模块
22
+ # 确保项目根目录在Python路径中
22
23
  import os
23
24
  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
25
 
26
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
27
+ try:
28
+ # 相对导入(包环境)
29
+ from .core.reconstructor import ProtoReconstructor
30
+ from .utils.logger import setup_logger, get_logger
31
+ from .utils.report_utils import print_results_summary
32
+ from .utils.version_checker import check_version_on_startup
33
+ except ImportError:
34
+ # 绝对导入(开发环境)
35
+ from core.reconstructor import ProtoReconstructor
36
+ from utils.logger import setup_logger, get_logger
37
+ from utils.report_utils import print_results_summary
38
+ from utils.version_checker import check_version_on_startup
27
39
 
28
- def parse_arguments():
29
- """解析命令行参数"""
40
+
41
+ def parse_arguments() -> argparse.Namespace:
42
+ """
43
+ 解析命令行参数
44
+
45
+ Returns:
46
+ 解析后的命令行参数对象
47
+ """
30
48
  parser = argparse.ArgumentParser(
31
49
  description='从JADX反编译的Java源码重构Protobuf .proto文件',
32
50
  formatter_class=argparse.RawDescriptionHelpFormatter,
@@ -72,8 +90,19 @@ def parse_arguments():
72
90
  return parser.parse_args()
73
91
 
74
92
 
75
- def validate_arguments(args):
76
- """验证命令行参数"""
93
+ def validate_arguments(args: argparse.Namespace) -> tuple[Path, str, Path]:
94
+ """
95
+ 验证命令行参数的有效性
96
+
97
+ Args:
98
+ args: 解析后的命令行参数
99
+
100
+ Returns:
101
+ 验证后的路径元组: (sources_path, root_class, output_path)
102
+
103
+ Raises:
104
+ SystemExit: 当参数无效时退出程序
105
+ """
77
106
  logger = get_logger("main")
78
107
 
79
108
  # 验证源码目录
@@ -92,13 +121,13 @@ def validate_arguments(args):
92
121
  logger.error("应该是完整的类名,如: com.example.Model")
93
122
  sys.exit(1)
94
123
 
95
- # 输出目录可以不存在,会自动创建
124
+ # 验证输出目录
96
125
  output_path = Path(args.output_dir)
97
126
  if output_path.exists() and not output_path.is_dir():
98
127
  logger.error(f"输出路径存在但不是目录: {output_path}")
99
128
  sys.exit(1)
100
129
 
101
- # 验证日志目录
130
+ # 创建日志目录
102
131
  log_path = Path(args.log_dir)
103
132
  try:
104
133
  log_path.mkdir(parents=True, exist_ok=True)
@@ -109,17 +138,29 @@ def validate_arguments(args):
109
138
  return sources_path.resolve(), args.root_class, output_path.resolve()
110
139
 
111
140
 
112
- def main():
113
- """主函数"""
141
+ def main() -> None:
142
+ """
143
+ 主函数:协调整个重构过程
144
+
145
+ 处理流程:
146
+ 1. 解析和验证命令行参数
147
+ 2. 初始化日志系统
148
+ 3. 启动版本检测(异步)
149
+ 4. 创建重构器并执行重构
150
+ 5. 输出结果统计信息
151
+ """
114
152
  args = None
115
153
  try:
116
- # 解析参数
154
+ # 解析和验证参数
117
155
  args = parse_arguments()
118
156
 
119
157
  # 初始化日志系统
120
158
  setup_logger(args.log_dir)
121
159
  logger = get_logger("main")
122
160
 
161
+ # 启动版本检测(异步,不阻塞主程序)
162
+ check_version_on_startup()
163
+
123
164
  # 验证参数
124
165
  sources_dir, root_class, output_dir = validate_arguments(args)
125
166
 
@@ -130,62 +171,25 @@ def main():
130
171
  logger.info(f"📁 日志目录: {args.log_dir}")
131
172
  logger.info(f"🎯 根类: {root_class}")
132
173
 
133
- # 创建重构器并执行
174
+ # 创建重构器并执行重构
134
175
  reconstructor = ProtoReconstructor(sources_dir, output_dir)
135
176
  reconstructor._verbose = args.verbose # 传递verbose标志
136
177
  results = reconstructor.reconstruct_from_root(root_class)
137
178
 
138
- # 输出详细的结果统计
139
- if results:
140
- # 统计成功和失败的数量
141
- success_count = len(results)
142
- failed_count = len(reconstructor.failed_classes) if hasattr(reconstructor, 'failed_classes') else 0
143
- total_attempted = success_count + failed_count
144
-
145
- logger.success("✅ 重构完成!")
146
- logger.info(f"📊 处理统计: 共尝试处理 {total_attempted} 个类型")
147
-
148
- message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
149
- enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
150
-
151
- logger.info(f" - ✅ 成功: {success_count} 个 (消息: {message_count}, 枚举: {enum_count})")
152
-
153
- # 显示失败的类
154
- if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
155
- logger.warning(f" - ❌ 失败: {failed_count} 个")
156
- for failed_class, reason in reconstructor.failed_classes.items():
157
- logger.warning(f" • {failed_class}: {reason}")
158
-
159
- # 显示跳过的类
160
- if hasattr(reconstructor, 'skipped_classes') and reconstructor.skipped_classes:
161
- skipped_count = len(reconstructor.skipped_classes)
162
- logger.info(f" - ⏭️ 跳过: {skipped_count} 个 (基础类型或已处理)")
163
- if args.verbose:
164
- for skipped_class, reason in reconstructor.skipped_classes.items():
165
- logger.info(f" • {skipped_class}: {reason}")
166
- else:
167
- logger.error("❌ 没有生成任何proto文件!")
168
- logger.error("请检查:")
169
- logger.error(" 1. 根类名是否正确")
170
- logger.error(" 2. Java源码目录是否包含对应的文件")
171
- logger.error(" 3. 类是否为protobuf消息类")
172
-
173
- # 显示详细的失败信息
174
- if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
175
- logger.error("失败的类:")
176
- for failed_class, reason in reconstructor.failed_classes.items():
177
- logger.error(f" • {failed_class}: {reason}")
178
-
179
- sys.exit(1)
179
+ # 输出结果统计
180
+ print_results_summary(reconstructor, results, logger, args.verbose)
180
181
 
181
182
  except KeyboardInterrupt:
183
+ # 处理用户中断
182
184
  if args:
183
185
  logger = get_logger("main")
184
186
  logger.warning("⚠️ 操作被用户中断")
185
187
  else:
186
188
  print("\n⚠️ 操作被用户中断")
187
189
  sys.exit(1)
190
+
188
191
  except Exception as e:
192
+ # 处理其他异常
189
193
  if args:
190
194
  logger = get_logger("main")
191
195
  logger.error(f"❌ 重构失败: {e}")
@@ -194,7 +198,6 @@ def main():
194
198
  else:
195
199
  print(f"\n❌ 重构失败: {e}")
196
200
  if hasattr(args, 'verbose') and args.verbose:
197
- import traceback
198
201
  traceback.print_exc()
199
202
  sys.exit(1)
200
203
 
models/__init__.py CHANGED
@@ -1,27 +1,34 @@
1
- from dataclasses import dataclass, field
2
- from typing import List, Dict, Set
1
+ """
2
+ 模型定义模块
3
3
 
4
- @dataclass
5
- class FieldDefinition:
6
- """表示一个 Protobuf 消息中的字段。"""
7
- name: str
8
- type: str
9
- tag: int
10
- rule: str # "optional", "repeated", or "oneof"
4
+ 包含Protobuf消息、字段、枚举等数据结构的定义
5
+ 所有具体的类定义都在相应的子模块中
6
+ """
11
7
 
12
- @dataclass
13
- class OneofDefinition:
14
- """表示一个 Protobuf oneof 块。"""
15
- name: str
16
- fields: List[FieldDefinition] = field(default_factory=list)
8
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
9
+ try:
10
+ # 相对导入(包环境)
11
+ from .message_definition import (
12
+ MessageDefinition,
13
+ FieldDefinition,
14
+ OneofDefinition,
15
+ EnumDefinition,
16
+ EnumValueDefinition
17
+ )
18
+ except ImportError:
19
+ # 绝对导入(开发环境)
20
+ from models.message_definition import (
21
+ MessageDefinition,
22
+ FieldDefinition,
23
+ OneofDefinition,
24
+ EnumDefinition,
25
+ EnumValueDefinition
26
+ )
17
27
 
18
- @dataclass
19
- class MessageDefinition:
20
- """表示一个完整的 Protobuf 消息的定义。"""
21
- name: str
22
- package: str
23
- info_string: str = ""
24
- objects: List[str] = field(default_factory=list)
25
- fields: List[FieldDefinition] = field(default_factory=list)
26
- oneofs: Dict[str, OneofDefinition] = field(default_factory=dict)
27
- dependencies: Set[str] = field(default_factory=set)
28
+ __all__ = [
29
+ 'MessageDefinition',
30
+ 'FieldDefinition',
31
+ 'OneofDefinition',
32
+ 'EnumDefinition',
33
+ 'EnumValueDefinition'
34
+ ]
parsing/__init__.py CHANGED
@@ -1,3 +1,25 @@
1
+ """
2
+ 解析器模块
3
+
4
+ 包含各种源码解析器:
5
+ - Java解析器:解析Java源码,提取字段标签和类型信息
6
+ - 枚举解析器:专门处理Java枚举类的解析
7
+ """
8
+
9
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
10
+ try:
11
+ # 相对导入(包环境)
12
+ from .java_parser import JavaParser
13
+ from .enum_parser import EnumParser
14
+ except ImportError:
15
+ # 绝对导入(开发环境)
16
+ from parsing.java_parser import JavaParser
17
+ from parsing.enum_parser import EnumParser
18
+
19
+ __all__ = [
20
+ 'JavaParser',
21
+ 'EnumParser'
22
+ ]
1
23
 
2
24
 
3
25
 
parsing/enum_parser.py CHANGED
@@ -8,8 +8,16 @@
8
8
  import re
9
9
  import os
10
10
  from typing import List, Optional, Dict, Tuple
11
- from models.message_definition import EnumDefinition, EnumValueDefinition
12
- from utils.logger import get_logger
11
+
12
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
13
+ try:
14
+ # 相对导入(包环境)
15
+ from ..models.message_definition import EnumDefinition, EnumValueDefinition
16
+ from ..utils.logger import get_logger
17
+ except ImportError:
18
+ # 绝对导入(开发环境)
19
+ from models.message_definition import EnumDefinition, EnumValueDefinition
20
+ from utils.logger import get_logger
13
21
 
14
22
 
15
23
  class EnumParser:
parsing/java_parser.py CHANGED
@@ -11,7 +11,13 @@ import re
11
11
  from pathlib import Path
12
12
  from typing import Optional, Tuple, List
13
13
 
14
- from utils.logger import get_logger
14
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
15
+ try:
16
+ # 相对导入(包环境)
17
+ from ..utils.logger import get_logger
18
+ except ImportError:
19
+ # 绝对导入(开发环境)
20
+ from utils.logger import get_logger
15
21
 
16
22
 
17
23
  class JavaParser:
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "reproto"
7
- version = "0.1.2"
7
+ version = "0.1.4"
8
8
  description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
9
9
  readme = "README.md"
10
10
  license = "Proprietary"
@@ -37,6 +37,7 @@ packages = [
37
37
  [tool.poetry.dependencies]
38
38
  python = ">=3.12,<4.0"
39
39
  loguru = ">=0.7.3"
40
+ packaging = "^25.0"
40
41
 
41
42
  [tool.poetry.scripts]
42
43
  reproto = "main:main"