summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2021-04-25 23:02:49 +0300
committerEvgeny Zinoviev <me@ch1p.io>2021-04-25 23:02:49 +0300
commit7d4f8da59d60156c2d45dc4a44891eea48082315 (patch)
tree81f46df8a796d7e1b85e4aac97926350fbdbf466
initial
-rw-r--r--.gitignore5
-rw-r--r--LICENSE25
-rw-r--r--README.md7
-rw-r--r--ch1p/__init__.py2
-rw-r--r--ch1p/functions.py34
-rw-r--r--ch1p/state.py28
-rw-r--r--setup.cfg24
7 files changed, 125 insertions, 0 deletions
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