# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test60
# FileName:      __init__.py
# Author:       lao_zhao
# Datetime:     2024/5/20 15:40
# Description:
# 
# ---------------------------------------------------------------------------
import functools
import logging
import os
import time

log_dir_path = os.path.join(os.path.join(os.path.dirname(__file__), "report"), "log")
if not os.path.exists(log_dir_path):
    # makedirs(c:\c\d\a)  os.mkdir
    os.makedirs(log_dir_path)

log_file_name = os.path.join(log_dir_path, time.strftime("%Y_%m_%d_%H_%M_%S") + ".log")


def log():
    # 创建logger对象
    logger = logging.getLogger()
    # 设置日志的级别
    logger.level = logging.ERROR
    # 设置日志文件
    handler = logging.FileHandler(log_file_name, mode="a", encoding="utf-8")
    # 设置日志的格式
    formatter = logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')
    # 将格式添加到handler中
    handler.setFormatter(formatter)
    # 将handler添加到logger对象中
    logger.addHandler(handler)
    return logger


log = log()


def log_decorator(func_name):
    @functools.wraps(func_name)
    def inner(*args, **kwargs):
        try:
            # 写入info级别的日志
            """
            __init__(): 构造方法，初始化对象
            __new__(): 为对象分配内存空间
            __del__(): 析构方法，回收对象
            __enter__()/__exit__(): 实现上下文管理器
            
            __mro__: 查看继承顺序
            __file__: 获取文件的路径
            __name__: 获取功能/类/方法/模块的名称
            __iter__(): 创建迭代器
            __next__(): 迭代器和生成器取值
            
            __code__: 获取功能的code属性
                    func.__code__.co_filename: 获取func所在的py文件名称
                    func.__code__.co_firstlineno： 获取func所在的py文件中行号
            __doc__：获取功能的描述
            """
            log.info(f"执行的功能为：{func_name.__name__}, 功能的描述为：{func_name.__doc__}, 所在的文件为："
                     f"{func_name.__code__.co_filename}, 所在行为:{func_name.__code__.co_firstlineno}")
            # 执行功能
            return func_name(*args, **kwargs)
        except Exception as e:
            # 如果发生错误，写入一个错误的日志
            log.error(f"执行的功能为：{func_name.__name__}, 功能的描述为：{func_name.__doc__}, 所在的文件为："
                     f"{func_name.__code__.co_filename}, 所在行为:{func_name.__code__.co_firstlineno}, 错误为:{e}")
            raise e
    return inner



# 报告输出
"""

    pytest-html----> pip install pytest-html
    生成报告的命名：
        pytest 用例层目录名称 -vv --html=存放报告的路径/报告名称.html --self-contained-html
            -vv: 终端执行显示详细结果
            --html: 存放报告的路径/报告名称.html
            --self-contained-html: 报告生成单独的html文件
"""
# allure
"""
    allure-pytest --- > pip install allure-pytest

    第一步：生成测试结果的json文件：pytest 用例模块/包 --alluredir=存放json文件的路径 --clean-alluredir
    第二步：
        生成一个服务：allure serve 第一步存放json文件的路径
        生成静态报告：allure generate 第一步存放json文件的路径 -o 存放报告的路径
            打开allure的静态报告：allure open 存放报告的路径
    
"""
"""
    失败重跑插件：pytest-rerunfailures ---> pip install pytest-rerunfailures

"""