Skip to main content


Pirate
PyTapable

A Library to Implement Hookable Interfaces

Test Status pypi codecov python versions Downloads a Day License Maintained

:corn: Table of Contents

:strawberry: About The Project

PyTapable provides a set of utility to help you implement hookable interfaces in your classes. This opens up the posibility for solving a number of usecases such as

  • Providing plugable interfaces for your libraries and frameworks
  • Code seperation by functional and service domains

:sun_with_face: Getting Started

This project can be used in python 2.7, 3.5 and greater

$ pip install pytapable

Example

Inline hooks

We first create our hook called my_hook

from pytapable import Hook

my_hook = Hook()

As a consumer, we can tap into this hook by passing a name for our tap and a callback function

def my_callback(context, greeting):
    print(f"Hook says: {greeting}")

my_hook.tap('My Tap Name', my_callback)

Our callback is executed when the hook.call(...) is executed. The callback receives whatever args were passed in the hook.call method in addition to a context dict

my_hook.call(greeting="Hi Callback")

Functional Hooks

Functional hooks are different from inline hooks in that the callback args are predefined.

from pytapable import CreateHook, HookableMixin, create_hook_name


class Car(HookableMixin):
    HOOK_ON_MOVE = create_hook_name('on_move')

    @CreateHook(name=HOOK_ON_MOVE)
    def move(self, speed=10):
        return f"Moving at {speed} Mph"
  • Start adding the HookableMixin to the Car Class. This is necessary to install hooks on class methods.
  • Decorate the Car.move method using the @CreateHook decorator. In the decorator, give it a name. As best practice we define the name as a Class Constant so consumers can easily refer to it.
  • The value of the hook can be anything. We use the create_hook_name(str) utility to generate a unique name. Generating a unique name is not required but becomes important when inheriting hooks from other Classes.
def callback(context, fn_args, fn_output):
    kmph_speed = fn_args['speed'] * 1.61
    print(f"The car is moving {kmph_speed} kmph")

c = Car()
c.hooks[Car.HOOK_ON_MOVE].tap('log_metric_speed', callback, before=False)

c.move(10)
  • Here we tap into the on_move hook which fires our callback after the c.move method has executed
  • The c.move() arguments are passed as fn_args to the callback and return value, if any, is passed as fn_output
  • The context holds a is_before and is_after flag it signify if the callback was executed before or after c.move()

:tropical_drink: Documentation

Full documentation is available here https://pytapable.readthedocs.io/en/latest

:satisfied: Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

To tests on your changes locally, run:

$ pip install -r test_requirements.txt
$ tox .

This will run your changes on python-2 and python-3

Documentation for any new changes are a must. We use Sphinx and to build the documentation locally, run:

$ cd docs/
$ make html
    # or on windows
$ make.bat html

:v: License

Distributed under the Apache License

Metadata

Release files for PyTapable 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for PyTapable 0.1.0
File Size Uploaded Provenance
PyTapable-0.1.0.tar.gz 7.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for PyTapable 0.1.0
File Interpreter ABI Platform
PyTapable-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.3 kB

Release files / PyTapable-0.1.0.tar.gz

Download URL PyTapable-0.1.0.tar.gz
Size 7.1 kB
Tags Source
SHA-256 checksum
How to use checksums
663181e5693767857439150b8193d8245bcf5c22bff8b99f255b3f75119d2528
BLAKE2b-256 checksum
How to use checksums
992b5f127f247117998fda8dfda3482fc77a823049bf54788276700b1fb5dae9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/47.1.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

Release files / PyTapable-0.1.0-py3-none-any.whl

Download URL PyTapable-0.1.0-py3-none-any.whl
Size 8.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
557e9eb3246beca7b9c3bbd2cba9a48d921c933fe522493509b4221f1e631a94
BLAKE2b-256 checksum
How to use checksums
14bafeb9e288018d101af69b68d823662c65dadfdeb9a86cdc5d285c409a5924
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/47.1.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

Security for PyTapable 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page