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 +1 -29
- .git/index +0 -0
- .git/logs/HEAD +1 -0
- .git/logs/refs/heads/iyue +1 -0
- .git/logs/refs/remotes/gitlab/iyue +1 -0
- .git/logs/refs/remotes/origin/iyue +1 -0
- .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6 +0 -0
- .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162 +0 -0
- .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb +0 -0
- .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1 +0 -0
- .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da +0 -0
- .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916 +0 -0
- .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2 +1 -0
- .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9 +0 -0
- .git/refs/heads/iyue +1 -1
- .git/refs/remotes/gitlab/iyue +1 -1
- .git/refs/remotes/origin/iyue +1 -1
- main.py +8 -2
- pyproject.toml +2 -1
- {reproto-0.1.3.dist-info → reproto-0.1.4.dist-info}/METADATA +2 -1
- {reproto-0.1.3.dist-info → reproto-0.1.4.dist-info}/RECORD +26 -17
- requirements.txt +3 -1
- utils/__init__.py +16 -1
- utils/version_checker.py +311 -0
- {reproto-0.1.3.dist-info → reproto-0.1.4.dist-info}/WHEEL +0 -0
- {reproto-0.1.3.dist-info → reproto-0.1.4.dist-info}/entry_points.txt +0 -0
.git/COMMIT_EDITMSG
CHANGED
@@ -1,29 +1 @@
|
|
1
|
-
feat:
|
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
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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��
|
Binary file
|
.git/refs/heads/iyue
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
b2a941b669991d7e0f9bdc35f1014897a933f4e2
|
.git/refs/remotes/gitlab/iyue
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
b2a941b669991d7e0f9bdc35f1014897a933f4e2
|
.git/refs/remotes/origin/iyue
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
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.
|
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
|
+
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=
|
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=
|
20
|
+
.git/index,sha256=S46Qz5JK2xQ0R0ZrtoDcknobMIA09k7V7jW1eWmpSLg,4139
|
21
21
|
.git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
|
22
|
-
.git/logs/HEAD,sha256=
|
23
|
-
.git/logs/refs/heads/iyue,sha256=
|
24
|
-
.git/logs/refs/remotes/gitlab/iyue,sha256=
|
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=
|
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=
|
201
|
-
.git/refs/remotes/gitlab/iyue,sha256=
|
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=
|
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=
|
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=
|
235
|
-
requirements.txt,sha256
|
236
|
-
utils/__init__.py,sha256=
|
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
|
-
|
245
|
-
reproto-0.1.
|
246
|
-
reproto-0.1.
|
247
|
-
reproto-0.1.
|
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
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
|
|
utils/version_checker.py
ADDED
@@ -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
|
+
)
|
File without changes
|
File without changes
|