Управление файлов конфигурации, используя всю мощь Python
- четверг, 3 марта 2022 г. в 00:38:15
Программа для создания файлов конфигурации. Часто встречается нужда держать конфигурационные файлы в порядке, и
консистенции, распределять общие данные по разным типам файлам, у некоторых типов файлов нет возможности читать
переменные окружения, или приходиться подстраиваться под каждый формат по отдельности. Для того чтобы не подстраиваться
под каждый формат файла, можно использовать всю мощь python
и держать все конфигурации в одном файле.
https://github.com/denisxab/configer
Этот проект является прототипом, я не заставляю вас использовать эту программу для решения своих задач, в большой степени мне хочется узнать мнение общественности о необходимости решения таких задач, и если будет поддержка идеи то уже тогда можно задуматься о создании надежной и конкурентной программы.
Если вас не заинтересовала данная статья, и вам не хотите использовать данные решения, то поставьте дизлайк по причине "В статье нет новой для меня информации" а не по какой-нибудь другой причине.
Если вы решили поставить дизлайк по причине "Низкий технический уровень материала", то просьба аргументировать в комментариях в чем он низкий. Если вы не разбирались в исходном коде программы, и вам просто неопрятен моя манера письма, то поставьте дизлайк по причине "Личная неприязнь к автору или компании", не нужно вводить в заблуждение и панику других пользователей ссылать на неаргументированный низкий технический уровень.
Осуждение того что документация и комментарии в исходном коде написаны на родном для меня Русском языке, а не на Английском. Является проявлением русофобии, и в как-то мери национализмом. Каждый в равно степени может писать и документировать на любом удобном для себя языке. Если вы действительно хотите помочь в мультиязычности проекта, то я(мы) готов(ы) к сотрудничеству.
У меня нет гарантий что этот проект будет поддерживаться. Если он мне не понравиться, и не будет поддержки со стороны общественности, то проекту суждено "кануть в лету". Вы, наверное, удивитесь, но так поступают со многими стартапами по всему миру которые не оправдывают ожидания. Так что вспомните об этом, когда захотите упомянуть, что "этот проект не надежен", что "нет гарантий поддержки этого проекта в длительной перспективе", что "лучше писать костыли к проверенным технологиям чем довериться этой авантюрной идеи". Забвение может произойти с любым сатрапам, но по крайне меры ни кто не вкладывал денег в этот проект.
Если вы знаете аналоги для решения этих задач, то буду рад увидеть их в комментариях.
- Скомпилировать конфигурационные файлы
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,
]