Initial upload: API Mock CLI v0.1.0
Some checks failed
CI / test (3.10) (push) Has been cancelled
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / type-check (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-01-29 13:53:36 +00:00
parent eefca45cad
commit 099f4fb428

68
src/cli/config.py Normal file
View File

@@ -0,0 +1,68 @@
import os
from typing import Optional, Dict, Any
import yaml
from src.models.config import ServerConfig, ProjectConfig
class ConfigLoader:
CONFIG_FILE_NAMES = ["config.yaml", ".api-mock.yaml", "api-mock.yaml"]
@staticmethod
def find_config_file(path: Optional[str] = None) -> Optional[str]:
if path and os.path.exists(path):
return path
for name in ConfigLoader.CONFIG_FILE_NAMES:
if os.path.exists(name):
return name
return None
@staticmethod
def load_config(path: str) -> Dict[str, Any]:
with open(path, "r") as f:
return yaml.safe_load(f) or {}
@staticmethod
def apply_env_overrides(config: Dict[str, Any]) -> Dict[str, Any]:
env_mappings = {
"API_MOCK_PORT": ("server", "port"),
"API_MOCK_HOST": ("server", "host"),
"API_MOCK_OFFLINE": ("server", "offline"),
"NGROK_AUTHTOKEN": ("server", "ngrok_authtoken"),
"API_MOCK_LOG_LEVEL": ("server", "log_level"),
}
for env_var, path in env_mappings.items():
value = os.environ.get(env_var)
if value is not None:
section, key = path
if section not in config:
config[section] = {}
if key in ("port", "offline"):
value = int(value) if key == "port" else value.lower() == "true"
config[section][key] = value
return config
@classmethod
def load(cls, config_path: Optional[str] = None) -> ProjectConfig:
path = cls.find_config_file(config_path)
if not path:
return ProjectConfig(name="default")
config_data = cls.load_config(path)
config_data = cls.apply_env_overrides(config_data)
return ProjectConfig(**config_data)
@staticmethod
def save_config(config: ProjectConfig, path: str) -> None:
config_dict = config.model_dump(exclude_none=True)
with open(path, "w") as f:
yaml.dump(config_dict, f, default_flow_style=False)
@staticmethod
def create_default_config(path: str = "config.yaml") -> ProjectConfig:
config = ProjectConfig(
name="my-mock-api",
version="1.0.0",
description="API Mock Project",
server=ServerConfig()
)
ConfigLoader.save_config(config, path)
return config