# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test63
# FileName:      __init__.py
# Author:       lao_zhao
# Datetime:     2024/11/5 14:02
# Description:
# 
# ---------------------------------------------------------------------------
import functools
import logging
import os
import time


"""
    每个用户有独立的数据配置层，每个用户有自己的配置文件-config.ini--->这个文件名称不能改变文件名---需要单独读取---ReadUserIni
    接口自动化框架有公共的配置文件---config.ini--->这个文件名称不能改变文件名---ReadBasicIni

    在用例层-每个用户都有自己独立的测试层--用户的测试层中的__init__.py文件中需要配置用户存放数据的目录名称
"""
"""
    pytest:
        报告插件：pytest-html ---> pip install pytest-html

            输出报告的命令：pytest -vv 用例模块/用例包 --html=报告存放的路径 --self-contained-html
            
        失败重跑插件：pytest-rerunfailures --> pip install pytest-rerunfailures
            
            输出报告的命令：pytest -vv 用例模块/用例包 --html=报告存放的路径 --self-contained-html --reruns 失败重跑的次数 --reruns-delay 失败重跑间隔时间
            
    
    allure生成报告：
        需要下pytest的插件：pip install allure-pytest
        
        1：使用pytest执行用例，生成执行结果的json文件 
            pytest 用例模块/用例包 --alluredir=存放json文件的目录 --clean-alluredir --reruns 失败重跑的次数 --reruns-delay 失败重跑间隔时间
        
        2: 根据第一步测试结果的json文件生成报告。
            i: 本地生成测试报告服务
                allure serve 第一步存放测试结果json文件的目录
            ii: 生成静态的报告
                allure generate 第一步存放测试结果json文件的目录 -o 静态报告存放的目录
                打开静态的报告：allure open 静态报告存放的目录
"""


def api_log():
    # 创建Logger对象    root
    logger = logging.getLogger()
    # 设置级别
    logger.level = logging.INFO
    # 日志文件存放的路径
    log_dir_path = os.path.join(os.path.join(os.path.dirname(__file__), "report"), "log")
    log_file_name = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + ".log"
    log_path = os.path.join(log_dir_path, log_file_name)
    # 创建日志文件的Handler对象
    handler = logging.FileHandler(filename=log_path, mode="a", encoding="utf-8")
    # 设置日志显示的格式
    # formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    formatter = logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')
    # 给Handler设置日志的格式
    handler.setFormatter(formatter)
    # 给Logger添加Handler对象
    logger.addHandler(handler)
    return logger


log = api_log()


def logor(func_name):

    @functools.wraps(func_name)   # 装饰器返回内部函数时，沿用被装饰者的名称
    def inner(*args, **kwargs):
        # __code__: 返回函数或方法的对象，可以获取函数或者方法的属性。
        # __code__.co_filename：获取函数或方法所在的py文件
        # __code__.co_firstlineno：获取函数或方法所在的py文件开始行号
        log.info(f"执行的功能为：{func_name.__name__}, 功能描述为：{func_name.__doc__}, 所在的py文件为：{func_name.__code__.co_filename}， 所在的行为：{func_name.__code__.co_firstlineno}行，形参的值为：{args}或{kwargs}")
        try:
            result = func_name(*args, **kwargs)
        except Exception as e:
            log.error(f"执行的功能为：{func_name.__name__}, 功能描述为：{func_name.__doc__}, 所在的py文件为：{func_name.__code__.co_filename}， 所在的行为：{func_name.__code__.co_firstlineno}行，形参的值为：{args}或{kwargs}"
                      f"错误的类型为：{type(e)}, 错误的描述为：{e}")
            raise e
        else:
            return result
    return inner