Skip to content

Commit

Permalink
Merge a24cdf8 into 4ea24b5
Browse files Browse the repository at this point in the history
  • Loading branch information
penguinolog committed May 1, 2018
2 parents 4ea24b5 + a24cdf8 commit 8274b6a
Show file tree
Hide file tree
Showing 17 changed files with 736 additions and 50 deletions.
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

0 comments on commit 8274b6a

Please sign in to comment.