210 lines
6.7 KiB
Python
210 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
# @Time : 2024/1/13 9:33
|
||
# @Author : floraachy
|
||
# @File : data_tools
|
||
# @Software: PyCharm
|
||
# @Desc:
|
||
|
||
# 标准库导入
|
||
import random # 导包不能移除,否则random.choice这种就不能处理了
|
||
import os
|
||
import base64
|
||
from datetime import datetime, timedelta
|
||
# 第三方库导入
|
||
from loguru import logger
|
||
# 本地应用/模块导入
|
||
from common_utils.files_utils.files_handle import file_to_base64, filepath_to_base64, get_files
|
||
from common_utils.tools.aes_encrypt_decrypt import Encrypt
|
||
from settings import FILES_DIR
|
||
|
||
|
||
def zip_test_step(step_id, step_status_id=None):
|
||
"""
|
||
处理测试用例的步骤
|
||
"""
|
||
if step_status_id:
|
||
return [{'id': id, 'stepStatus': execResult} for id, execResult in zip(step_id, step_status_id)]
|
||
else:
|
||
random_list = [0, 1, 2, 3, 4]
|
||
return [{'id': id, 'stepStatus': random.choice(random_list)} for id in step_id]
|
||
|
||
|
||
def get_file_content(file_name):
|
||
"""
|
||
获取文件二进制内容
|
||
:param file_name: 文件名称
|
||
:return:
|
||
"""
|
||
file_path = os.path.join(FILES_DIR, file_name)
|
||
if os.path.exists(file_path):
|
||
# 如果文件是一个真实存在的路径,则返回文件二进制内容
|
||
return file_to_base64(file_path=file_path)
|
||
else:
|
||
# 若文件不存在,则尝试以文件扩展名随机选择一个文件
|
||
logger.warning(f"图片不存在,将获取传入文件名后缀,随机取对应类型的文件, 路径:{file_path}")
|
||
file_extension = os.path.splitext(file_name)[1]
|
||
files = get_files(target=FILES_DIR, end=file_extension)
|
||
if files:
|
||
# 返回文件二进制内容
|
||
return file_to_base64(file_path=random.choice(files))
|
||
else:
|
||
logger.warning(f"找不到该文件后缀对应的同类型文件,将返回空, 传入的文件名:{file_name}")
|
||
return None
|
||
|
||
|
||
def list_to_str(target):
|
||
"""
|
||
将列表中的元素转换为字符串,并用逗号分隔。
|
||
:param target: 要转换为字符串的列表。
|
||
:return: 以逗号分隔的字符串。
|
||
"""
|
||
if isinstance(target, list) and target:
|
||
# 过滤掉列表中的None值
|
||
filtered_list = [str(item) for item in target if item is not None]
|
||
# 使用逗号连接字符串
|
||
return ",".join(filtered_list)
|
||
elif isinstance(target, str) and target:
|
||
return target
|
||
else:
|
||
return None
|
||
|
||
|
||
def string_to_base64(input_string: str):
|
||
"""
|
||
将字符串转换为Base64格式
|
||
"""
|
||
base64_bytes = base64.b64encode(input_string.encode('utf-8'))
|
||
base64_string = base64_bytes.decode('utf-8')
|
||
return base64_string
|
||
|
||
|
||
def str_to_list(target):
|
||
"""
|
||
将字符串转换为列表,字符串中以逗号分隔的元素将转换为列表中的元素。
|
||
"""
|
||
if isinstance(target, str):
|
||
return [target]
|
||
else:
|
||
return target
|
||
|
||
|
||
def none_to_null(target):
|
||
"""
|
||
将'None'转成空字符串
|
||
"""
|
||
if target == 'None':
|
||
return ""
|
||
else:
|
||
return target
|
||
|
||
|
||
def get_file_base64(file_name):
|
||
"""
|
||
返回文文件内容的base64编码
|
||
"""
|
||
file_path = os.path.join(FILES_DIR, file_name)
|
||
if os.path.exists(file_path):
|
||
# 如果文件是一个真实存在的路径,则返回base64编码内容
|
||
return file_to_base64(file_path=file_path)
|
||
else:
|
||
logger.warning(f"找不到该文件,将返回空, 传入的文件名:{file_name}")
|
||
return None
|
||
|
||
|
||
def get_filepath_base64(file_name):
|
||
"""
|
||
返回文件路径的base64编码
|
||
"""
|
||
file_path = os.path.join(FILES_DIR, file_name)
|
||
if os.path.exists(file_path):
|
||
# 如果文件是一个真实存在的路径,则返回base64编码内容
|
||
return filepath_to_base64(file_path=file_path)
|
||
|
||
else:
|
||
logger.warning(f"找不到该文件,将返回空, 传入的文件名:{file_name}")
|
||
return None
|
||
|
||
|
||
def get_base64_content(input_string: str):
|
||
"""
|
||
获取base64编码内容
|
||
"""
|
||
byte_string = input_string.encode('utf-8')
|
||
base64_bytes = base64.b64encode(byte_string)
|
||
base64_string = base64_bytes.decode('utf-8')
|
||
return base64_string
|
||
|
||
|
||
def base64_decode(encoded_string):
|
||
try:
|
||
decoded_bytes = base64.b64decode(encoded_string)
|
||
decoded_string = decoded_bytes.decode('utf-8')
|
||
return decoded_string
|
||
except Exception as e:
|
||
return f"Error decoding: {str(e)}"
|
||
|
||
|
||
def update_wiki_sidebar(sidebar_content, new_page_name):
|
||
"""
|
||
获取wiki sideber的base64编码内容,将新页面追加到后面,再重新编码返回
|
||
"""
|
||
_sidebar_content = base64_decode(sidebar_content)
|
||
new_sidebar_content = _sidebar_content + f"\n[[{new_page_name}]]"
|
||
return string_to_base64(new_sidebar_content)
|
||
|
||
|
||
def get_current_week(start_or_end="start"):
|
||
"""
|
||
获取当前日期,并根据参数返回本周的开始或结束日期。
|
||
|
||
参数:
|
||
- start_or_end: 字符串,指定返回本周的开始日期("start")还是结束日期("end")。
|
||
|
||
返回:
|
||
- 本周开始或结束日期的字符串表示,格式为"月日"(例如:"01月01日")。
|
||
"""
|
||
# 获取当前日期
|
||
today = datetime.today()
|
||
# 计算今天是本周的第几天(0代表周一,1代表周二,以此类推)
|
||
current_weekday = today.weekday()
|
||
|
||
if start_or_end == "start":
|
||
# 计算本周的周一
|
||
res = today - timedelta(days=current_weekday)
|
||
elif start_or_end == "end":
|
||
# 计算本周的周日
|
||
res = today - timedelta(days=current_weekday) + timedelta(days=6)
|
||
else:
|
||
# 如果参数非法,返回当前日期的周一
|
||
logger.error(f"Invalid value for start_or_end: {start_or_end}. Defaulting to 'start'.")
|
||
res = today - timedelta(days=current_weekday)
|
||
|
||
return res.strftime("%m月%d日")
|
||
|
||
|
||
def split_data(target: str, split_char: str, start_index: int, end_index: int = None):
|
||
"""
|
||
切割数据,返回指定索引范围内的切割结果
|
||
:param target: 要切割的字符串
|
||
:param split_char: 切割的方式
|
||
:param start_index: 切割结果的起始索引。假如end_index为空,则返回指定索引值
|
||
:param end_index: 切割结果的结束索引(可选,默认为 None)
|
||
:return: 指定索引范围内的切割结果
|
||
"""
|
||
# 参数类型检查
|
||
if not isinstance(target, str):
|
||
raise ValueError("target must be a string")
|
||
|
||
if start_index and end_index:
|
||
return target.split(split_char)[start_index:end_index]
|
||
else:
|
||
return target.split(split_char)[start_index]
|
||
|
||
|
||
def aes_encrypt_data(target_str: str, ace_key):
|
||
"""
|
||
使用AES-CBC对称加密算法对密码进行加密
|
||
"""
|
||
ace = Encrypt(key=ace_key, iv=ace_key)
|
||
return ace.aes_encrypt(target_str)
|