========
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)