import json import sqlite3 from collections import OrderedDict from typing import TYPE_CHECKING import yaml if TYPE_CHECKING: from models.test_case import CaseManager JSON_COLUMNS = ["environment", "request", "generation_strategy"] def json_to_multiline_string(obj): if obj is None: return None return json.dumps(json.loads(obj), indent=2) def dict_factory(cursor, row): d = OrderedDict() for idx, col in enumerate(cursor.description): if col[0] in JSON_COLUMNS: d[col[0]] = json_to_multiline_string(row[idx]) elif col[0] == "confirmed" or col[0] == "ignored": d[col[0]] = bool(row[idx]) else: d[col[0]] = row[idx] return d def convert_sqlite_to_yaml(case_manager: "CaseManager", yaml_path, metadata=None): sql = "SELECT id, operation_id, category, affected_element, element_type, generation_strategy, path, method, environment, request, expected_status, description, type, confirmed, ignored FROM cases WHERE expected_status IS NOT NULL" original_row_factory = case_manager.conn.row_factory case_manager.conn.row_factory = dict_factory cursor = case_manager.conn.cursor() cursor.execute(sql) cases = cursor.fetchall() case_manager.conn.row_factory = original_row_factory if metadata is None: meta = { "swagger_commit_id": "placeholder", "biz_type": "dedicated", "openapi_version": "v1beta1", "pr": "placeholder", } else: meta = metadata content = { "meta": meta, "cases": cases, } class CustomDumper(yaml.SafeDumper): def ignore_aliases(self, data): return True def represent_scalar(self, tag, value, style=None): if isinstance(value, str) and "\n" in value: return yaml.ScalarNode(tag, value, style="|") return super().represent_scalar(tag, value, style) yaml.add_representer( OrderedDict, yaml.representer.SafeRepresenter.represent_dict, Dumper=CustomDumper, ) with open(yaml_path, "w", encoding="utf-8") as yaml_file: yaml.dump( content, yaml_file, sort_keys=False, default_flow_style=False, allow_unicode=True, Dumper=CustomDumper, ) if __name__ == "__main__": db_path = "../output/374a127_refactor.db" case_manager = CaseManager(db_path) yaml_path = "../output/374a127_refactor.yaml" convert_sqlite_to_yaml(case_manager, yaml_path)