Skip to main content

Decorator for logging function arguments by human-readable way

Project description

logwrap

https://travis-ci.org/penguinolog/logwrap.svg?branch=master https://coveralls.io/repos/github/penguinolog/logwrap/badge.svg?branch=master Documentation Status https://img.shields.io/pypi/v/logwrap.svg https://img.shields.io/pypi/pyversions/logwrap.svg https://img.shields.io/pypi/status/logwrap.svg https://img.shields.io/github/license/penguinolog/logwrap.svg

logwrap is a helper for logging in human-readable format function arguments and call result on function call.

Pros:

Python 2.7
Python 3.4
Python 3.5
Python 3.6
PyPy

This package also includes helpers:

  • pretty_repr

  • pretty_str

  • PrettyFormat

Usage

logwrap

The main decorator. Could be used as not argumented (@logwrap.logwrap) and argumented (@logwrap.logwrap()). Not argumented usage simple calls with default values for all positions. Argumented usage with arguments from signature:

@logwrap.logwrap(
    log=logging.getLogger(__name__),  # __name__ = 'logwrap'
    log_level=logging.DEBUG,
    exc_level=logging.ERROR,
    max_indent=20,  # forwarded to the pretty_repr
    spec=None,  # use target callable function for spec
)

Usage examples:

@logwrap.logwrap()
def foo():
    pass

is equal to:

@logwrap.logwrap
def foo():
    pass

Get decorator for use without parameters:

get_logs = logwap.logwrap()  # set required parameters via arguments

@get_logs
def foo():
    pass

Limitations: * return value from awaitable objects (async def(…) is not accessible - on call asyncio object is returned.

  • nested wrapping (@logwrap @deco2 …) is not parsed under python 2.7: funcsigs limitation. Please set logwrap as the first level decorator.

pretty_repr

This is specified helper for making human-readable repr on complex objects. Signature is self-documenting:

def pretty_repr(
    src,  # object for repr
    indent=0,  # start indent
    no_indent_start=False,  # do not indent the first level
    max_indent=20,  # maximum allowed indent level
    indent_step=4,  # step between indents
    py2_str=False,  # use bytes for python 2 __repr__ and __str__
)

Limitation: Dict like objects is always marked inside {} for readability, even if it is collections.OrderedDict (standard repr as list of tuples).

pretty_str

This is specified helper for making human-readable repr on complex objects. Signature is self-documenting:

def pretty_str(
    src,  # object for __str__
    indent=0,  # start indent
    no_indent_start=False,  # do not indent the first level
    max_indent=20,  # maximum allowed indent level
    indent_step=4,  # step between indents
    py2_str=False,  # use bytes for python 2 __repr__ and __str__
)
Limitations:

Dict like objects is always marked inside {} for readability, even if it is collections.OrderedDict (standard repr as list of tuples). Iterable types is not declared, only brackets is used. String and bytes looks the same (its __str__, not __repr__).

PrettyFormat

PrettyFormat is the main formatting implementation class. on pretty_repr instance of this class is created and executed. Object signature:

def __init__(
    self,
    simple_formatters,  # Will be used to repr not complex. Keys is data types and 'default'.
    complex_formatters,  # Currently only legacy pretty_repr formatters is supported, will be extended in the future
    keyword='repr',  # Currently 'repr' is supported, will be extended in the future
    max_indent=20,  # maximum allowed indent level
    indent_step=4,  # step between indents
    py2_str=False,  # use bytes for python 2 __repr__ and __str__
)

Callable object (PrettyFormat instance) signature:

def __call__(
    self,
    src,  # object for repr
    indent=0,  # start indent
    no_indent_start=False  # do not indent the first level
)

Adopting your code

pretty_repr behavior could be overridden for your classes by implementing specific magic method:

def __pretty_repr__(
    self,
    parser  # PrettyFormat class instance,
    indent  # start indent,
    no_indent_start  # do not indent the first level
):
    return ...

This method will be executed instead of __repr__ on your object.

Testing

The main test mechanism for the package logwrap is using tox. Test environments available:

pep8
py27
py34
py35
pypy
pylint
docs

CI systems

For code checking several CI systems is used in parallel:

  1. Travis CI: is used for checking: PEP8, pylint, bandit, installation possibility and unit tests. Also it’s publishes coverage on coveralls.

  2. coveralls: is used for coverage display.

CD system

Travis CI: is used for package delivery on PyPI.

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

logwrap-1.1.0.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

logwrap-1.1.0-py2.py3-none-any.whl (13.6 kB view details)

Uploaded Python 2Python 3

File details

Details for the file logwrap-1.1.0.tar.gz.

File metadata

  • Download URL: logwrap-1.1.0.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for logwrap-1.1.0.tar.gz
Algorithm Hash digest
SHA256 24efd478eac714934c7e625d4ca6d342ad474880fb1da53232fcc9d878820f82
MD5 32454d1725a1a06191b87d2bf3d50b2c
BLAKE2b-256 d25ad51a110fd9b48a428bb52c8fddf5ac3bcee93e29a15a78559d9027b7aacb

See more details on using hashes here.

File details

Details for the file logwrap-1.1.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for logwrap-1.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 820a677840abf3501d5f2e838efe32c86f90fd90bc289a1b7a89251f7a3b9522
MD5 39a65401407e8483b9e197792b305346
BLAKE2b-256 da8b41cd853fefd5328d91b9557a2776d05540bff11116e3f7a28e85ff8b1bef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page