refactor: restructure project to modern Python layout, separate src, tests, docs, examples
This commit is contained in:
10
src/config_man/utils/__init__.py
Normal file
10
src/config_man/utils/__init__.py
Normal file
@@ -0,0 +1,10 @@
|
||||
"""
|
||||
工具模块
|
||||
|
||||
包含加密解密、模拟环境等工具功能。
|
||||
"""
|
||||
|
||||
from .crypto import encrypt, decrypt
|
||||
from .mock_rclone import MockRclone, patch_rclone
|
||||
|
||||
__all__ = ["encrypt", "decrypt", "MockRclone", "patch_rclone"]
|
||||
23
src/config_man/utils/crypto.py
Normal file
23
src/config_man/utils/crypto.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import json
|
||||
import os
|
||||
from Crypto.Cipher import DES
|
||||
from Crypto.Util.Padding import pad,unpad
|
||||
import base64
|
||||
|
||||
def encrypt(text):
|
||||
key = 'tbambooz'.encode('ascii')
|
||||
des = DES.new(key, DES.MODE_CBC, IV=key)
|
||||
padded_text = pad(text.encode('utf-8'), DES.block_size)
|
||||
encrypted_text = des.encrypt(padded_text)
|
||||
return base64.b64encode(encrypted_text).decode('utf-8')
|
||||
|
||||
|
||||
def decrypt(encrypted_text):
|
||||
key = 'tbambooz'
|
||||
key = key.encode('ascii')
|
||||
des = DES.new(key, DES.MODE_CBC, IV=key)
|
||||
decoded_text = base64.b64decode(encrypted_text)
|
||||
decrypted_text = des.decrypt(decoded_text)
|
||||
unpadded_text = unpad(decrypted_text, DES.block_size)
|
||||
return unpadded_text.decode('utf-8')
|
||||
|
||||
153
src/config_man/utils/mock_rclone.py
Normal file
153
src/config_man/utils/mock_rclone.py
Normal file
@@ -0,0 +1,153 @@
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
from .crypto import encrypt, decrypt
|
||||
|
||||
|
||||
class MockRclone:
|
||||
"""模拟rclone环境,用于测试"""
|
||||
|
||||
def __init__(self, test_data_path: str = "test_data"):
|
||||
self.test_data_path = test_data_path
|
||||
self._setup_mock_environment()
|
||||
|
||||
def _setup_mock_environment(self):
|
||||
"""设置模拟环境"""
|
||||
# 确保测试数据目录存在
|
||||
os.makedirs(self.test_data_path, exist_ok=True)
|
||||
|
||||
# 创建测试配置文件
|
||||
self._create_test_configs()
|
||||
|
||||
def _create_test_configs(self):
|
||||
"""创建测试配置文件"""
|
||||
test_configs = {
|
||||
"0.29": {
|
||||
"android": {
|
||||
"EventApiURL": "https://n3backend.azurewebsites.net/",
|
||||
"Ver": "0.29.1abc123",
|
||||
"PlayFabTitle": "B066F",
|
||||
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
|
||||
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
|
||||
"HeartBeat": "60",
|
||||
"RTMPid": "80000586",
|
||||
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
|
||||
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
|
||||
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
|
||||
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w=="
|
||||
},
|
||||
"ios": {
|
||||
"EventApiURL": "https://n3backend.azurewebsites.net/",
|
||||
"Ver": "0.29.1def456",
|
||||
"PlayFabTitle": "B066F",
|
||||
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
|
||||
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
|
||||
"HeartBeat": "60",
|
||||
"RTMPid": "80000586",
|
||||
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
|
||||
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
|
||||
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
|
||||
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w=="
|
||||
}
|
||||
},
|
||||
"0.30": {
|
||||
"android": {
|
||||
"EventApiURL": "https://n3backend.azurewebsites.net/",
|
||||
"Ver": "0.30.2ghi789",
|
||||
"PlayFabTitle": "B066F",
|
||||
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
|
||||
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
|
||||
"HeartBeat": "60",
|
||||
"RTMPid": "80000586",
|
||||
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
|
||||
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
|
||||
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
|
||||
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w==",
|
||||
"NewFeature": "enabled"
|
||||
},
|
||||
"ios": {
|
||||
"EventApiURL": "https://n3backend.azurewebsites.net/",
|
||||
"Ver": "0.30.2jkl012",
|
||||
"PlayFabTitle": "B066F",
|
||||
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
|
||||
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
|
||||
"HeartBeat": "60",
|
||||
"RTMPid": "80000586",
|
||||
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
|
||||
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
|
||||
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
|
||||
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w==",
|
||||
"NewFeature": "enabled"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# 创建测试目录结构
|
||||
for version, platforms in test_configs.items():
|
||||
version_path = f"{self.test_data_path}/ab/{version.replace('.', '_')}"
|
||||
os.makedirs(version_path, exist_ok=True)
|
||||
|
||||
for platform, config in platforms.items():
|
||||
filename = f"{platform}config.json"
|
||||
filepath = os.path.join(version_path, filename)
|
||||
|
||||
# 加密配置并保存
|
||||
config_json = json.dumps(config, indent=2, ensure_ascii=False)
|
||||
encrypted_config = encrypt(config_json)
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
f.write(encrypted_config)
|
||||
|
||||
print(f"创建测试文件: {filepath}")
|
||||
|
||||
def mock_rclone_cat(self, path: str) -> str:
|
||||
"""模拟rclone cat命令"""
|
||||
# 将路径转换为本地文件路径
|
||||
local_path = os.path.join(self.test_data_path, path)
|
||||
|
||||
if not os.path.exists(local_path):
|
||||
raise FileNotFoundError(f"文件不存在: {path}")
|
||||
|
||||
with open(local_path, 'r', encoding='utf-8') as f:
|
||||
return f.read().strip()
|
||||
|
||||
|
||||
def patch_rclone():
|
||||
"""修补rclone调用,使用模拟环境"""
|
||||
import subprocess
|
||||
|
||||
original_run = subprocess.run
|
||||
|
||||
def mock_run(cmd, *args, **kwargs):
|
||||
if len(cmd) >= 2 and cmd[0] == 'rclone' and cmd[1] == 'cat':
|
||||
# 模拟rclone cat命令
|
||||
mock_rclone = MockRclone()
|
||||
try:
|
||||
content = mock_rclone.mock_rclone_cat(cmd[2])
|
||||
# 返回模拟的subprocess结果
|
||||
from types import SimpleNamespace
|
||||
result = SimpleNamespace()
|
||||
result.returncode = 0
|
||||
result.stdout = content
|
||||
result.stderr = ""
|
||||
return result
|
||||
except FileNotFoundError as e:
|
||||
# 返回错误结果
|
||||
from types import SimpleNamespace
|
||||
result = SimpleNamespace()
|
||||
result.returncode = 1
|
||||
result.stdout = ""
|
||||
result.stderr = str(e)
|
||||
return result
|
||||
else:
|
||||
# 对于其他命令,使用原始实现
|
||||
return original_run(cmd, *args, **kwargs)
|
||||
|
||||
subprocess.run = mock_run
|
||||
print("已启用rclone模拟环境")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 创建测试环境
|
||||
mock = MockRclone()
|
||||
print("模拟rclone环境设置完成!")
|
||||
Reference in New Issue
Block a user