#!/usr/bin/env python # coding=utf-8 """ @author: CNWei @Software: PyCharm @contact: t6i888@163.com @file: settings @date: 2025/2/23 21:34 @desc: """ import logging from pathlib import Path from typing import Any import tomlkit ROOT_PATH = (Path(__file__)).resolve().parents[1] # 获取根路径(绝对路径) EXPLICIT_WAIT_TIMEOUT = 10 DATA_ROOT = ROOT_PATH / "data" if not DATA_ROOT.exists(): DATA_ROOT.mkdir(parents=True, exist_ok=True) # 配置文件路 CONF_PATH = Path(DATA_ROOT, "settings.toml") # 截图保存路径 SCREENSHOT_DIR = Path(ROOT_PATH, "screenshot") if not SCREENSHOT_DIR.exists(): SCREENSHOT_DIR.mkdir(parents=True, exist_ok=True) # 测试案例路径 CASES_DIR = Path(ROOT_PATH, "tests") # 变量替换 EXCHANGER = Path(ROOT_PATH, "extract.toml") # 自增ID ID_PATH = Path(ROOT_PATH, "id.toml") browser_dir: Path | str | None = None chrome_driver: Path | str | None = None temp_user_data_dir: Path | str # 默认配置 DEFAULT_CONF = { "SCREENSHOT_DIR": SCREENSHOT_DIR, "CASES_DIR": CASES_DIR, "EXCHANGER": EXCHANGER, "ID_PATH": ID_PATH, } class Settings: """ 配置管理类 (单例模式 Singleton Pattern)。 优先从项目根目录下的 'settings.toml' 文件加载配置。 如果 'settings.toml' 文件不存在、无法解析或缺少某个配置项, 则使用此类中定义的默认值。 通过创建类的唯一实例 `settings` 来全局访问配置。 """ _instance = None # --- 单例实现 --- def __new__(cls, *args, **kwargs): """ 实现单例模式。确保全局只有一个 Settings 实例。 """ if not cls._instance: cls._instance = super().__new__(cls, *args, **kwargs) # 初始化只进行一次 cls._instance._initialized = False return cls._instance def __init__(self): """ 初始化配置。仅在第一次创建实例时执行。 """ # 防止重复初始化 (单例模式下可能会被多次调用 __init__) if self._initialized: return self._initialized = True logging.info("开始初始化配置...") self._init_config() self._load_config() def _init_config(self): """初始化配置文件""" if not CONF_PATH.exists(): CONF_PATH.parent.mkdir(parents=True, exist_ok=True) CONF_PATH.touch() # self._save_config(DEFAULT_CONF) return self def _load_config(self): with open(CONF_PATH, 'r', encoding='utf-8') as f: result = tomlkit.parse(f.read()) logging.debug(f"加载 settings.toml 文件 ===> {result}") new_conf = DEFAULT_CONF | result for key, value in new_conf.items(): self.__setattr__(key, value) return self def _save_config(self, data: dict[str, Any]): """保存配置到文件""" for key, value in data.items(): if isinstance(value, Path): data[key] = value.as_posix() with open(CONF_PATH, 'w', encoding='utf-8') as f: tomlkit.dump(data=data, fp=f, sort_keys=False) return self def __setattr__(self, key, value): self.__dict__[key] = value def items(self): conf: dict = {} for key, value in self.__dict__.items(): if not key.startswith('_'): conf[key] = value # return self.__dict__.items() return conf configs = Settings() # --- 用于直接运行此文件进行测试 --- if __name__ == '__main__': ... print(configs.items())