From 9fab50edb0e77dbf5b06117c0e8fddf4ff260893 Mon Sep 17 00:00:00 2001 From: Aqr-K <95741669+Aqr-K@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:22:28 +0800 Subject: [PATCH 1/3] =?UTF-8?q?refactor(string):=20=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=AF=94=E8=BE=83=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/plugin.py | 4 +- app/helper/resource.py | 2 +- app/utils/string.py | 135 +++++++++++++++++++++++++++++++++++------ 3 files changed, 119 insertions(+), 22 deletions(-) diff --git a/app/core/plugin.py b/app/core/plugin.py index 98176617..e36aa0b1 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -682,7 +682,7 @@ class PluginManager(metaclass=Singleton): # 相同 ID 的插件保留版本号最大的版本 max_versions = {} for p in all_plugins: - if p.id not in max_versions or StringUtils.compare_version(p.plugin_version, max_versions[p.id]) > 0: + if p.id not in max_versions or StringUtils.compare_version(p.plugin_version, max_versions[p.id], ">"): max_versions[p.id] = p.plugin_version result = [p for p in all_plugins if p.plugin_version == max_versions[p.id]] logger.info(f"共获取到 {len(result)} 个线上插件") @@ -823,7 +823,7 @@ class PluginManager(metaclass=Singleton): plugin.has_update = False if plugin_static: installed_version = getattr(plugin_static, "plugin_version") - if StringUtils.compare_version(installed_version, plugin_info.get("version")) < 0: + if StringUtils.compare_version(installed_version, plugin_info.get("version"), "<"): # 需要更新 plugin.has_update = True # 运行状态 diff --git a/app/helper/resource.py b/app/helper/resource.py index aa7edb49..f3a1fdd3 100644 --- a/app/helper/resource.py +++ b/app/helper/resource.py @@ -70,7 +70,7 @@ class ResourceHelper(metaclass=Singleton): local_version = self.siteshelper.indexer_version else: continue - if StringUtils.compare_version(version, local_version) > 0: + if StringUtils.compare_version(version, local_version, ">"): logger.info(f"{rname} 资源包有更新,最新版本:v{version}") else: continue diff --git a/app/utils/string.py b/app/utils/string.py index 1960de63..2cbac496 100644 --- a/app/utils/string.py +++ b/app/utils/string.py @@ -740,27 +740,124 @@ class StringUtils: return ''.join(common_prefix) @staticmethod - def compare_version(v1: str, v2: str) -> int: + def compare_version(v1: str, v2: str, compare_type, verbose: bool = False) \ + -> Tuple[Optional[bool], str | Exception] | Optional[bool]: """ - 比较两个版本号的大小,v1 > v2时返回1,v1 < v2时返回-1,v1 = v2时返回0 + 比较两个版本号的大小 + + :param v1: 比对的来源版本号 + :param v2: 比对的目标版本号 + :param verbose: 是否输出比对结果的时候输出详细消息,默认 False 不输出 + :param compare_type: 识别模式。支持直接使用符号进行比对 + 'ge' or '>=' :来源 >= 目标 + 'le' or '<=' :来源 <= 目标 + 'eq' or '==' :来源 == 目标 + 'gt' or '>' :来源 > 目标 + 'lt' or '<' :来源 < 目标 + :return """ - if not v1 or not v2: - return 0 - v1 = v1.replace('v', '') - v2 = v2.replace('v', '') - v1 = [int(x) for x in v1.split('.')] - v2 = [int(x) for x in v2.split('.')] - for i in range(min(len(v1), len(v2))): - if v1[i] > v2[i]: - return 1 - elif v1[i] < v2[i]: - return -1 - if len(v1) > len(v2): - return 1 - elif len(v1) < len(v2): - return -1 - else: - return 0 + def preprocess_version(version: str) -> list: + """ + 预处理版本号,去除首尾空字符串与换行符,去除开头大小写v,并拆分版本号 + """ + return re.split(r'[.-]', version.strip().lstrip('vV')) + + def conversion_version(version_list) -> list: + """ + 英文字符转换为数字 + stable = -1,rc = -2,beta = -3,alpha = -4 + 其余不符合的,都为-5 + """ + # 内置版本号转换字典 + version_map = {"stable": -1, "rc": -2, "beta": -3, "alpha": -4} + # 不符合的版本号 + other = -5 + result = [] + for item in version_list: + if item.isdigit(): + result.append(int(item)) + else: + value = version_map.get(item, other) + result.append(value) + return result + + try: + if not v1 or not v2: + raise ValueError("要比较的版本号不全") + if not compare_type: + raise ValueError("缺少比对模式,无法比对") + if compare_type not in {"ge", "gt", "le", "lt", "eq", "==", ">=", ">", "<=", "<"}: + raise ValueError(f"设置的版本比对模式 {compare_type} 不是有效的模式!") + + # 拆分获取版本号各个分段值做成列表 + input_ver_list = conversion_version(preprocess_version(version=v1)) + targe_ver_list = conversion_version(preprocess_version(version=v2)) + + # 补全版本号位置,保持长度一致 + max_length = max(len(input_ver_list), len(targe_ver_list)) + input_ver_list += [0] * (max_length - len(input_ver_list)) + targe_ver_list += [0] * (max_length - len(targe_ver_list)) + + ver_comparison, ver_comparison_err = None, None + for i, t in zip(input_ver_list, targe_ver_list): + # 来源==目标 + if compare_type in {"eq", "=="}: + if i != t: + ver_comparison, ver_comparison_err = None, "不等于" + break + else: + ver_comparison, ver_comparison_err = "等于", None + + # 来源>=目标 + elif compare_type in {"ge", ">="}: + if i > t: + ver_comparison, ver_comparison_err = "大于", None + break + elif i < t: + ver_comparison, ver_comparison_err = None, "小于" + break + else: + ver_comparison, ver_comparison_err = "等于", None + + # 来源>目标 + elif compare_type in {"gt", ">"}: + if i > t: + ver_comparison, ver_comparison_err = "大于", None + break + elif i < t: + ver_comparison, ver_comparison_err = None, "小于" + break + else: + ver_comparison, ver_comparison_err = None, "等于" + + # 来源<=目标 + elif compare_type in {"le", "<="}: + if i > t: + ver_comparison, ver_comparison_err = None, "大于" + break + elif i < t: + ver_comparison, ver_comparison_err = "小于", None + break + else: + ver_comparison, ver_comparison_err = "等于", None + + # 来源<目标 + elif compare_type in {"lt", "<"}: + if i > t: + ver_comparison, ver_comparison_err = None, "大于" + break + elif i < t: + ver_comparison, ver_comparison_err = "小于", None + break + else: + ver_comparison, ver_comparison_err = None, "等于" + + msg = f"版本号 {v1} {ver_comparison if ver_comparison else ver_comparison_err} 目标版本号 {v2} !" + + return (True if ver_comparison else False, msg) if verbose else True if ver_comparison else False + + except Exception as e: + return (None, e) if verbose else None @staticmethod def diff_time_str(time_str: str): From 704dcf46d3c6e27eb6985a7d7a6ddcc81b541c7e Mon Sep 17 00:00:00 2001 From: Aqr-K <95741669+Aqr-K@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:54:02 +0800 Subject: [PATCH 2/3] =?UTF-8?q?refactor(string):=20=E8=B0=83=E6=95=B4=20`p?= =?UTF-8?q?reprocess=5Fversion`=20=E4=B8=8E=20`conversion=5Fversion`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/string.py | 85 ++++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/app/utils/string.py b/app/utils/string.py index 2cbac496..d9c68d96 100644 --- a/app/utils/string.py +++ b/app/utils/string.py @@ -17,6 +17,11 @@ _special_domains = [ 'pt.ecust.pp.ua', ] +# 内置版本号转换字典 +_version_map = {"stable": -1, "rc": -2, "beta": -3, "alpha": -4} +# 不符合的版本号 +_other_version = -5 + class StringUtils: @@ -739,6 +744,31 @@ class StringUtils: return ''.join(common_prefix) + @staticmethod + def preprocess_version(version: str) -> list: + """ + 预处理版本号,去除首尾空字符串与换行符,去除开头大小写v,并拆分版本号 + """ + return re.split(r'[.-]', version.strip().lstrip('vV')) + + @staticmethod + def conversion_version(version_list) -> list: + """ + 英文字符转换为数字 + + :param version_list : 版本号列表,格式:['1', '2', '3', 'beta'] + """ + result = [] + for item in version_list: + # stable = -1,rc = -2,beta = -3,alpha = -4 + if item.isdigit(): + result.append(int(item)) + # 其余不符合的,都为-5 + else: + value = _version_map.get(item, _other_version) + result.append(value) + return result + @staticmethod def compare_version(v1: str, v2: str, compare_type, verbose: bool = False) \ -> Tuple[Optional[bool], str | Exception] | Optional[bool]: @@ -756,31 +786,6 @@ class StringUtils: 'lt' or '<' :来源 < 目标 :return """ - def preprocess_version(version: str) -> list: - """ - 预处理版本号,去除首尾空字符串与换行符,去除开头大小写v,并拆分版本号 - """ - return re.split(r'[.-]', version.strip().lstrip('vV')) - - def conversion_version(version_list) -> list: - """ - 英文字符转换为数字 - stable = -1,rc = -2,beta = -3,alpha = -4 - 其余不符合的,都为-5 - """ - # 内置版本号转换字典 - version_map = {"stable": -1, "rc": -2, "beta": -3, "alpha": -4} - # 不符合的版本号 - other = -5 - result = [] - for item in version_list: - if item.isdigit(): - result.append(int(item)) - else: - value = version_map.get(item, other) - result.append(value) - return result - try: if not v1 or not v2: raise ValueError("要比较的版本号不全") @@ -790,19 +795,19 @@ class StringUtils: raise ValueError(f"设置的版本比对模式 {compare_type} 不是有效的模式!") # 拆分获取版本号各个分段值做成列表 - input_ver_list = conversion_version(preprocess_version(version=v1)) - targe_ver_list = conversion_version(preprocess_version(version=v2)) + v1_list = StringUtils.conversion_version(StringUtils.preprocess_version(version=v1)) + v2_list = StringUtils.conversion_version(StringUtils.preprocess_version(version=v2)) # 补全版本号位置,保持长度一致 - max_length = max(len(input_ver_list), len(targe_ver_list)) - input_ver_list += [0] * (max_length - len(input_ver_list)) - targe_ver_list += [0] * (max_length - len(targe_ver_list)) + max_length = max(len(v1_list), len(v2_list)) + v1_list += [0] * (max_length - len(v1_list)) + v2_list += [0] * (max_length - len(v2_list)) ver_comparison, ver_comparison_err = None, None - for i, t in zip(input_ver_list, targe_ver_list): + for v1_value, v2_value in zip(v1_list, v2_list): # 来源==目标 if compare_type in {"eq", "=="}: - if i != t: + if v1_value != v2_value: ver_comparison, ver_comparison_err = None, "不等于" break else: @@ -810,10 +815,10 @@ class StringUtils: # 来源>=目标 elif compare_type in {"ge", ">="}: - if i > t: + if v1_value > v2_value: ver_comparison, ver_comparison_err = "大于", None break - elif i < t: + elif v1_value < v2_value: ver_comparison, ver_comparison_err = None, "小于" break else: @@ -821,10 +826,10 @@ class StringUtils: # 来源>目标 elif compare_type in {"gt", ">"}: - if i > t: + if v1_value > v2_value: ver_comparison, ver_comparison_err = "大于", None break - elif i < t: + elif v1_value < v2_value: ver_comparison, ver_comparison_err = None, "小于" break else: @@ -832,10 +837,10 @@ class StringUtils: # 来源<=目标 elif compare_type in {"le", "<="}: - if i > t: + if v1_value > v2_value: ver_comparison, ver_comparison_err = None, "大于" break - elif i < t: + elif v1_value < v2_value: ver_comparison, ver_comparison_err = "小于", None break else: @@ -843,10 +848,10 @@ class StringUtils: # 来源<目标 elif compare_type in {"lt", "<"}: - if i > t: + if v1_value > v2_value: ver_comparison, ver_comparison_err = None, "大于" break - elif i < t: + elif v1_value < v2_value: ver_comparison, ver_comparison_err = "小于", None break else: From 261bb5fa816b1287ab392c08de12989e82a11e18 Mon Sep 17 00:00:00 2001 From: Aqr-K <95741669+Aqr-K@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:07:11 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=EF=BC=8C=E6=9B=B4=E5=8A=A0=E7=9B=B4=E8=A7=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/plugin.py | 4 ++-- app/helper/resource.py | 2 +- app/utils/string.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/core/plugin.py b/app/core/plugin.py index e36aa0b1..0ea1bef8 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -682,7 +682,7 @@ class PluginManager(metaclass=Singleton): # 相同 ID 的插件保留版本号最大的版本 max_versions = {} for p in all_plugins: - if p.id not in max_versions or StringUtils.compare_version(p.plugin_version, max_versions[p.id], ">"): + if p.id not in max_versions or StringUtils.compare_version(p.plugin_version, ">", max_versions[p.id]): max_versions[p.id] = p.plugin_version result = [p for p in all_plugins if p.plugin_version == max_versions[p.id]] logger.info(f"共获取到 {len(result)} 个线上插件") @@ -823,7 +823,7 @@ class PluginManager(metaclass=Singleton): plugin.has_update = False if plugin_static: installed_version = getattr(plugin_static, "plugin_version") - if StringUtils.compare_version(installed_version, plugin_info.get("version"), "<"): + if StringUtils.compare_version(installed_version, "<", plugin_info.get("version")): # 需要更新 plugin.has_update = True # 运行状态 diff --git a/app/helper/resource.py b/app/helper/resource.py index f3a1fdd3..8fa47e6d 100644 --- a/app/helper/resource.py +++ b/app/helper/resource.py @@ -70,7 +70,7 @@ class ResourceHelper(metaclass=Singleton): local_version = self.siteshelper.indexer_version else: continue - if StringUtils.compare_version(version, local_version, ">"): + if StringUtils.compare_version(version, ">", local_version): logger.info(f"{rname} 资源包有更新,最新版本:v{version}") else: continue diff --git a/app/utils/string.py b/app/utils/string.py index d9c68d96..480c5948 100644 --- a/app/utils/string.py +++ b/app/utils/string.py @@ -770,7 +770,7 @@ class StringUtils: return result @staticmethod - def compare_version(v1: str, v2: str, compare_type, verbose: bool = False) \ + def compare_version(v1: str, compare_type: str, v2: str, verbose: bool = False) \ -> Tuple[Optional[bool], str | Exception] | Optional[bool]: """ 比较两个版本号的大小