Перейти к содержанию

Settings

Конфигурация приложения на основе Pydantic Settings.

Класс Settings

Settings

Bases: BaseSettings

Главные настройки приложения.

Порядок загрузки (от низшего приоритета к высшему): 1. Значения по умолчанию 2. Глобальный конфиг ~/.config/wiki-sync/config.toml 3. Локальный конфиг .wiki-sync.toml 4. .env файл 5. Переменные окружения WIKI_SYNC_* 6. CLI аргументы (передаются при создании экземпляра)

Source code in src/sandboxer/wiki_sync/core/config.py
class Settings(BaseSettings):
    """Главные настройки приложения.

    Порядок загрузки (от низшего приоритета к высшему):
    1. Значения по умолчанию
    2. Глобальный конфиг ~/.config/wiki-sync/config.toml
    3. Локальный конфиг .wiki-sync.toml
    4. .env файл
    5. Переменные окружения WIKI_SYNC_*
    6. CLI аргументы (передаются при создании экземпляра)
    """

    model_config = SettingsConfigDict(
        env_prefix="WIKI_SYNC_",
        env_nested_delimiter="__",
        env_file=".env",
        env_file_encoding="utf-8",
        extra="ignore",
        # pydantic-settings 2.12+: частичное обновление вложенных моделей
        nested_model_default_partial_update=True,
    )

    token: str = Field(description="OAuth токен Yandex")
    wiki: WikiSettings
    sync: SyncSettings = Field(default_factory=SyncSettings)

    @classmethod
    def from_file(cls, config_path: Path | None = None, **overrides: Any) -> "Settings":
        """Загрузить настройки из файла.

        Args:
            config_path: Путь к файлу конфигурации.
            **overrides: Переопределения параметров.

        Returns:
            Экземпляр Settings.
        """
        import tomllib

        # Собираем данные из файлов
        data: dict[str, Any] = {}

        # 1. Глобальный конфиг
        global_config = GLOBAL_CONFIG_DIR / "config.toml"
        if global_config.exists():
            with global_config.open("rb") as f:
                data.update(tomllib.load(f))

        # 2. Локальный конфиг
        local_config = config_path or Path.cwd() / CONFIG_FILE_NAME
        if local_config.exists():
            with local_config.open("rb") as f:
                data.update(tomllib.load(f))

        # 3. Применяем переопределения
        data.update(overrides)

        return cls(**data)

from_file classmethod

from_file(config_path=None, **overrides)

Загрузить настройки из файла.

Parameters:

Name Type Description Default
config_path Path | None

Путь к файлу конфигурации.

None
**overrides Any

Переопределения параметров.

{}

Returns:

Type Description
Settings

Экземпляр Settings.

Source code in src/sandboxer/wiki_sync/core/config.py
@classmethod
def from_file(cls, config_path: Path | None = None, **overrides: Any) -> "Settings":
    """Загрузить настройки из файла.

    Args:
        config_path: Путь к файлу конфигурации.
        **overrides: Переопределения параметров.

    Returns:
        Экземпляр Settings.
    """
    import tomllib

    # Собираем данные из файлов
    data: dict[str, Any] = {}

    # 1. Глобальный конфиг
    global_config = GLOBAL_CONFIG_DIR / "config.toml"
    if global_config.exists():
        with global_config.open("rb") as f:
            data.update(tomllib.load(f))

    # 2. Локальный конфиг
    local_config = config_path or Path.cwd() / CONFIG_FILE_NAME
    if local_config.exists():
        with local_config.open("rb") as f:
            data.update(tomllib.load(f))

    # 3. Применяем переопределения
    data.update(overrides)

    return cls(**data)

WikiSettings

WikiSettings

Bases: BaseModel

Настройки Wiki API.

Source code in src/sandboxer/wiki_sync/core/config.py
class WikiSettings(BaseModel):
    """Настройки Wiki API."""

    org_id: str = Field(description="ID организации в Yandex Wiki")
    base_slug: str = Field(description="Базовый slug раздела Wiki")
    docs_dir: str = Field(default="docs", description="Папка с документами")
    api_url: str = Field(default=DEFAULT_API_URL, description="URL API")

    @field_validator("base_slug")
    @classmethod
    def validate_base_slug(cls, v: str) -> str:
        """Убрать начальный и конечный слэш."""
        return v.strip("/")

    @field_validator("docs_dir")
    @classmethod
    def validate_docs_dir(cls, v: str) -> str:
        """Убрать начальный и конечный слэш."""
        return v.strip("/")

validate_base_slug classmethod

validate_base_slug(v)

Убрать начальный и конечный слэш.

Source code in src/sandboxer/wiki_sync/core/config.py
@field_validator("base_slug")
@classmethod
def validate_base_slug(cls, v: str) -> str:
    """Убрать начальный и конечный слэш."""
    return v.strip("/")

validate_docs_dir classmethod

validate_docs_dir(v)

Убрать начальный и конечный слэш.

Source code in src/sandboxer/wiki_sync/core/config.py
@field_validator("docs_dir")
@classmethod
def validate_docs_dir(cls, v: str) -> str:
    """Убрать начальный и конечный слэш."""
    return v.strip("/")

SyncSettings

SyncSettings

Bases: BaseModel

Настройки синхронизации.

Source code in src/sandboxer/wiki_sync/core/config.py
class SyncSettings(BaseModel):
    """Настройки синхронизации."""

    ignore: list[str] = Field(default_factory=list, description="Игнорируемые паттерны")
    strip_title: bool = Field(default=True, description="Убирать # заголовок при push")
    timeout: int = Field(default=DEFAULT_TIMEOUT, description="Таймаут запросов (сек)")

Функции

find_config_file

find_config_file(start_path=None)

Найти файл конфигурации в текущей или родительских директориях.

Parameters:

Name Type Description Default
start_path Path | None

Начальная директория для поиска.

None

Returns:

Type Description
Path | None

Путь к файлу конфигурации или None.

Source code in src/sandboxer/wiki_sync/core/config.py
def find_config_file(start_path: Path | None = None) -> Path | None:
    """Найти файл конфигурации в текущей или родительских директориях.

    Args:
        start_path: Начальная директория для поиска.

    Returns:
        Путь к файлу конфигурации или None.
    """
    current = start_path or Path.cwd()

    # Ищем вверх по дереву каталогов
    for parent in [current, *current.parents]:
        config_file = parent / CONFIG_FILE_NAME
        if config_file.exists():
            return config_file

    return None

get_docs_dir

get_docs_dir(settings, base_path=None)

Получить путь к директории с документами.

Parameters:

Name Type Description Default
settings Settings

Настройки приложения.

required
base_path Path | None

Базовый путь (по умолчанию — текущая директория).

None

Returns:

Type Description
Path

Абсолютный путь к директории с документами.

Source code in src/sandboxer/wiki_sync/core/config.py
def get_docs_dir(settings: Settings, base_path: Path | None = None) -> Path:
    """Получить путь к директории с документами.

    Args:
        settings: Настройки приложения.
        base_path: Базовый путь (по умолчанию — текущая директория).

    Returns:
        Абсолютный путь к директории с документами.
    """
    base = base_path or Path.cwd()
    docs_path = base / settings.wiki.docs_dir

    # Создаём директорию если не существует
    docs_path.mkdir(parents=True, exist_ok=True)

    return docs_path

create_default_config

create_default_config(org_id, base_slug, docs_dir='docs', output_path=None)

Создать файл конфигурации по умолчанию.

Parameters:

Name Type Description Default
org_id str

ID организации.

required
base_slug str

Базовый slug раздела.

required
docs_dir str

Папка с документами.

'docs'
output_path Path | None

Путь для сохранения (по умолчанию — .wiki-sync.toml).

None

Returns:

Type Description
Path

Путь к созданному файлу.

Source code in src/sandboxer/wiki_sync/core/config.py
def create_default_config(
    org_id: str,
    base_slug: str,
    docs_dir: str = "docs",
    output_path: Path | None = None,
) -> Path:
    """Создать файл конфигурации по умолчанию.

    Args:
        org_id: ID организации.
        base_slug: Базовый slug раздела.
        docs_dir: Папка с документами.
        output_path: Путь для сохранения (по умолчанию — .wiki-sync.toml).

    Returns:
        Путь к созданному файлу.
    """
    config_content = f'''[wiki]
org_id = "{org_id}"
base_slug = "{base_slug}"
docs_dir = "{docs_dir}"

[sync]
ignore = ["*.draft.md", "_*"]
strip_title = true
timeout = 60
'''

    output = output_path or Path.cwd() / CONFIG_FILE_NAME
    output.write_text(config_content)

    return output

Константы

CONFIG_FILE_NAME module-attribute

CONFIG_FILE_NAME = '.wiki-sync.toml'

META_FILE_NAME module-attribute

META_FILE_NAME = '.wiki-meta.json'