reproto 0.1.3__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.
.git/COMMIT_EDITMSG CHANGED
@@ -1,29 +1 @@
1
- feat: 实施智能导入系统并优化README
2
-
3
- 🚀 主要更新:
4
- - 实施智能导入方案,同时支持开发环境和包安装环境
5
- - 使用try/except块自动切换相对导入和绝对导入
6
- - 解决ModuleNotFoundError导入错误问题
7
-
8
- 📝 代码改进:
9
- - 所有模块文件添加智能导入语句
10
- - 统一导入格式,提升代码兼容性
11
- - 优化包结构,支持作为Python包使用
12
-
13
- 📖 文档优化:
14
- - 简化README内容,去除冗余技术细节
15
- - 突出核心使用方法和注意事项
16
- - 特别强调内部类()的正确使用方法
17
- - 移除特定应用相关内容,使用通用示例
18
-
19
- 🔧 技术特性:
20
- - 开发环境: 使用绝对导入 (from core import)
21
- - 包环境: 使用相对导入 (from .core import)
22
- - 自动检测环境并选择合适的导入方式
23
- - 完全向后兼容,无破坏性变更
24
-
25
- ✅ 测试验证:
26
- - 开发环境测试通过 ✅
27
- - 包安装环境测试通过 ✅
28
- - 命令行工具正常运行 ✅
29
- - 导入系统工作正常 ✅
1
+ feat(version): :fire: check version
.git/index CHANGED
Binary file
.git/logs/HEAD CHANGED
@@ -16,3 +16,4 @@ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962
16
16
  07b71df33935c14ddf99e3480c04eca4685028bc 12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f iyue <ys1231@126.com> 1751096494 +0800 commit: feat: 代码优化
17
17
  12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f 9368f2c32f83054ab072b7c9686d8baa0bad7f12 iyue <ys1231@126.com> 1751101028 +0800 commit: 重构: 将print_results_summary函数移动到utils.report_utils模块
18
18
  9368f2c32f83054ab072b7c9686d8baa0bad7f12 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 iyue <ys1231@126.com> 1751103208 +0800 commit: feat: 实施智能导入系统并优化README
19
+ 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 b2a941b669991d7e0f9bdc35f1014897a933f4e2 iyue <ys1231@126.com> 1751105571 +0800 commit: feat(version): :fire: check version
.git/logs/refs/heads/iyue CHANGED
@@ -16,3 +16,4 @@ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962
16
16
  07b71df33935c14ddf99e3480c04eca4685028bc 12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f iyue <ys1231@126.com> 1751096494 +0800 commit: feat: 代码优化
17
17
  12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f 9368f2c32f83054ab072b7c9686d8baa0bad7f12 iyue <ys1231@126.com> 1751101028 +0800 commit: 重构: 将print_results_summary函数移动到utils.report_utils模块
18
18
  9368f2c32f83054ab072b7c9686d8baa0bad7f12 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 iyue <ys1231@126.com> 1751103208 +0800 commit: feat: 实施智能导入系统并优化README
19
+ 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 b2a941b669991d7e0f9bdc35f1014897a933f4e2 iyue <ys1231@126.com> 1751105571 +0800 commit: feat(version): :fire: check version
@@ -15,3 +15,4 @@ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962
15
15
  07b71df33935c14ddf99e3480c04eca4685028bc 12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f iyue <ys1231@126.com> 1751096510 +0800 update by push
16
16
  12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f 9368f2c32f83054ab072b7c9686d8baa0bad7f12 iyue <ys1231@126.com> 1751101083 +0800 update by push
17
17
  9368f2c32f83054ab072b7c9686d8baa0bad7f12 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 iyue <ys1231@126.com> 1751103234 +0800 update by push
18
+ 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 b2a941b669991d7e0f9bdc35f1014897a933f4e2 iyue <ys1231@126.com> 1751105581 +0800 update by push
@@ -15,3 +15,4 @@ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962
15
15
  07b71df33935c14ddf99e3480c04eca4685028bc 12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f iyue <ys1231@126.com> 1751096519 +0800 update by push
16
16
  12f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f 9368f2c32f83054ab072b7c9686d8baa0bad7f12 iyue <ys1231@126.com> 1751101033 +0800 update by push
17
17
  9368f2c32f83054ab072b7c9686d8baa0bad7f12 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 iyue <ys1231@126.com> 1751103218 +0800 update by push
18
+ 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 b2a941b669991d7e0f9bdc35f1014897a933f4e2 iyue <ys1231@126.com> 1751105599 +0800 update by push
@@ -0,0 +1 @@
1
+ x��Mj�0��u�Y��F�~lB�U��7��A��}���}��W�e�;9O��TNJ3��Y;B\J�Gr�r��h���q�7dH���p�]�z����%I�ٔ���F󾁮����ov�"��E��
.git/refs/heads/iyue CHANGED
@@ -1 +1 @@
1
- 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8
1
+ b2a941b669991d7e0f9bdc35f1014897a933f4e2
@@ -1 +1 @@
1
- 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8
1
+ b2a941b669991d7e0f9bdc35f1014897a933f4e2
@@ -1 +1 @@
1
- 2de8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8
1
+ b2a941b669991d7e0f9bdc35f1014897a933f4e2
main.py CHANGED
@@ -29,11 +29,13 @@ try:
29
29
  from .core.reconstructor import ProtoReconstructor
30
30
  from .utils.logger import setup_logger, get_logger
31
31
  from .utils.report_utils import print_results_summary
32
+ from .utils.version_checker import check_version_on_startup
32
33
  except ImportError:
33
34
  # 绝对导入(开发环境)
34
35
  from core.reconstructor import ProtoReconstructor
35
36
  from utils.logger import setup_logger, get_logger
36
37
  from utils.report_utils import print_results_summary
38
+ from utils.version_checker import check_version_on_startup
37
39
 
38
40
 
39
41
  def parse_arguments() -> argparse.Namespace:
@@ -143,8 +145,9 @@ def main() -> None:
143
145
  处理流程:
144
146
  1. 解析和验证命令行参数
145
147
  2. 初始化日志系统
146
- 3. 创建重构器并执行重构
147
- 4. 输出结果统计信息
148
+ 3. 启动版本检测(异步)
149
+ 4. 创建重构器并执行重构
150
+ 5. 输出结果统计信息
148
151
  """
149
152
  args = None
150
153
  try:
@@ -155,6 +158,9 @@ def main() -> None:
155
158
  setup_logger(args.log_dir)
156
159
  logger = get_logger("main")
157
160
 
161
+ # 启动版本检测(异步,不阻塞主程序)
162
+ check_version_on_startup()
163
+
158
164
  # 验证参数
159
165
  sources_dir, root_class, output_dir = validate_arguments(args)
160
166
 
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.3"
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: reproto
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
5
  License: Proprietary
6
6
  Keywords: protobuf,reverse-engineering,android,jadx,proto
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Topic :: Software Development :: Code Generators
17
17
  Classifier: Topic :: Software Development :: Disassemblers
18
18
  Requires-Dist: loguru (>=0.7.3)
19
+ Requires-Dist: packaging (>=25.0,<26.0)
19
20
  Project-URL: Homepage, https://github.com/ys1231/reproto
20
21
  Project-URL: Repository, https://github.com/ys1231/reproto.git
21
22
  Description-Content-Type: text/markdown
@@ -1,4 +1,4 @@
1
- .git/COMMIT_EDITMSG,sha256=EwGSPDXcG7NYrPVVf9yXMFd9roBbDcpRt9JIhQTqlhw,982
1
+ .git/COMMIT_EDITMSG,sha256=wCgfHzkY9fUofZeu8jlYfbP-HbC3oGukMStB0V5cK6A,36
2
2
  .git/FETCH_HEAD,sha256=1W_vttZCTHf9DXnCOhWjilD3kVx9WT2Xu85YBetV3ok,191
3
3
  .git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
4
4
  .git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
@@ -17,19 +17,20 @@
17
17
  .git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
18
18
  .git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
19
19
  .git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
20
- .git/index,sha256=duwg4sdUR_alJ5nxmVjRRMxG428rf-bBytr9LNrO1_0,4051
20
+ .git/index,sha256=S46Qz5JK2xQ0R0ZrtoDcknobMIA09k7V7jW1eWmpSLg,4139
21
21
  .git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
- .git/logs/HEAD,sha256=xSZx97kdcyJM7yzEX-YE16uicQjg_g7zN92fe7pgDXw,3237
23
- .git/logs/refs/heads/iyue,sha256=xSZx97kdcyJM7yzEX-YE16uicQjg_g7zN92fe7pgDXw,3237
24
- .git/logs/refs/remotes/gitlab/iyue,sha256=Iic8I88_Gr5u6r4Y_zbsnmidUOKFz43p3HdDu5Lo74k,2312
22
+ .git/logs/HEAD,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
23
+ .git/logs/refs/heads/iyue,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
24
+ .git/logs/refs/remotes/gitlab/iyue,sha256=eLuTgGW3hvFMkBfE_puyd-tyfv9f9kT1mY5V73UrSGU,2448
25
25
  .git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
26
- .git/logs/refs/remotes/origin/iyue,sha256=GbAv5EUPHJKfS6YHcslLUSKoV6gFzBx2jv5HHppCxfM,2312
26
+ .git/logs/refs/remotes/origin/iyue,sha256=iPHY1VFHyGvSPN64fqG9pSZG6n6R2JBkUiJL3S3CITQ,2448
27
27
  .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872,sha256=qvjEp_xD7FT8C2qIxFzoHETfgdG_Ilj-ZKMURK0woik,2268
28
28
  .git/objects/00/885cebf557ff261574deb93cb96449d06db01c,sha256=AFzclJZweg-CmVNt99YI3Ho9dqghj1vsZrPI4Jy9mkI,288
29
29
  .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa,sha256=M92vMZ87NltwEsn7mZuk87PtBP687n4-ET0qrPtk7Tg,507
30
30
  .git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0,sha256=QeXQ9x_0kJVZzjaA6G8MSPxwkIdZxg3bQpOt3gPmUio,3536
31
31
  .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa,sha256=JWG_MmB15Ez0qpSsbn7QUORFRbzUVxt7KpR7tlikJsQ,2257
32
32
  .git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc,sha256=jk2YdZfFLF0_L6dtC5g3NXzhkuPzW8x5n5F2pD-Ih4s,1032
33
+ .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6,sha256=DJ3Kc3LZiZssb0pkrP5g0WeztOvZa8jm0Bk7NVmEbJg,752
33
34
  .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
34
35
  .git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af,sha256=oRIrMdIqLj8tPUctDVp0A3INeadtii7UAn40HVOJQDY,19177
35
36
  .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
@@ -44,6 +45,7 @@
44
45
  .git/objects/1e/46816d16e7c9db7575f1964403c3daa105be5c,sha256=Wqo7uWsh11BefjHvh2CEqowaA6zmNR-TcvNJv6WYjr4,459
45
46
  .git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
46
47
  .git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
48
+ .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162,sha256=YNjEPm2QQ9kRVdHdMyVyXMniijMSWKEg6iSnyeP1bnU,3409
47
49
  .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
48
50
  .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8,sha256=V9cd-XeITtK7Mq7ecpJpWGpi23_5Ny-qnsY4jRHWdDQ,606
49
51
  .git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
@@ -71,8 +73,10 @@
71
73
  .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
72
74
  .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a,sha256=kBQ8krCCjNFnKOXS4OPkX60C7wQdUWtNJB1zs-LrPVc,2656
73
75
  .git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
76
+ .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb,sha256=xKKUEGEH8hWB4mhKhvJkSC23j4xwJJcr4Vo99kNPquQ,155
74
77
  .git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570,sha256=j36c6Wtp0Lp9HVP1xvV-2c25opLFzd3kzuxRHirgb9Y,803
75
78
  .git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
79
+ .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1,sha256=pcWmJXs3mDGeHCLW7AA0PkCRA_bcOIuhjD9e4fYzmVk,322
76
80
  .git/objects/41/f40c22247de377be99e30784229f3f128508a2,sha256=3k-QVtbIvbMHt2cHrPJ0oh4TckwD6Pux6_v5J-EJhvY,2189
77
81
  .git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
78
82
  .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555,sha256=4AN9Jlc9SttC8DK9ADUjw9wTEYnASrz4HubQCpVgXVc,417
@@ -90,6 +94,7 @@
90
94
  .git/objects/5a/11f9d70791e06a0570e01d3dcbbae39cde55db,sha256=wjd8hb5D03icknLFsPqMas6xAFfG30_Wg-PJJH03ezg,13722
91
95
  .git/objects/5b/d4d87753b79e9157817f0c2e6964a731052854,sha256=PK8JbTxqE1VLYE1hCBt6rPI6nSmJKnVnVYbpo42DftU,57
92
96
  .git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
97
+ .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da,sha256=ijAKnBWyR_h8s3B-C_j314y0zFiT_fdiQrGr3HiDVIQ,2352
93
98
  .git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
94
99
  .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
95
100
  .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17,sha256=zmGY1G58wmmZq2KD_Bu3Sy4-9iKKFiYMK52xOHbYfA0,343
@@ -117,6 +122,7 @@
117
122
  .git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
118
123
  .git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
119
124
  .git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda,sha256=dTFdFA8EPaLpDuJ4X-hfXjbwiAfKBY-EvFJ77H2mRxY,18883
125
+ .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916,sha256=s9CyHii7wMQLwnQhCfvRoe2aKSoezlKhOyWfrfP8uPo,821
120
126
  .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054,sha256=EyDEXseNoUivqR25-icLPWkaKt2pimwOucf7u4TyAIw,130
121
127
  .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
122
128
  .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487,sha256=7VYYZiscg3mWnC4xmuQViLHakgctCXCTAonqA_76BAw,283
@@ -145,6 +151,7 @@
145
151
  .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9,sha256=Tn8y8C287Wd8ZZsQ4FgduAQMlD-ANm8l0i6XeA0J9mc,476
146
152
  .git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26,sha256=bgcHj-13lalI3KZLo4PS1xneLz-E1oSxp1qIfCiqSH0,17243
147
153
  .git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca,sha256=QnXhDj4XDoGwytea6h_RgeaoWX3jXffxX6S7DcMzRZo,3461
154
+ .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2,sha256=ZDcO2IZt7d6zBfixJDRRlhI6ICjNWKeziD4dZsDj2rs,168
148
155
  .git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
149
156
  .git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
150
157
  .git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092,sha256=kE2ed_VMlop9lFeD9xXhrmql0ybRkMT6SbgWSP-0f7I,1249
@@ -176,6 +183,7 @@
176
183
  .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
177
184
  .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31,sha256=YJmX3vsaaoauuSFWAJqD3wriTdWueanhd_r5zroQqY8,232
178
185
  .git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42,sha256=BLXKgjdPyjn2Y-x-OQfbdg5JXCq3Nrnvwh5PfGMpmxQ,1848
186
+ .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9,sha256=7ffpb5T9vtoe8pe6pXi4mytBTBsoyIxQfkAwwZNdeGA,458
179
187
  .git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
180
188
  .git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
181
189
  .git/objects/e9/a15996cb55ac72aeb6611d26e8d22246589943,sha256=sTn6X3xMp3_WYpj1CmP2hDqviX86aJHTCzzi_ZTpBKw,4643
@@ -197,10 +205,10 @@
197
205
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
198
206
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
199
207
  .git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
200
- .git/refs/heads/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
201
- .git/refs/remotes/gitlab/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
208
+ .git/refs/heads/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
209
+ .git/refs/remotes/gitlab/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
202
210
  .git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
203
- .git/refs/remotes/origin/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
211
+ .git/refs/remotes/origin/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
204
212
  .gitignore,sha256=HHs2RDf54i9UJ3Z-pqWWCy8wyQLN7FCvz8Zm-RGN65s,2091
205
213
  .python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
206
214
  ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
@@ -225,15 +233,15 @@ include/google/protobuf/struct.proto,sha256=G_B7qLmiTjoDkN3aw60NtBxjKH0lJ4iwI5gi
225
233
  include/google/protobuf/timestamp.proto,sha256=FAUsYELB3S0LUCRfKBLqq26vgtsLbozkg-rlJ_c7bug,6449
226
234
  include/google/protobuf/type.proto,sha256=4jDg5K64fJXp8casv8DHE9s_iAlPFJsVRxelHQIPdQs,6367
227
235
  include/google/protobuf/wrappers.proto,sha256=aHjcdTTPmAXu5WNFzcOLXpyjneziRnEMZjxwB6Z_70k,5392
228
- main.py,sha256=EnjOjWcpCoK6JrblcLXPvkS-RiXwbkBjs8gL7QP8jG4,5933
236
+ main.py,sha256=4OP5n4Hl7rVfZ2sAixerKvASJfauWzImUkxhm8W35Vk,6204
229
237
  models/__init__.py,sha256=KVthXPEPwpKg45LaaX5EIHu6UMY8eLXMnx4rfJB84Xs,825
230
238
  models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
231
239
  parsing/__init__.py,sha256=WBrRACzmxAN4_k7uUo3KSeywvlTJYp5iVSOnU2gNoF8,596
232
240
  parsing/enum_parser.py,sha256=Yf59cDLTwIbPRQsuj0tgYUmmtpjY02llmSZ3XlsCqUk,6492
233
241
  parsing/java_parser.py,sha256=PZ5gs2aJqcX8sRlC29QIOsrbI-OCRtaHsxkMyvYnkCA,33774
234
- pyproject.toml,sha256=WSHU6modzAkZB__A3-T2NdhK1Kcyfn371uLL2TeIgR4,1378
235
- requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
236
- utils/__init__.py,sha256=QTPe5H6T5qiqVRlhI7UJzIJrnerHvsGN38xEa-8V5is,1369
242
+ pyproject.toml,sha256=BsSlxTI53hy5pLze0sHDK3ajhUbb0Smia9UBAPYj_ms,1398
243
+ requirements.txt,sha256=-RokGvMGfwO1GtN-7eNyyfPFdQzD2gQzvb4sKFRqBlM,154
244
+ utils/__init__.py,sha256=wYvkPeNr30up14CBLK3UxMaGlvgYTjK-npgR2SMXgtU,1960
237
245
  utils/builtin_proto.py,sha256=PiRdcJGKr02d8NbbedS14mjl6khtTbUzmlpso4q-NHA,9339
238
246
  utils/file_cache.py,sha256=m6-fAQsSBVn8-BodjPsmA2C_OqWjnt6mjUyGhT1pFno,5433
239
247
  utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
@@ -241,7 +249,8 @@ utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
241
249
  utils/report_utils.py,sha256=ftXU27nscrKUPMVWRnjLwckrt4NVBkKAc4zGmgNHwbc,2873
242
250
  utils/type_index.py,sha256=ni9hhR321unTQ9kfgsTum59VEh9nJMlUG0ca3V4rSHk,12354
243
251
  utils/type_utils.py,sha256=H32JSIvq1TmZkAZZesEs4VQVc1VXQuJlSLTINTBVkK4,15947
244
- reproto-0.1.3.dist-info/METADATA,sha256=ph3duIhum8nQPtVURrh9SSx8sA0WuET5qi1Zl3pGplg,6348
245
- reproto-0.1.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
246
- reproto-0.1.3.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
247
- reproto-0.1.3.dist-info/RECORD,,
252
+ utils/version_checker.py,sha256=sgC4-DqRXPgdCov-fi60BIPo-5KY3MpvfHYyjQ-Ixbw,10560
253
+ reproto-0.1.4.dist-info/METADATA,sha256=LtxHIh5cKAWDYJWt4R-71pbFQEjTAqov97tPWmj4V2U,6388
254
+ reproto-0.1.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
255
+ reproto-0.1.4.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
256
+ reproto-0.1.4.dist-info/RECORD,,
requirements.txt CHANGED
@@ -1,3 +1,5 @@
1
1
  # 项目依赖
2
2
  # 使用 loguru 库来提供强大且易于配置的日志记录功能。
3
- loguru
3
+ loguru
4
+ # 使用 packaging 库来进行版本号比较
5
+ packaging
utils/__init__.py CHANGED
@@ -7,6 +7,7 @@
7
7
  - 类型工具:类型转换和命名规范处理
8
8
  - 内置Proto:Google Protobuf标准类型支持
9
9
  - 报告工具:重构结果统计和展示
10
+ - 版本检测:通用版本更新检测系统
10
11
  """
11
12
 
12
13
  # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
@@ -18,6 +19,10 @@ try:
18
19
  from .builtin_proto import get_builtin_manager
19
20
  from .type_index import get_type_index
20
21
  from .report_utils import print_results_summary
22
+ from .version_checker import (
23
+ VersionChecker, create_version_checker, check_pypi_version,
24
+ check_reproto_version, check_version_on_startup, get_package_version
25
+ )
21
26
  except ImportError:
22
27
  # 绝对导入(开发环境)
23
28
  from utils.logger import setup_logger, get_logger
@@ -26,6 +31,10 @@ except ImportError:
26
31
  from utils.builtin_proto import get_builtin_manager
27
32
  from utils.type_index import get_type_index
28
33
  from utils.report_utils import print_results_summary
34
+ from utils.version_checker import (
35
+ VersionChecker, create_version_checker, check_pypi_version,
36
+ check_reproto_version, check_version_on_startup, get_package_version
37
+ )
29
38
 
30
39
  __all__ = [
31
40
  'setup_logger',
@@ -36,7 +45,13 @@ __all__ = [
36
45
  'field_name_processor',
37
46
  'get_builtin_manager',
38
47
  'get_type_index',
39
- 'print_results_summary'
48
+ 'print_results_summary',
49
+ 'VersionChecker',
50
+ 'create_version_checker',
51
+ 'check_pypi_version',
52
+ 'check_reproto_version',
53
+ 'check_version_on_startup',
54
+ 'get_package_version'
40
55
  ]
41
56
 
42
57
 
@@ -0,0 +1,311 @@
1
+ """
2
+ 通用版本检测模块
3
+
4
+ 支持检测Python包的新版本并提供用户友好的提示信息
5
+ 设计为通用模块,可以被其他Python库复用
6
+
7
+ 支持的版本源:
8
+ - PyPI (Python Package Index)
9
+
10
+ Author: AI Assistant
11
+ """
12
+
13
+ import json
14
+ import time
15
+ import threading
16
+ from typing import Optional, Callable
17
+ from pathlib import Path
18
+ from urllib.request import urlopen, Request
19
+ from urllib.error import URLError, HTTPError
20
+ from packaging import version
21
+ import tempfile
22
+ import importlib.metadata
23
+
24
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
25
+ try:
26
+ # 相对导入(包环境)
27
+ from .logger import get_logger
28
+ except ImportError:
29
+ # 绝对导入(开发环境)
30
+ from utils.logger import get_logger
31
+
32
+
33
+ def get_package_version(package_name: str) -> Optional[str]:
34
+ """
35
+ 动态获取已安装包的版本号
36
+
37
+ Args:
38
+ package_name: 包名
39
+
40
+ Returns:
41
+ 包版本号,如果获取失败则返回None
42
+ """
43
+ try:
44
+ return importlib.metadata.version(package_name)
45
+ except importlib.metadata.PackageNotFoundError:
46
+ return None
47
+
48
+
49
+ class VersionChecker:
50
+ """
51
+ 通用版本检测器
52
+
53
+ 功能:
54
+ - 支持PyPI版本源
55
+ - 异步检测,不阻塞主程序
56
+ - 智能缓存,避免频繁请求
57
+ - 可配置的检测间隔和提示样式
58
+ - 动态获取当前版本
59
+ """
60
+
61
+ def __init__(self,
62
+ package_name: str,
63
+ current_version: Optional[str] = None,
64
+ cache_duration: int = 3600, # 缓存1小时
65
+ timeout: int = 5, # 请求超时5秒
66
+ silent_mode: bool = False): # 静默模式
67
+ """
68
+ 初始化版本检测器
69
+
70
+ Args:
71
+ package_name: 包名
72
+ current_version: 当前版本,如果为None则自动获取
73
+ cache_duration: 缓存持续时间(秒)
74
+ timeout: 网络请求超时时间(秒)
75
+ silent_mode: 是否启用静默模式(不打印日志)
76
+ """
77
+ self.package_name = package_name
78
+ self.current_version = current_version or get_package_version(package_name) or "0.0.0"
79
+ self.cache_duration = cache_duration
80
+ self.timeout = timeout
81
+ self.silent_mode = silent_mode
82
+
83
+ # 缓存配置
84
+ self.cache_dir = Path(tempfile.gettempdir()) / f".{package_name}_version_cache"
85
+ self.cache_file = self.cache_dir / "latest_version.json"
86
+
87
+ # 日志配置
88
+ self.logger = get_logger("version_checker") if not silent_mode else None
89
+
90
+ def check_version_async(self,
91
+ callback: Optional[Callable] = None,
92
+ show_notification: bool = True):
93
+ """
94
+ 异步检测版本更新
95
+
96
+ Args:
97
+ callback: 检测完成后的回调函数
98
+ show_notification: 是否显示更新提示
99
+ """
100
+ def _check():
101
+ try:
102
+ latest_version = self.check_version_sync()
103
+ if latest_version and self._is_newer_version(latest_version):
104
+ if show_notification:
105
+ self._show_update_notification(latest_version)
106
+ if callback:
107
+ callback(True, latest_version)
108
+ else:
109
+ if callback:
110
+ callback(False, latest_version)
111
+ except Exception as e:
112
+ if not self.silent_mode and self.logger:
113
+ self.logger.debug(f"版本检测失败: {e}")
114
+ if callback:
115
+ callback(False, None)
116
+
117
+ thread = threading.Thread(target=_check, daemon=True)
118
+ thread.start()
119
+
120
+ def check_version_sync(self) -> Optional[str]:
121
+ """
122
+ 同步检测版本更新
123
+
124
+ Returns:
125
+ 最新版本号,如果检测失败则返回None
126
+ """
127
+ # 检查缓存
128
+ cached_version = self._get_cached_version()
129
+ if cached_version:
130
+ return cached_version
131
+
132
+ # 从PyPI获取最新版本
133
+ try:
134
+ latest_version = self._check_pypi_version()
135
+ if latest_version:
136
+ self._cache_version(latest_version)
137
+ return latest_version
138
+ except Exception as e:
139
+ if not self.silent_mode and self.logger:
140
+ self.logger.debug(f"从PyPI检测版本失败: {e}")
141
+
142
+ return None
143
+
144
+ def _check_pypi_version(self) -> Optional[str]:
145
+ """从PyPI检测最新版本"""
146
+ url = f"https://pypi.org/pypi/{self.package_name}/json"
147
+
148
+ try:
149
+ request = Request(url, headers={'User-Agent': f'{self.package_name}-version-checker'})
150
+ with urlopen(request, timeout=self.timeout) as response:
151
+ data = json.loads(response.read().decode())
152
+ return data['info']['version']
153
+ except (URLError, HTTPError, KeyError, json.JSONDecodeError):
154
+ return None
155
+
156
+ def _is_newer_version(self, latest_version: str) -> bool:
157
+ """检查是否有新版本"""
158
+ try:
159
+ return version.parse(latest_version) > version.parse(self.current_version)
160
+ except Exception:
161
+ # 如果版本解析失败,使用字符串比较
162
+ return latest_version != self.current_version
163
+
164
+ def _get_cached_version(self) -> Optional[str]:
165
+ """获取缓存的版本信息"""
166
+ try:
167
+ if not self.cache_file.exists():
168
+ return None
169
+
170
+ with open(self.cache_file, 'r', encoding='utf-8') as f:
171
+ cache_data = json.load(f)
172
+
173
+ # 检查缓存是否过期
174
+ cache_time = cache_data.get('timestamp', 0)
175
+ if time.time() - cache_time > self.cache_duration:
176
+ return None
177
+
178
+ return cache_data.get('version')
179
+ except (FileNotFoundError, json.JSONDecodeError, KeyError):
180
+ return None
181
+
182
+ def _cache_version(self, latest_version: str):
183
+ """缓存版本信息"""
184
+ try:
185
+ self.cache_dir.mkdir(exist_ok=True)
186
+
187
+ cache_data = {
188
+ 'version': latest_version,
189
+ 'timestamp': time.time()
190
+ }
191
+
192
+ with open(self.cache_file, 'w', encoding='utf-8') as f:
193
+ json.dump(cache_data, f)
194
+ except Exception:
195
+ pass # 缓存失败不影响主功能
196
+
197
+ def _show_update_notification(self, latest_version: str):
198
+ """显示更新通知"""
199
+ if self.silent_mode:
200
+ return
201
+
202
+ print(f"\n🎉 {self.package_name} 有新版本可用!")
203
+ print(f" 当前版本: {self.current_version}")
204
+ print(f" 最新版本: {latest_version}")
205
+ print(f" 更新命令: pip install --upgrade {self.package_name}")
206
+ print()
207
+
208
+ def clear_cache(self):
209
+ """清除版本缓存"""
210
+ try:
211
+ if self.cache_file.exists():
212
+ self.cache_file.unlink()
213
+ except Exception:
214
+ pass
215
+
216
+
217
+ def create_version_checker(package_name: str,
218
+ current_version: Optional[str] = None,
219
+ **kwargs) -> VersionChecker:
220
+ """
221
+ 创建版本检测器的便捷函数
222
+
223
+ Args:
224
+ package_name: 包名
225
+ current_version: 当前版本,如果为None则自动获取
226
+ **kwargs: 其他配置参数
227
+
228
+ Returns:
229
+ VersionChecker实例
230
+ """
231
+ return VersionChecker(package_name, current_version, **kwargs)
232
+
233
+
234
+ def check_pypi_version(package_name: str,
235
+ current_version: Optional[str] = None,
236
+ show_notification: bool = True,
237
+ silent_mode: bool = False) -> Optional[str]:
238
+ """
239
+ 快速检测PyPI版本的便捷函数
240
+
241
+ Args:
242
+ package_name: 包名
243
+ current_version: 当前版本,如果为None则自动获取
244
+ show_notification: 是否显示通知
245
+ silent_mode: 是否静默模式
246
+
247
+ Returns:
248
+ 最新版本号,如果检测失败则返回None
249
+ """
250
+ checker = VersionChecker(package_name, current_version, silent_mode=silent_mode)
251
+ latest_version = checker.check_version_sync()
252
+
253
+ if latest_version and checker._is_newer_version(latest_version) and show_notification:
254
+ checker._show_update_notification(latest_version)
255
+
256
+ return latest_version
257
+
258
+
259
+ def check_reproto_version(current_version: Optional[str] = None,
260
+ show_notification: bool = True,
261
+ silent_mode: bool = False) -> Optional[str]:
262
+ """
263
+ 检测reproto包的PyPI版本更新
264
+
265
+ 这是专门为reproto项目设计的便捷函数,使用PyPI作为版本源
266
+
267
+ Args:
268
+ current_version: 当前版本,如果为None则自动获取
269
+ show_notification: 是否显示更新通知,默认True
270
+ silent_mode: 是否静默模式,默认False
271
+
272
+ Returns:
273
+ 最新版本号,如果检测失败则返回None
274
+ """
275
+ return check_pypi_version(
276
+ package_name="reproto",
277
+ current_version=current_version,
278
+ show_notification=show_notification,
279
+ silent_mode=silent_mode
280
+ )
281
+
282
+
283
+ def check_version_on_startup(current_version: Optional[str] = None):
284
+ """
285
+ 在程序启动时异步检测版本更新
286
+
287
+ 这个函数专门用于在reproto启动时进行版本检测,
288
+ 采用异步方式,不会阻塞主程序启动
289
+
290
+ Args:
291
+ current_version: 当前版本号,如果为None则自动获取
292
+ """
293
+ # 获取当前版本
294
+ actual_version = current_version or get_package_version("reproto") or "0.0.0"
295
+
296
+ def version_callback(has_update: bool, latest_version: Optional[str]):
297
+ if has_update and latest_version:
298
+ print(f"\n💡 提示:reproto有新版本 {latest_version} 可用")
299
+ print(f" 当前版本:{actual_version}")
300
+ print(f" 更新命令:pip install --upgrade reproto\n")
301
+
302
+ checker = create_version_checker(
303
+ package_name="reproto",
304
+ current_version=actual_version,
305
+ silent_mode=True # 静默模式,只在有更新时通过回调显示
306
+ )
307
+
308
+ checker.check_version_async(
309
+ callback=version_callback,
310
+ show_notification=False # 使用自定义回调,不使用默认通知
311
+ )