#!/usr/bin/env python # coding=utf-8 """ @author: chen wei @Software: PyCharm @contact: t6i888@163.com @file: files.py @date: 2024 2024/9/15 21:28 @desc: 读取和保存yaml文件 """ import logging from pathlib import Path import yaml logger = logging.getLogger(__name__) class YamlFile(dict): def __init__(self, path=None, data=None): super().__init__() self.path = Path(path) if path else None if data: self.update(data) elif self.path: if self.path.is_dir(): raise IsADirectoryError(f"The path {self.path} is a directory, not a file.") self.load() def load(self): if not self.path: logger.warning("No path specified for YamlFile, cannot load.") return self if self.path.exists() and self.path.is_file(): with open(self.path, "r", encoding="utf-8") as f: loaded_data = yaml.safe_load(f) or {} self.clear() self.update(loaded_data) else: logger.warning(f"File not found at {self.path}, YamlFile initialized as empty.") self.clear() return self def to_yaml(self) -> str: return yaml.safe_dump( dict(self), allow_unicode=True, sort_keys=False ) @classmethod def by_yaml(cls, yaml_str): data = yaml.safe_load(yaml_str) or {} return cls(data=data) def save(self): if not self.path: raise ValueError("Cannot save YamlFile instance without a specified path.") # 确保父目录存在 self.path.parent.mkdir(parents=True, exist_ok=True) with open(self.path, "w", encoding="utf-8") as f: yaml.safe_dump( dict(self), stream=f, allow_unicode=True, sort_keys=False ) return self if __name__ == '__main__': from core.models import CaseInfo from core.settings import TEST_CASE_DIR # 1. 创建一个用于测试的临时yaml文件 dummy_path = TEST_CASE_DIR / "test_model_demo.yaml" dummy_data = { "title": "Get user info", "request": {"method": "GET", "url": "/users/1"}, "validate": [{"equals": ["status_code", 200]}] } YamlFile(path=dummy_path, data=dummy_data).save() print(f"--- 已创建临时测试文件: {dummy_path}") # 2. 加载文件并使用Pydantic模型进行校验 yaml_case = YamlFile(dummy_path) print("\n--- 已加载YAML内容 ---\n", yaml_case.to_yaml()) case_model = CaseInfo(**yaml_case) print("\n--- Pydantic模型校验成功 ---") print(case_model.model_dump_json(indent=2, by_alias=True)) # 3. 清理临时文件 dummy_path.unlink() print(f"\n--- 已清理临时文件: {dummy_path}")