From 961180a0065c0a9ac4211670a9968d163dfe4609 Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Thu, 8 Feb 2024 18:06:33 +0900 Subject: [PATCH 1/2] Add: environs lib --- poetry.lock | 68 +++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + requirements.txt | 12 +++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 284b90f..c582194 100644 --- a/poetry.lock +++ b/poetry.lock @@ -135,6 +135,27 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "environs" +version = "10.3.0" +description = "simplified environment variable parsing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "environs-10.3.0-py3-none-any.whl", hash = "sha256:feeaf28f17fd0499f9cd7c0fcf408c6d82c308e69e335eb92d09322fc9ed8138"}, + {file = "environs-10.3.0.tar.gz", hash = "sha256:cc421ddb143fa30183568164755aa113a160e555cd19e97e664c478662032c24"}, +] + +[package.dependencies] +marshmallow = ">=3.0.0" +python-dotenv = "*" + +[package.extras] +dev = ["environs[lint,tests]", "tox"] +django = ["dj-database-url", "dj-email-url", "django-cache-url"] +lint = ["flake8 (==7.0.0)", "flake8-bugbear (==23.11.28)", "mypy (==1.8.0)", "pre-commit (>=3.6,<4.0)"] +tests = ["environs[django]", "pytest"] + [[package]] name = "flake8" version = "7.0.0" @@ -162,6 +183,26 @@ files = [ {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] +[[package]] +name = "marshmallow" +version = "3.20.2" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] +tests = ["pytest", "pytz", "simplejson"] + [[package]] name = "mccabe" version = "0.7.0" @@ -173,6 +214,17 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + [[package]] name = "peewee" version = "3.17.1" @@ -205,6 +257,20 @@ files = [ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "requests" version = "2.31.0" @@ -246,4 +312,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "a4dcf387610a52d2dc26db60e270175ed4fae32cafd717a70337cecc367c066e" +content-hash = "f031f9e86074966762fb83b3386f11c109c7a17ea31937dd03f66701676b632e" diff --git a/pyproject.toml b/pyproject.toml index 03ea0bc..c218ab6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ python = "^3.11" peewee = "^3.17.0" click = "^8.1.7" requests = "^2.31.0" +environs = "^10.3.0" [tool.poetry.group.dev.dependencies] flake8 = "^7.0.0" diff --git a/requirements.txt b/requirements.txt index 7e76804..080cf9e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -98,11 +98,23 @@ click==8.1.7 ; python_version >= "3.11" and python_version < "4.0" \ colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +environs==10.3.0 ; python_version >= "3.11" and python_version < "4.0" \ + --hash=sha256:cc421ddb143fa30183568164755aa113a160e555cd19e97e664c478662032c24 \ + --hash=sha256:feeaf28f17fd0499f9cd7c0fcf408c6d82c308e69e335eb92d09322fc9ed8138 idna==3.6 ; python_version >= "3.11" and python_version < "4.0" \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f +marshmallow==3.20.2 ; python_version >= "3.11" and python_version < "4.0" \ + --hash=sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd \ + --hash=sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9 +packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" \ + --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ + --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 peewee==3.17.1 ; python_version >= "3.11" and python_version < "4.0" \ --hash=sha256:e009ac4227c4fdc0058a56e822ad5987684f0a1fbb20fed577200785102581c3 +python-dotenv==1.0.1 ; python_version >= "3.11" and python_version < "4.0" \ + --hash=sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca \ + --hash=sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a requests==2.31.0 ; python_version >= "3.11" and python_version < "4.0" \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 -- 2.45.2 From c8c7060201962ed60d9b57ade4d4b9a8cbaf864d Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Thu, 8 Feb 2024 22:37:54 +0900 Subject: [PATCH 2/2] Add: settings values, json parser from file (function), demo example --- .gitignore | 2 ++ isp_maintenance/ispmgr.py | 9 +++++++++ isp_maintenance/settings/__init__.py | 15 +++++++++++++++ isp_maintenance/settings/db.py | 20 ++++++++++++++++++++ isp_maintenance/settings/environment.py | 14 ++++++++++++++ isp_maintenance/settings/platform.py | 12 ++++++++++++ isp_maintenance/utils/helpers.py | 20 ++++++++++++++++++++ 7 files changed, 92 insertions(+) mode change 100644 => 100755 isp_maintenance/ispmgr.py create mode 100644 isp_maintenance/settings/db.py create mode 100644 isp_maintenance/settings/environment.py create mode 100644 isp_maintenance/settings/platform.py create mode 100644 isp_maintenance/utils/helpers.py diff --git a/.gitignore b/.gitignore index 5d381cc..a525eb5 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +# Project specific +config.json diff --git a/isp_maintenance/ispmgr.py b/isp_maintenance/ispmgr.py old mode 100644 new mode 100755 index e69de29..b6b6ea1 --- a/isp_maintenance/ispmgr.py +++ b/isp_maintenance/ispmgr.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from settings.environment import env + + +# TODO: delete this demo +# Just show you which env get application or default values +for key, value in env.dump().items(): + print(key, '|', value) diff --git a/isp_maintenance/settings/__init__.py b/isp_maintenance/settings/__init__.py index e69de29..33b615d 100644 --- a/isp_maintenance/settings/__init__.py +++ b/isp_maintenance/settings/__init__.py @@ -0,0 +1,15 @@ +from settings.environment import BASE_DIR + +from settings.platform import ( + PLATFORM_TYPE, + PLATFORM_URL, + PLATFORM_CONFIG +) + +from settings.db import( + DB_ENGINE, + DB_HOST, + DB_PORT, + DB_USER, + DB_PASSWORD +) diff --git a/isp_maintenance/settings/db.py b/isp_maintenance/settings/db.py new file mode 100644 index 0000000..504bc6f --- /dev/null +++ b/isp_maintenance/settings/db.py @@ -0,0 +1,20 @@ +from settings.environment import env +from settings.platform import PLATFORM_CONFIG + + +#! Required because some instance use psql db: +DB_ENGINE = env.str( + 'DB_ENGINE', + PLATFORM_CONFIG.get('DatabaseType', 'mysql') +) + +# Connection parameters: +DB_HOST = env.str('DB_HOST', 'mysql') +DB_PORT = env.int('DB_PORT', 3306) +DB_USER = env.str('DB_USER', 'root') + +#! Do not pass password on production. Use value from config.json +DB_PASSWORD = env.str( + 'DB_PASSWORD', + PLATFORM_CONFIG.get('MysqlRootPassword', '') +) diff --git a/isp_maintenance/settings/environment.py b/isp_maintenance/settings/environment.py new file mode 100644 index 0000000..e20551a --- /dev/null +++ b/isp_maintenance/settings/environment.py @@ -0,0 +1,14 @@ +import pathlib +from environs import Env + + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = pathlib.Path(__file__).resolve().parent.parent + + +# Init environment: +env = Env() + +# read .env file, if it exists +# reed more about .env file here: https://github.com/sloria/environs +env.read_env() diff --git a/isp_maintenance/settings/platform.py b/isp_maintenance/settings/platform.py new file mode 100644 index 0000000..2165522 --- /dev/null +++ b/isp_maintenance/settings/platform.py @@ -0,0 +1,12 @@ +from settings.environment import env, BASE_DIR +from utils.helpers import parse_json_file + + +PLATFORM_TYPE = env.str('PLATFORM_TYPE', 'vm') + +PLATFORM_CONFIG = parse_json_file(f'{BASE_DIR}/config.json') + +PLATFORM_URL = env.url( + 'PLATFORM_URL', + f"https://{PLATFORM_CONFIG.get('DomainName' ,'replace.me')}" +) diff --git a/isp_maintenance/utils/helpers.py b/isp_maintenance/utils/helpers.py new file mode 100644 index 0000000..0a85dc2 --- /dev/null +++ b/isp_maintenance/utils/helpers.py @@ -0,0 +1,20 @@ +import json +import sys + + +def parse_json_file(file_path): + """ + Function read json file as usual config.json then parse it to python dict + + Args: + config_file_path (str): path to config file + + Returns: + dict: contains parse json content + """ + try: + with open(file_path, 'r') as f: + return json.load(f) + except Exception as error: + print(error) + sys.exit(1) -- 2.45.2