========
Overview
aspectlib is an aspect-oriented programming, monkey-patch and decorators library. It is useful when changing
behavior in existing code is desired. It includes tools for debugging and testing: simple mock/record and a complete
capture/replay framework.
- Free software: BSD 2-Clause License
Installation
::
pip install aspectlib
You can also install the in-development version with::
pip install https://github.com/ionelmc/python-aspectlib/archive/main.zip
Documentation
Docs are hosted at readthedocs.org: python-aspectlib docs <http://python-aspectlib.readthedocs.org/en/latest/>_.
Implementation status
Weaving functions, methods, instances and classes is completed.
Pending:
- "Concerns" (see
docs/todo.rst)
If aspectlib.weave doesn't work for your scenario please report a bug!
Requirements
:OS: Any
:Runtime: Python 2.6, 2.7, 3.3, 3.4 or PyPy
Python 3.2, 3.1 and 3.0 are NOT supported (some objects are too crippled).
Similar projects
function_trace <https://github.com/RedHatQE/function_trace>_ - extremely simple
Changelog
2.0.0 (2022-10-20)
- Drop support for legacy Pythons (2.7, 3.6 or older).
- Remove Travis/Appveyor CI and switch to GitHub Actions.
- Added support for Tornado 6 (in the test suite).
1.5.2 (2020-11-15)
- Fixed broken import on Python 3.9.
Contributed by Felix Yan in
#19 <https://github.com/ionelmc/python-aspectlib/pull/19>_.
1.5.1 (2020-06-11)
- Remove some debug leftover prints from
v1.5.0.
1.5.0 (2020-04-05)
- Fixed
weave to stop reading attributes that don't match the method selector.
Contributed by Jonas Maurus in #14 <https://github.com/ionelmc/python-aspectlib/pull/14>_.
- Added support for Python 3.7 and 3.8 (
async def functions and generators).
1.4.2 (2016-05-10)
- Fix forgotten debug prints.
1.4.1 (2016-05-06)
- Fixed weaving of objects that don't live on root-level modules.
1.4.0 (2016-04-09)
- Corrected weaving of methods, the weaved function should be unbound.
- Rolling back only applies undos once.
- Added a convenience
weave fixture for pytest.
1.3.3 (2015-10-02)
- Fixed typo in
ABSOLUTELLY_ALL_METHODS name (now ABSOLUTELY_ALL_METHODS). Old name is still there for
backwards compatibility.
1.3.2 (2015-09-22)
- Fixed another tricky bug in the generator advising wrappers - result was not returned if only
Proceed was yielded.
1.3.1 (2015-09-12)
- Corrected result handling when using Aspects on generators.
1.3.0 (2015-06-06)
- Added
messages property to aspectlib.test.LogCapture. Change call to have level name instead of number.
- Fixed a bogus warning from ``aspectlib.patch_module``` when patching methods on old style classes.
1.2.2 (2014-11-25)
- Added support for weakrefs in the
__logged__ wrapper from aspectlib.debug.log decorator.
1.2.1 (2014-10-15)
- Don't raise exceptions from
Replay.__exit__ if there would be an error (makes original cause hard to debug).
1.2.0 (2014-06-24)
- Fixed weaving methods that were defined in some baseclass (and not on the target class).
- Fixed wrong qualname beeing used in the Story/Replay recording. Now used the alias given to the weaver instead of
whatever is the realname on the current platform.
1.1.1 (2014-06-14)
- Use
ASPECTLIB_DEBUG for every logger in aspectlib.
1.1.0 (2014-06-13)
- Added a
bind option to aspectlib.Aspect so you can access the cutpoint from the advisor.
- Replaced automatic importing in
aspectlib.test.Replay with extraction of context variables (locals and globals
from the calling aspectlib.test.Story). Works better than the previous inference of module from AST of the
result.
- All the methods on the replay are now properties:
aspectlib.test.Story.diff,
aspectlib.test.Story.unexpected and aspectlib.test.Story.missing.
- Added
aspectlib.test.Story.actual and aspectlib.test.Story.expected.
- Added an
ASPECTLIB_DEBUG environment variable option to switch on debug logging in aspectlib's internals.
1.0.0 (2014-05-03)
- Reworked the internals
aspectlib.test.Story to keep call ordering, to allow dependencies and improved the
serialization (used in the diffs and the missing/unexpected lists).
0.9.0 (2014-04-16)
0.8.1 (2014-04-01)
- Use simpler import for the py3support.
0.8.0 (2014-03-31)
- Change
aspectlib.debug.log to use aspectlib.Aspect and work as expected with coroutines or generators.
- Fixed
aspectlib.debug.log to work on Python 3.4.
- Remove the undocumented
aspectlib.Yield advice. It was only usable when decorating generators.
0.7.0 (2014-03-28)
- Add support for decorating generators and coroutines in
aspectlib.Aspect.
- Made aspectlib raise better exceptions.
0.6.1 (2014-03-22)
- Fix checks inside
aspectlib.debug.log that would inadvertently call __bool__/__nonzero.
0.6.0 (2014-03-17)
- Don't include getattribute in ALL_METHODS - it's too dangerous dangerous dangerous dangerous dangerous dangerous
... ;)
- Do a more reliable check for old-style classes in debug.log
- When weaving a class don't weave attributes that are callable but are not actually routines (functions, methods etc)
0.5.0 (2014-03-16)
-
Changed aspectlib.debug.log:
- Renamed
arguments to call_args.
- Renamed
arguments_repr to call_args_repr.
- Added
call option.
- Fixed issue with logging from old-style methods (object name was a generic "instance").
-
Fixed issues with weaving some types of builtin methods.
-
Allow to apply multiple aspects at the same time.
-
Validate string targets before weaving. aspectlib.weave('mod.invalid name', aspect) now gives a clear error
(invalid name is not a valid identifier)
-
Various documentation improvements and examples.
0.4.1 (2014-03-08)
- Remove junk from 0.4.0's source distribution.
0.4.0 (2014-03-08)
0.3.1 (2014-03-05)
0.3.0 (2014-03-05)