From 7d4f8da59d60156c2d45dc4a44891eea48082315 Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Sun, 25 Apr 2021 23:02:49 +0300 Subject: initial --- .gitignore | 5 +++++ LICENSE | 25 +++++++++++++++++++++++++ README.md | 7 +++++++ ch1p/__init__.py | 2 ++ ch1p/functions.py | 34 ++++++++++++++++++++++++++++++++++ ch1p/state.py | 28 ++++++++++++++++++++++++++++ setup.cfg | 24 ++++++++++++++++++++++++ 7 files changed, 125 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ch1p/__init__.py create mode 100644 ch1p/functions.py create mode 100644 ch1p/state.py create mode 100644 setup.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..337ca2c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +build/ +dist/ +ch1p.egg-info +venv/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3d4446b --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2021, Evgeny Zinoviev +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..df5496b --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# ch1p-py + +Personal collection of small but usable code snippets used here and there in various scripts. + +## License + +BSD-2c \ No newline at end of file diff --git a/ch1p/__init__.py b/ch1p/__init__.py new file mode 100644 index 0000000..878f8fa --- /dev/null +++ b/ch1p/__init__.py @@ -0,0 +1,2 @@ +from .functions import telegram_notify +from .state import State \ No newline at end of file diff --git a/ch1p/functions.py b/ch1p/functions.py new file mode 100644 index 0000000..c4f9c99 --- /dev/null +++ b/ch1p/functions.py @@ -0,0 +1,34 @@ +import os, requests + +from typing import List, Tuple, AnyStr + + +def _get_vars(params: List[Tuple], kw: dict) -> List[AnyStr]: + result = [] + + for kw_name, env_name in params: + env_name = f'MY_{env_name}' + if kw_name in kw: + result.append(kw[kw_name]) + elif env_name in os.environ: + result.append(os.environ[env_name]) + else: + raise RuntimeError("missing parameter %s or variable %s" % (kw_name, env_name)) + + return result + + +def telegram_notify(text: str, parse_mode: str = 'html', **kwargs): + token, chat_id = _get_vars([ + ('chat_id', 'TELEGRAM_NOTIFY_CHAT_ID'), + ('token', 'TELEGRAM_NOTIFY_TOKEN') + ], kwargs) + + r = requests.post('https://api.telegram.org/bot%s/sendMessage' % token, data={ + 'chat_id': chat_id, + 'text': text, + 'parse_mode': parse_mode + }) + + if r.status_code != 200: + raise RuntimeError("telegram returned %d" % r.status_code) diff --git a/ch1p/state.py b/ch1p/state.py new file mode 100644 index 0000000..f677f59 --- /dev/null +++ b/ch1p/state.py @@ -0,0 +1,28 @@ +import os, json + +from functions import _get_vars + + +class State: + def __init__(self, default=None, **kwargs): + file, = _get_vars([ + ('file', 'STATE_FILE') + ], kwargs) + + if default is None: + default = {} + + self.file = file + self.default = default + + def read(self) -> dict: + if not os.path.exists(self.file): + self.write(self.default) + return self.default + + with open(self.file, 'r') as f: + return json.loads(f.read()) + + def write(self, state: dict): + with open(self.file, 'w') as f: + f.write(json.dumps(state)) \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..427563c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,24 @@ +[metadata] +name = ch1p +version = 0.0.1 +author = Evgeny Zinoviev +author_email = me@ch1p.io +description = +long_description = file: README.md +license = BSD +license_file = LICENSE +long_description_content_type = text/markdown +url = https://github.com/gch1p/ch1p-py.git +project_urls = + Bug Tracker = https://github.com/gch1p/ch1p-py/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: BSD License + Operating System :: OS Independent + +[options] +packages = ch1p +python_requires = >=3.6 +include_package_data = True +install_requires = + requests \ No newline at end of file -- cgit v1.2.3