Simple implementation of `chain of responsibilities` pattern
Project description
hxss.responsibility
Simple implementation of chain of responsibilities pattern.
result = chain(request) [ & DefaultLinkClass] [ | <callable|Link>] | chain
Installation
pip: hxss.responsibility
aur: python-hxss-responsibility
Usage
from hxss.responsibility import chain
def none(value):
pass
def increment(value):
return value + 1
def decrement(value):
return value - 1
request = 1
result = chain(request) | none | increment | decrement | chain
assert(result == 2)
result = chain(request) | none | decrement | increment | chain
assert(result == 0)
result = chain(request) | none | none | none | chain
assert(result == None)
Basics
Chain of responsibilities sequentially handles request by every link until response returned.
By default every not None value considered as valid response(some kind of Null coalescing operator):
handled = []
def wrap(func):
def wrapper(value):
handled.append(func.__name__)
return func(value)
return wrapper
result = chain(request) \
| wrap(none) \
| wrap(increment) \
| wrap(decrement) \
| chain
assert(result == 2)
assert(handled == ['none', 'increment'])
Lifecycle
chainfunction creates newRequest- every
callablepassed toRequestby|operator wraps intoLinkwhich handles the request - once
Linkreturns validResponseall nextcallableswill be ignored | chainoperator forces to return raw response value
Customization
- custom result validation:
from hxss.responsibility import Link
class FinalLink(Link):
def _validate_result(self, result): # see default Link implementation
return self._response(result)
result = chain(1) | FinalLink(none) | increment | decrement | chain
assert(result == None)
- custom independent link:
class CustomLink(Link):
def __init__(self):
pass
def handle(self, request):
result = calc_result(request)
return self._response(result)
result = chain(1) | increment | CustomLink() | decrement | chain
- custom default link:
class InversedLink(Link):
def _validate_result(self, result):
if (result is None):
return self._response(result)
result = chain(1) & InversedLink | increment | CustomLink() | decrement | chain
assert(result == None)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hxss.responsibility-0.1.1.tar.gz.
File metadata
- Download URL: hxss.responsibility-0.1.1.tar.gz
- Upload date:
- Size: 4.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.9.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7c020e6031fa5373cec0c09ae7bf4ae07a2224b20e4312e00a0e282795a4e92
|
|
| MD5 |
5038b0cb5f4bff67ea0baa42bf0e8dea
|
|
| BLAKE2b-256 |
9107d34b25944d1d655f55eaae2c56e708d1143690de8b61ac21f7cc58b4bb3a
|
File details
Details for the file hxss.responsibility-0.1.1-py3-none-any.whl.
File metadata
- Download URL: hxss.responsibility-0.1.1-py3-none-any.whl
- Upload date:
- Size: 6.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.9.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d3e6d4dd63f3e40c60e147d1f42cd87ebac92fa104bf6a2ec3c0532c2c63b1d
|
|
| MD5 |
31cdfac14d43e89b32460599bdefcb35
|
|
| BLAKE2b-256 |
e842e0d8a0203f3c10d8c4cbcd39fc15b4fa593414d5e16d3ca1adeacc9d5cf7
|