{ "info": { "author": "Reuben Cummings", "author_email": "reubano@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "pygogo: a Python logger with super powers\n=========================================\n\n|travis| |versions| |pypi|\n\n.. image:: https://raw.githubusercontent.com/reubano/pygogo/master/gogo.png\n :alt: sample pygogo usage\n :width: 800\n :align: center\n\nIndex\n-----\n`Introduction`_ | `Requirements`_ | `Motivation`_ | `Usage`_ | `Installation`_ |\n`Project Structure`_ | `Design Principles`_ | `Structured Logging`_ |\n`Formatters`_ | `Handlers`_ | `Scripts`_ | `Contributing`_ | `License`_\n\nIntroduction\n------------\n\npygogo is a Python logging `library`_ and `command-line interface`_ with super powers.\npygogo leverages the standard Python `logging module`_ under the hood, so there's\nno need to learn yet-another logging library. The default implementation sends\nall messages to ``stdout``, and any messages at level ``WARNING`` or above also to ``stderr``.\n\nWith pygogo, you can\n\n- Log via different handlers depending on the event severity\n- Format log messages as plain text, csv, json, and more..\n- Send logs to stdout, stderr, file, email, sockets, and more..\n- Inter-operate with the standard python logging module\n- and much more...\n\nRequirements\n------------\n\npygogo has been tested and is known to work on Python 2.7, 3.5, and 3.6;\nPyPy2.7; and PyPy3.5.\n\nMotivation\n----------\n\nThe standard logging module is great, but requires a ton of boilerplate before\nyou can do anything really interesting with it. I designed pygogo to provide\nmany useful logging use-cases out of the box. A reimplementation of\n`Using LoggerAdapters to impart contextual information`_ is shown below:\n\n.. _Using LoggerAdapters to impart contextual information: https://docs.python.org/2/howto/logging-cookbook.html#using-loggeradapters-to-impart-contextual-information\n\n.. code-block:: python\n\n import pygogo as gogo\n\n logger = gogo.Gogo(__name__).get_structured_logger(connid='1234')\n logger.info('log message')\n\n # Prints the following to stdout\n\n {\"message\": \"log message\", \"connid\": \"1234\"}\n\nUsage\n-----\n\npygogo is intended to be used either directly as a Python `library`_ or from\nthe terminal via the `command-line interface`_.\n\nLibrary\n~~~~~~~\n\nExamples\n^^^^^^^^\n\n*Hello World*\n\n.. code-block:: python\n\n from pygogo import logger\n\n logger.debug('hello world')\n logger.error('hello error')\n\n # Prints the following to `stdout`\n\n hello world\n hello error\n\n # Prints the following to `stderr`\n\n hello error\n\n*Log based debugging*\n\n.. code-block:: python\n\n import pygogo as gogo\n\n def main(verbose=False):\n logger = gogo.Gogo(__name__, verbose=verbose).logger\n logger.debug('I will log to `stdout` only if `verbose` is True')\n logger.info('I will log to `stdout` always')\n logger.warning('I will log to both `stdout` and `stderr` always')\n\n*Disabled dual logging*\n\n.. code-block:: python\n\n import pygogo as gogo\n\n logger = gogo.Gogo(monolog=True).logger\n logger.debug('debug message')\n logger.info('info message')\n logger.warning('warning message')\n logger.error('error message')\n logger.critical('critical message')\n\n # Prints the following to `stdout.log` (all messages at level `INFO` or below):\n\n debug message\n info message\n\n # Prints the following to `stderr` (messages at level `WARNING` or above):\n\n warning message\n error message\n critical message\n\n*Custom formatter* [1]_\n\n.. code-block:: python\n\n import logging\n import pygogo as gogo\n\n log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n formatter = logging.Formatter(log_format)\n\n logger = gogo.Gogo(\n 'examples.fmt',\n low_hdlr=gogo.handlers.file_hdlr('custom_fmt.log'),\n low_formatter=formatter,\n high_level='error',\n high_formatter=formatter).logger\n\n # Now let's log something!\n\n logger.debug('debug message')\n logger.info('info message')\n logger.warn('warn message')\n logger.error('error message')\n logger.critical('critical message')\n\n # Prints the following to `custom_fmt.log` (all messages):\n\n 2015-12-18 18:51:30,416 - examples.fmt.base - DEBUG - debug message\n 2015-12-18 18:51:30,416 - examples.fmt.base - INFO - info message\n 2015-12-18 18:51:30,416 - examples.fmt.base - WARNING - warn message\n 2015-12-18 18:51:30,416 - examples.fmt.base - ERROR - error message\n 2015-12-18 18:51:30,416 - examples.fmt.base - CRITICAL - critical message\n\n # Prints the following to `stderr` (messages at level `ERROR` or above):\n\n 2015-12-18 18:51:30,416 - examples.fmt.base - ERROR - error message\n 2015-12-18 18:51:30,416 - examples.fmt.base - CRITICAL - critical message\n\n*Structured logging* [2]_\n\n.. code-block:: python\n\n import pygogo as gogo\n\n formatter = gogo.formatters.structured_formatter\n kwargs = {'low_level': 'info', 'low_formatter': formatter}\n logger = gogo.Gogo('examples.structured', **kwargs).logger\n extra = {'set_value': set([1, 2, 3]), 'snowman': '\u2603'}\n logger.info('log message', extra=extra) # doctest: +ELLIPSIS\n\n # Prints the following to `stdout`:\n\n {\"snowman\": \"\\u2603\", \"name\": \"examples.structured.base\", \"level\": \"INFO\", \"message\": \"log message\", \"time\": \"2015-12-18 18:52:39\", \"msecs\": 58.973073959350586, \"set_value\": [1, 2, 3]}\n\n*Using Filters to impart contextual information* [3]_\n\n.. code-block:: python\n\n import logging\n import pygogo as gogo\n\n levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')\n log_frmt = (\n '%(asctime)-4s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: '\n '%(user)-8s %(message)s')\n\n formatter = logging.Formatter(log_frmt)\n going = gogo.Gogo('a', low_formatter=formatter)\n a1 = going.get_logger('b.c', ip='123.231.231.123', user='fred')\n a2 = going.get_logger('e.f', ip='192.168.0.1', user='sheila')\n\n # Now let's log something!\n\n a1.debug('A debug message')\n a1.info('An info %s', 'message')\n\n for level in [getattr(logging, l) for l in levels]:\n name = logging.getLevelName(level)\n a2.log(level, 'A %s msg', name)\n\n # Prints the following to `stdout` (all messages):\n\n 2015-12-19 10:12:24,479 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message\n 2015-12-19 10:12:24,479 a.b.c INFO IP: 123.231.231.123 User: fred An info message\n 2015-12-19 10:12:24,479 a.e.f DEBUG IP: 192.168.0.1 User: sheila A DEBUG msg\n 2015-12-19 10:12:24,479 a.e.f INFO IP: 192.168.0.1 User: sheila AN INFO msg\n 2015-12-19 10:12:24,479 a.e.f WARNING IP: 192.168.0.1 User: sheila A WARNING msg\n 2015-12-19 10:12:24,479 a.e.f ERROR IP: 192.168.0.1 User: sheila AN ERROR msg\n 2015-12-19 10:12:24,479 a.e.f CRITICAL IP: 192.168.0.1 User: sheila A CRITICAL msg\n\n # Prints the following to `stderr` (messages at level `WARNING` or above):\n\n 2015-12-19 10:12:24,479 a.e.f WARNING IP: 192.168.0.1 User: sheila A WARNING msg\n 2015-12-19 10:12:24,479 a.e.f ERROR IP: 192.168.0.1 User: sheila AN ERROR msg\n 2015-12-19 10:12:24,479 a.e.f CRITICAL IP: 192.168.0.1 User: sheila A CRITICAL msg\n\n*Multiple loggers* [4]_\n\n.. code-block:: python\n\n import pygogo as gogo\n\n going = gogo.Gogo(\n 'examples.lggrs',\n low_hdlr=gogo.handlers.file_hdlr('multi_lggrs.log'),\n low_formatter=gogo.formatters.fixed_formatter,\n high_level='info',\n high_formatter=gogo.formatters.console_formatter)\n\n root = going.logger\n logger1 = going.get_logger('area1')\n logger2 = going.get_logger('area2')\n\n # Now let's log something!\n\n root.info('Jackdaws love my big sphinx.')\n logger1.debug('Quick zephyrs blow, daft Jim.')\n logger1.info('How daft jumping zebras vex.')\n logger2.warning('Jail zesty vixen who grabbed pay.')\n logger2.error('The five boxing wizards jump.')\n\n # Prints the following to `multi_lggrs.log` (all messages):\n\n 2015-12-18 17:21:37.417 examples.lggrs.base INFO Jackdaws love my big sphinx.\n 2015-12-18 17:21:37.417 examples.lggrs.area1 DEBUG Quick zephyrs blow, daft Jim.\n 2015-12-18 17:21:37.417 examples.lggrs.area1 INFO How daft jumping zebras vex.\n 2015-12-18 17:21:37.417 examples.lggrs.area2 WARNING Jail zesty vixen who grabbed pay.\n 2015-12-18 17:21:37.417 examples.lggrs.area2 ERROR The five boxing wizards jump.\n\n # Prints the following to `stderr` (messages at level `INFO` or above):\n\n examples.lggrs.base: INFO Jackdaws love my big sphinx.\n examples.lggrs.area1: INFO How daft jumping zebras vex.\n examples.lggrs.area2: WARNING Jail zesty vixen who grabbed pay.\n examples.lggrs.area2: ERROR The five boxing wizards jump.\n\nNotes\n^^^^^\n\n.. [1] https://docs.python.org/2/howto/logging-cookbook.html#multiple-handlers-and-formatters\n.. [2] https://docs.python.org/2/howto/logging-cookbook.html#implementing-structured-logging\n.. [3] https://docs.python.org/2/howto/logging-cookbook.html#using-filters-to-impart-contextual-information\n.. [4] https://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations\n\nCommand-line Interface\n~~~~~~~~~~~~~~~~~~~~~~\n\nExamples\n^^^^^^^^\n\n*Basic Usage*\n\n.. code-block:: bash\n\n gogo [options] \n\n*show help*\n\n.. code-block:: bash\n\n gogo -h\n\n*CLI usage*\n\n usage: gogo [options] \n\n description: Logs a given message\n\n positional arguments:\n message The message to log (defaults to reading from stdin).\n\n optional arguments:\n -h, --help show this help message and exit\n -l LEVEL, --msg-level LEVEL\n The level to log the message (default: info).\n Must be one of: critical, error, warning, info, debug.\n\n -n NAME, --name NAME The logger name (default: pygogo)\n -D HANDLER, --high-hdlr HANDLER\n The high pass log handler (default: stderr).\n Must be one of: buffered, email, file, fileobj,\n socket, stderr, stdout, syslog, webhook.\n\n -d HANDLER, --low-hdlr HANDLER\n The low pass log handler (default: stdout).\n Must be one of: buffered, email, file, fileobj,\n socket, stderr, stdout, syslog, webhook.\n\n -L LEVEL, --high-level LEVEL\n Min level to log to the high pass handler\n (default: warning).\n Must be one of: buffered, email, file, fileobj,\n socket, stderr, stdout, syslog, webhook.\n\n -e LEVEL, --low-level LEVEL\n Min level to log to the low pass handler\n (default: debug).\n Must be one of: buffered, email, file, fileobj,\n socket, stderr, stdout, syslog, webhook.\n\n -F FORMAT, --high-format FORMAT\n High pass handler log format (default: basic).\n Must be one of: basic, bom, console, csv,\n fixed, json, structured.\n\n -o FORMAT, --low-format FORMAT\n Low pass handler log format (default: basic).\n Must be one of: basic, bom, console, csv,\n fixed, json, structured.\n\n -m, --monolog Log high level events only to high pass handler.\n -f FILENAME, --filename FILENAME\n The filename to log to.\n Required for the follow handlers: file.\n\n -s SUBJECT, --subject SUBJECT\n The log subject (default: You've got mail).\n Used in the follow handlers: email.\n\n -u URL, --url URL The log url. Required for the follow handlers: webhook.\n -H HOST, --host HOST The host.\n Used in the follow handlers: socket and syslog.\n\n -p NUM, --port NUM The port number.\n Used in the follow handlers: socket and syslog.\n\n -t, --tcp Use TCP instead of UDP.\n Used in the follow handlers: socket and syslog.\n\n -g, --get Use a GET request instead of POST.\n Used in the follow handlers: webhook.\n\n -v, --version Show version and exit.\n -V, --verbose Increase output verbosity.\n\n*Hello World*\n\n.. code-block:: bash\n\n gogo 'hello world'\n\n*Log based debugging*\n\n.. code-block:: bash\n\n gogo 'default info level will log to `stdout`'\n gogo --level=debug \"debug won't log\"\n gogo --level=debug -V 'verbose will log to `stdout`'\n gogo --level=info 'info will log to `stdout`'\n gogo --level=warning 'warning will log to both `stdout` and `stderr`'\n\n # Prints the following to `stdout`:\n\n default info level will log to `stdout`\n verbose will log to `stdout`\n info will log to `stdout`\n warning will log to both `stdout` and `stderr`\n\n # Prints the following to `stderr`:\n\n warning will log to both `stdout` and `stderr`\n\n*Disable dual logging*\n\n.. code-block:: bash\n\n gogo --level=debug -V 'debug message'\n gogo --level=info 'info message'\n gogo --level=warning -m 'warning message'\n gogo --level=error -m 'error message'\n gogo --level=critical -m 'critical message'\n\n # Prints the following to `stdout.log` (all messages at level `INFO` or below):\n\n debug message\n info message\n\n # Prints the following to `stderr` (messages at level `WARNING` or above):\n\n warning message\n error message\n critical message\n\n*Structured logging*\n\n.. code-block:: bash\n\n gogo --low-format=json 'log message'\n\n # Prints the following to `stdout`:\n\n {\"time\": \"2015-12-19 11:26:53.776\", \"name\": \"pygogo.runner\", \"level\": \"INFO\", \"message\": \"log message\"}\n\n*Alternate handler*\n\n.. code-block:: bash\n\n gogo --low-hdlr=file 'log message'\n\n # Prints the following to `pygogo.log` in the current dir (assuming the current dir is named `pygogo`):\n\n {\"time\": \"2015-12-19 11:26:53.776\", \"name\": \"pygogo.runner\", \"level\": \"INFO\", \"message\": \"log message\"}\n\nInstallation\n------------\n\n(You are using a `virtualenv`_, right?)\n\nAt the command line, install pygogo using either ``pip`` (*recommended*)\n\n.. code-block:: bash\n\n pip install pygogo\n\nor ``easy_install``\n\n.. code-block:: bash\n\n easy_install pygogo\n\nPlease see the `installation doc`_ for more details.\n\nProject Structure\n-----------------\n\n.. code-block:: bash\n\n \u250c\u2500\u2500 bin\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 gogo\n \u251c\u2500\u2500 docs\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 AUTHORS.rst\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 CHANGES.rst\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 INSTALLATION.rst\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 TODO.rst\n \u251c\u2500\u2500 helpers\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 check-stage\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 clean\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 pippy\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 srcdist\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 wheel\n \u251c\u2500\u2500 pygogo\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 formatters.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 handlers.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 main.py\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 utils.py\n \u251c\u2500\u2500 tests\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 standard.rc\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 test.py\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_main.py\n \u251c\u2500\u2500 CONTRIBUTING.rst\n \u251c\u2500\u2500 LICENSE\n \u251c\u2500\u2500 MANIFEST.in\n \u251c\u2500\u2500 Makefile\n \u251c\u2500\u2500 README.rst\n \u251c\u2500\u2500 dev-requirements.txt\n \u251c\u2500\u2500 examples.py\n \u251c\u2500\u2500 manage.py\n \u251c\u2500\u2500 py2-requirements.txt\n \u251c\u2500\u2500 setup.cfg\n \u251c\u2500\u2500 setup.py\n \u2514\u2500\u2500 tox.ini\n\nDesign Principles\n-----------------\n\n- the built-in ``logging`` module isn't broken so don't reinvent the wheel\n- prefer functions over objects\n- keep the API as simple as possible\n\nStructured Logging\n------------------\n\nThere are severals ways to get structured (machine readable) log messages using pygogo.\nEach method makes a different customization/complexity trade-off which is\noutlined below:\n\nSetup\n~~~~~\n\nThe following methods make use of these variables.\n\n.. code-block:: python\n\n import pygogo as gogo\n\n kwargs = {'contextual': True}\n extra = {'additional': True}\n\nMethods\n~~~~~~~\n\nbasic structured logger\n^^^^^^^^^^^^^^^^^^^^^^^\n\nThe simplest to use. Useful if you don\u2019t need message metadata, i.e., log level,\nlog name, and log time.\n\n.. code-block:: python\n\n logger = gogo.Gogo('basic').get_structured_logger('base', **kwargs)\n logger.debug('message', extra=extra)\n\n # Prints the following to `stdout`:\n\n {\"additional\": true, \"contextual\": true, \"message\": \"message\"}\n\nstructured formatter\n^^^^^^^^^^^^^^^^^^^^\n\nRequires an additional step of specifying a formatter. Useful if you need\nmessage metadata, i.e., log level, log name, and log time.\n\n.. code-block:: python\n\n formatter = gogo.formatters.structured_formatter\n logger = gogo.Gogo('struct', low_formatter=formatter).get_logger(**kwargs)\n logger.debug('message', extra=extra)\n\n # Prints the following to `stdout`:\n\n {\"additional\": true, \"contextual\": true, \"level\": \"DEBUG\", \"message\": \"message\", \"msecs\": 760.5140209197998, \"name\": \"struct.base\", \"time\": \"2015-12-19 14:25:58\"}\n\nJSON formatter\n^^^^^^^^^^^^^^\n\nRequires an additional step of specifying a formatter. Useful if you require\nmillisecond precision in the date. If you are ok with having the milliseconds\nin a separate field, consider the ``structured formatter`` since it supports\nthe ``extra`` keyword and contextual information.\n\n.. code-block:: python\n\n formatter = gogo.formatters.json_formatter\n logger = gogo.Gogo('json', low_formatter=formatter).get_logger(**kwargs)\n logger.debug('message', extra=extra)\n\n # Prints the following to `stdout`:\n\n {\"level\": \"DEBUG\", \"message\": \"message\", \"name\": \"json.base\", \"time\": \"2015-12-19 14:25:58.760\"}\n\n # Note that both `extra` and `kwargs` were ignored\n\ncustom logger\n^^^^^^^^^^^^^\n\nThe most complex and customizable. Useful if you need a custom\nlog or date format not provided by the above methods. However, even though this\nmethod supports the ``extra`` keyword when logging, it is static (unlike the\n``structured logger`` or ``structured formatter``). This is because the log\nformat must be specified at the time of the log's creation and therefore can't\nadapt to log messages with differing ``extra`` parameters.\n\n.. code-block:: python\n\n logfmt = (\n '{\"time\": \"%(asctime)s.%(msecs)d\", \"name\": \"%(name)s\", \"level\":'\n ' \"%(levelname)s\", \"message\": \"%(message)s\", '\n '\"contextual\": \"%(contextual)s\", \"additional\": \"%(additional)s\"}')\n\n fmtr = logging.Formatter(logfmt, datefmt=gogo.formatters.DATEFMT)\n logger = gogo.Gogo('custom', low_formatter=fmtr).get_logger(**kwargs)\n logger.debug('message', extra=extra)\n\n # Prints the following to `stdout`:\n\n {\"additional\": \"True\", \"contextual\": \"True\", \"level\": \"DEBUG\", \"message\": \"message\", \"name\": \"custom.logger\", \"time\": \"2015-12-19 14:25:58.760\"}\n\nSummary\n~~~~~~~\n\nThe following table can help make sense of the different methods:\n\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| | structured logger | structured formatter | json formatter | custom logger |\n+===============================+===================+======================+================+===============+\n| contextual information | \u2714 | \u2714 | | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| ``extra`` param support | \u2714 | \u2714 | | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| dynamic ``extra`` support | \u2714 | \u2714 | | |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| message metadata | | \u2714 | \u2714 | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| available via the command line| | \u2714 | \u2714 | |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| ``msecs`` field | | \u2714 | | |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| milliseconds in time field | | | \u2714 | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| custom date format | | | | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n| custom log format | | | | \u2714 |\n+-------------------------------+-------------------+----------------------+----------------+---------------+\n\nFormatters\n----------\n\npygogo has several builtin formatters and also supports any ``logging.Formatter``\ninstance.\n\nExamples\n~~~~~~~~\n\nbuiltin CSV format in python\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import pygogo as gogo\n\n formatter = gogo.formatters.csv_formatter\n gogo.Gogo('csv', low_formatter=formatter).logger.debug('message')\n\n # Prints the following to `stdout`:\n\n 2015-12-19 17:03:48.99,csv.base,DEBUG,\"message\"\n\n\n``logging.Formatter`` instance in python\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import logging\n import pygogo as gogo\n\n datefmt = gogo.formatters.DATEFMT\n formatter = logging.Formatter(gogo.formatters.CSV_FORMAT, datefmt=datefmt)\n gogo.Gogo('csv', low_format=formatter).get_logger('custom').debug('message')\n\n # Prints the following to `stdout`:\n\n 2015-12-19 17:03:48.99,csv.custom,DEBUG,\"message\"\n\nbuiltin CSV format via CLI\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: bash\n\n gogo --low-format=csv 'message'\n\n # Prints the following to `stdout`:\n\n 2015-12-19 15:51:32.16,pygogo.runner,INFO,\"message\"\n\nSummary\n~~~~~~~\n\nThe following table can help make sense of the different builtin formatters:\n\n+------------+------------------------------------------------------------------------------------------------------------------+\n| name | message |\n+============+==================================================================================================================+\n| basic | message |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| bom | message |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| console | name: INFO message |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| csv | 2015-12-19 15:51:32.16,name,INFO,\"message\" |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| fixed | 2015-12-19 15:51:32.16 name INFO message |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| json | {\"level\": \"INFO\", \"message\": \"message\", \"name\": \"name\", \"time\": \"2015-12-19 15:51:32.16\"} |\n+------------+------------------------------------------------------------------------------------------------------------------+\n| structured | {\"level\": \"INFO\", \"message\": \"message\", \"msecs\": 16.5140209197998, \"name\": \"name\", \"time\": \"2015-12-19 15:51:32\"}|\n+------------+------------------------------------------------------------------------------------------------------------------+\n\nHandlers\n--------\n\npygogo has several builtin handlers and also supports any instance from the\n``logging.handlers`` module.\n\nExamples\n~~~~~~~~\n\nbuiltin stdout handler in python\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import pygogo as gogo\n\n hdlr = gogo.handlers.stdout_hdlr()\n gogo.Gogo('stdout', low_hdlr=hdlr).logger.debug('message')\n\n # Prints 'message' to `stdout`\n\n``logging.StreamHandler`` instance in python\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import logging\n import sys\n import pygogo as gogo\n\n hdlr = logging.StreamHandler(sys.stdout)\n gogo.Gogo('stdout', low_hdlr=hdlr).get_logger('custom').debug('message')\n\n # Prints 'message' to `stdout`\n\nbuiltin CSV format via CLI\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: bash\n\n gogo --low-hdlr=stdout 'message'\n\n # Prints 'message' to `stdout`\n\nSummary\n~~~~~~~\n\nThe following table can help make sense of the different builtin handlers:\n\n+------------+------------------------------------------+\n| name | description |\n+============+==========================================+\n| buffered | Holds log in memory until it reaches its |\n| | capacity, or it logs a message with a |\n| | level at or above the flush level |\n+------------+------------------------------------------+\n| email | Emails log to a given email address |\n+------------+------------------------------------------+\n| file | Writes log to a given filename |\n+------------+------------------------------------------+\n| fileobj | Writes log to a given file-like object |\n+------------+------------------------------------------+\n| socket | Writes log to a given network socket |\n+------------+------------------------------------------+\n| stderr | Writes log to standard error |\n+------------+------------------------------------------+\n| stdout | Writes log to standard output |\n+------------+------------------------------------------+\n| syslog | Writes log to syslog |\n+------------+------------------------------------------+\n| webhook | POSTs log to a url |\n+------------+------------------------------------------+\n\nScripts\n-------\n\npygogo comes with a built in task manager ``manage.py``\n\nSetup\n~~~~~\n\n.. code-block:: bash\n\n pip install -r dev-requirements.txt\n\nExamples\n~~~~~~~~\n\n*Run python linter and nose tests*\n\n.. code-block:: bash\n\n manage lint\n manage test\n\nContributing\n------------\n\nPlease mimic the coding style/conventions used in this repo.\nIf you add new classes or functions, please add the appropriate doc blocks with\nexamples. Also, make sure the python linter and nose tests pass.\n\nPlease see the `contributing doc`_ for more details.\n\nLicense\n-------\n\npygogo is distributed under the `MIT License`_.\n\n.. |travis| image:: https://img.shields.io/travis/reubano/pygogo/master.svg\n :target: https://travis-ci.org/reubano/pygogo\n\n.. |versions| image:: https://img.shields.io/pypi/pyversions/pygogo.svg\n :target: https://pypi.python.org/pypi/pygogo\n\n.. |pypi| image:: https://img.shields.io/pypi/v/pygogo.svg\n :target: https://pypi.python.org/pypi/pygogo\n\n.. _MIT License: http://opensource.org/licenses/MIT\n.. _logging module: https://docs.python.org/2/library/logging.html\n.. _virtualenv: http://www.virtualenv.org/en/latest/index.html\n.. _contributing doc: https://github.com/reubano/pygogo/blob/master/CONTRIBUTING.rst\n.. _installation doc: https://github.com/reubano/pygogo/blob/master/docs/INSTALLATION.rst\n\n\nChangelog\n=========\n\n%%version%% (unreleased)\n------------------------\n\nNew\n~~~\n\n- Add changelog.\n\n- Add quick logger instantiation.\n\nBugfixes\n~~~~~~~~\n\n- Don\u2019t parse args unless running as script.\n\n- Fix CLI usage text.\n\n- Fix examples.\n\n- Fix packaging scripts.\n\n- Update docs, fix requirements, and remove sphinx.\n\nv0.8.13 (2016-01-01)\n--------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix new year bug.\n\nv0.8.10 (2015-12-30)\n--------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix capitalization.\n\n- Fix optional dependency parsing.\n\n- Fix spacing and remove unneeded marker.\n\nv0.8.9 (2015-12-30)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix conditional dependency configuration.\n\n- Fix requirements.\n\nv0.8.8 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix project name.\n\nv0.8.7 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Add pygogo to script path.\n\n- Add pygogo to test path.\n\nv0.8.6 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix doccheck errors.\n\nv0.8.5 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Add missing helper script.\n\nv0.8.4 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix setup.py (again!)\n\nv0.8.3 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix setup.py.\n\nv0.8.2 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix travis.\n\nv0.8.1 (2015-12-29)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix tox config and tests.\n\n- Change helper script name.\n\n- Fix spacing.\n\n- Fix makefile error.\n\n- Only clean once.\n\nv0.8.0 (2015-12-25)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix sphinx.\n\n- Fix tox.\n\n- Fix lint errors.\n\n- Fix tests.\n\nv0.7.0 (2015-12-23)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix lint error.\n\nv0.6.3 (2015-12-22)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix pylint errors.\n\n- Fix pylint and make check optional.\n\n- Don\u2019t overwrite fmtrs argument.\n\nv0.5.0 (2015-12-20)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix duplicate handler/filter bug.\n\n- Fix tests.\n\n- Fix assertion arg orders.\n\nv0.4.0 (2015-12-19)\n-------------------\n\nNew\n~~~\n\n- Add BOM formatter.\n\nBugfixes\n~~~~~~~~\n\n- Fix spelling and spacing.\n\n- Fix lint errors.\n\n- Fix example.\n\n- Fix lint errors and add msecs to formatter.\n\n- Remove \u2018ascitime\u2019 from StructuredFormatter.\n\n- Use port if given.\n\n- Fix docblocks.\n\nv0.2.2 (2015-12-07)\n-------------------\n\nBugfixes\n~~~~~~~~\n\n- Fix typo.\n\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/reubano/pygogo/archive/v0.12.0.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/reubano/pygogo", "keywords": "pygogo,A,Python,logging,library,with,super,powers", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pygogo", "package_url": "https://pypi.org/project/pygogo/", "platform": "MacOS X", "project_url": "https://pypi.org/project/pygogo/", "project_urls": { "Download": "https://github.com/reubano/pygogo/archive/v0.12.0.tar.gz", "Homepage": "https://github.com/reubano/pygogo" }, "release_url": "https://pypi.org/project/pygogo/0.12.0/", "requires_dist": [ "coverage (<5.0.0,>=4.0.3); extra == 'develop'", "docutils (<0.15,>=0.14); extra == 'develop'", "flake8 (<3.0.0,>=2.5.1); extra == 'develop'", "mccabe (<0.7.0,>=0.6.1); extra == 'develop'", "manage.py (<0.3.0,>=0.2.10); extra == 'develop'", "nose (<2.0.0,>=1.3.7); extra == 'develop'", "pep8 (<2.0.0,>=1.7.1); extra == 'develop'", "pip (<10.0.0,>=9.0.3); extra == 'develop'", "pyflakes (<2.0.0,>=1.0.0); extra == 'develop'", "pylint (<2.0.0,>=1.8.3); extra == 'develop'", "Pygments (<3.0.0,>=2.0.2); extra == 'develop'", "setuptools (<40.0.0,>=36.2.4); extra == 'develop'", "scripttest (<2.0,>=1.3); extra == 'develop'", "tox (<3.0.0,>=2.9.1); extra == 'develop'", "twine (<2.0.0,>=1.11.0); extra == 'develop'", "virtualenv (<16.0.0,>=15.1.0); extra == 'develop'", "wheel (<0.32.0,>=0.29.0); extra == 'develop'", "wrapt (<2.0.0,>=1.10.6); extra == 'develop'", "pkutils (<2.0.0,>=1.0.0); extra == 'develop'", "future (<1.0.0,>=0.16.0); extra == 'python_version<3.0'" ], "requires_python": "", "summary": "A Python logging library with super powers", "version": "0.12.0" }, "last_serial": 3743614, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "a44d8629f71503173dce5a5ee0757548", "sha256": "e67d7bfb9e02b8786e5bdf60e4a1a7d402fe71b95867b98583f9b02e84410db3" }, "downloads": -1, "filename": "pygogo-0.10.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a44d8629f71503173dce5a5ee0757548", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29239, "upload_time": "2017-02-28T12:16:59", "url": "https://files.pythonhosted.org/packages/1f/cd/789ba0528ec5839078267611cfa1bc2be124a09a061a144c53c2b2e0aaeb/pygogo-0.10.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "143fa2e72ab56b2ef16bffaf463cde5b", "sha256": "95411116e41ee95f5d369eebcaffd00a8b43dce2bcf798cad701146dbdd54693" }, "downloads": -1, "filename": "pygogo-0.10.0.tar.gz", "has_sig": true, "md5_digest": "143fa2e72ab56b2ef16bffaf463cde5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44554, "upload_time": "2017-02-28T12:17:04", "url": "https://files.pythonhosted.org/packages/28/28/a4f38b1d9d8f942fd1dd84ae179ef931284587ba52854b6da82d71cb9394/pygogo-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "192c21485f93434493eeaba526b7db23", "sha256": "f0548d88fdee3920dec9f1baf9dc1c29f6a96a156e82b469970b85d9ecdad14d" }, "downloads": -1, "filename": "pygogo-0.11.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "192c21485f93434493eeaba526b7db23", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21062, "upload_time": "2018-04-05T18:20:36", "url": "https://files.pythonhosted.org/packages/01/5c/3594d1433f8d07c944533db28bd73a7044f2cf4ff5f23c882acc65d0fba4/pygogo-0.11.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cbc8807e64df5b58a051ebde0d72c2db", "sha256": "4718d324bebd3895c73c958caa445527b025874c85832f33e05c7ed3cc870de6" }, "downloads": -1, "filename": "pygogo-0.11.0.tar.gz", "has_sig": true, "md5_digest": "cbc8807e64df5b58a051ebde0d72c2db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44625, "upload_time": "2018-04-05T18:20:37", "url": "https://files.pythonhosted.org/packages/85/97/3091f8fb2b9fec86ea4be9807cfb894e2e9e2cc3a89505efd56abaaf6137/pygogo-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "34a66808fd10325d82d067de4cc2975d", "sha256": "595ff156e9fbf0ec6a3180ae2a6f5e5dcd5fe676860810576a49422058505c69" }, "downloads": -1, "filename": "pygogo-0.12.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "34a66808fd10325d82d067de4cc2975d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21048, "upload_time": "2018-04-07T12:53:09", "url": "https://files.pythonhosted.org/packages/ad/27/d6be8d255a96e3a301771695f8e868a02c082e5c4c61382a0ed23e16a432/pygogo-0.12.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4da9aa2f80ebdb1eb8f1b0b909174881", "sha256": "3e121efba1c202c10df54a84db88e3579741883a47465a4fa318d226d8477f51" }, "downloads": -1, "filename": "pygogo-0.12.0.tar.gz", "has_sig": true, "md5_digest": "4da9aa2f80ebdb1eb8f1b0b909174881", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44660, "upload_time": "2018-04-07T12:53:21", "url": "https://files.pythonhosted.org/packages/0f/eb/116d9bc06dc0912574154e094fa784af00289ebc890bef66391f6c8762c2/pygogo-0.12.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ff421b5dfda1d2273f38caf413c39d2b", "sha256": "5641ec56ad5bc5e7a93d901a4d7cfd58e3b49b2f254e7294548e582607790db5" }, "downloads": -1, "filename": "pygogo-0.3.0-py27-none-any.whl", "has_sig": true, "md5_digest": "ff421b5dfda1d2273f38caf413c39d2b", "packagetype": "bdist_wheel", "python_version": "py27", "requires_python": null, "size": 11947, "upload_time": "2015-12-07T15:44:55", "url": "https://files.pythonhosted.org/packages/bd/9e/74f751a371b2e60cb3bf9dc6c72a1a7318135fe582a8a063903361d40a53/pygogo-0.3.0-py27-none-any.whl" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "319cf38bb5c524f07f5333bcfefb95dc", "sha256": "2cd63435a541caa41834a90716c4fcfdcd4ac92f46b0960e8224f74d7461e648" }, "downloads": -1, "filename": "pygogo-0.8.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "319cf38bb5c524f07f5333bcfefb95dc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20950, "upload_time": "2015-12-29T10:10:45", "url": "https://files.pythonhosted.org/packages/bc/0a/89a0ae663de292560e0bccd3df90c79d673dfc5c60c1aea454fe4069388f/pygogo-0.8.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ecc32b1faaf61f631ef9e7c02397046d", "sha256": "e974aab0bd59f977c48ab98dfad422a8bdc3fee6edbe18aa6c6949a92a166a98" }, "downloads": -1, "filename": "pygogo-0.8.1.tar.gz", "has_sig": true, "md5_digest": "ecc32b1faaf61f631ef9e7c02397046d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30871, "upload_time": "2015-12-29T10:10:53", "url": "https://files.pythonhosted.org/packages/57/fc/868f7772ad7ad26af00ed711b1a1682e9ce1ad36dc00c9c38a9e4c0a64b8/pygogo-0.8.1.tar.gz" } ], "0.8.10": [ { "comment_text": "", "digests": { "md5": "139e8418f8957f9f7536497b65596d29", "sha256": "d7e9335fd91e7e1ccfcb4231ba994e355ac24fe1403ba2e203e47086fbab2305" }, "downloads": -1, "filename": "pygogo-0.8.10-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "139e8418f8957f9f7536497b65596d29", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27615, "upload_time": "2015-12-30T16:09:04", "url": "https://files.pythonhosted.org/packages/58/72/9a5834e9955cdee047896549a3ba42e862a9a3fb4e4f5dd420227e8444b9/pygogo-0.8.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "951575c15f5ec5bc0fcf35f43a8649b0", "sha256": "3ed436d1adc64f35a80550ecfaccbd095c535dce9797fd2a249adae2ad1d1c47" }, "downloads": -1, "filename": "pygogo-0.8.10.tar.gz", "has_sig": true, "md5_digest": "951575c15f5ec5bc0fcf35f43a8649b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39613, "upload_time": "2015-12-30T16:09:10", "url": "https://files.pythonhosted.org/packages/12/0b/42977870de89f03b7aa04ad1e5fc295d4f6126047dcbe7b2d1e9082c2015/pygogo-0.8.10.tar.gz" } ], "0.8.13": [ { "comment_text": "", "digests": { "md5": "f874dd9739419e836e842e5bff6b3ea3", "sha256": "d17e853d0818fd8f5326d30c0a2ad29c3d3585a5a083ae7d559ed4e821bf0e19" }, "downloads": -1, "filename": "pygogo-0.8.13-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "f874dd9739419e836e842e5bff6b3ea3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27739, "upload_time": "2016-01-01T10:59:22", "url": "https://files.pythonhosted.org/packages/9e/4c/85e2f3d93bd9abab4a53013a100a86fa90f7e777fc8b3e9975ee22ea53b7/pygogo-0.8.13-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ad63eea6dc723f7eab3f9068f6691e41", "sha256": "345430063f1a66db4f4eb639debf9bfff7a1555b849c362799275ac341f67fc0" }, "downloads": -1, "filename": "pygogo-0.8.13.tar.gz", "has_sig": true, "md5_digest": "ad63eea6dc723f7eab3f9068f6691e41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39828, "upload_time": "2016-01-01T10:59:45", "url": "https://files.pythonhosted.org/packages/66/05/8dc93320d1758c488b7721757e2fcfa9a6866def31a623753fccc30e6e7b/pygogo-0.8.13.tar.gz" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "b0d7245919a246826f27222e280c6917", "sha256": "2c544af84c376b3794edc9453da088c95dc131e045beaf9af1ee4929dfea3d6e" }, "downloads": -1, "filename": "pygogo-0.8.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b0d7245919a246826f27222e280c6917", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21060, "upload_time": "2015-12-29T10:26:20", "url": "https://files.pythonhosted.org/packages/45/c8/227001ac5e3150e23999f192c23f00c8d395fd15f7f8c3faa2cf14f5ed33/pygogo-0.8.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cedf89ef4829984d25e7852871466390", "sha256": "3dba25bcd54e9e0ccf68bc1dbf6f598d86fd8f28e8fb737e11e01752d9ab8ea2" }, "downloads": -1, "filename": "pygogo-0.8.3.tar.gz", "has_sig": true, "md5_digest": "cedf89ef4829984d25e7852871466390", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30972, "upload_time": "2015-12-29T10:26:45", "url": "https://files.pythonhosted.org/packages/a7/8a/a4db583e0befb7c9a5b8c8f23bcac6833d3261e049620c3313e43aa2cc98/pygogo-0.8.3.tar.gz" } ], "0.8.7": [ { "comment_text": "", "digests": { "md5": "9bb284b7e2e12cc9a630ffd3fe1b188c", "sha256": "5292984b08424b15e827aea21ae8cdbdcc24c4393dc13f94bf266766e83210da" }, "downloads": -1, "filename": "pygogo-0.8.7-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "9bb284b7e2e12cc9a630ffd3fe1b188c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27359, "upload_time": "2015-12-29T11:51:33", "url": "https://files.pythonhosted.org/packages/78/c4/06640672aa77c35a45411ee97fdbed8dba76cb9ab048bd006967d14af753/pygogo-0.8.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ebe9af6242c06b6744ef5148042c25c", "sha256": "904f10e9008cf056a7a3954b3f5ff1e13a04a363b88dbe10b33def3116330755" }, "downloads": -1, "filename": "pygogo-0.8.7.tar.gz", "has_sig": true, "md5_digest": "2ebe9af6242c06b6744ef5148042c25c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39121, "upload_time": "2015-12-29T11:52:01", "url": "https://files.pythonhosted.org/packages/04/0d/659f838b369f96f941aed76198c631474314de985e5580c9fef7defe5f7e/pygogo-0.8.7.tar.gz" } ], "0.8.8": [ { "comment_text": "", "digests": { "md5": "63ecaac08cf8ff50707c5de36c28004a", "sha256": "88a62341136e9cb08da634347bde996c821357abcad5ae8e1b3d95f7b0d46ee7" }, "downloads": -1, "filename": "pygogo-0.8.8-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "63ecaac08cf8ff50707c5de36c28004a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27417, "upload_time": "2015-12-29T16:11:51", "url": "https://files.pythonhosted.org/packages/2a/c0/287510a1a0b1558af3d64f1d3ce6baa0c251dd5c6739c48112b373606866/pygogo-0.8.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9311a09ce834b26bdd45f50ac8cc203d", "sha256": "a7ae274a94e4cf91fd1938a8c3b412396f31abda70e64d07a005b7304c30b75a" }, "downloads": -1, "filename": "pygogo-0.8.8.tar.gz", "has_sig": true, "md5_digest": "9311a09ce834b26bdd45f50ac8cc203d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39190, "upload_time": "2015-12-29T16:11:58", "url": "https://files.pythonhosted.org/packages/9e/52/1928bb558981459a18ec3f56891533955a39410a0a8e1f4f3472fc74fc46/pygogo-0.8.8.tar.gz" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "4b7513c82c6a801d24d5e95e6f68c447", "sha256": "e57a883ea51244201c24004a763147501d0924c8d4abacea23ee9299cd5e8039" }, "downloads": -1, "filename": "pygogo-0.8.9-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4b7513c82c6a801d24d5e95e6f68c447", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27467, "upload_time": "2015-12-30T14:45:24", "url": "https://files.pythonhosted.org/packages/d1/80/57ebfe93745e504c40e32ec7f96551e7e173289c5ba06d09c84cb3b10d47/pygogo-0.8.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05fd053a25f8c4e46eaa80a9e4f0cd55", "sha256": "0ba728eb850d6ffb1b384d1663acccd1cd49808720556961e936662fdcb681ba" }, "downloads": -1, "filename": "pygogo-0.8.9.tar.gz", "has_sig": true, "md5_digest": "05fd053a25f8c4e46eaa80a9e4f0cd55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39274, "upload_time": "2015-12-30T14:45:43", "url": "https://files.pythonhosted.org/packages/ce/12/3adff210943dc05533d19f90a60859e688c7d40d22dbe47d7aabd99141f2/pygogo-0.8.9.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "3151b09aecf26ea8727e7ff5c015024b", "sha256": "9f1e2d70d70798e76b3391f13990a2190f15a900cc89a5a458cfd0b5213a72fb" }, "downloads": -1, "filename": "pygogo-0.9.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3151b09aecf26ea8727e7ff5c015024b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28778, "upload_time": "2016-07-22T19:24:25", "url": "https://files.pythonhosted.org/packages/19/23/5a57d70980000321846d6f1cb577e7ad93e138f1eedaca97c43a1324571a/pygogo-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "50c1a52d71595068e13511e9c3d95743", "sha256": "6a47f510082c0d077edf2ce9da00f681424d4790e83167e74497838c7caf8467" }, "downloads": -1, "filename": "pygogo-0.9.0.tar.gz", "has_sig": true, "md5_digest": "50c1a52d71595068e13511e9c3d95743", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44187, "upload_time": "2016-07-22T19:24:30", "url": "https://files.pythonhosted.org/packages/ca/bc/6d3e8eb8b10569075397eb693aac1de854e59deb8ae9141ab230da14d059/pygogo-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "3e7008498c4787e57b4782de4bbc8c07", "sha256": "b23369460a2035b2d8897852c94fa356d5a785373b85bd409b4e5ef7ef1cd2cc" }, "downloads": -1, "filename": "pygogo-0.9.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3e7008498c4787e57b4782de4bbc8c07", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28793, "upload_time": "2016-08-20T11:42:54", "url": "https://files.pythonhosted.org/packages/87/f2/622c790a525ba1924bcdd814e2b830179339bdcd43c3d9ef85ae7bf58874/pygogo-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3180a56042ebd835b7ac3da4aeb4512b", "sha256": "ea909b7f0653049acc4eb5f3b6ba0a8df042293ec171da0d6bc452f687d0379e" }, "downloads": -1, "filename": "pygogo-0.9.1.tar.gz", "has_sig": true, "md5_digest": "3180a56042ebd835b7ac3da4aeb4512b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44196, "upload_time": "2016-08-20T11:43:01", "url": "https://files.pythonhosted.org/packages/d8/30/831b7e64864592538ea31e16de7a296a08d9fa338a32811c94c1591c92b8/pygogo-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "34a66808fd10325d82d067de4cc2975d", "sha256": "595ff156e9fbf0ec6a3180ae2a6f5e5dcd5fe676860810576a49422058505c69" }, "downloads": -1, "filename": "pygogo-0.12.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "34a66808fd10325d82d067de4cc2975d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21048, "upload_time": "2018-04-07T12:53:09", "url": "https://files.pythonhosted.org/packages/ad/27/d6be8d255a96e3a301771695f8e868a02c082e5c4c61382a0ed23e16a432/pygogo-0.12.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4da9aa2f80ebdb1eb8f1b0b909174881", "sha256": "3e121efba1c202c10df54a84db88e3579741883a47465a4fa318d226d8477f51" }, "downloads": -1, "filename": "pygogo-0.12.0.tar.gz", "has_sig": true, "md5_digest": "4da9aa2f80ebdb1eb8f1b0b909174881", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44660, "upload_time": "2018-04-07T12:53:21", "url": "https://files.pythonhosted.org/packages/0f/eb/116d9bc06dc0912574154e094fa784af00289ebc890bef66391f6c8762c2/pygogo-0.12.0.tar.gz" } ] }