reproto 0.1.2__py3-none-any.whl → 0.1.3__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 (77) hide show
  1. .git/COMMIT_EDITMSG +24 -25
  2. .git/index +0 -0
  3. .git/logs/HEAD +3 -0
  4. .git/logs/refs/heads/iyue +3 -0
  5. .git/logs/refs/remotes/gitlab/iyue +3 -0
  6. .git/logs/refs/remotes/origin/iyue +3 -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/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
  12. .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
  13. .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
  14. .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
  15. .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
  16. .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
  17. .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
  18. .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
  19. .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
  20. .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
  21. .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
  22. .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
  23. .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
  24. .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
  25. .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
  26. .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
  27. .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
  28. .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
  29. .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
  30. .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
  31. .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
  32. .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
  33. .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
  34. .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
  35. .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
  36. .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
  37. .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
  38. .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
  39. .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
  40. .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
  41. .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
  42. .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
  43. .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
  44. .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
  45. .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
  46. .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
  47. .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
  48. .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
  49. .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
  50. .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
  51. .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
  52. .git/refs/heads/iyue +1 -1
  53. .git/refs/remotes/gitlab/iyue +1 -1
  54. .git/refs/remotes/origin/iyue +1 -1
  55. README.md +104 -190
  56. core/__init__.py +23 -0
  57. core/info_decoder.py +13 -4
  58. core/reconstructor.py +25 -16
  59. generation/__init__.py +17 -0
  60. generation/proto_generator.py +11 -5
  61. main.py +53 -56
  62. models/__init__.py +31 -24
  63. parsing/__init__.py +22 -0
  64. parsing/enum_parser.py +10 -2
  65. parsing/java_parser.py +7 -1
  66. pyproject.toml +1 -1
  67. reproto-0.1.3.dist-info/METADATA +209 -0
  68. {reproto-0.1.2.dist-info → reproto-0.1.3.dist-info}/RECORD +75 -30
  69. utils/__init__.py +40 -0
  70. utils/builtin_proto.py +8 -1
  71. utils/file_cache.py +8 -1
  72. utils/report_utils.py +71 -0
  73. utils/type_index.py +8 -1
  74. core/bytecode_parser.py +0 -274
  75. reproto-0.1.2.dist-info/METADATA +0 -295
  76. {reproto-0.1.2.dist-info → reproto-0.1.3.dist-info}/WHEEL +0 -0
  77. {reproto-0.1.2.dist-info → reproto-0.1.3.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,33 @@ 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
+ except ImportError:
33
+ # 绝对导入(开发环境)
34
+ from core.reconstructor import ProtoReconstructor
35
+ from utils.logger import setup_logger, get_logger
36
+ from utils.report_utils import print_results_summary
27
37
 
28
- def parse_arguments():
29
- """解析命令行参数"""
38
+
39
+ def parse_arguments() -> argparse.Namespace:
40
+ """
41
+ 解析命令行参数
42
+
43
+ Returns:
44
+ 解析后的命令行参数对象
45
+ """
30
46
  parser = argparse.ArgumentParser(
31
47
  description='从JADX反编译的Java源码重构Protobuf .proto文件',
32
48
  formatter_class=argparse.RawDescriptionHelpFormatter,
@@ -72,8 +88,19 @@ def parse_arguments():
72
88
  return parser.parse_args()
73
89
 
74
90
 
75
- def validate_arguments(args):
76
- """验证命令行参数"""
91
+ def validate_arguments(args: argparse.Namespace) -> tuple[Path, str, Path]:
92
+ """
93
+ 验证命令行参数的有效性
94
+
95
+ Args:
96
+ args: 解析后的命令行参数
97
+
98
+ Returns:
99
+ 验证后的路径元组: (sources_path, root_class, output_path)
100
+
101
+ Raises:
102
+ SystemExit: 当参数无效时退出程序
103
+ """
77
104
  logger = get_logger("main")
78
105
 
79
106
  # 验证源码目录
@@ -92,13 +119,13 @@ def validate_arguments(args):
92
119
  logger.error("应该是完整的类名,如: com.example.Model")
93
120
  sys.exit(1)
94
121
 
95
- # 输出目录可以不存在,会自动创建
122
+ # 验证输出目录
96
123
  output_path = Path(args.output_dir)
97
124
  if output_path.exists() and not output_path.is_dir():
98
125
  logger.error(f"输出路径存在但不是目录: {output_path}")
99
126
  sys.exit(1)
100
127
 
101
- # 验证日志目录
128
+ # 创建日志目录
102
129
  log_path = Path(args.log_dir)
103
130
  try:
104
131
  log_path.mkdir(parents=True, exist_ok=True)
@@ -109,11 +136,19 @@ def validate_arguments(args):
109
136
  return sources_path.resolve(), args.root_class, output_path.resolve()
110
137
 
111
138
 
112
- def main():
113
- """主函数"""
139
+ def main() -> None:
140
+ """
141
+ 主函数:协调整个重构过程
142
+
143
+ 处理流程:
144
+ 1. 解析和验证命令行参数
145
+ 2. 初始化日志系统
146
+ 3. 创建重构器并执行重构
147
+ 4. 输出结果统计信息
148
+ """
114
149
  args = None
115
150
  try:
116
- # 解析参数
151
+ # 解析和验证参数
117
152
  args = parse_arguments()
118
153
 
119
154
  # 初始化日志系统
@@ -130,62 +165,25 @@ def main():
130
165
  logger.info(f"📁 日志目录: {args.log_dir}")
131
166
  logger.info(f"🎯 根类: {root_class}")
132
167
 
133
- # 创建重构器并执行
168
+ # 创建重构器并执行重构
134
169
  reconstructor = ProtoReconstructor(sources_dir, output_dir)
135
170
  reconstructor._verbose = args.verbose # 传递verbose标志
136
171
  results = reconstructor.reconstruct_from_root(root_class)
137
172
 
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)
173
+ # 输出结果统计
174
+ print_results_summary(reconstructor, results, logger, args.verbose)
180
175
 
181
176
  except KeyboardInterrupt:
177
+ # 处理用户中断
182
178
  if args:
183
179
  logger = get_logger("main")
184
180
  logger.warning("⚠️ 操作被用户中断")
185
181
  else:
186
182
  print("\n⚠️ 操作被用户中断")
187
183
  sys.exit(1)
184
+
188
185
  except Exception as e:
186
+ # 处理其他异常
189
187
  if args:
190
188
  logger = get_logger("main")
191
189
  logger.error(f"❌ 重构失败: {e}")
@@ -194,7 +192,6 @@ def main():
194
192
  else:
195
193
  print(f"\n❌ 重构失败: {e}")
196
194
  if hasattr(args, 'verbose') and args.verbose:
197
- import traceback
198
195
  traceback.print_exc()
199
196
  sys.exit(1)
200
197
 
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.3"
8
8
  description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
9
9
  readme = "README.md"
10
10
  license = "Proprietary"