Package FuncNotify

FuncNotify ⏰

Get notified when your code finishes/crashes with one line of code

Build Deploy DOC LCommit release License wheel

Documentation | GitHub | PyPI

Installation:

$ pip install FuncNotify

Guide:

"""Add more as projects grow!"""
from FuncNotify import time_func, time_text, time_slack


@time_func(NotifyMethod="Text", use_env=True, env_path".env", update_env=True, phone="8001234567")
def wait_func():
    """This function will use the text method and pull env varaibles from
    `.env`, it will update the already determined env variables too!"""
    do_something()


@time_Text()
def wait_func2():
    """All parameters are optional and each method has a personal decorator, even the 
    function call is optional see below"""
    do_something()

@time_Text
def wait_func3():
    """Auto pull from `.env` is enabled by default with Method specific time decorators"""
    do_something()

@time_func(multi_target=[{...}, {...}], multi_env=["1.env", "2.env"])
def wait_func4():
    """Send to multiple sources either through specifying multiple dictionaries of kwargs
    or multiple .env paths, or both in pairs!"""
    do_something()

custom_message("HELLO WORLD", NotifyMethod="Text", multi_target=[{...}, {...}], multi_env=["1.env", "2.env"])
"""Custom messaging is here, pass the same arguments in as time_func and you 
can mass send messages in many methods"""

if __name__ == "__main__":
    """You don't even need to use the timer as a decorator, use it as a normal function
    This is how we do testing 😊 """
    time_func(function=wait_func5)(*func5_args, **func5_kwargs)

CLI arguments:

$ FuncNotify [command here] --kwargs NotifyMethod=Text phone=8001234567

$ FuncNotify go run main.go --kwargs NotifyMethod=Email multi_env=1.env multi_env=2.env

$ FuncNotify sleep 5 --kwargs NotifyMethod=Text multi_target="[{'NotifyMethod': 'Print', 'verbose': True}, {'phone': '8001234567'}]"

Anything after --kwargs with an equal sign will automatically be parsesd as a key word argument for FuncNotify. The remainder without = will be executed. Wrap lists, dicts, and tuples in " so they get read properly. This allows you to time any script.

Demo:

$ pip install FuncNotify

$ FuncNotify sleep 5 --kwargs NotifyMethod=Print

To expand, create a .env file and a twilio account according to these instructions (it's free!). Instead of hard coding variables or exporting them to your env, just put them in the twilio alerts section of your .env, skip installing twilio as it's already installed. Then try:

$ FuncNotify sleep 5 --kwargs NotifyMethod=Text

Contributing:

Click above for instructions on how to contribute

Supported Methods:

Platform
Console Print
Email Twilio
Email Yagmail
Text
Slack
Microsoft Teams

Create following .env in CWD

  .env
Expand source code
"""
.. include:: ../README.md 
""" # For pdoc3

from os.path import dirname, basename, isfile, join
import glob
import importlib

module_list = glob.glob(join(dirname(__file__), "*Method.py"))
MODULES = [basename(f)[:-3] for f in module_list if isfile(f)]

def _import_all(modules: list):
    """Dynamic import of a module, similar to `from package import *` but specifically for this package

    Args:
        modules (list[str]): A file name in `FuncNotify` directory/package
    """    
    for mod in modules:
        try:
            module = importlib.import_module(f'FuncNotify.{mod}') 
            globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')})
        except Exception as ex:
            print(f"Unable to import {mod} due to the following error\n " \
                  f"[ERROR] Exception: {ex}")

_import_all(MODULES)

from FuncNotify.NotifyDecorators import *
from FuncNotify.NotifyMethods import *
NotifyTypes=NotifyMethods.get_cls_registry()


import pkg_resources  # part of setuptools
__version__ = pkg_resources.require("FuncNotify")[0].version

__pdoc__={'FuncNotify.__main__': True}
"""Used only for pdoc documentation to inclue main for CLI documentation"""

Sub-modules

FuncNotify.EmailMethod

Send messages with sendgrid API (non-gmail) …

FuncNotify.NotifyDecorators

Main decoratory for FuncNotify with all env variables …

FuncNotify.NotifyMethods

Parent class for all of FuncNotify useability All NotifyMethods are child of this and use send_start_message, send_end_message, and …

FuncNotify.PrintMethod

Print messages to console …

FuncNotify.SlackMethod

Sends messages to a given slack server, currently only notifies a user as slack channel support not currently supported …

FuncNotify.TeamsMethod

Sends a message to any teams channel via the requests library …

FuncNotify.TextMethod

Sends text messages to users via a purchased number and twilio …

FuncNotify.__main__

Call this module FuncNotify to be able to time scripts as well as functions …