Управление файлов конфигурации, используя всю мощь Python

Управление файлов конфигурации, используя всю мощь Python


Программа для создания файлов конфигурации. Часто встречается нужда держать конфигурационные файлы в порядке, и консистенции, распределять общие данные по разным типам файлам, у некоторых типов файлов нет возможности читать переменные окружения, или приходиться подстраиваться под каждый формат по отдельности. Для того чтобы не подстраиваться под каждый формат файла, можно использовать всю мощь python и держать все конфигурации в одном файле.


Ссылка на проект


Использование

- Скомпилировать конфигурационные файлы

configer parseconf $ПутьКонфигурациям$.py

- Сделать копию и скрыть данные

configer hideconf $ПутьКонфигурациям$.py

Создание файла конфигураций

Для того чтобы указать какие переменные нужно рассматривать в качестве конфигураций, их нужно поместить в переменную export_var, переменная с конфигурациями должна соответствовать правилам, это должен быть картеж со следующим порядком значений:


  1. Название файла (`str`)
  2. Путь куда поместить файл (`str`)
  3. Шаблон (`str`)
  4. Значения которые нужно взять из словаря заключите в $$(Ключ)$$
  5. Словарь для замены слов dict[str,str]
Эти значения подставится в классConfFile(*args)
port = 8080

env = ("__env.env", "./test", """
## Django
# Ключ для расшифровки сессии
DJANGO_SECRET_KEY="$$(secret_key)$$"
# Имя проекта
NAME_PROJ="$$(project_name)$$"
# Режим работы (true/false)
DEBUG=true

### Docker
# Путь к рабочей директории
WORK_DIR="/usr/src/$$(project_name)$$"
# Путь к переемным окружениям
PATH_ENV="./__env.env"
NGINX_PORT=$$(port)$$

"""[1:], {
    "secret_key": "dq232dc3f34f32q4fwe3",
    "project_name": "МойПроект",
    "port": port,
})
export_var = [
    env
]

Выполним команду

configer parseconf conf.py

В итоге мы получим файл, расположенный в ./test/__env.env. Содержание

## Django
# Ключ для расшифровки сессии
DJANGO_SECRET_KEY="dq232dc3f34f32q4fwe3"
# Имя проекта
NAME_PROJ="МойПроект"
# Режим работы (true/false)
DEBUG=true

### Docker
# Путь к рабочей директории
WORK_DIR="/usr/src/МойПроект"
# Путь к переемным окружениям
PATH_ENV="./__env.env"
NGINX_PORT=8080

Логи

[INFO][TEMPLATE]:'__env.env'
[INFO][FIND]:['secret_key', 'project_name', 'project_name', 'port']
[INFO][FILE_WRITE]:'/home/ПолныйПуть/test/__env.env'
[INFO][VAR_CREATE]:'__env.env'

Сделать копию и скрыть данные

Почти всегда нам нужно иметь в проекте секретные(приватные) данные, которые не должны стать публичными. У нас есть возможность создавать копию конфигурации со скрытыми данными. Для того чтобы указать переменную у которой нужно скрыть значения, напишите в начел её имени _hide_

Пример, нам нужно скрыть данные url для подключения к БД, ключ для шифрования сессии, данные для входа в админ панель, ну или любые другие данные. Для того чтобы сделать копию этой конфигурации, например, для того чтобы сохранить всю логики, но при этом скрыть выше указанные данные, мы указываем в начале имени _hide_, в итоге мы получим файл conf_pub.py который можно спокойно хранить в открытом доступе, например в GitHab.

_hide_SQL_URL: str = "postgresql+asyncpg://postgres:root@localhost/fast"
_hide_SESSION_SECRET_KEY = "qQWEdqwdwqefASDQF4qw4h3ofv3vw3oervwg532gg5"
_hide_ADMIN_PANEL: tuple[str, str, str] = ("user", "password", "emal")

host = "0.0.0.0"
port = 8080

env = ("__env.env", "./test", """
SQL_URL = $$(sql_url)$$
SESSION_SECRET_KEY = $$(session_secret_kry)$$
ADMIN_PANEL = $$(admin_panel)$$
"""[1:], {
    "sql_url": _hide_SQL_URL,
    "session_secret_kry": _hide_SESSION_SECRET_KEY,
    "port": port,
})
export_var = [
    env
]

Выполним команду

configer hideconf conf.py

В итоге мы получим копию, расположенную в ./conf_pub.py. Содержание

_hide_ADMIN_PANEL: tuple[str, str, str] = ___
_hide_SESSION_SECRET_KEY = ___
_hide_SQL_URL: str = ___

host = "0.0.0.0"
port = 8080

env = ("__env.env", "./test", """
SQL_URL = $$(sql_url)$$
SESSION_SECRET_KEY = $$(session_secret_kry)$$
ADMIN_PANEL = $$(admin_panel)$$
"""[1:], {
    "sql_url": _hide_SQL_URL,
    "session_secret_kry": _hide_SESSION_SECRET_KEY,
    "port": port,
})
export_var = [
    env
]

Логи

[INFO][VAR_HIDE]:'_hide_ADMIN_PANEL: tuple[str, str, str]'
[INFO][VAR_HIDE]:'_hide_SESSION_SECRET_KEY'
[INFO][VAR_HIDE]:'_hide_SQL_URL: str '

Не перезаписывать файл если он уже существует

Допустим у нас есть ситуация когда нужно создать шаблонный файл, по указанному пути. Но нам не нужно его постоянно перезаписывать при вызове parseconf. Например, нам нужно чтобы был создан файл README.md для проекта, и pyproject.tom для зависимостей проекта. README.md файл может часто вами изменятся и расширятся, pyproject.toml файл тоже может часто изменятся например вы обновили версии зависимостей. Писать весь текст файлами в conf.py неудобно поэтому мы хотим чтобы он был создан единожды и больше не перезаписывался для этого мы передаем последним аргументом "norewrite"


name_proj = "ИмяПроекта"
version = "0.0.1"
auth = "Иван Иванов <ivan-ivan@mail.com>"
description = "Любое описание"

pyproject_toml = ("pyproject.toml", "./", """
[tool.poetry]
name = "$$(name_proj)$$"
version = "$$(version)$$"
description = "$$(description)$$"
repository = "https://github.com/denisxab/$$(name_proj)$$.git"
documentation = "https://$$(name_proj)$$.readthedocs.io/ru/latest/index.html"
authors = ["$$(auth)$$"]
readme = "README.md"
exclude = [
    "$$(name_proj)$$/.idea",
    "$$(name_proj)$$/venv",
    "$$(name_proj)$$/.git",
    "$$(name_proj)$$/.gitignore",
    "$$(name_proj)$$/test",
    "$$(name_proj)$$/Makefile"
]

[tool.poetry.dependencies]
python = "^3.10"


[tool.poetry.dev-dependencies]
pytest = "^7.0.0"
Nuitka = "^0.6.19"
Sphinx = "^4.4.0"
sphinx-autobuild = "^2021.3.14"
sphinx-rtd-theme = "^1.0.0"
m2r2 = "^0.3.2"


[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

"""[1:], {
    "name_proj": name_proj,
    "version": version,
    "auth": auth,
    "description": description,
}, "norewrite")

readme_md = ("README.md", "./", """
## О чем

## Как установить


## Использование


## Примеры

"""[1:], {}, "norewrite")

export_var = [
    pyproject_toml,
    readme_md,
]


Report Page