feat: config.txt読込モジュールを追加
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
b8b8f4d93c
commit
4ae53c2725
45
PythonProj/ScanOCR/スクリプト/config_loader.py
Normal file
45
PythonProj/ScanOCR/スクリプト/config_loader.py
Normal file
@ -0,0 +1,45 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""config.txt(key=value形式)読込モジュール。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class ConfigError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
REQUIRED_KEYS = (
|
||||
"スクリプトフォルダ",
|
||||
"テンプレートフォルダ",
|
||||
"スキャンフォルダ",
|
||||
"アウトプットフォルダ",
|
||||
"成功フォルダ",
|
||||
"失敗フォルダ",
|
||||
"ログフォルダ",
|
||||
"margin",
|
||||
"DPI",
|
||||
"ファイル安定待ち秒",
|
||||
"ファイル安定待ちリトライ回数",
|
||||
)
|
||||
|
||||
|
||||
def load_config(config_path: Path) -> dict[str, str]:
|
||||
if not config_path.exists():
|
||||
raise ConfigError(f"config.txt が見つかりません: {config_path}")
|
||||
|
||||
config: dict[str, str] = {}
|
||||
for raw_line in config_path.read_text(encoding="utf-8").splitlines():
|
||||
line = raw_line.strip()
|
||||
if not line or line.startswith("#") or "=" not in line:
|
||||
continue
|
||||
key, _, value = line.partition("=")
|
||||
config[key.strip()] = value.strip()
|
||||
|
||||
missing = [key for key in REQUIRED_KEYS if key not in config]
|
||||
if missing:
|
||||
raise ConfigError(
|
||||
f"config.txt に必須項目が不足しています: {', '.join(missing)}"
|
||||
)
|
||||
|
||||
return config
|
||||
55
PythonProj/ScanOCR/スクリプト/tests/test_config_loader.py
Normal file
55
PythonProj/ScanOCR/スクリプト/tests/test_config_loader.py
Normal file
@ -0,0 +1,55 @@
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
|
||||
from config_loader import ConfigError, load_config
|
||||
|
||||
|
||||
VALID_CONTENT = """\
|
||||
スクリプトフォルダ=スクリプト
|
||||
テンプレートフォルダ=テンプレート
|
||||
スキャンフォルダ=スキャン
|
||||
アウトプットフォルダ=アウトプット
|
||||
成功フォルダ=成功
|
||||
失敗フォルダ=失敗
|
||||
ログフォルダ=ログ
|
||||
margin=0.10
|
||||
DPI=300
|
||||
ファイル安定待ち秒=1
|
||||
ファイル安定待ちリトライ回数=5
|
||||
"""
|
||||
|
||||
|
||||
def test_load_config_missing_file_raises(tmp_path):
|
||||
missing_path = tmp_path / "config.txt"
|
||||
with pytest.raises(ConfigError):
|
||||
load_config(missing_path)
|
||||
|
||||
|
||||
def test_load_config_parses_all_keys(tmp_path):
|
||||
config_path = tmp_path / "config.txt"
|
||||
config_path.write_text(VALID_CONTENT, encoding="utf-8")
|
||||
|
||||
config = load_config(config_path)
|
||||
|
||||
assert config["スクリプトフォルダ"] == "スクリプト"
|
||||
assert config["テンプレートフォルダ"] == "テンプレート"
|
||||
assert config["margin"] == "0.10"
|
||||
assert config["ファイル安定待ちリトライ回数"] == "5"
|
||||
|
||||
|
||||
def test_load_config_missing_required_key_raises(tmp_path):
|
||||
config_path = tmp_path / "config.txt"
|
||||
config_path.write_text("スクリプトフォルダ=スクリプト\n", encoding="utf-8")
|
||||
|
||||
with pytest.raises(ConfigError):
|
||||
load_config(config_path)
|
||||
|
||||
|
||||
def test_load_config_ignores_blank_lines_and_comments(tmp_path):
|
||||
config_path = tmp_path / "config.txt"
|
||||
content = "# comment\n\n" + VALID_CONTENT
|
||||
config_path.write_text(content, encoding="utf-8")
|
||||
|
||||
config = load_config(config_path)
|
||||
|
||||
assert config["スクリプトフォルダ"] == "スクリプト"
|
||||
Loading…
Reference in New Issue
Block a user