Accrocchio is a library to mark and being notified of smelly code (a.k.a, "accrocchio").
Project description
accrocchio
Accrocchio is a library to mark and being notified of smelly code (a.k.a, “accrocchio”).
Example
from accrocchio.badgeofshame import accrocchio
from accrocchio import observers
class AClassThatSmells(metaclass=accrocchio):
pass
@accrocchio
def a_function_that_smells():
pass
accrocchio.how_many() # here we have 1, as you have declared a smelly class
AClassThatSmells()
accrocchio.how_many() # here we have 2, as you have created an instance of a smelly class
a_function_that_smells()
accrocchio.how_many() # here we have 3, as you have invoked a smelly function
accrocchio.reset()
accrocchio.how_many() # here we have 0
# You can also be notified of smelly code execution, such as:
class MyAccrocchioObserver(observers.AccrocchioObserver):
def on_accrocchio(self):
print('Another accrocchio!')
def reset(self):
print('Reset accrocchi')
accrocchio.add_observer(MyAccrocchioObserver())
a_function_that_smells() # prints 'Another accrocchio!'
accrocchio.reset() # prints 'Reset accrocchi'
It is also possible to decorate the entire class. Both the declaration and the instantiation of such classes increase the accrocchio counters.
from accrocchio.badgeofshame import accrocchio
from accrocchio import observers
@accrocchio
class AClassThatSmells:
pass
accrocchio.how_many() # here we have 1, as you have declared a smelly class
AClassThatSmells()
accrocchio.how_many() # here we have 2, as you have created an instance of a smelly class
You might declare an accrocchio using type hinting, as follows:
from accrocchio.badgeofshame import accrocchio, detonator
def f(a: detonator[int]):
pass
accrocchio.how_many() # here we have 1, as you have declared a smelly parameter
detonator.how_many() # here we have 1, as you have declared a smelly parameter
f(1)
accrocchio.how_many() # here we still have 1
detonator.how_many() # here we still have 1
The library also implements Michael Duell’s resign patterns.
from accrocchio.badgeofshame import accrocchio, detonator
@accrocchio
def accrocchio_fun():
pass
@detonator
def detonator_fun():
pass
accrocchio_fun()
accrocchio.how_many() # here we have 1, as you have invoked an accrocchio function
detonator.how_many() # here we have 0, as you have never invoked a detonator function
detonator_fun()
detonator.how_many() # here we have 1, as you have invoked a detonator function
accrocchio.how_many() # here we have 2, as you have invoked a detonator function, which is an accrocchio
You may mark arbitrary code as an accrocchio:
from accrocchio.badgeofshame import detonator, epoxy, this_is_a, this_is_an
this_is_an(epoxy)
this_is_a(detonator)
detonator.how_many() # this will be 1
epoxy.how_many() # this will be 1
If you need to have to mark a specific portion of your code as an accrocchio, you can use it as a context manager, as follows:
from accrocchio.badgeofshame import detonator, epoxy
with detonator:
...
with epoxy:
...
detonator.how_many() # this will be 1
epoxy.how_many() # this will be 1
For a full list of the implemented accrocchio resign patterns, please consult Michael Duell’s resign patterns.
Some final notes:
This library is useful only if a small part of the software is an accrocchio
We intentionally left out Python versions before 3.5, as we think they are a complete accrocchio.
We intentionally did not pass the accrocchio to the ‘on_accrocchio’ observer function, as you should treat all the accrocchioes the same way
The plural for accrocchio is accrocchioes
If you are using this library, you are deliberately brutalizing The Zen of Python; thus it has been replaced with a more appropriate one. Just do import this after import accrocchio.
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
File details
Details for the file accrocchio-0.1.14.tar.gz
.
File metadata
- Download URL: accrocchio-0.1.14.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.8.1 pkginfo/1.4.1 requests/2.19.1 setuptools/35.0.2 requests-toolbelt/0.7.1 clint/0.5.1 CPython/2.7.17 Linux/4.15.0-128-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9c8dc50b8a9a5f4387ffaac1718391e8a6ab2fbb635d70b08d4843a43ae11bb1 |
|
MD5 | 761bc668092e021be5302832102d7a2c |
|
BLAKE2b-256 | 23498146fc33a0bef7770fa2ec7e3b713df50bd0e4d6b3d2b101b5a9c1f56f99 |