Управление файлов конфигурации, используя всю мощь Python
Программа для создания файлов конфигурации. Часто встречается нужда держать конфигурационные файлы в порядке, и консистенции, распределять общие данные по разным типам файлам, у некоторых типов файлов нет возможности читать переменные окружения, или приходиться подстраиваться под каждый формат по отдельности. Для того чтобы не подстраиваться под каждый формат файла, можно использовать всю мощь python
и держать все конфигурации в одном файле.
Ссылка на проект
Использование
- Скомпилировать конфигурационные файлы
configer parseconf $ПутьКонфигурациям$.py
- Сделать копию и скрыть данные
configer hideconf $ПутьКонфигурациям$.py
Создание файла конфигураций
Для того чтобы указать какие переменные нужно рассматривать в качестве конфигураций, их нужно поместить в переменную export_var
, переменная с конфигурациями должна соответствовать правилам, это должен быть картеж со следующим порядком значений:
- Название файла (`str`)
- Путь куда поместить файл (`str`)
- Шаблон (`str`)
- Значения которые нужно взять из словаря заключите в
$$(Ключ)$$
- Словарь для замены слов
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, ]