Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,14 @@
source =
logwrap
omit =
test/*
test/*
[report]
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover

# Don't complain about missing debug-only code:
def __repr__

# Don't complain if non-runnable code isn't run:
if __name__ == .__main__.:
5 changes: 3 additions & 2 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ Version 3.3.0
-------------
* Type hints and stubs
* PEP0518
* Deprecation of *args for logwrap
* Fix empty *args and **kwargs
* Deprecation of `*args` for logwrap
* Fix empty `*args` and `**kwargs`
* allow override for arguments repr processing (pre- and post-processing)

Version 3.2.0
-------------
Expand Down
5 changes: 5 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,11 @@ Example construction and read from test:

On object change, variable types is validated.

In special cases, when special processing required for parameters logging (hide or change parameters in log),
it can be done by override `pre_process_param` and `post_process_param`.

See API documentation for details.


pretty_repr
-----------
Expand Down
131 changes: 130 additions & 1 deletion doc/source/logwrap.rst
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,35 @@ API: Decorators: `LogWrap` class and `logwrap` function.
:type log_result_obj: bool

.. versionchanged:: 3.3.0 Extract func from log and do not use Union.
.. versionchanged:: 3.3.0 Deprecation of *args
.. versionchanged:: 3.3.0 Deprecation of `*args`

.. py:method:: pre_process_param(self, arg)

Process parameter for the future logging.

:param arg: bound parameter
:type arg: BoundParameter
:return: value, value override for logging or None if argument should not be logged.
:rtype: typing.Union[BoundParameter, typing.Tuple[BoundParameter, typing.Any], None]

Override this method if some modifications required for parameter value before logging

.. versionadded:: 3.3.0

.. py:method:: post_process_param(self, arg, arg_repr)

Process parameter for the future logging.

:param arg: bound parameter
:type arg: BoundParameter
:param arg_repr: repr for value
:type arg_repr: six.text_type
:return: processed repr for value
:rtype: six.text_type

Override this method if some modifications required for result of repr() over parameter

.. versionadded:: 3.3.0

.. note:: Attributes/properties names the same as argument names and changes
the same fields.
Expand Down Expand Up @@ -76,3 +104,104 @@ API: Decorators: `LogWrap` class and `logwrap` function.

:returns: Decorated function. On python 3.3+ awaitable is supported.
:rtype: typing.Union[typing.Callable, typing.Awaitable]


.. py:class:: BoundParameter(object)

Parameter-like object store BOUND with value parameter.

.. versionadded:: 3.3.0

.. py:method:: __init__(self, parameter, value=Parameter.empty)

Parameter-like object store BOUND with value parameter.

:param parameter: parameter from signature
:type parameter: ``inspect.Parameter``
:param value: parameter real value
:type value: typing.Any
:raises ValueError: No default value and no value

.. py:attribute:: POSITIONAL_ONLY

``enum.IntEnum``
Parameter.POSITIONAL_ONLY

.. py:attribute:: POSITIONAL_OR_KEYWORD

``enum.IntEnum``
Parameter.POSITIONAL_OR_KEYWORD

.. py:attribute:: VAR_POSITIONAL

``enum.IntEnum``
Parameter.VAR_POSITIONAL

.. py:attribute:: KEYWORD_ONLY

``enum.IntEnum``
Parameter.KEYWORD_ONLY

.. py:attribute:: VAR_KEYWORD

``enum.IntEnum``
Parameter.VAR_KEYWORD

.. py:attribute:: empty

``typing.Type``
Parameter.empty

.. py:attribute:: parameter

Parameter object.

:rtype: inspect.Parameter

.. py:attribute:: name

Parameter name.

:rtype: typing.Union[None, str]

.. py:attribute:: default

Parameter default value.

:rtype: typing.Any

.. py:attribute:: annotation

Parameter annotation.

:rtype: typing.Union[Parameter.empty, str]

.. py:attribute:: kind

Parameter kind.

:rtype: enum.IntEnum

.. py:attribute:: value

Parameter value.

:rtype: typing.Any

.. py:method:: __hash__(self)

Block hashing.

:raises TypeError: Not hashable.


.. py:function:: bind_args_kwargs(sig, *args, **kwargs)

Bind `*args` and `**kwargs` to signature and get Bound Parameters.

:param sig: source signature
:type sig: inspect.Signature
:return: Iterator for bound parameters with all information about it
:rtype: typing.Iterator[BoundParameter]

.. versionadded:: 3.3.0
5 changes: 4 additions & 1 deletion logwrap/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
pretty_repr,
pretty_str
)
from ._log_wrap_shared import BoundParameter, bind_args_kwargs

PY3 = sys.version_info[:2] > (3, 0) # type: bool

Expand All @@ -50,7 +51,9 @@
'PrettyRepr',
'PrettyStr',
'pretty_repr',
'pretty_str'
'pretty_str',
'BoundParameter',
'bind_args_kwargs'
)

__version__ = '3.2.2'
Expand Down
11 changes: 2 additions & 9 deletions logwrap/_log_wrap2.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,10 @@ def old_spec(
# pylint: enable=unused-argument

sig = funcsigs.signature(old_spec) # type: funcsigs.Signature
parameters = tuple(sig.parameters.values()) # type: typing.Tuple[funcsigs.Parameter, ...]

real_parameters = {
parameter.name: parameter.default for parameter in parameters
} # type: typing.Dict[str, typing.Any]

bound = sig.bind(*args, **kwargs).arguments

final_kwargs = {
key: bound.get(key, real_parameters[key])
for key in real_parameters
parameter.name: parameter.value
for parameter in _log_wrap_shared.bind_args_kwargs(sig, *args, **kwargs)
} # type: typing.Dict[str, typing.Any]

return final_kwargs
Expand Down
3 changes: 3 additions & 0 deletions logwrap/_log_wrap2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import typing
from . import _log_wrap_shared

class LogWrap(_log_wrap_shared.BaseLogWrap):

__slots__ = ()

def __init__(
self,
func: typing.Optional[typing.Callable]=None,
Expand Down
11 changes: 2 additions & 9 deletions logwrap/_log_wrap3.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,10 @@ def old_spec(
# pylint: enable=unused-argument

sig = inspect.signature(old_spec) # type: inspect.Signature
parameters = tuple(sig.parameters.values()) # type: typing.Tuple[inspect.Parameter, ...]

real_parameters = {
parameter.name: parameter.default for parameter in parameters
} # type: typing.Dict[str, typing.Any]

bound = sig.bind(*args, **kwargs).arguments

final_kwargs = {
key: bound.get(key, real_parameters[key])
for key in real_parameters
parameter.name: parameter.value
for parameter in _log_wrap_shared.bind_args_kwargs(sig, *args, **kwargs)
} # type: typing.Dict[str, typing.Any]

return final_kwargs
Expand Down
3 changes: 3 additions & 0 deletions logwrap/_log_wrap3.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import typing
from . import _log_wrap_shared

class LogWrap(_log_wrap_shared.BaseLogWrap):

__slots__ = ()

def __init__(
self,
func: typing.Optional[typing.Callable]=None,
Expand Down
Loading