deepdata: core product code (backend, frontend, runtime, deepflow module)
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
"""
|
||||
Parser Holder
|
||||
解析器持有者,根据文件类型选择合适的解析器
|
||||
"""
|
||||
import os
|
||||
from typing import Dict, Type, Optional
|
||||
|
||||
from app.module.operator.parsers.abstract_parser import AbstractParser
|
||||
from app.module.operator.parsers.tar_parser import TarParser
|
||||
from app.module.operator.parsers.zip_parser import ZipParser
|
||||
from app.module.operator.schema import OperatorDto
|
||||
|
||||
|
||||
class ParserHolder:
|
||||
"""解析器持有者,根据文件类型选择解析器"""
|
||||
|
||||
def __init__(self):
|
||||
self._parsers: Dict[str, AbstractParser] = {
|
||||
"tar": TarParser(),
|
||||
"gz": TarParser(),
|
||||
"tgz": TarParser(),
|
||||
"zip": ZipParser(),
|
||||
}
|
||||
|
||||
def get_parser(self, file_path: str) -> AbstractParser:
|
||||
"""根据文件扩展名获取解析器"""
|
||||
_, ext = os.path.splitext(file_path)
|
||||
file_type = ext.lstrip('.').lower()
|
||||
|
||||
if file_type not in self._parsers:
|
||||
raise ValueError(f"Unsupported file type: {file_type}")
|
||||
|
||||
return self._parsers[file_type]
|
||||
|
||||
def parse_yaml_from_archive(
|
||||
self,
|
||||
file_type: str,
|
||||
archive_path: str,
|
||||
entry_path: str,
|
||||
file_name: Optional[str] = None,
|
||||
file_size: Optional[int] = None
|
||||
) -> OperatorDto:
|
||||
"""从压缩包解析 YAML"""
|
||||
if file_type not in self._parsers:
|
||||
raise ValueError(f"Unsupported file type: {file_type}")
|
||||
|
||||
return self._parsers[file_type].parse_yaml_from_archive(
|
||||
archive_path,
|
||||
entry_path,
|
||||
file_name,
|
||||
file_size
|
||||
)
|
||||
|
||||
def extract_to(self, file_type: str, archive_path: str, target_dir: str) -> None:
|
||||
"""解压文件到目标目录"""
|
||||
if file_type not in self._parsers:
|
||||
raise ValueError(f"Unsupported file type: {file_type}")
|
||||
|
||||
self._parsers[file_type].extract_to(archive_path, target_dir)
|
||||
Reference in New Issue
Block a user