Initial upload: ConfDoc v0.1.0 - Config validation and documentation generator
This commit is contained in:
60
src/confdoc/parsers/factory.py
Normal file
60
src/confdoc/parsers/factory.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
from typing import Dict, Optional, Type
|
||||||
|
from confdoc.parsers.json_parser import JsonParser
|
||||||
|
from confdoc.parsers.yaml_parser import YamlParser
|
||||||
|
from confdoc.parsers.toml_parser import TomlParser
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigParserFactory:
|
||||||
|
"""Factory for creating configuration parsers based on format."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._parsers: Dict[str, object] = {
|
||||||
|
"json": JsonParser(),
|
||||||
|
"yaml": YamlParser(),
|
||||||
|
"toml": TomlParser(),
|
||||||
|
}
|
||||||
|
self._format_detection = {
|
||||||
|
".json": "json",
|
||||||
|
".yaml": "yaml",
|
||||||
|
".yml": "yaml",
|
||||||
|
".toml": "toml",
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_parser(self, format: Optional[str] = None):
|
||||||
|
"""Get a parser for the specified format."""
|
||||||
|
if format is None:
|
||||||
|
format = "json"
|
||||||
|
|
||||||
|
parser = self._parsers.get(format.lower())
|
||||||
|
if parser is None:
|
||||||
|
raise ValueError(f"Unsupported format: {format}")
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def get_parser_for_file(self, file_path: str):
|
||||||
|
"""Detect format from file path and return appropriate parser."""
|
||||||
|
import os
|
||||||
|
ext = os.path.splitext(file_path)[1].lower()
|
||||||
|
format = self._format_detection.get(ext, "json")
|
||||||
|
return self.get_parser(format)
|
||||||
|
|
||||||
|
def detect_format(self, content: str) -> str:
|
||||||
|
"""Detect format from content."""
|
||||||
|
content = content.strip()
|
||||||
|
|
||||||
|
if content.startswith("{"):
|
||||||
|
return "json"
|
||||||
|
elif content.startswith("["):
|
||||||
|
return "toml"
|
||||||
|
elif content.startswith("#"):
|
||||||
|
return "yaml"
|
||||||
|
elif ":" in content and "=" not in content.split(":")[0]:
|
||||||
|
return "yaml"
|
||||||
|
elif "=" in content and not content.startswith("{"):
|
||||||
|
return "toml"
|
||||||
|
|
||||||
|
return "json"
|
||||||
|
|
||||||
|
def register_parser(self, format: str, parser: object):
|
||||||
|
"""Register a new parser."""
|
||||||
|
self._parsers[format] = parser
|
||||||
Reference in New Issue
Block a user