108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
"""Configuration handling."""
|
|
|
|
import os
|
|
from dataclasses import dataclass, field
|
|
from typing import Optional
|
|
import toml
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
"""Configuration for code-doc-cli."""
|
|
|
|
input_patterns: list[str] = field(default_factory=lambda: ["**/*.py", "**/*.ts", "**/*.go"])
|
|
output_file: Optional[str] = None
|
|
language: Optional[str] = None
|
|
template_style: str = "default"
|
|
syntax_highlighting: bool = True
|
|
theme: str = "default"
|
|
fail_on_warning: bool = False
|
|
exclude_patterns: list[str] = field(default_factory=list)
|
|
include_private: bool = False
|
|
output_format: str = "markdown"
|
|
|
|
def to_dict(self) -> dict:
|
|
"""Convert config to dictionary."""
|
|
return {
|
|
"input_patterns": self.input_patterns,
|
|
"output_file": self.output_file,
|
|
"language": self.language,
|
|
"template_style": self.template_style,
|
|
"syntax_highlighting": self.syntax_highlighting,
|
|
"theme": self.theme,
|
|
"fail_on_warning": self.fail_on_warning,
|
|
"exclude_patterns": self.exclude_patterns,
|
|
"include_private": self.include_private,
|
|
"output_format": self.output_format,
|
|
}
|
|
|
|
|
|
def load_config(config_path: Optional[str] = None) -> Config:
|
|
"""Load configuration from file.
|
|
|
|
Args:
|
|
config_path: Path to config file (code-doc.toml)
|
|
|
|
Returns:
|
|
Config object
|
|
"""
|
|
config = Config()
|
|
|
|
if not config_path:
|
|
config_path = os.environ.get("CODE_DOC_CONFIG")
|
|
if not config_path:
|
|
config_path = os.path.join(os.getcwd(), "code-doc.toml")
|
|
if not os.path.exists(config_path):
|
|
return config
|
|
|
|
if not os.path.exists(config_path):
|
|
return config
|
|
|
|
try:
|
|
with open(config_path, "r", encoding="utf-8") as f:
|
|
data = toml.load(f)
|
|
|
|
if "tool" in data and "code-doc" in data["tool"]:
|
|
config_data = data["tool"]["code-doc"]
|
|
|
|
if "input_patterns" in config_data:
|
|
config.input_patterns = config_data["input_patterns"]
|
|
if "output_file" in config_data:
|
|
config.output_file = config_data["output_file"]
|
|
if "language" in config_data:
|
|
config.language = config_data["language"]
|
|
if "template_style" in config_data:
|
|
config.template_style = config_data["template_style"]
|
|
if "syntax_highlighting" in config_data:
|
|
config.syntax_highlighting = config_data["syntax_highlighting"]
|
|
if "theme" in config_data:
|
|
config.theme = config_data["theme"]
|
|
if "fail_on_warning" in config_data:
|
|
config.fail_on_warning = config_data["fail_on_warning"]
|
|
if "exclude_patterns" in config_data:
|
|
config.exclude_patterns = config_data["exclude_patterns"]
|
|
if "include_private" in config_data:
|
|
config.include_private = config_data["include_private"]
|
|
if "output_format" in config_data:
|
|
config.output_format = config_data["output_format"]
|
|
|
|
except toml.TomlDecodeError as e:
|
|
raise ValueError(f"Invalid TOML in config file: {e}")
|
|
except Exception as e:
|
|
raise ValueError(f"Error reading config file: {e}")
|
|
|
|
return config
|
|
|
|
|
|
def save_config(config: Config, config_path: str) -> None:
|
|
"""Save configuration to file.
|
|
|
|
Args:
|
|
config: Config object
|
|
config_path: Path to save config
|
|
"""
|
|
data = {"tool": {"code-doc": config.to_dict()}}
|
|
|
|
with open(config_path, "w", encoding="utf-8") as f:
|
|
toml.dump(data, f)
|