#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2022 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import re class BundleCheckTools: '''用于检查 bundle.json 的工具箱。''' @staticmethod def is_all_lower(string:str): ''' 判断字符串是否有且仅有小写字母。''' if not string: return False for i in string: if not (97 <= ord(i) <= 122): return False return True @staticmethod def is_number(string:str) -> bool: ''' 判断字符串 s 是否能表示为数值。''' try: float(string) return True except (OverflowError, ValueError): return False @staticmethod def split_by_unit(string:str): '''分离 s 字符串的数值和单位''' match = re.match(r'^[~]?(\d+)([a-zA-Z]*)$', string) if not match: return (0, '') return (float(match.group(1)), match.group(2)) @staticmethod def get_root_path() -> str: cur_path = os.path.dirname(os.path.abspath(__file__)) root_path = os.path.normpath(os.path.join(cur_path, '../../../../../')) try: if BundleCheckTools.is_project(root_path): return root_path else: raise ValueError( 'get root path failed, please check script "bundle_check_common.py" under ' 'the path(build/tools/component_tools/static_check/bundle_check).') except ValueError as get_path_error: print("Error: ", repr(get_path_error)) return "" @staticmethod def is_project(path:str) -> bool: ''' @func: 判断路径是否源码工程。 @note: 通过是否存在 .repo/manifests 目录判断。 ''' if not path: return False abs_path = os.path.abspath(os.path.normpath(path)) return os.path.exists(abs_path + '/' + '.repo/manifests') @staticmethod def get_ohos_version(root:str) -> str: if not BundleCheckTools.is_project(root): return "" version_path = os.path.join(root, 'build/version.gni') lines = [] with open(version_path, 'r', encoding='utf-8') as version_file: lines = version_file.readlines() for line in lines: line = line.strip() if line and line[0] == '#': continue if 'sdk_version =' in line: match_result = re.match(r'\s*sdk_version\s*=\s*"(\d+\.\d+).*"', line) if match_result: return match_result.group(1) else: return "" return "" @staticmethod def match_unix_like_name(name:str): ''' @func: 检查是否符合 unix_like 命名规范(规则1.1) ''' return re.match(r'^[a-z][a-z0-9_]{1,62}$', name) @staticmethod def match_bundle_full_name(name:str): ''' @func: 检查 bundle.json 第一个 name 字段命名规则。 ''' return re.match(r'^@[a-z]+/([a-z][a-z0-9_]{1,62})$', name)