# packages

pkgId: 14980ef75fb31396b095f04443ae38f2f9780948e795033c0731048dd6e2001f
name: rh-python36-python-daemon
arch: noarch
version: 2.2.3
epoch: 0
release: 1
summary: Library to implement a well-behaved Unix daemon process.
url: https://pagure.io/python-daemon/
rpm_license: Apache-2
rpm_vendor: Ben Finney <ben+python@benfinney.id.au>
rpm_group: Development/Libraries
rpm_buildhost: af0eaa6dc6934f66a9576d09ce758d64
rpm_sourcerpm: rh-python36-python-daemon-2.2.3-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387275-rh-python36-python-daemon/rh-python36-python-daemon-2.2.3-1.noarch.rpm
checksum_type: sha256
description:
  This library implements the well-behaved daemon specification of
  :pep:`3143`, “Standard daemon process library”.

  A well-behaved Unix daemon process is tricky to get right, but the
  required steps are much the same for every daemon program. A
  `DaemonContext` instance holds the behaviour and configured
  process environment for the program; use the instance as a context
  manager to enter a daemon state.

  Simple example of usage::

      import daemon

      from spam import do_main_program

      with daemon.DaemonContext():
          do_main_program()

  Customisation of the steps to become a daemon is available by
  setting options on the `DaemonContext` instance; see the
  documentation for that class for each option.


pkgId: 441e04dee344fd3f85db8b09a95fa7b96f58c4788fe54d8a45003ebb66421ea1
name: rh-python36-python-dateutil
arch: noarch
version: 2.8.1
epoch: 0
release: 1
summary: Extensions to the standard Python datetime module
url: https://dateutil.readthedocs.io
rpm_license: Simplified BSD
rpm_vendor: Paul Ganssle <dateutil@python.org>
rpm_group: Development/Libraries
rpm_buildhost: 4b9e825487124594b68a9a9d3e735fea
rpm_sourcerpm: rh-python36-python-dateutil-2.8.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387158-rh-python36-python-dateutil/rh-python36-python-dateutil-2.8.1-1.noarch.rpm
checksum_type: sha256
description:
  The dateutil module provides powerful extensions to the
  datetime module available in the Python standard library.


pkgId: afe2f5b16f242f04638f235f27429e0d9528872c5cb7d5dd0fba8e0efb875045
name: rh-python36-python-django-oauth-toolkit
arch: noarch
version: 1.1.3
epoch: 0
release: 1.el7
summary: OAuth2 Provider for Django
url: https://github.com/jazzband/django-oauth-toolkit
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: e54d3488c01d4d80943c1d0f2e763e5c
rpm_sourcerpm: rh-python36-python-django-oauth-toolkit-1.1.3-1.el7.src.rpm
checksum_type: sha256
location_href:
  01387282-rh-python36-python-django-oauth-toolkit/rh-python36-python-django-oauth-toolkit-1.1.3-1.el7.noarch.rpm


pkgId: 4df021c69c9ab761e5022dd7d71f562d092d1b668371f3e9a8b013139ac12ca3
name: rh-python36-python-django-oauth-toolkit
arch: src
version: 1.1.3
epoch: 0
release: 1.el7
summary: OAuth2 Provider for Django
url: https://github.com/jazzband/django-oauth-toolkit
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: c1ffb2dc6eca4a27bc06bc6bc3aa3cc9
checksum_type: sha256
location_href:
  01387282-rh-python36-python-django-oauth-toolkit/rh-python36-python-django-oauth-toolkit-1.1.3-1.el7.src.rpm


pkgId: d3bbddf9d4a91ace19260629bc0fdd8c16b6e784babbfb71661ceba296e8e74a
name: rh-python36-python-django-solo
arch: noarch
version: 1.1.3
epoch: 0
release: 1.el7
url: http://github.com/lazybird/django-solo/
rpm_license: Creative Commons Attribution 3.0 Unported
rpm_group: Unspecified
rpm_buildhost: 26455c72152c439595f9c09f058a77f3
rpm_sourcerpm: rh-python36-python-django-solo-1.1.3-1.el7.src.rpm
location_href: 01387280-rh-python36-python-django-solo/rh-python36-python-django-solo-1.1.3-1.el7.noarch.rpm
checksum_type: sha256
summary:
  django-solo helps working with singletons: things like global settings that you want to edit from the admin site

description:
  Django Solo ++ | | | | | \ | Django Solo helps working with singletons: | /\ |
  database tables that only have one row. | >)'> | Singletons are useful for
  things like global | \/ | settings that you want to edit from the admin | / |
  instead of having them in Django settings.py. | | | | ++--


pkgId: ab1393ced2f98cdf91df0b2f605cdc0372083b4b005d176a260b60ad88b82fd1
name: rh-python36-python-editor
arch: noarch
version: 1.0.4
epoch: 0
release: 1
summary: Programmatically open an editor, capture the result.
url: https://github.com/fmoo/python-editor
rpm_license: Apache
rpm_vendor: Peter Ruibal <ruibalp@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 5d98ec99177e4e87b035a181145b1bfc
rpm_sourcerpm: rh-python36-python-editor-1.0.4-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387059-rh-python36-python-editor/rh-python36-python-editor-1.0.4-1.noarch.rpm
checksum_type: sha256
description:
  `python-editor` is a library that provides the `editor` module for programmatically
  interfacing with your system's $EDITOR.

  Examples
  --------

  ```python
  import editor
  commit_msg = editor.edit(contents=b"# Enter commit message here")
  ```

  Opens an editor, prefilled with the contents, `# Enter commit message here`.
  When the editor is closed, returns the contents (bytes) in variable `commit_msg`.
  Note that the argument to `contents` needs to be a bytes object on Python 3.


  ```python
  editor.edit(file="README.txt")
  ```

  Opens README.txt in an editor.  Changes are saved in place.  If there is
  a `contents` argument then the file contents will be overwritten.

  ```python
  editor.edit(..., use_tty=True)
  ```

  Opens the editor in a TTY.  This is usually done in programs which output is
  piped to other programs.  In this case the TTY is used as the editor's stdout,
  allowing interactive usage.


  How it Works
  ------------

  `editor` first looks for the ${EDITOR} environment variable.  If set, it uses
  the value as-is, without fallbacks.

  If no $EDITOR is set, editor will search through a list of known editors, and
  use the first one that exists on the system.

  For example, on Linux, `editor` will look for the following editors in order:

  * vim
  * emacs
  * nano

  When calling `editor.edit`, an editor will be opened in a subprocess, inheriting
  the parent process's stdin, stdout.


pkgId: 5af97b4129beb78837564a1a50e70ed7ad6bf80f3156156fc91343ea5153f0a0
name: rh-python36-python-jinja2
arch: noarch
version: 2.11.1
epoch: 0
release: 1
summary: A small but fast and easy to use stand-alone template engine written in pure python.
url: http://jinja.pocoo.org/
rpm_license: BSD
rpm_vendor: Armin Ronacher <armin.ronacher@active-4.com>
rpm_group: Development/Libraries
rpm_buildhost: 75ec56b6bcf64ecc8a773300aab1ec0c
rpm_sourcerpm: rh-python36-python-jinja2-2.11.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387285-rh-python36-python-jinja2/rh-python36-python-jinja2-2.11.1-1.noarch.rpm
checksum_type: sha256
description:
  Jinja2
  ~~~~~~

  Jinja2 is a template engine written in pure Python.  It provides a
  `Django`_ inspired non-XML syntax but supports inline expressions and
  an optional `sandboxed`_ environment.

  Nutshell
  --------

  Here a small example of a Jinja template::

      {% extends 'base.html' %}
      {% block title %}Memberlist{% endblock %}
      {% block content %}
        <ul>
        {% for user in users %}
          <li><a href="{{ user.url }}">{{ user.username }}</a></li>
        {% endfor %}
        </ul>
      {% endblock %}

  Philosophy
  ----------

  Application logic is for the controller but don't try to make the life
  for the template designer too hard by giving him too few functionality.

  For more informations visit the new `Jinja2 webpage`_ and `documentation`_.

  .. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security)
  .. _Django: https://www.djangoproject.com/
  .. _Jinja2 webpage: http://jinja.pocoo.org/
  .. _documentation: http://jinja.pocoo.org/2/documentation/


pkgId: b9aadd69f7aad1adaa1f7939e8631e5597a061860995ede3a276fdf874c021c4
name: rh-python36-python-ldap
arch: src
version: 3.2.0
epoch: 0
release: 1
summary: Python modules for implementing LDAP clients
url: https://www.python-ldap.org/
rpm_license: Python style
rpm_vendor: python-ldap project
rpm_group: Development/Libraries
rpm_buildhost: 179a2eece39d4bae8970104026d1a903
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387163-rh-python36-python-ldap/rh-python36-python-ldap-3.2.0-1.src.rpm
checksum_type: sha256
description:
  python-ldap:
    python-ldap provides an object-oriented API to access LDAP directory servers
    from Python programs. Mainly it wraps the OpenLDAP 2.x libs for that purpose.
    Additionally the package contains modules for other LDAP-related stuff
    (e.g. processing LDIF, LDAPURLs, LDAPv3 schema, LDAPv3 extended operations
    and controls, etc.).


pkgId: bc23db4c3360c7ce47775796ab957bd327e2383163a5c92a571cf77f4ab2f7ea
name: rh-python36-python-ldap-debuginfo
arch: x86_64
version: 3.2.0
epoch: 0
release: 1
summary: Debug information for package rh-python36-python-ldap
url: https://www.python-ldap.org/
rpm_license: Python style
rpm_vendor: python-ldap project
rpm_group: Development/Debug
rpm_buildhost: 288134be68fb41ac8b800405e68ace11
rpm_sourcerpm: rh-python36-python-ldap-3.2.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387163-rh-python36-python-ldap/rh-python36-python-ldap-debuginfo-3.2.0-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-python-ldap.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 09ec520eaeb85911fe93f4e57a6285ae9f82bbd1b3c2a636d2933b2d12baa68e
name: rh-python36-python-markupsafe
arch: src
version: 1.1.1
epoch: 0
release: 1
summary: Safely add untrusted strings to HTML/XML markup.
url: https://palletsprojects.com/p/markupsafe/
rpm_license: BSD-3-Clause
rpm_vendor: The Pallets Team <contact@palletsprojects.com>
rpm_group: Development/Libraries
rpm_buildhost: 0a7eb32d01e5472f8b19f9339b4d9895
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387286-rh-python36-python-markupsafe/rh-python36-python-markupsafe-1.1.1-1.src.rpm
checksum_type: sha256
description:
  MarkupSafe
  ==========

  MarkupSafe implements a text object that escapes characters so it is
  safe to use in HTML and XML. Characters that have special meanings are
  replaced so that they display as the actual characters. This mitigates
  injection attacks, meaning untrusted user input can safely be displayed
  on a page.


  Installing
  ----------

  Install and update using `pip`_:

  .. code-block:: text

      pip install -U MarkupSafe

  .. _pip: https://pip.pypa.io/en/stable/quickstart/


  Examples
  --------

  .. code-block:: pycon

      >>> from markupsafe import Markup, escape
      >>> # escape replaces special characters and wraps in Markup
      >>> escape('<script>alert(document.cookie);</script>')
      Markup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
      >>> # wrap in Markup to mark text "safe" and prevent escaping
      >>> Markup('<strong>Hello</strong>')
      Markup('<strong>hello</strong>')
      >>> escape(Markup('<strong>Hello</strong>'))
      Markup('<strong>hello</strong>')
      >>> # Markup is a text subclass (str on Python 3, unicode on Python 2)
      >>> # methods and operators escape their arguments
      >>> template = Markup("Hello <em>%s</em>")
      >>> template % '"World"'
      Markup('Hello <em>&#34;World&#34;</em>')


  Donate
  ------

  The Pallets organization develops and supports MarkupSafe and other
  libraries that use it. In order to grow the community of contributors
  and users, and allow the maintainers to devote more time to the
  projects, `please donate today`_.

  .. _please donate today: https://palletsprojects.com/donate


  Links
  -----

  *   Website: https://palletsprojects.com/p/markupsafe/
  *   Documentation: https://markupsafe.palletsprojects.com/
  *   License: `BSD-3-Clause <https://github.com/pallets/markupsafe/blob/master/LICENSE.rst>`_
  *   Releases: https://pypi.org/project/MarkupSafe/
  *   Code: https://github.com/pallets/markupsafe
  *   Issue tracker: https://github.com/pallets/markupsafe/issues
  *   Test status:

      *   Linux, Mac: https://travis-ci.org/pallets/markupsafe
      *   Windows: https://ci.appveyor.com/project/pallets/markupsafe

  *   Test coverage: https://codecov.io/gh/pallets/markupsafe


pkgId: 50219e13079f3f6129eecd0e450d7ceab549f52d58ac87504c44e96b290a86fa
name: rh-python36-python-markupsafe-debuginfo
arch: x86_64
version: 1.1.1
epoch: 0
release: 1
summary: Debug information for package rh-python36-python-markupsafe
url: https://palletsprojects.com/p/markupsafe/
rpm_license: BSD-3-Clause
rpm_vendor: The Pallets Team <contact@palletsprojects.com>
rpm_group: Development/Debug
rpm_buildhost: a5f585da85584f3c97a7c61af4cc6f27
rpm_sourcerpm: rh-python36-python-markupsafe-1.1.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387286-rh-python36-python-markupsafe/rh-python36-python-markupsafe-debuginfo-1.1.1-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-python-markupsafe.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 41c694b93643559012e9ff6f7e825121dc85168f4ea6b6e774894fdf1aa6d768
name: rh-python36-python-mimeparse
arch: noarch
version: 1.6.0
epoch: 0
release: 1
url: https://github.com/dbtsai/python-mimeparse
rpm_license: UNKNOWN
rpm_vendor: DB Tsai <dbtsai@dbtsai.com>
rpm_group: Development/Libraries
rpm_buildhost: 035f5cd03b88447b8b1625a854393e34
rpm_sourcerpm: rh-python36-python-mimeparse-1.6.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387061-rh-python36-python-mimeparse/rh-python36-python-mimeparse-1.6.0-1.noarch.rpm
checksum_type: sha256
summary:
  A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges.

description:
  Python-MimeParse
  ================

  .. image:: https://travis-ci.org/dbtsai/python-mimeparse.svg?branch=master
     :target: https://travis-ci.org/dbtsai/python-mimeparse

  This module provides basic functions for handling mime-types. It can
  handle matching mime-types against a list of media-ranges. See section
  5.3.2 of the HTTP 1.1 Semantics and Content specification [RFC 7231] for
  a complete explanation: https://tools.ietf.org/html/rfc7231#section-5.3.2

  Installation
  ------------

  Use **pip**:

  .. code-block:: sh

      $ pip install python-mimeparse

  It supports Python 2.7 - 3.5 and PyPy.

  Functions
  ---------

  **parse_mime_type()**

  Parses a mime-type into its component parts.

  **parse_media_range()**

  Media-ranges are mime-types with wild-cards and a "q" quality parameter.

  **quality()**

  Determines the quality ("q") of a mime-type when compared against a list of
  media-ranges.

  **quality_parsed()**

  Just like ``quality()`` except the second parameter must be pre-parsed.

  **best_match()**

  Choose the mime-type with the highest quality ("q") from a list of candidates.

  Testing
  -------

  Run the tests by typing: ``python mimeparse_test.py``. The tests require Python 2.6.

  To make sure that the package works in all the supported environments, you can
  run **tox** tests:

  .. code-block:: sh

      $ pip install tox
      $ tox

  The format of the JSON test data file is as follows: A top-level JSON object
  which has a key for each of the functions to be tested. The value corresponding
  to that key is a list of tests. Each test contains: the argument or arguments
  to the function being tested, the expected results and an optional description.


pkgId: 6cf1de452ffeddf6447a42aae6218e5da49721e1347cf6ea0b7abf94610c7511
name: rh-python36-python-pygments
arch: noarch
version: 2.5.2
epoch: 0
release: 1
summary: Pygments is a syntax highlighting package written in Python.
url: http://pygments.org/
rpm_license: BSD License
rpm_vendor: Georg Brandl <georg@python.org>
rpm_group: Development/Libraries
rpm_buildhost: eec316a901f54f85ad548d2270943dec
rpm_sourcerpm: rh-python36-python-pygments-2.5.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387064-rh-python36-python-pygments/rh-python36-python-pygments-2.5.2-1.noarch.rpm
checksum_type: sha256
description:
  Pygments
      ~~~~~~~~

      Pygments is a syntax highlighting package written in Python.

      It is a generic syntax highlighter suitable for use in code hosting, forums,
      wikis or other applications that need to prettify source code.  Highlights
      are:

      * a wide range of over 300 languages and other text formats is supported
      * special attention is paid to details, increasing quality by a fair amount
      * support for new languages and formats are added easily
      * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image       formats that PIL supports and ANSI sequences
      * it is usable as a command-line tool and as a library

      :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
      :license: BSD, see LICENSE for details.


pkgId: 8369ad2464de76b3f1c0ec82a12279efd51e870150dc13529ed83da8454c1563
name: rh-python36-python-string-utils
arch: noarch
version: 0.6.0
epoch: 0
release: 1
summary: Utility functions for strings checking and manipulation.
url: https://github.com/daveoncode/python-string-utils
rpm_license: MIT
rpm_vendor: Davide Zanotti <davidezanotti@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 91df12f022b546188b57a20ed76ffc27
rpm_sourcerpm: rh-python36-python-string-utils-0.6.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387269-rh-python36-python-string-utils/rh-python36-python-string-utils-0.6.0-1.noarch.rpm
checksum_type: sha256
description:
  A small utility library to check and manipulate strings.

  - simple and pythonic
  - fast (based on compiled regex)
  - no external dependencies
  - fully documented
  - PEP8 complaint
  - 100% code coverage
  - tested against multiple python versions (2.7, 3.2, 3.3, 3.4, 3.5)






  - is_string
  - is_full_string
  - is_ip
  - is_url
  - is_email
  - is_credit_card
  - is_camel_case
  - is_snake_case
  - is_json
  - is_uuid
  - is_pangram
  - is_palindrome
  - is_isogram
  - is_slug
  - words_count
  - contains_html



  - camel_case_to_snake
  - snake_case_to_camel
  - reverse
  - uuid
  - shuffle
  - strip_html
  - prettify
  - slugify


  ...and more are coming!




      pip install python-string-utils




  Full API documentation available on: <http://python-string-utils.readthedocs.org/en/latest/>


pkgId: 46383273daf1c07a270dd472dafded245f7363a06121da5d069cc97c2a4f3d30
name: rh-python36-python-subunit
arch: noarch
version: 1.3.0
epoch: 0
release: 1
summary: Python implementation of subunit test streaming protocol
url: http://launchpad.net/subunit
rpm_license: UNKNOWN
rpm_vendor: Robert Collins <subunit-dev@lists.launchpad.net>
rpm_group: Development/Libraries
rpm_buildhost: 3b61dfa1844a45929d0101173bdf4188
rpm_sourcerpm: rh-python36-python-subunit-1.3.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387041-rh-python36-python-subunit/rh-python36-python-subunit-1.3.0-1.noarch.rpm
checksum_type: sha256
description:
    subunit: A streaming protocol for test results
    Copyright (C) 2005-2013 Robert Collins <robertc@robertcollins.net>

    Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
    license at the users choice. A copy of both licenses are available in the
    project source as Apache-2.0 and BSD. You may not use this file except in
    compliance with one of these two licences.

    Unless required by applicable law or agreed to in writing, software
    distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
    license you chose for the specific language governing permissions and
    limitations under that license.

    See the COPYING file for full details on the licensing of Subunit.

    subunit reuses iso8601 by Michael Twomey, distributed under an MIT style
    licence - see python/iso8601/LICENSE for details.

  Subunit
  -------

  Subunit is a streaming protocol for test results.

  There are two major revisions of the protocol. Version 1 was trivially human
  readable but had significant defects as far as highly parallel testing was
  concerned - it had no room for doing discovery and execution in parallel,
  required substantial buffering when multiplexing and was fragile - a corrupt
  byte could cause an entire stream to be misparsed. Version 1.1 added
  encapsulation of binary streams which mitigated some of the issues but the
  core remained.

  Version 2 shares many of the good characteristics of Version 1 - it can be
  embedded into a regular text stream (e.g. from a build system) and it still
  models xUnit style test execution. It also fixes many of the issues with
  Version 1 - Version 2 can be multiplexed without excessive buffering (in
  time or space), it has a well defined recovery mechanism for dealing with
  corrupted streams (e.g. where two processes write to the same stream
  concurrently, or where the stream generator suffers a bug).

  More details on both protocol version s can be found in the 'Protocol' section
  of this document.

  Subunit comes with command line filters to process a subunit stream and
  language bindings for python, C, C++ and shell. Bindings are easy to write
  for other languages.

  A number of useful things can be done easily with subunit:
   * Test aggregation: Tests run separately can be combined and then
     reported/displayed together. For instance, tests from different languages
     can be shown as a seamless whole, and tests running on multiple machines
     can be aggregated into a single stream through a multiplexer.
   * Test archiving: A test run may be recorded and replayed later.
   * Test isolation: Tests that may crash or otherwise interact badly with each
     other can be run seperately and then aggregated, rather than interfering
     with each other or requiring an adhoc test->runner reporting protocol.
   * Grid testing: subunit can act as the necessary serialisation and
     deserialiation to get test runs on distributed machines to be reported in
     real time.

  Subunit supplies the following filters:
   * tap2subunit - convert perl's TestAnythingProtocol to subunit.
   * subunit2csv - convert a subunit stream to csv.
   * subunit2disk - export a subunit stream to files on disk.
   * subunit2pyunit - convert a subunit stream to pyunit test results.
   * subunit2gtk - show a subunit stream in GTK.
   * subunit2junitxml - convert a subunit stream to JUnit's XML format.
   * subunit-diff - compare two subunit streams.
   * subunit-filter - filter out tests from a subunit stream.
   * subunit-ls - list info about tests present in a subunit stream.
   * subunit-stats - generate a summary of a subunit stream.
   * subunit-tags - add or remove tags from a stream.

  Integration with other tools
  ----------------------------

  Subunit's language bindings act as integration with various test runners like
  'check', 'cppunit', Python's 'unittest'. Beyond that a small amount of glue
  (typically a few lines) will allow Subunit to be used in more sophisticated
  ways.

  Python
  ======

  Subunit has excellent Python support: most of the filters and tools are written
  in python and there are facilities for using Subunit to increase test isolation
  seamlessly within a test suite.

  The most common way is to run an existing python test suite and have it output
  subunit via the ``subunit.run`` module::

    $ python -m subunit.run mypackage.tests.test_suite

  For more information on the Python support Subunit offers , please see
  ``pydoc subunit``, or the source in ``python/subunit/``

  C
  =

  Subunit has C bindings to emit the protocol. The 'check' C unit testing project
  has included subunit support in their project for some years now. See
  'c/README' for more details.

  C++
  ===

  The C library is includable and usable directly from C++. A TestListener for
  CPPUnit is included in the Subunit distribution. See 'c++/README' for details.

  shell
  =====

  There are two sets of shell tools. There are filters, which accept a subunit
  stream on stdin and output processed data (or a transformed stream) on stdout.

  Then there are unittest facilities similar to those for C : shell bindings
  consisting of simple functions to output protocol elements, and a patch for
  adding subunit output to the 'ShUnit' shell test runner. See 'shell/README' for
  details.

  Filter recipes
  --------------

  To ignore some failing tests whose root cause is already known::

    subunit-filter --without 'AttributeError.*flavor'


  The xUnit test model
  --------------------

  Subunit implements a slightly modified xUnit test model. The stock standard
  model is that there are tests, which have an id(), can be run, and when run
  start, emit an outcome (like success or failure) and then finish.

  Subunit extends this with the idea of test enumeration (find out about tests
  a runner has without running them), tags (allow users to describe tests in
  ways the test framework doesn't apply any semantic value to), file attachments
  (allow arbitrary data to make analysing a failure easy) and timestamps.

  The protocol
  ------------

  Version 2, or v2 is new and still under development, but is intended to
  supercede version 1 in the very near future. Subunit's bundled tools accept
  only version 2 and only emit version 2, but the new filters subunit-1to2 and
  subunit-2to1 can be used to interoperate with older third party libraries.

  Version 2
  =========

  Version 2 is a binary protocol consisting of independent packets that can be
  embedded in the output from tools like make - as long as each packet has no
  other bytes mixed in with it (which 'make -j N>1' has a tendency of doing).
  Version 2 is currently in draft form, and early adopters should be willing
  to either discard stored results (if protocol changes are made), or bulk
  convert them back to v1 and then to a newer edition of v2.

  The protocol synchronises at the start of the stream, after a packet, or
  after any 0x0A byte. That is, a subunit v2 packet starts after a newline or
  directly after the end of the prior packet.

  Subunit is intended to be transported over a reliable streaming protocol such
  as TCP. As such it does not concern itself with out of order delivery of
  packets. However, because of the possibility of corruption due to either
  bugs in the sender, or due to mixed up data from concurrent writes to the same
  fd when being embedded, subunit strives to recover reasonably gracefully from
  damaged data.

  A key design goal for Subunit version 2 is to allow processing and multiplexing
  without forcing buffering for semantic correctness, as buffering tends to hide
  hung or otherwise misbehaving tests. That said, limited time based buffering
  for network efficiency is a good idea - this is ultimately implementator
  choice. Line buffering is also discouraged for subunit streams, as dropping
  into a debugger or other tool may require interactive traffic even if line
  buffering would not otherwise be a problem.

  In version two there are two conceptual events - a test status event and a file
  attachment event. Events may have timestamps, and the path of multiplexers that
  an event is routed through is recorded to permit sending actions back to the
  source (such as new tests to run or stdin for driving debuggers and other
  interactive input). Test status events are used to enumerate tests, to report
  tests and test helpers as they run. Tests may have tags, used to allow
  tunnelling extra meanings through subunit without requiring parsing of
  arbitrary file attachments. Things that are not standalone tests get marked
  as such by setting the 'Runnable' flag to false. (For instance, individual
  assertions in TAP are not runnable tests, only the top level TAP test script
  is runnable).

  File attachments are used to provide rich detail about the nature of a failure.
  File attachments can also be used to encapsulate stdout and stderr both during
  and outside tests.

  Most numbers are stored in network byte order - Most Significant Byte first
  encoded using a variation of http://www.dlugosz.com/ZIP2/VLI.html. The first
  byte's top 2 high order bits encode the total number of octets in the number.
  This encoding can encode values from 0 to 2**30-1, enough to encode a
  nanosecond. Numbers that are not variable length encoded are still stored in
  MSB order.

  +--------+--------+---------+------------+
  | prefix | octets | max     | max        |
  +========+========+=========+============+
  | 00     |      1 |  2**6-1 |         63 |
  +--------+--------+---------+------------+
  | 01     |      2 | 2**14-1 |      16383 |
  +--------+--------+---------+------------+
  | 10     |      3 | 2**22-1 |    4194303 |
  +--------+--------+---------+------------+
  | 11     |      4 | 2**30-1 | 1073741823 |
  +--------+--------+---------+------------+

  All variable length elements of the packet are stored with a length prefix
  number allowing them to be skipped over for consumers that don't need to
  interpret them.

  UTF-8 strings are with no terminating NUL and should not have any embedded NULs
  (implementations SHOULD validate any such strings that they process and take
  some remedial action (such as discarding the packet as corrupt).

  In short the structure of a packet is:

    PACKET := SIGNATURE FLAGS PACKET_LENGTH TIMESTAMP? TESTID? TAGS? MIME?
              FILECONTENT? ROUTING_CODE? CRC32

  In more detail...

  Packets are identified by a single byte signature - 0xB3, which is never legal
  in a UTF-8 stream as the first byte of a character. 0xB3 starts with the first
  bit set and the second not, which is the UTF-8 signature for a continuation
  byte. 0xB3 was chosen as 0x73 ('s' in ASCII') with the top two bits replaced by
  the 1 and 0 for a continuation byte.

  If subunit packets are being embedded in a non-UTF-8 text stream, where 0x73 is
  a legal character, consider either recoding the text to UTF-8, or using
  subunit's 'file' packets to embed the text stream in subunit, rather than the
  other way around.

  Following the signature byte comes a 16-bit flags field, which includes a
  4-bit version field - if the version is not 0x2 then the packet cannot be
  read. It is recommended to signal an error at this point (e.g. by emitting
  a synthetic error packet and returning to the top level loop to look for
  new packets, or exiting with an error). If recovery is desired, treat the
  packet signature as an opaque byte and scan for a new synchronisation point.
  NB: Subunit V1 and V2 packets may legitimately included 0xB3 internally,
  as they are an 8-bit safe container format, so recovery from this situation
  may involve an arbitrary number of false positives until an actual packet
  is encountered : and even then it may still be false, failing after passing
  the version check due to coincidence.

  Flags are stored in network byte order too.

  +------------+------------+------------------------+
  | High byte               | Low byte               |
  +------------+------------+------------------------+
  | 15 14 13 12 11 10  9  8 | 7  6  5  4  3  2  1  0 |
  +------------+------------+------------------------+
  | VERSION    |      feature bits                   |
  +------------+-------------------------------------+

  Valid version values are:
  0x2 - version 2

  Feature bits:
  Bit 11 - mask 0x0800 - Test id present.
  Bit 10 - mask 0x0400 - Routing code present.
  Bit  9 - mask 0x0200 - Timestamp present.
  Bit  8 - mask 0x0100 - Test is 'runnable'.
  Bit  7 - mask 0x0080 - Tags are present.
  Bit  6 - mask 0x0040 - File content is present.
  Bit  5 - mask 0x0020 - File MIME type is present.
  Bit  4 - mask 0x0010 - EOF marker.
  Bit  3 - mask 0x0008 - Must be zero in version 2.

  Test status gets three bits:
  Bit 2 | Bit 1 | Bit 0 - mask 0x0007 - A test status enum lookup:
  000 - undefined / no test
  001 - Enumeration / existence
  002 - In progress
  003 - Success
  004 - Unexpected Success
  005 - Skipped
  006 - Failed
  007 - Expected failure

  After the flags field is a number field giving the length in bytes for the
  entire packet including the signature and the checksum. This length must
  be less than 4MiB - 4194303 bytes. The encoding can obviously record a larger
  number but one of the goals is to avoid requiring large buffers, or causing
  large latency in the packet forward/processing pipeline. Larger file
  attachments can be communicated in multiple packets, and the overhead in such a
  4MiB packet is approximately 0.2%.

  The rest of the packet is a series of optional features as specified by the set
  feature bits in the flags field. When absent they are entirely absent.

  Forwarding and multiplexing of packets can be done without interpreting the
  remainder of the packet until the routing code and checksum (which are both at
  the end of the packet). Additionally, routers can often avoid copying or moving
  the bulk of the packet, as long as the routing code size increase doesn't force
  the length encoding to take up a new byte (which will only happen to packets
  less than or equal to 16KiB in length) - large packets are very efficient to
  route.

  Timestamp when present is a 32 bit unsigned integer for seconds, and a variable
  length number for nanoseconds, representing UTC time since Unix Epoch in
  seconds and nanoseconds.

  Test id when present is a UTF-8 string. The test id should uniquely identify
  runnable tests such that they can be selected individually. For tests and other
  actions which cannot be individually run (such as test
  fixtures/layers/subtests) uniqueness is not required (though being human
  meaningful is highly recommended).

  Tags when present is a length prefixed vector of UTF-8 strings, one per tag.
  There are no restrictions on tag content (other than the restrictions on UTF-8
  strings in subunit in general). Tags have no ordering.

  When a MIME type is present, it defines the MIME type for the file across all
  packets same file (routing code + testid + name uniquely identifies a file,
  reset when EOF is flagged). If a file never has a MIME type set, it should be
  treated as application/octet-stream.

  File content when present is a UTF-8 string for the name followed by the length
  in bytes of the content, and then the content octets.

  If present routing code is a UTF-8 string. The routing code is used to
  determine which test backend a test was running on when doing data analysis,
  and to route stdin to the test process if interaction is required.

  Multiplexers SHOULD add a routing code if none is present, and prefix any
  existing routing code with a routing code ('/' separated) if one is already
  present. For example, a multiplexer might label each stream it is multiplexing
  with a simple ordinal ('0', '1' etc), and given an incoming packet with route
  code '3' from stream '0' would adjust the route code when forwarding the packet
  to be '0/3'.

  Following the end of the packet is a CRC-32 checksum of the contents of the
  packet including the signature.

  Example packets
  ~~~~~~~~~~~~~~~

  Trivial test "foo" enumeration packet, with test id, runnable set,
  status=enumeration. Spaces below are to visually break up signature / flags /
  length / testid / crc32

  b3 2901 0c 03666f6f 08555f1b


  Version 1 (and 1.1)
  ===================

  Version 1 (and 1.1) are mostly human readable protocols.

  Sample subunit wire contents
  ----------------------------

  The following::

    test: test foo works
    success: test foo works
    test: tar a file.
    failure: tar a file. [
    ..
     ]..  space is eaten.
    foo.c:34 WARNING foo is not defined.
    ]
    a writeln to stdout

  When run through subunit2pyunit::

    .F
    a writeln to stdout

    ========================
    FAILURE: tar a file.
    -------------------
    ..
    ]..  space is eaten.
    foo.c:34 WARNING foo is not defined.


  Subunit v1 protocol description
  ===============================

  This description is being ported to an EBNF style. Currently its only partly in
  that style, but should be fairly clear all the same. When in doubt, refer the
  source (and ideally help fix up the description!). Generally the protocol is
  line orientated and consists of either directives and their parameters, or
  when outside a DETAILS region unexpected lines which are not interpreted by
  the parser - they should be forwarded unaltered::

      test|testing|test:|testing: test LABEL
      success|success:|successful|successful: test LABEL
      success|success:|successful|successful: test LABEL DETAILS
      failure: test LABEL
      failure: test LABEL DETAILS
      error: test LABEL
      error: test LABEL DETAILS
      skip[:] test LABEL
      skip[:] test LABEL DETAILS
      xfail[:] test LABEL
      xfail[:] test LABEL DETAILS
      uxsuccess[:] test LABEL
      uxsuccess[:] test LABEL DETAILS
      progress: [+|-]X
      progress: push
      progress: pop
      tags: [-]TAG ...
      time: YYYY-MM-DD HH:MM:SSZ

      LABEL: UTF8*
      NAME: UTF8*
      DETAILS ::= BRACKETED | MULTIPART
      BRACKETED ::= '[' CR UTF8-lines ']' CR
      MULTIPART ::= '[ multipart' CR PART* ']' CR
      PART ::= PART_TYPE CR NAME CR PART_BYTES CR
      PART_TYPE ::= Content-Type: type/sub-type(;parameter=value,parameter=value)
      PART_BYTES ::= (DIGITS CR LF BYTE{DIGITS})* '0' CR LF

  unexpected output on stdout -> stdout.
  exit w/0 or last test completing -> error

  Tags given outside a test are applied to all following tests
  Tags given after a test: line and before the result line for the same test
  apply only to that test, and inherit the current global tags.
  A '-' before a tag is used to remove tags - e.g. to prevent a global tag
  applying to a single test, or to cancel a global tag.

  The progress directive is used to provide progress information about a stream
  so that stream consumer can provide completion estimates, progress bars and so
  on. Stream generators that know how many tests will be present in the stream
  should output "progress: COUNT". Stream filters that add tests should output
  "progress: +COUNT", and those that remove tests should output
  "progress: -COUNT". An absolute count should reset the progress indicators in
  use - it indicates that two separate streams from different generators have
  been trivially concatenated together, and there is no knowledge of how many
  more complete streams are incoming. Smart concatenation could scan each stream
  for their count and sum them, or alternatively translate absolute counts into
  relative counts inline. It is recommended that outputters avoid absolute counts
  unless necessary. The push and pop directives are used to provide local regions
  for progress reporting. This fits with hierarchically operating test
  environments - such as those that organise tests into suites - the top-most
  runner can report on the number of suites, and each suite surround its output
  with a (push, pop) pair. Interpreters should interpret a pop as also advancing
  the progress of the restored level by one step. Encountering progress
  directives between the start and end of a test pair indicates that a previous
  test was interrupted and did not cleanly terminate: it should be implicitly
  closed with an error (the same as when a stream ends with no closing test
  directive for the most recently started test).

  The time directive acts as a clock event - it sets the time for all future
  events. The value should be a valid ISO8601 time.

  The skip, xfail and uxsuccess outcomes are not supported by all testing
  environments. In Python the testttools (https://launchpad.net/testtools)
  library is used to translate these automatically if an older Python version
  that does not support them is in use. See the testtools documentation for the
  translation policy.

  skip is used to indicate a test was discovered but not executed. xfail is used
  to indicate a test that errored in some expected fashion (also know as "TODO"
  tests in some frameworks). uxsuccess is used to indicate and unexpected success
  where a test though to be failing actually passes. It is complementary to
  xfail.

  Hacking on subunit
  ------------------

  Releases
  ========

  * Update versions in configure.ac and python/subunit/__init__.py.
  * Update NEWS.
  * Do a make distcheck, which will update Makefile etc.
  * Do a PyPI release: PYTHONPATH=../../python python ../../setup.py sdist bdist_wheel upload -s
  * Upload the regular one to LP.
  * Push a tagged commit.
    git push -t origin master:master


pkgId: 83786e7948b0855b02022e858576413a046227a52c3cbf32c0e949550433df52
name: rh-python36-python3-openid
arch: noarch
version: 3.1.0
epoch: 0
release: 1
summary: OpenID support for modern servers and consumers.
url: http://github.com/necaris/python3-openid
rpm_license: UNKNOWN
rpm_vendor: Rami Chowdhury <rami.chowdhury@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 55e2f283345140799166c71efd0fe475
rpm_sourcerpm: rh-python36-python3-openid-3.1.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387157-rh-python36-python3-openid/rh-python36-python3-openid-3.1.0-1.noarch.rpm
checksum_type: sha256
description:
  This is a set of Python packages to support use of
  the OpenID decentralized identity system in your application, update to Python
  3.  Want to enable single sign-on for your web site?  Use the openid.consumer
  package.  Want to run your own OpenID server? Check out openid.server.
  Includes example code and support for a variety of storage back-ends.


pkgId: d1acfa80fc8d858b833f8db7db1e24edf03fd4d85eb858d5ba6da05a2d4a8ff7
name: rh-python36-pytz
arch: noarch
version: 2019.3
epoch: 0
release: 1
summary: World timezone definitions, modern and historical
url: http://pythonhosted.org/pytz
rpm_license: MIT
rpm_vendor: Stuart Bishop <stuart@stuartbishop.net>
rpm_group: Development/Libraries
rpm_buildhost: 9f0754eb8b0e49cbbcb8fc0ed0ca5c4c
rpm_sourcerpm: rh-python36-pytz-2019.3-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387113-rh-python36-pytz/rh-python36-pytz-2019.3-1.noarch.rpm
checksum_type: sha256
description:
  pytz - World Timezone Definitions for Python
  ============================================

  :Author: Stuart Bishop <stuart@stuartbishop.net>

  Introduction
  ~~~~~~~~~~~~

  pytz brings the Olson tz database into Python. This library allows
  accurate and cross platform timezone calculations using Python 2.4
  or higher. It also solves the issue of ambiguous times at the end
  of daylight saving time, which you can read more about in the Python
  Library Reference (``datetime.tzinfo``).

  Almost all of the Olson timezones are supported.

  .. note::

      This library differs from the documented Python API for
      tzinfo implementations; if you want to create local wallclock
      times you need to use the ``localize()`` method documented in this
      document. In addition, if you perform date arithmetic on local
      times that cross DST boundaries, the result may be in an incorrect
      timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get
      2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A
      ``normalize()`` method is provided to correct this. Unfortunately these
      issues cannot be resolved without modifying the Python datetime
      implementation (see PEP-431).


  Installation
  ~~~~~~~~~~~~

  This package can either be installed from a .egg file using setuptools,
  or from the tarball using the standard Python distutils.

  If you are installing from a tarball, run the following command as an
  administrative user::

      python setup.py install

  If you are installing using setuptools, you don't even need to download
  anything as the latest version will be downloaded for you
  from the Python package index::

      easy_install --upgrade pytz

  If you already have the .egg file, you can use that too::

      easy_install pytz-2008g-py2.6.egg


  Example & Usage
  ~~~~~~~~~~~~~~~

  Localized times and date arithmetic
  -----------------------------------

  >>> from datetime import datetime, timedelta
  >>> from pytz import timezone
  >>> import pytz
  >>> utc = pytz.utc
  >>> utc.zone
  'UTC'
  >>> eastern = timezone('US/Eastern')
  >>> eastern.zone
  'US/Eastern'
  >>> amsterdam = timezone('Europe/Amsterdam')
  >>> fmt = '%Y-%m-%d %H:%M:%SOURCE %Z%z'

  This library only supports two ways of building a localized time. The
  first is to use the ``localize()`` method provided by the pytz library.
  This is used to localize a naive datetime (datetime with no timezone
  information):

  >>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
  >>> print(loc_dt.strftime(fmt))
  2002-10-27 06:00:00 EST-0500

  The second way of building a localized time is by converting an existing
  localized time using the standard ``astimezone()`` method:

  >>> ams_dt = loc_dt.astimezone(amsterdam)
  >>> ams_dt.strftime(fmt)
  '2002-10-27 12:00:00 CET+0100'

  Unfortunately using the tzinfo argument of the standard datetime
  constructors ''does not work'' with pytz for many timezones.

  >>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
  '2002-10-27 12:00:00 LMT+0020'

  It is safe for timezones without daylight saving transitions though, such
  as UTC:

  >>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
  '2002-10-27 12:00:00 UTC+0000'

  The preferred way of dealing with times is to always work in UTC,
  converting to localtime only when generating output to be read
  by humans.

  >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
  >>> loc_dt = utc_dt.astimezone(eastern)
  >>> loc_dt.strftime(fmt)
  '2002-10-27 01:00:00 EST-0500'

  This library also allows you to do date arithmetic using local
  times, although it is more complicated than working in UTC as you
  need to use the ``normalize()`` method to handle daylight saving time
  and other timezone transitions. In this example, ``loc_dt`` is set
  to the instant when daylight saving time ends in the US/Eastern
  timezone.

  >>> before = loc_dt - timedelta(minutes=10)
  >>> before.strftime(fmt)
  '2002-10-27 00:50:00 EST-0500'
  >>> eastern.normalize(before).strftime(fmt)
  '2002-10-27 01:50:00 EDT-0400'
  >>> after = eastern.normalize(before + timedelta(minutes=20))
  >>> after.strftime(fmt)
  '2002-10-27 01:10:00 EST-0500'

  Creating local times is also tricky, and the reason why working with
  local times is not recommended. Unfortunately, you cannot just pass
  a ``tzinfo`` argument when constructing a datetime (see the next
  section for more details)

  >>> dt = datetime(2002, 10, 27, 1, 30, 0)
  >>> dt1 = eastern.localize(dt, is_dst=True)
  >>> dt1.strftime(fmt)
  '2002-10-27 01:30:00 EDT-0400'
  >>> dt2 = eastern.localize(dt, is_dst=False)
  >>> dt2.strftime(fmt)
  '2002-10-27 01:30:00 EST-0500'

  Converting between timezones is more easily done, using the
  standard astimezone method.

  >>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
  >>> utc_dt.strftime(fmt)
  '2006-03-26 21:34:59 UTC+0000'
  >>> au_tz = timezone('Australia/Sydney')
  >>> au_dt = utc_dt.astimezone(au_tz)
  >>> au_dt.strftime(fmt)
  '2006-03-27 08:34:59 AEDT+1100'
  >>> utc_dt2 = au_dt.astimezone(utc)
  >>> utc_dt2.strftime(fmt)
  '2006-03-26 21:34:59 UTC+0000'
  >>> utc_dt == utc_dt2
  True

  You can take shortcuts when dealing with the UTC side of timezone
  conversions. ``normalize()`` and ``localize()`` are not really
  necessary when there are no daylight saving time transitions to
  deal with.

  >>> utc_dt = datetime.utcfromtimestamp(1143408899).replace(tzinfo=utc)
  >>> utc_dt.strftime(fmt)
  '2006-03-26 21:34:59 UTC+0000'
  >>> au_tz = timezone('Australia/Sydney')
  >>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
  >>> au_dt.strftime(fmt)
  '2006-03-27 08:34:59 AEDT+1100'
  >>> utc_dt2 = au_dt.astimezone(utc)
  >>> utc_dt2.strftime(fmt)
  '2006-03-26 21:34:59 UTC+0000'


  ``tzinfo`` API
  --------------

  The ``tzinfo`` instances returned by the ``timezone()`` function have
  been extended to cope with ambiguous times by adding an ``is_dst``
  parameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.

  >>> tz = timezone('America/St_Johns')

  >>> normal = datetime(2009, 9, 1)
  >>> ambiguous = datetime(2009, 10, 31, 23, 30)

  The ``is_dst`` parameter is ignored for most timestamps. It is only used
  during DST transition ambiguous periods to resolve that ambiguity.

  >>> tz.utcoffset(normal, is_dst=True)
  datetime.timedelta(-1, 77400)
  >>> tz.dst(normal, is_dst=True)
  datetime.timedelta(0, 3600)
  >>> tz.tzname(normal, is_dst=True)
  'NDT'

  >>> tz.utcoffset(ambiguous, is_dst=True)
  datetime.timedelta(-1, 77400)
  >>> tz.dst(ambiguous, is_dst=True)
  datetime.timedelta(0, 3600)
  >>> tz.tzname(ambiguous, is_dst=True)
  'NDT'

  >>> tz.utcoffset(normal, is_dst=False)
  datetime.timedelta(-1, 77400)
  >>> tz.dst(normal, is_dst=False)
  datetime.timedelta(0, 3600)
  >>> tz.tzname(normal, is_dst=False)
  'NDT'

  >>> tz.utcoffset(ambiguous, is_dst=False)
  datetime.timedelta(-1, 73800)
  >>> tz.dst(ambiguous, is_dst=False)
  datetime.timedelta(0)
  >>> tz.tzname(ambiguous, is_dst=False)
  'NST'

  If ``is_dst`` is not specified, ambiguous timestamps will raise
  an ``pytz.exceptions.AmbiguousTimeError`` exception.

  >>> tz.utcoffset(normal)
  datetime.timedelta(-1, 77400)
  >>> tz.dst(normal)
  datetime.timedelta(0, 3600)
  >>> tz.tzname(normal)
  'NDT'

  >>> import pytz.exceptions
  >>> try:
  ...     tz.utcoffset(ambiguous)
  ... except pytz.exceptions.AmbiguousTimeError:
  ...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
  pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
  >>> try:
  ...     tz.dst(ambiguous)
  ... except pytz.exceptions.AmbiguousTimeError:
  ...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
  pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
  >>> try:
  ...     tz.tzname(ambiguous)
  ... except pytz.exceptions.AmbiguousTimeError:
  ...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
  pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00


  Problems with Localtime
  ~~~~~~~~~~~~~~~~~~~~~~~

  The major problem we have to deal with is that certain datetimes
  may occur twice in a year. For example, in the US/Eastern timezone
  on the last Sunday morning in October, the following sequence
  happens:

      - 01:00 EDT occurs
      - 1 hour later, instead of 2:00am the clock is turned back 1 hour
        and 01:00 happens again (this time 01:00 EST)

  In fact, every instant between 01:00 and 02:00 occurs twice. This means
  that if you try and create a time in the 'US/Eastern' timezone
  the standard datetime syntax, there is no way to specify if you meant
  before of after the end-of-daylight-saving-time transition. Using the
  pytz custom syntax, the best you can do is make an educated guess:

  >>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))
  >>> loc_dt.strftime(fmt)
  '2002-10-27 01:30:00 EST-0500'

  As you can see, the system has chosen one for you and there is a 50%
  chance of it being out by one hour. For some applications, this does
  not matter. However, if you are trying to schedule meetings with people
  in different timezones or analyze log files it is not acceptable.

  The best and simplest solution is to stick with using UTC.  The pytz
  package encourages using UTC for internal timezone representation by
  including a special UTC implementation based on the standard Python
  reference implementation in the Python documentation.

  The UTC timezone unpickles to be the same instance, and pickles to a
  smaller size than other pytz tzinfo instances.  The UTC implementation
  can be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').

  >>> import pickle, pytz
  >>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
  >>> naive = dt.replace(tzinfo=None)
  >>> p = pickle.dumps(dt, 1)
  >>> naive_p = pickle.dumps(naive, 1)
  >>> len(p) - len(naive_p)
  17
  >>> new = pickle.loads(p)
  >>> new == dt
  True
  >>> new is dt
  False
  >>> new.tzinfo is dt.tzinfo
  True
  >>> pytz.utc is pytz.UTC is pytz.timezone('UTC')
  True

  Note that some other timezones are commonly thought of as the same (GMT,
  Greenwich, Universal, etc.). The definition of UTC is distinct from these
  other timezones, and they are not equivalent. For this reason, they will
  not compare the same in Python.

  >>> utc == pytz.timezone('GMT')
  False

  See the section `What is UTC`_, below.

  If you insist on working with local times, this library provides a
  facility for constructing them unambiguously:

  >>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
  >>> est_dt = eastern.localize(loc_dt, is_dst=True)
  >>> edt_dt = eastern.localize(loc_dt, is_dst=False)
  >>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
  2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500

  If you pass None as the is_dst flag to localize(), pytz will refuse to
  guess and raise exceptions if you try to build ambiguous or non-existent
  times.

  For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
  timezone when the clocks where put back at the end of Daylight Saving
  Time:

  >>> dt = datetime(2002, 10, 27, 1, 30, 00)
  >>> try:
  ...     eastern.localize(dt, is_dst=None)
  ... except pytz.exceptions.AmbiguousTimeError:
  ...     print('pytz.exceptions.AmbiguousTimeError: %s' % dt)
  pytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00

  Similarly, 2:30am on 7th April 2002 never happened at all in the
  US/Eastern timezone, as the clocks where put forward at 2:00am skipping
  the entire hour:

  >>> dt = datetime(2002, 4, 7, 2, 30, 00)
  >>> try:
  ...     eastern.localize(dt, is_dst=None)
  ... except pytz.exceptions.NonExistentTimeError:
  ...     print('pytz.exceptions.NonExistentTimeError: %s' % dt)
  pytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00

  Both of these exceptions share a common base class to make error handling
  easier:

  >>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)
  True
  >>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)
  True


  A special case is where countries change their timezone definitions
  with no daylight savings time switch. For example, in 1915 Warsaw
  switched from Warsaw time to Central European time with no daylight savings
  transition. So at the stroke of midnight on August 5th 1915 the clocks
  were wound back 24 minutes creating an ambiguous time period that cannot
  be specified without referring to the timezone abbreviation or the
  actual UTC offset. In this case midnight happened twice, neither time
  during a daylight saving time period. pytz handles this transition by
  treating the ambiguous period before the switch as daylight savings
  time, and the ambiguous period after as standard time.


  >>> warsaw = pytz.timezone('Europe/Warsaw')
  >>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)
  >>> amb_dt1.strftime(fmt)
  '1915-08-04 23:59:59 WMT+0124'
  >>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)
  >>> amb_dt2.strftime(fmt)
  '1915-08-04 23:59:59 CET+0100'
  >>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)
  >>> switch_dt.strftime(fmt)
  '1915-08-05 00:00:00 CET+0100'
  >>> str(switch_dt - amb_dt1)
  '0:24:01'
  >>> str(switch_dt - amb_dt2)
  '0:00:01'

  The best way of creating a time during an ambiguous time period is
  by converting from another timezone such as UTC:

  >>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)
  >>> utc_dt.astimezone(warsaw).strftime(fmt)
  '1915-08-04 23:36:00 CET+0100'

  The standard Python way of handling all these ambiguities is not to
  handle them, such as demonstrated in this example using the US/Eastern
  timezone definition from the Python documentation (Note that this
  implementation only works for dates between 1987 and 2006 - it is
  included for tests only!):

  >>> from pytz.reference import Eastern # pytz.reference only for tests
  >>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)
  >>> str(dt)
  '2002-10-27 00:30:00-04:00'
  >>> str(dt + timedelta(hours=1))
  '2002-10-27 01:30:00-05:00'
  >>> str(dt + timedelta(hours=2))
  '2002-10-27 02:30:00-05:00'
  >>> str(dt + timedelta(hours=3))
  '2002-10-27 03:30:00-05:00'

  Notice the first two results? At first glance you might think they are
  correct, but taking the UTC offset into account you find that they are
  actually two hours appart instead of the 1 hour we asked for.

  >>> from pytz.reference import UTC # pytz.reference only for tests
  >>> str(dt.astimezone(UTC))
  '2002-10-27 04:30:00+00:00'
  >>> str((dt + timedelta(hours=1)).astimezone(UTC))
  '2002-10-27 06:30:00+00:00'


  Country Information
  ~~~~~~~~~~~~~~~~~~~

  A mechanism is provided to access the timezones commonly in use
  for a particular country, looked up using the ISO 3166 country code.
  It returns a list of strings that can be used to retrieve the relevant
  tzinfo instance using ``pytz.timezone()``:

  >>> print(' '.join(pytz.country_timezones['nz']))
  Pacific/Auckland Pacific/Chatham

  The Olson database comes with a ISO 3166 country code to English country
  name mapping that pytz exposes as a dictionary:

  >>> print(pytz.country_names['nz'])
  New Zealand


  What is UTC
  ~~~~~~~~~~~

  'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct
  from, Greenwich Mean Time (GMT) and the various definitions of Universal
  Time. UTC is now the worldwide standard for regulating clocks and time
  measurement.

  All other timezones are defined relative to UTC, and include offsets like
  UTC+0800 - hours to add or subtract from UTC to derive the local time. No
  daylight saving time occurs in UTC, making it a useful timezone to perform
  date arithmetic without worrying about the confusion and ambiguities caused
  by daylight saving time transitions, your country changing its timezone, or
  mobile computers that roam through multiple timezones.

  ..  _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time


  Helpers
  ~~~~~~~

  There are two lists of timezones provided.

  ``all_timezones`` is the exhaustive list of the timezone names that can
  be used.

  >>> from pytz import all_timezones
  >>> len(all_timezones) >= 500
  True
  >>> 'Etc/Greenwich' in all_timezones
  True

  ``common_timezones`` is a list of useful, current timezones. It doesn't
  contain deprecated zones or historical zones, except for a few I've
  deemed in common usage, such as US/Eastern (open a bug report if you
  think other timezones are deserving of being included here). It is also
  a sequence of strings.

  >>> from pytz import common_timezones
  >>> len(common_timezones) < len(all_timezones)
  True
  >>> 'Etc/Greenwich' in common_timezones
  False
  >>> 'Australia/Melbourne' in common_timezones
  True
  >>> 'US/Eastern' in common_timezones
  True
  >>> 'Canada/Eastern' in common_timezones
  True
  >>> 'Australia/Yancowinna' in all_timezones
  True
  >>> 'Australia/Yancowinna' in common_timezones
  False

  Both ``common_timezones`` and ``all_timezones`` are alphabetically
  sorted:

  >>> common_timezones_dupe = common_timezones[:]
  >>> common_timezones_dupe.sort()
  >>> common_timezones == common_timezones_dupe
  True
  >>> all_timezones_dupe = all_timezones[:]
  >>> all_timezones_dupe.sort()
  >>> all_timezones == all_timezones_dupe
  True

  ``all_timezones`` and ``common_timezones`` are also available as sets.

  >>> from pytz import all_timezones_set, common_timezones_set
  >>> 'US/Eastern' in all_timezones_set
  True
  >>> 'US/Eastern' in common_timezones_set
  True
  >>> 'Australia/Victoria' in common_timezones_set
  False

  You can also retrieve lists of timezones used by particular countries
  using the ``country_timezones()`` function. It requires an ISO-3166
  two letter country code.

  >>> from pytz import country_timezones
  >>> print(' '.join(country_timezones('ch')))
  Europe/Zurich
  >>> print(' '.join(country_timezones('CH')))
  Europe/Zurich


  Internationalization - i18n/l10n
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Pytz is an interface to the IANA database, which uses ASCII names. The `Unicode  Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_
  project provides translations. Thomas Khyn's
  `l18n <https://pypi.org/project/l18n/>`_ package can be used to access
  these translations from Python.


  License
  ~~~~~~~

  MIT license.

  This code is also available as part of Zope 3 under the Zope Public
  License,  Version 2.1 (ZPL).

  I'm happy to relicense this code if necessary for inclusion in other
  open source projects.


  Latest Versions
  ~~~~~~~~~~~~~~~

  This package will be updated after releases of the Olson timezone
  database.  The latest version can be downloaded from the `Python Package
  Index <https://pypi.org/project/pytz/>`_.  The code that is used
  to generate this distribution is hosted on launchpad.net and available
  using git::

      git clone https://git.launchpad.net/pytz

  A mirror on github is also available at https://github.com/stub42/pytz

  Announcements of new releases are made on
  `Launchpad <https://launchpad.net/pytz>`_, and the
  `Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_
  hosted there.


  Bugs, Feature Requests & Patches
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Bugs can be reported using `Launchpad <https://bugs.launchpad.net/pytz>`__.


  Issues & Limitations
  ~~~~~~~~~~~~~~~~~~~~

  - Offsets from UTC are rounded to the nearest whole minute, so timezones
    such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This
    is a limitation of the Python datetime library.

  - If you think a timezone definition is incorrect, I probably can't fix
    it. pytz is a direct translation of the Olson timezone database, and
    changes to the timezone definitions need to be made to this source.
    If you find errors they should be reported to the time zone mailing
    list, linked from http://www.iana.org/time-zones.


  Further Reading
  ~~~~~~~~~~~~~~~

  More info than you want to know about timezones:
  http://www.twinsun.com/tz/tz-link.htm


  Contact
  ~~~~~~~

  Stuart Bishop <stuart@stuartbishop.net>


pkgId: 65c06e36e4fa633a34fc0959a0bf3970a90d5175a030747ad09ef145863c1193
name: rh-python36-pyvmomi
arch: noarch
version: 6.7.3
epoch: 0
release: 2
summary: VMware vSphere Python SDK
url: https://github.com/vmware/pyvmomi
rpm_license: License :: OSI Approved :: Apache Software License
rpm_vendor: VMware, Inc. <jhu@vmware.com>
rpm_group: Development/Libraries
rpm_buildhost: a8165db4c0fe4bef84f592d993506ebb
rpm_sourcerpm: rh-python36-pyvmomi-6.7.3-2.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387207-rh-python36-pyvmomi/rh-python36-pyvmomi-6.7.3-2.noarch.rpm
checksum_type: sha256
description:
  .. image:: https://travis-ci.org/vmware/pyvmomi.svg?branch=v6.0.0.2016.4
      :target: https://travis-ci.org/vmware/pyvmomi
      :alt: Build Status

  .. image:: https://img.shields.io/pypi/dm/pyvmomi.svg
      :target: https://pypi.python.org/pypi/pyvmomi/
      :alt: Downloads

  pyVmomi is the Python SDK for the VMware vSphere API that allows you to manage
  ESX, ESXi, and vCenter.

  Getting Started
  ================
  To get started, see the `getting started guide <http://vmware.github.io/pyvmomi-community-samples/#getting-started>`_. You'll need `Python <https://www.python.org/downloads/>`_, `pip <https://pip.pypa.io/en/latest/installing.html#using-package-managers>`_, and the `samples project <https://github.com/vmware/pyvmomi-community-samples/tarball/master>`_.

  * http://vmware.github.io/pyvmomi-community-samples/
  * community discussion on IRC freenode.net channels `#pyvmomi and #pyvmomi-dev <http://webchat.freenode.net/?channels=#pyvmomi,#pyvmomi-dev>`_
  * community email is on `nabble <http://pyvmomi.2338814.n4.nabble.com>`_

  Don't know what pip is? Any serious python developer should know, so here's a `throrough intro to pip <http://www.dabapps.com/blog/introduction-to-pip-and-virtualenv-python/>`_ that we like.

  Installing
  ==========
  The master is code that is in development, official releases are tagged and
  posted to `pypi <https://pypi.python.org/pypi/pyvmomi/>`_

  * The official release is available using pip, just run
    ``pip install --upgrade pyvmomi``.
  * To install the version in `github <https://github.com/vmware/pyvmomi>`_ use
    ``python setup.py develop`` for development install or
    ``python setup.py install``.

  Testing
  =======
  Unit tests can be invoked by using the `tox <https://testrun.org/tox/>`_ command. You may have to
  configure multiple python interpreters so that you can test in all the
  environments listed in ``tox.ini`` or you will have to run ``tox`` with the
  ``-e`` flag to run only in your version of python. For example, if you only
  have Python 2.7 then ``tox -e py27`` will limit your test run to Python 2.7.

  Contributing
  ============
  * Research `open issues <https://github.com/vmware/pyvmomi/issues?q=is%3Aopen+is%3Aissue>`_
  * Follow the `contribution standards <https://github.com/vmware/pyvmomi/wiki/Contributions>`_
  * Coordinate with `other developers <http://webchat.freenode.net/?channels=#pyvmomi,#pyvmomi-dev>`_ on the project.

  Documentation
  =============
  For general language neutral documentation of vSphere Management API see:

  * `vSphere WS SDK API Docs <http://pubs.vmware.com/vsphere-65/topic/com.vmware.wssdk.apiref.doc/right-pane.html>`_

  Python Support
  ==============
  * pyVmomi 6.5 supports 2.7, 3.3, 3.4 and 3.5
  * pyVmomi 6.0.0.2016.4 and later support 2.7, 3.3 and 3.4
  * pyVmomi 6.0.0 and later support 2.7, 3.3 and 3.4
  * pyVmomi 5.5.0-2014.1 and 5.5.0-2014.1.1 support Python 2.6, 2.7, 3.3 and 3.4
  * pyVmomi 5.5.0 and below support Python 2.6 and 2.7

  Compatibility Policy
  ====================
  pyVmomi versions are marked vSphere_version-release . Pyvmomi maintains minimum
  backward compatibility with the previous _four_ releases of *vSphere* and it's
  own previous four releases. Compatibility with much older versions may continue
  to work but will not be actively supported.

  For example, version v6.0.0 is most compatible with vSphere 6.0, 5.5, 5.1 and
  5.0. Initial releases compatible with a version of vSphere will bare a naked
  version number of v6.0.0 indicating that version of pyVmomi was released
  simultaneously with the *GA* version of vSphere with the same version number.

  Releases
  ========
  * `6.5 <https://github.com/vmware/pyvmomi/tree/v6.5.0>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v6.5.0
  * `6.0.0.2016.4 <https://github.com/vmware/pyvmomi/tree/v6.0.0.2016.4>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v6.0.0.2016.4
  * `6.0.0 <https://github.com/vmware/pyvmomi/tree/v6.0.0>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v6.0.0
  * `5.5.0-2014.1.1 <https://github.com/vmware/pyvmomi/tree/v5.5.0-2014.1.1>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v5.5.0-2014.1.1
  * `5.5.0-2014.1 <https://github.com/vmware/pyvmomi/tree/v5.5.0-2014.1>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v5.5.0-2014.1
  * `5.5.0 <https://github.com/vmware/pyvmomi/tree/v5.5.0>`_
  * `5.1.0 <https://github.com/vmware/pyvmomi/tree/v5.1.0>`_
     release notes https://github.com/vmware/pyvmomi/releases/tag/v5.1.0

  Related Projects
  ================
  * VMware vSphere Automation SDK for Python: https://developercenter.vmware.com/web/sdk/65/vsphere-automation-python
  * Samples Project: https://github.com/vmware/pyvmomi-community-samples
  * Feature Incubator: pyvmomi-tools https://github.com/vmware/pyvmomi-tools

  Have fun!


pkgId: 24a2fcc2670a205bb49666617521bf487f79f490396db4f0351e4d7b87076a6e
name: rh-python36-redis
arch: noarch
version: 3.3.11
epoch: 0
release: 1
summary: Python client for Redis key-value store
url: https://github.com/andymccurdy/redis-py
rpm_license: MIT
rpm_vendor: Andy McCurdy <sedrik@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 76a78d4cde15440e9f1cd16fc744f8d1
rpm_sourcerpm: rh-python36-redis-3.3.11-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387010-rh-python36-redis/rh-python36-redis-3.3.11-1.noarch.rpm
checksum_type: sha256
description:
  redis-py
  ========

  The Python interface to the Redis key-value store.

  .. image:: https://secure.travis-ci.org/andymccurdy/redis-py.svg?branch=master
          :target: https://travis-ci.org/andymccurdy/redis-py
  .. image:: https://readthedocs.org/projects/redis-py/badge/?version=latest&style=flat
          :target: https://redis-py.readthedocs.io/en/latest/
  .. image:: https://badge.fury.io/py/redis.svg
          :target: https://pypi.org/project/redis/
  .. image:: https://codecov.io/gh/andymccurdy/redis-py/branch/master/graph/badge.svg
    :target: https://codecov.io/gh/andymccurdy/redis-py

  Installation
  ------------

  redis-py requires a running Redis server. See `Redis's quickstart
  <https://redis.io/topics/quickstart>`_ for installation instructions.

  redis-py can be installed using `pip` similar to other Python packages. Do not use `sudo`
  with `pip`. It is usually good to work in a
  `virtualenv <https://virtualenv.pypa.io/en/latest/>`_ or
  `venv <https://docs.python.org/3/library/venv.html>`_ to avoid conflicts with other package
  managers and Python projects. For a quick introduction see
  `Python Virtual Environments in Five Minutes <https://bit.ly/py-env>`_.

  To install redis-py, simply:

  .. code-block:: bash

      $ pip install redis

  or from source:

  .. code-block:: bash

      $ python setup.py install


  Getting Started
  ---------------

  .. code-block:: pycon

      >>> import redis
      >>> r = redis.Redis(host='localhost', port=6379, db=0)
      >>> r.set('foo', 'bar')
      True
      >>> r.get('foo')
      'bar'

  By default, all responses are returned as `bytes` in Python 3 and `str` in
  Python 2. The user is responsible for decoding to Python 3 strings or Python 2
  unicode objects.

  If **all** string responses from a client should be decoded, the user can
  specify `decode_responses=True` to `Redis.__init__`. In this case, any
  Redis command that returns a string type will be decoded with the `encoding`
  specified.


  Upgrading from redis-py 2.X to 3.0
  ----------------------------------

  redis-py 3.0 introduces many new features but required a number of backwards
  incompatible changes to be made in the process. This section attempts to
  provide an upgrade path for users migrating from 2.X to 3.0.


  Python Version Support
  ^^^^^^^^^^^^^^^^^^^^^^

  redis-py 3.0 now supports Python 2.7 and Python 3.4+. Python 2.6 and 3.3
  support has been dropped.


  Client Classes: Redis and StrictRedis
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  redis-py 3.0 drops support for the legacy "Redis" client class. "StrictRedis"
  has been renamed to "Redis" and an alias named "StrictRedis" is provided so
  that users previously using "StrictRedis" can continue to run unchanged.

  The 2.X "Redis" class provided alternative implementations of a few commands.
  This confused users (rightfully so) and caused a number of support issues. To
  make things easier going forward, it was decided to drop support for these
  alternate implementations and instead focus on a single client class.

  2.X users that are already using StrictRedis don't have to change the class
  name. StrictRedis will continue to work for the forseeable future.

  2.X users that are using the Redis class will have to make changes if they
  use any of the following commands:

  * SETEX: The argument order has changed. The new order is (name, time, value).
  * LREM: The argument order has changed. The new order is (name, num, value).
  * TTL and PTTL: The return value is now always an int and matches the
    official Redis command (>0 indicates the timeout, -1 indicates that the key
    exists but that it has no expire time set, -2 indicates that the key does
    not exist)


  SSL Connections
  ^^^^^^^^^^^^^^^

  redis-py 3.0 changes the default value of the `ssl_cert_reqs` option from
  `None` to `'required'`. See
  `Issue 1016 <https://github.com/andymccurdy/redis-py/issues/1016>`_. This
  change enforces hostname validation when accepting a cert from a remote SSL
  terminator. If the terminator doesn't properly set the hostname on the cert
  this will cause redis-py 3.0 to raise a ConnectionError.

  This check can be disabled by setting `ssl_cert_reqs` to `None`. Note that
  doing so removes the security check. Do so at your own risk.

  It has been reported that SSL certs received from AWS ElastiCache do not have
  proper hostnames and turning off hostname verification is currently required.


  MSET, MSETNX and ZADD
  ^^^^^^^^^^^^^^^^^^^^^

  These commands all accept a mapping of key/value pairs. In redis-py 2.X
  this mapping could be specified as ``*args`` or as ``**kwargs``. Both of these
  styles caused issues when Redis introduced optional flags to ZADD. Relying on
  ``*args`` caused issues with the optional argument order, especially in Python
  2.7. Relying on ``**kwargs`` caused potential collision issues of user keys with
  the argument names in the method signature.

  To resolve this, redis-py 3.0 has changed these three commands to all accept
  a single positional argument named mapping that is expected to be a dict. For
  MSET and MSETNX, the dict is a mapping of key-names -> values. For ZADD, the
  dict is a mapping of element-names -> score.

  MSET, MSETNX and ZADD now look like:

  .. code-block:: pycon

      def mset(self, mapping):
      def msetnx(self, mapping):
      def zadd(self, name, mapping, nx=False, xx=False, ch=False, incr=False):

  All 2.X users that use these commands must modify their code to supply
  keys and values as a dict to these commands.


  ZINCRBY
  ^^^^^^^

  redis-py 2.X accidentally modified the argument order of ZINCRBY, swapping the
  order of value and amount. ZINCRBY now looks like:

  .. code-block:: pycon

      def zincrby(self, name, amount, value):

  All 2.X users that rely on ZINCRBY must swap the order of amount and value
  for the command to continue to work as intended.


  Encoding of User Input
  ^^^^^^^^^^^^^^^^^^^^^^

  redis-py 3.0 only accepts user data as bytes, strings or numbers (ints, longs
  and floats). Attempting to specify a key or a value as any other type will
  raise a DataError exception.

  redis-py 2.X attempted to coerce any type of input into a string. While
  occasionally convenient, this caused all sorts of hidden errors when users
  passed boolean values (which were coerced to 'True' or 'False'), a None
  value (which was coerced to 'None') or other values, such as user defined
  types.

  All 2.X users should make sure that the keys and values they pass into
  redis-py are either bytes, strings or numbers.


  Locks
  ^^^^^

  redis-py 3.0 drops support for the pipeline-based Lock and now only supports
  the Lua-based lock. In doing so, LuaLock has been renamed to Lock. This also
  means that redis-py Lock objects require Redis server 2.6 or greater.

  2.X users that were explicitly referring to "LuaLock" will have to now refer
  to "Lock" instead.


  Locks as Context Managers
  ^^^^^^^^^^^^^^^^^^^^^^^^^

  redis-py 3.0 now raises a LockError when using a lock as a context manager and
  the lock cannot be acquired within the specified timeout. This is more of a
  bug fix than a backwards incompatible change. However, given an error is now
  raised where none was before, this might alarm some users.

  2.X users should make sure they're wrapping their lock code in a try/catch
  like this:

  .. code-block:: pycon

      try:
          with r.lock('my-lock-key', blocking_timeout=5) as lock:
              
      except LockError:
          


  API Reference
  -------------

  The `official Redis command documentation <https://redis.io/commands>`_ does a
  great job of explaining each command in detail. redis-py attempts to adhere
  to the official command syntax. There are a few exceptions:

  * **SELECT**: Not implemented. See the explanation in the Thread Safety section
    below.
  * **DEL**: 'del' is a reserved keyword in the Python syntax. Therefore redis-py
    uses 'delete' instead.
  * **MULTI/EXEC**: These are implemented as part of the Pipeline class. The
    pipeline is wrapped with the MULTI and EXEC statements by default when it
    is executed, which can be disabled by specifying transaction=False.
    See more about Pipelines below.
  * **SUBSCRIBE/LISTEN**: Similar to pipelines, PubSub is implemented as a separate
    class as it places the underlying connection in a state where it can't
    execute non-pubsub commands. Calling the pubsub method from the Redis client
    will return a PubSub instance where you can subscribe to channels and listen
    for messages. You can only call PUBLISH from the Redis client (see
    `this comment on issue #151
    <https://github.com/andymccurdy/redis-py/issues/151#issuecomment-1545015>`_
    for details).
  * **SCAN/SSCAN/HSCAN/ZSCAN**: The \*SCAN commands are implemented as they
    exist in the Redis documentation. In addition, each command has an equivalent
    iterator method. These are purely for convenience so the user doesn't have
    to keep track of the cursor while iterating. Use the
    scan_iter/sscan_iter/hscan_iter/zscan_iter methods for this behavior.


  More Detail
  -----------

  Connection Pools
  ^^^^^^^^^^^^^^^^

  Behind the scenes, redis-py uses a connection pool to manage connections to
  a Redis server. By default, each Redis instance you create will in turn create
  its own connection pool. You can override this behavior and use an existing
  connection pool by passing an already created connection pool instance to the
  connection_pool argument of the Redis class. You may choose to do this in order
  to implement client side sharding or have finer grain control of how
  connections are managed.

  .. code-block:: pycon

      >>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
      >>> r = redis.Redis(connection_pool=pool)

  Connections
  ^^^^^^^^^^^

  ConnectionPools manage a set of Connection instances. redis-py ships with two
  types of Connections. The default, Connection, is a normal TCP socket based
  connection. The UnixDomainSocketConnection allows for clients running on the
  same device as the server to connect via a unix domain socket. To use a
  UnixDomainSocketConnection connection, simply pass the unix_socket_path
  argument, which is a string to the unix domain socket file. Additionally, make
  sure the unixsocket parameter is defined in your redis.conf file. It's
  commented out by default.

  .. code-block:: pycon

      >>> r = redis.Redis(unix_socket_path='/tmp/redis.sock')

  You can create your own Connection subclasses as well. This may be useful if
  you want to control the socket behavior within an async framework. To
  instantiate a client class using your own connection, you need to create
  a connection pool, passing your class to the connection_class argument.
  Other keyword parameters you pass to the pool will be passed to the class
  specified during initialization.

  .. code-block:: pycon

      >>> pool = redis.ConnectionPool(connection_class=YourConnectionClass,
                                      your_arg='...', ...)

  Connections maintain an open socket to the Redis server. Sometimes these
  sockets are interrupted or disconnected for a variety of reasons. For example,
  network appliances, load balancers and other services that sit between clients
  and servers are often configured to kill connections that remain idle for a
  given threshold.

  When a connection becomes disconnected, the next command issued on that
  connection will fail and redis-py will raise a ConnectionError to the caller.
  This allows each application that uses redis-py to handle errors in a way
  that's fitting for that specific application. However, constant error
  handling can be verbose and cumbersome, especially when socket disconnections
  happen frequently in many production environments.

  To combat this, redis-py can issue regular health checks to assess the
  liveliness of a connection just before issuing a command. Users can pass
  ``health_check_interval=N`` to the Redis or ConnectionPool classes or
  as a query argument within a Redis URL. The value of ``health_check_interval``
  must be an integer. A value of ``0``, the default, disables health checks.
  Any positive integer will enable health checks. Health checks are performed
  just before a command is executed if the underlying connection has been idle
  for more than ``health_check_interval`` seconds. For example,
  ``health_check_interval=30`` will ensure that a health check is run on any
  connection that has been idle for 30 or more seconds just before a command
  is executed on that connection.

  If your application is running in an environment that disconnects idle
  connections after 30 seconds you should set the ``health_check_interval``
  option to a value less than 30.

  This option also works on any PubSub connection that is created from a
  client with ``health_check_interval`` enabled. PubSub users need to ensure
  that ``get_message()`` or ``listen()`` are called more frequently than
  ``health_check_interval`` seconds. It is assumed that most workloads already
  do this.

  If your PubSub use case doesn't call ``get_message()`` or ``listen()``
  frequently, you should call ``pubsub.check_health()`` explicitly on a
  regularly basis.

  Parsers
  ^^^^^^^

  Parser classes provide a way to control how responses from the Redis server
  are parsed. redis-py ships with two parser classes, the PythonParser and the
  HiredisParser. By default, redis-py will attempt to use the HiredisParser if
  you have the hiredis module installed and will fallback to the PythonParser
  otherwise.

  Hiredis is a C library maintained by the core Redis team. Pieter Noordhuis was
  kind enough to create Python bindings. Using Hiredis can provide up to a
  10x speed improvement in parsing responses from the Redis server. The
  performance increase is most noticeable when retrieving many pieces of data,
  such as from LRANGE or SMEMBERS operations.

  Hiredis is available on PyPI, and can be installed via pip just like redis-py.

  .. code-block:: bash

      $ pip install hiredis

  Response Callbacks
  ^^^^^^^^^^^^^^^^^^

  The client class uses a set of callbacks to cast Redis responses to the
  appropriate Python type. There are a number of these callbacks defined on
  the Redis client class in a dictionary called RESPONSE_CALLBACKS.

  Custom callbacks can be added on a per-instance basis using the
  set_response_callback method. This method accepts two arguments: a command
  name and the callback. Callbacks added in this manner are only valid on the
  instance the callback is added to. If you want to define or override a callback
  globally, you should make a subclass of the Redis client and add your callback
  to its RESPONSE_CALLBACKS class dictionary.

  Response callbacks take at least one parameter: the response from the Redis
  server. Keyword arguments may also be accepted in order to further control
  how to interpret the response. These keyword arguments are specified during the
  command's call to execute_command. The ZRANGE implementation demonstrates the
  use of response callback keyword arguments with its "withscores" argument.

  Thread Safety
  ^^^^^^^^^^^^^

  Redis client instances can safely be shared between threads. Internally,
  connection instances are only retrieved from the connection pool during
  command execution, and returned to the pool directly after. Command execution
  never modifies state on the client instance.

  However, there is one caveat: the Redis SELECT command. The SELECT command
  allows you to switch the database currently in use by the connection. That
  database remains selected until another is selected or until the connection is
  closed. This creates an issue in that connections could be returned to the pool
  that are connected to a different database.

  As a result, redis-py does not implement the SELECT command on client
  instances. If you use multiple Redis databases within the same application, you
  should create a separate client instance (and possibly a separate connection
  pool) for each database.

  It is not safe to pass PubSub or Pipeline objects between threads.

  Pipelines
  ^^^^^^^^^

  Pipelines are a subclass of the base Redis class that provide support for
  buffering multiple commands to the server in a single request. They can be used
  to dramatically increase the performance of groups of commands by reducing the
  number of back-and-forth TCP packets between the client and server.

  Pipelines are quite simple to use:

  .. code-block:: pycon

      >>> r = redis.Redis(...)
      >>> r.set('bing', 'baz')
      >>> # Use the pipeline() method to create a pipeline instance
      >>> pipe = r.pipeline()
      >>> # The following SET commands are buffered
      >>> pipe.set('foo', 'bar')
      >>> pipe.get('bing')
      >>> # the EXECUTE call sends all buffered commands to the server, returning
      >>> # a list of responses, one for each command.
      >>> pipe.execute()
      [True, 'baz']

  For ease of use, all commands being buffered into the pipeline return the
  pipeline object itself. Therefore calls can be chained like:

  .. code-block:: pycon

      >>> pipe.set('foo', 'bar').sadd('faz', 'baz').incr('auto_number').execute()
      [True, True, 6]

  In addition, pipelines can also ensure the buffered commands are executed
  atomically as a group. This happens by default. If you want to disable the
  atomic nature of a pipeline but still want to buffer commands, you can turn
  off transactions.

  .. code-block:: pycon

      >>> pipe = r.pipeline(transaction=False)

  A common issue occurs when requiring atomic transactions but needing to
  retrieve values in Redis prior for use within the transaction. For instance,
  let's assume that the INCR command didn't exist and we need to build an atomic
  version of INCR in Python.

  The completely naive implementation could GET the value, increment it in
  Python, and SET the new value back. However, this is not atomic because
  multiple clients could be doing this at the same time, each getting the same
  value from GET.

  Enter the WATCH command. WATCH provides the ability to monitor one or more keys
  prior to starting a transaction. If any of those keys change prior the
  execution of that transaction, the entire transaction will be canceled and a
  WatchError will be raised. To implement our own client-side INCR command, we
  could do something like this:

  .. code-block:: pycon

      >>> with r.pipeline() as pipe:
      ...     while True:
      ...         try:
      ...             # put a WATCH on the key that holds our sequence value
      ...             pipe.watch('OUR-SEQUENCE-KEY')
      ...             # after WATCHing, the pipeline is put into immediate execution
      ...             # mode until we tell it to start buffering commands again.
      ...             # this allows us to get the current value of our sequence
      ...             current_value = pipe.get('OUR-SEQUENCE-KEY')
      ...             next_value = int(current_value) + 1
      ...             # now we can put the pipeline back into buffered mode with MULTI
      ...             pipe.multi()
      ...             pipe.set('OUR-SEQUENCE-KEY', next_value)
      ...             # and finally, execute the pipeline (the set command)
      ...             pipe.execute()
      ...             # if a WatchError wasn't raised during execution, everything
      ...             # we just did happened atomically.
      ...             break
      ...        except WatchError:
      ...             # another client must have changed 'OUR-SEQUENCE-KEY' between
      ...             # the time we started WATCHing it and the pipeline's execution.
      ...             # our best bet is to just retry.
      ...             continue

  Note that, because the Pipeline must bind to a single connection for the
  duration of a WATCH, care must be taken to ensure that the connection is
  returned to the connection pool by calling the reset() method. If the
  Pipeline is used as a context manager (as in the example above) reset()
  will be called automatically. Of course you can do this the manual way by
  explicitly calling reset():

  .. code-block:: pycon

      >>> pipe = r.pipeline()
      >>> while True:
      ...     try:
      ...         pipe.watch('OUR-SEQUENCE-KEY')
      ...         ...
      ...         pipe.execute()
      ...         break
      ...     except WatchError:
      ...         continue
      ...     finally:
      ...         pipe.reset()

  A convenience method named "transaction" exists for handling all the
  boilerplate of handling and retrying watch errors. It takes a callable that
  should expect a single parameter, a pipeline object, and any number of keys to
  be WATCHed. Our client-side INCR command above can be written like this,
  which is much easier to read:

  .. code-block:: pycon

      >>> def client_side_incr(pipe):
      ...     current_value = pipe.get('OUR-SEQUENCE-KEY')
      ...     next_value = int(current_value) + 1
      ...     pipe.multi()
      ...     pipe.set('OUR-SEQUENCE-KEY', next_value)
      >>>
      >>> r.transaction(client_side_incr, 'OUR-SEQUENCE-KEY')
      [True]

  Publish / Subscribe
  ^^^^^^^^^^^^^^^^^^^

  redis-py includes a `PubSub` object that subscribes to channels and listens
  for new messages. Creating a `PubSub` object is easy.

  .. code-block:: pycon

      >>> r = redis.Redis(...)
      >>> p = r.pubsub()

  Once a `PubSub` instance is created, channels and patterns can be subscribed
  to.

  .. code-block:: pycon

      >>> p.subscribe('my-first-channel', 'my-second-channel', ...)
      >>> p.psubscribe('my-*', ...)

  The `PubSub` instance is now subscribed to those channels/patterns. The
  subscription confirmations can be seen by reading messages from the `PubSub`
  instance.

  .. code-block:: pycon

      >>> p.get_message()
      {'pattern': None, 'type': 'subscribe', 'channel': 'my-second-channel', 'data': 1L}
      >>> p.get_message()
      {'pattern': None, 'type': 'subscribe', 'channel': 'my-first-channel', 'data': 2L}
      >>> p.get_message()
      {'pattern': None, 'type': 'psubscribe', 'channel': 'my-*', 'data': 3L}

  Every message read from a `PubSub` instance will be a dictionary with the
  following keys.

  * **type**: One of the following: 'subscribe', 'unsubscribe', 'psubscribe',
    'punsubscribe', 'message', 'pmessage'
  * **channel**: The channel [un]subscribed to or the channel a message was
    published to
  * **pattern**: The pattern that matched a published message's channel. Will be
    `None` in all cases except for 'pmessage' types.
  * **data**: The message data. With [un]subscribe messages, this value will be
    the number of channels and patterns the connection is currently subscribed
    to. With [p]message messages, this value will be the actual published
    message.

  Let's send a message now.

  .. code-block:: pycon

      
      
      
      
      >>> r.publish('my-first-channel', 'some data')
      2
      >>> p.get_message()
      {'channel': 'my-first-channel', 'data': 'some data', 'pattern': None, 'type': 'message'}
      >>> p.get_message()
      {'channel': 'my-first-channel', 'data': 'some data', 'pattern': 'my-*', 'type': 'pmessage'}

  Unsubscribing works just like subscribing. If no arguments are passed to
  [p]unsubscribe, all channels or patterns will be unsubscribed from.

  .. code-block:: pycon

      >>> p.unsubscribe()
      >>> p.punsubscribe('my-*')
      >>> p.get_message()
      {'channel': 'my-second-channel', 'data': 2L, 'pattern': None, 'type': 'unsubscribe'}
      >>> p.get_message()
      {'channel': 'my-first-channel', 'data': 1L, 'pattern': None, 'type': 'unsubscribe'}
      >>> p.get_message()
      {'channel': 'my-*', 'data': 0L, 'pattern': None, 'type': 'punsubscribe'}

  redis-py also allows you to register callback functions to handle published
  messages. Message handlers take a single argument, the message, which is a
  dictionary just like the examples above. To subscribe to a channel or pattern
  with a message handler, pass the channel or pattern name as a keyword argument
  with its value being the callback function.

  When a message is read on a channel or pattern with a message handler, the
  message dictionary is created and passed to the message handler. In this case,
  a `None` value is returned from get_message() since the message was already
  handled.

  .. code-block:: pycon

      >>> def my_handler(message):
      ...     print 'MY HANDLER: ', message['data']
      >>> p.subscribe(**{'my-channel': my_handler})
      
      >>> p.get_message()
      {'pattern': None, 'type': 'subscribe', 'channel': 'my-channel', 'data': 1L}
      >>> r.publish('my-channel', 'awesome data')
      1
      
      
      
      >>> message = p.get_message()
      MY HANDLER:  awesome data
      
      
      >>> print message
      None

  If your application is not interested in the (sometimes noisy)
  subscribe/unsubscribe confirmation messages, you can ignore them by passing
  `ignore_subscribe_messages=True` to `r.pubsub()`. This will cause all
  subscribe/unsubscribe messages to be read, but they won't bubble up to your
  application.

  .. code-block:: pycon

      >>> p = r.pubsub(ignore_subscribe_messages=True)
      >>> p.subscribe('my-channel')
      >>> p.get_message()  # hides the subscribe message and returns None
      >>> r.publish('my-channel', 'my data')
      1
      >>> p.get_message()
      {'channel': 'my-channel', 'data': 'my data', 'pattern': None, 'type': 'message'}

  There are three different strategies for reading messages.

  The examples above have been using `pubsub.get_message()`. Behind the scenes,
  `get_message()` uses the system's 'select' module to quickly poll the
  connection's socket. If there's data available to be read, `get_message()` will
  read it, format the message and return it or pass it to a message handler. If
  there's no data to be read, `get_message()` will immediately return None. This
  makes it trivial to integrate into an existing event loop inside your
  application.

  .. code-block:: pycon

      >>> while True:
      >>>     message = p.get_message()
      >>>     if message:
      >>>         # do something with the message
      >>>     time.sleep(0.001)  # be nice to the system :)

  Older versions of redis-py only read messages with `pubsub.listen()`. listen()
  is a generator that blocks until a message is available. If your application
  doesn't need to do anything else but receive and act on messages received from
  redis, listen() is an easy way to get up an running.

  .. code-block:: pycon

      >>> for message in p.listen():
      ...     # do something with the message

  The third option runs an event loop in a separate thread.
  `pubsub.run_in_thread()` creates a new thread and starts the event loop. The
  thread object is returned to the caller of `run_in_thread()`. The caller can
  use the `thread.stop()` method to shut down the event loop and thread. Behind
  the scenes, this is simply a wrapper around `get_message()` that runs in a
  separate thread, essentially creating a tiny non-blocking event loop for you.
  `run_in_thread()` takes an optional `sleep_time` argument. If specified, the
  event loop will call `time.sleep()` with the value in each iteration of the
  loop.

  Note: Since we're running in a separate thread, there's no way to handle
  messages that aren't automatically handled with registered message handlers.
  Therefore, redis-py prevents you from calling `run_in_thread()` if you're
  subscribed to patterns or channels that don't have message handlers attached.

  .. code-block:: pycon

      >>> p.subscribe(**{'my-channel': my_handler})
      >>> thread = p.run_in_thread(sleep_time=0.001)
      
      
      >>> thread.stop()

  A PubSub object adheres to the same encoding semantics as the client instance
  it was created from. Any channel or pattern that's unicode will be encoded
  using the `charset` specified on the client before being sent to Redis. If the
  client's `decode_responses` flag is set the False (the default), the
  'channel', 'pattern' and 'data' values in message dictionaries will be byte
  strings (str on Python 2, bytes on Python 3). If the client's
  `decode_responses` is True, then the 'channel', 'pattern' and 'data' values
  will be automatically decoded to unicode strings using the client's `charset`.

  PubSub objects remember what channels and patterns they are subscribed to. In
  the event of a disconnection such as a network error or timeout, the
  PubSub object will re-subscribe to all prior channels and patterns when
  reconnecting. Messages that were published while the client was disconnected
  cannot be delivered. When you're finished with a PubSub object, call its
  `.close()` method to shutdown the connection.

  .. code-block:: pycon

      >>> p = r.pubsub()
      >>> ...
      >>> p.close()


  The PUBSUB set of subcommands CHANNELS, NUMSUB and NUMPAT are also
  supported:

  .. code-block:: pycon

      >>> r.pubsub_channels()
      ['foo', 'bar']
      >>> r.pubsub_numsub('foo', 'bar')
      [('foo', 9001), ('bar', 42)]
      >>> r.pubsub_numsub('baz')
      [('baz', 0)]
      >>> r.pubsub_numpat()
      1204

  Monitor
  ^^^^^^^
  redis-py includes a `Monitor` object that streams every command processed
  by the Redis server. Use `listen()` on the `Monitor` object to block
  until a command is received.

  .. code-block:: pycon

      >>> r = redis.Redis(...)
      >>> with r.monitor() as m:
      >>>     for command in m.listen():
      >>>         print(command)

  Lua Scripting
  ^^^^^^^^^^^^^

  redis-py supports the EVAL, EVALSHA, and SCRIPT commands. However, there are
  a number of edge cases that make these commands tedious to use in real world
  scenarios. Therefore, redis-py exposes a Script object that makes scripting
  much easier to use.

  To create a Script instance, use the `register_script` function on a client
  instance passing the Lua code as the first argument. `register_script` returns
  a Script instance that you can use throughout your code.

  The following trivial Lua script accepts two parameters: the name of a key and
  a multiplier value. The script fetches the value stored in the key, multiplies
  it with the multiplier value and returns the result.

  .. code-block:: pycon

      >>> r = redis.Redis()
      >>> lua = """
      ... local value = redis.call('GET', KEYS[1])
      ... value = tonumber(value)
      ... return value * ARGV[1]"""
      >>> multiply = r.register_script(lua)

  `multiply` is now a Script instance that is invoked by calling it like a
  function. Script instances accept the following optional arguments:

  * **keys**: A list of key names that the script will access. This becomes the
    KEYS list in Lua.
  * **args**: A list of argument values. This becomes the ARGV list in Lua.
  * **client**: A redis-py Client or Pipeline instance that will invoke the
    script. If client isn't specified, the client that initially
    created the Script instance (the one that `register_script` was
    invoked from) will be used.

  Continuing the example from above:

  .. code-block:: pycon

      >>> r.set('foo', 2)
      >>> multiply(keys=['foo'], args=[5])
      10

  The value of key 'foo' is set to 2. When multiply is invoked, the 'foo' key is
  passed to the script along with the multiplier value of 5. Lua executes the
  script and returns the result, 10.

  Script instances can be executed using a different client instance, even one
  that points to a completely different Redis server.

  .. code-block:: pycon

      >>> r2 = redis.Redis('redis2.example.com')
      >>> r2.set('foo', 3)
      >>> multiply(keys=['foo'], args=[5], client=r2)
      15

  The Script object ensures that the Lua script is loaded into Redis's script
  cache. In the event of a NOSCRIPT error, it will load the script and retry
  executing it.

  Script objects can also be used in pipelines. The pipeline instance should be
  passed as the client argument when calling the script. Care is taken to ensure
  that the script is registered in Redis's script cache just prior to pipeline
  execution.

  .. code-block:: pycon

      >>> pipe = r.pipeline()
      >>> pipe.set('foo', 5)
      >>> multiply(keys=['foo'], args=[5], client=pipe)
      >>> pipe.execute()
      [True, 25]

  Sentinel support
  ^^^^^^^^^^^^^^^^

  redis-py can be used together with `Redis Sentinel <https://redis.io/topics/sentinel>`_
  to discover Redis nodes. You need to have at least one Sentinel daemon running
  in order to use redis-py's Sentinel support.

  Connecting redis-py to the Sentinel instance(s) is easy. You can use a
  Sentinel connection to discover the master and slaves network addresses:

  .. code-block:: pycon

      >>> from redis.sentinel import Sentinel
      >>> sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1)
      >>> sentinel.discover_master('mymaster')
      ('127.0.0.1', 6379)
      >>> sentinel.discover_slaves('mymaster')
      [('127.0.0.1', 6380)]

  You can also create Redis client connections from a Sentinel instance. You can
  connect to either the master (for write operations) or a slave (for read-only
  operations).

  .. code-block:: pycon

      >>> master = sentinel.master_for('mymaster', socket_timeout=0.1)
      >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
      >>> master.set('foo', 'bar')
      >>> slave.get('foo')
      'bar'

  The master and slave objects are normal Redis instances with their
  connection pool bound to the Sentinel instance. When a Sentinel backed client
  attempts to establish a connection, it first queries the Sentinel servers to
  determine an appropriate host to connect to. If no server is found,
  a MasterNotFoundError or SlaveNotFoundError is raised. Both exceptions are
  subclasses of ConnectionError.

  When trying to connect to a slave client, the Sentinel connection pool will
  iterate over the list of slaves until it finds one that can be connected to.
  If no slaves can be connected to, a connection will be established with the
  master.

  See `Guidelines for Redis clients with support for Redis Sentinel
  <https://redis.io/topics/sentinel-clients>`_ to learn more about Redis Sentinel.

  Scan Iterators
  ^^^^^^^^^^^^^^

  The \*SCAN commands introduced in Redis 2.8 can be cumbersome to use. While
  these commands are fully supported, redis-py also exposes the following methods
  that return Python iterators for convenience: `scan_iter`, `hscan_iter`,
  `sscan_iter` and `zscan_iter`.

  .. code-block:: pycon

      >>> for key, value in (('A', '1'), ('B', '2'), ('C', '3')):
      ...     r.set(key, value)
      >>> for key in r.scan_iter():
      ...     print key, r.get(key)
      A 1
      B 2
      C 3

  Author
  ^^^^^^

  redis-py is developed and maintained by Andy McCurdy (sedrik@gmail.com).
  It can be found here: https://github.com/andymccurdy/redis-py

  Special thanks to:

  * Ludovico Magnocavallo, author of the original Python Redis client, from
    which some of the socket code is still used.
  * Alexander Solovyov for ideas on the generic response callback system.
  * Paul Hubbard for initial packaging support.


pkgId: 047ff940b6b69d92e4fbb5a3e7612fada16d831e83313c0085afebb0b6c78ef3
name: rh-python36-requests
arch: noarch
version: 2.23.0
epoch: 0
release: 1
summary: Python HTTP for Humans.
url: http://python-requests.org
rpm_license: Apache 2.0
rpm_vendor: Kenneth Reitz <me@kennethreitz.org>
rpm_group: Development/Libraries
rpm_buildhost: 03db2573c1b04008988a253886528f6b
rpm_sourcerpm: rh-python36-requests-2.23.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387171-rh-python36-requests/rh-python36-requests-2.23.0-1.noarch.rpm
checksum_type: sha256
description:
  Requests: HTTP for Humans™
  ==========================

  [![image](https://img.shields.io/pypi/v/requests.svg)](https://pypi.org/project/requests/)
  [![image](https://img.shields.io/pypi/l/requests.svg)](https://pypi.org/project/requests/)
  [![image](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests/)
  [![codecov.io](https://codecov.io/github/requests/requests/coverage.svg?branch=master)](https://codecov.io/github/requests/requests)
  [![image](https://img.shields.io/github/contributors/requests/requests.svg)](https://github.com/requests/requests/graphs/contributors)
  [![image](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/kennethreitz)

  **If you're interested in financially supporting Kenneth Reitz open source, consider [visiting this link](https://cash.me/$KennethReitz). Your support helps tremendously with sustainability of motivation, as Open Source is no longer part of my day job.**

  Requests is the only *Non-GMO* HTTP library for Python, safe for human
  consumption.

  ![image](https://farm5.staticflickr.com/4317/35198386374_1939af3de6_k_d.jpg)

  Behold, the power of Requests:

  ``` {.sourceCode .python}
  >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
  >>> r.status_code
  200
  >>> r.headers['content-type']
  'application/json; charset=utf8'
  >>> r.encoding
  'utf-8'
  >>> r.text
  u'{"type":"User"...'
  >>> r.json()
  {u'disk_usage': 368627, u'private_gists': 484, ...}
  ```

  See [the similar code, sans Requests](https://gist.github.com/973705).

  [![image](https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png)](http://docs.python-requests.org/)

  Requests allows you to send *organic, grass-fed* HTTP/1.1 requests,
  without the need for manual labor. There's no need to manually add query
  strings to your URLs, or to form-encode your POST data. Keep-alive and
  HTTP connection pooling are 100% automatic, thanks to
  [urllib3](https://github.com/shazow/urllib3).

  Besides, all the cool kids are doing it. Requests is one of the most
  downloaded Python packages of all time, pulling in over 11,000,000
  downloads every month. You don't want to be left out!

  Feature Support
  ---------------

  Requests is ready for today's web.

  -   International Domains and URLs
  -   Keep-Alive & Connection Pooling
  -   Sessions with Cookie Persistence
  -   Browser-style SSL Verification
  -   Basic/Digest Authentication
  -   Elegant Key/Value Cookies
  -   Automatic Decompression
  -   Automatic Content Decoding
  -   Unicode Response Bodies
  -   Multipart File Uploads
  -   HTTP(S) Proxy Support
  -   Connection Timeouts
  -   Streaming Downloads
  -   `.netrc` Support
  -   Chunked Requests

  Requests officially supports Python 2.7 & 3.4–3.7, and runs great on
  PyPy.

  Installation
  ------------

  To install Requests, simply use [pipenv](http://pipenv.org/) (or pip, of
  course):

  ``` {.sourceCode .bash}
  $ pipenv install requests
  ✨🍰✨
  ```

  Satisfaction guaranteed.

  Documentation
  -------------

  Fantastic documentation is available at
  <http://docs.python-requests.org/>, for a limited time only.

  How to Contribute
  -----------------

  1.  Check for open issues or open a fresh issue to start a discussion
      around a feature idea or a bug. There is a [Contributor
      Friendly](https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open)
      tag for issues that should be ideal for people who are not very
      familiar with the codebase yet.
  2.  Fork [the repository](https://github.com/requests/requests) on
      GitHub to start making your changes to the **master** branch (or
      branch off of it).
  3.  Write a test which shows that the bug was fixed or that the feature
      works as expected.
  4.  Send a pull request and bug the maintainer until it gets merged and
      published. :) Make sure to add yourself to
      [AUTHORS](https://github.com/requests/requests/blob/master/AUTHORS.rst).


pkgId: 860c0d12b7694470e95d88c67c5817f046a12d8d220683f8302aa8f27498085a
name: rh-python36-requests-oauthlib
arch: noarch
version: 1.3.0
epoch: 0
release: 1
summary: OAuthlib authentication support for Requests.
url: https://github.com/requests/requests-oauthlib
rpm_license: ISC
rpm_vendor: Kenneth Reitz <me@kennethreitz.com>
rpm_group: Development/Libraries
rpm_buildhost: b7a3374f8f4d431cad7e3fbef7ff2be2
rpm_sourcerpm: rh-python36-requests-oauthlib-1.3.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387164-rh-python36-requests-oauthlib/rh-python36-requests-oauthlib-1.3.0-1.noarch.rpm
checksum_type: sha256
description:
  Requests-OAuthlib |build-status| |coverage-status| |docs|
  =========================================================

  This project provides first-class OAuth library support for `Requests <http://python-requests.org>`_.

  The OAuth 1 workflow
  --------------------

  OAuth 1 can seem overly complicated and it sure has its quirks. Luckily,
  requests_oauthlib hides most of these and let you focus at the task at hand.

  Accessing protected resources using requests_oauthlib is as simple as:

  .. code-block:: pycon

      >>> from requests_oauthlib import OAuth1Session
      >>> twitter = OAuth1Session('client_key',
                                  client_secret='client_secret',
                                  resource_owner_key='resource_owner_key',
                                  resource_owner_secret='resource_owner_secret')
      >>> url = 'https://api.twitter.com/1/account/settings.json'
      >>> r = twitter.get(url)

  Before accessing resources you will need to obtain a few credentials from your
  provider (e.g. Twitter) and authorization from the user for whom you wish to
  retrieve resources for. You can read all about this in the full
  `OAuth 1 workflow guide on RTD <https://requests-oauthlib.readthedocs.io/en/latest/oauth1_workflow.html>`_.

  The OAuth 2 workflow
  --------------------

  OAuth 2 is generally simpler than OAuth 1 but comes in more flavours. The most
  common being the Authorization Code Grant, also known as the WebApplication
  flow.

  Fetching a protected resource after obtaining an access token can be extremely
  simple. However, before accessing resources you will need to obtain a few
  credentials from your provider (e.g. Google) and authorization from the user
  for whom you wish to retrieve resources for. You can read all about this in the
  full `OAuth 2 workflow guide on RTD <https://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html>`_.

  Installation
  -------------

  To install requests and requests_oauthlib you can use pip:

  .. code-block:: bash

      $ pip install requests requests_oauthlib

  .. |build-status| image:: https://travis-ci.org/requests/requests-oauthlib.svg?branch=master
     :target: https://travis-ci.org/requests/requests-oauthlib
  .. |coverage-status| image:: https://img.shields.io/coveralls/requests/requests-oauthlib.svg
     :target: https://coveralls.io/r/requests/requests-oauthlib
  .. |docs| image:: https://readthedocs.org/projects/requests-oauthlib/badge/
     :alt: Documentation Status
     :scale: 100%
     :target: https://requests-oauthlib.readthedocs.io/


  History
  -------

  UNRELEASED
  ++++++++++

  nothing yet

  v1.2.0 (14 January 2019)
  ++++++++++++++++++++++++

  - This project now depends on OAuthlib 3.0.0 and above. It does **not** support
    versions of OAuthlib before 3.0.0.
  - Updated oauth2 tests to use 'sess' for an OAuth2Session instance instead of `auth`
    because OAuth2Session objects and methods acceept an `auth` paramether which is
    typically an instance of `requests.auth.HTTPBasicAuth`
  - `OAuth2Session.fetch_token` previously tried to guess how and where to provide
    "client" and "user" credentials incorrectly. This was incompatible with some
    OAuth servers and incompatible with breaking changes in oauthlib that seek to
    correctly provide the `client_id`. The older implementation also did not raise
    the correct exceptions when username and password are not present on Legacy
    clients.
  - Avoid automatic netrc authentication for OAuth2Session.

  v1.1.0 (9 January 2019)
  +++++++++++++++++++++++

  - Adjusted version specifier for ``oauthlib`` dependency: this project is
    not yet compatible with ``oauthlib`` 3.0.0.
  - Dropped dependency on ``nose``.
  - Minor changes to clean up the code and make it more readable/maintainable.

  v1.0.0 (4 June 2018)
  ++++++++++++++++++++

  - **Removed support for Python 2.6 and Python 3.3.**
    This project now supports Python 2.7, and Python 3.4 and above.
  - Added several examples to the documentation.
  - Added plentymarkets compliance fix.
  - Added a ``token`` property to OAuth1Session, to match the corresponding
    ``token`` property on OAuth2Session.

  v0.8.0 (14 February 2017)
  +++++++++++++++++++++++++

  - Added Fitbit compliance fix.
  - Fixed an issue where newlines in the response body for the access token
    request would cause errors when trying to extract the token.
  - Fixed an issue introduced in v0.7.0 where users passing ``auth`` to several
    methods would encounter conflicts with the ``client_id`` and
    ``client_secret``-derived auth. The user-supplied ``auth`` argument is now
    used in preference to those options.

  v0.7.0 (22 September 2016)
  ++++++++++++++++++++++++++

  - Allowed ``OAuth2Session.request`` to take the ``client_id`` and
    ``client_secret`` parameters for the purposes of automatic token refresh,
    which may need them.

  v0.6.2 (12 July 2016)
  +++++++++++++++++++++

  - Use ``client_id`` and ``client_secret`` for the Authorization header if
    provided.
  - Allow explicit bypass of the Authorization header by setting ``auth=False``.
  - Pass through the ``proxies`` kwarg when refreshing tokens.
  - Miscellaneous cleanups.

  v0.6.1 (19 February 2016)
  +++++++++++++++++++++++++

  - Fixed a bug when sending authorization in headers with no username and
    password present.
  - Make sure we clear the session token before obtaining a new one.
  - Some improvements to the Slack compliance fix.
  - Avoid timing problems around token refresh.
  - Allow passing arbitrary arguments to requests when calling
    ``fetch_request_token`` and ``fetch_access_token``.

  v0.6.0 (14 December 2015)
  +++++++++++++++++++++++++

  - Add compliance fix for Slack.
  - Add compliance fix for Mailchimp.
  - ``TokenRequestDenied`` exceptions now carry the entire response, not just the
    status code.
  - Pass through keyword arguments when refreshing tokens automatically.
  - Send authorization in headers, not just body, to maximize compatibility.
  - More getters/setters available for OAuth2 session client values.
  - Allow sending custom headers when refreshing tokens, and set some defaults.


  v0.5.0 (4 May 2015)
  +++++++++++++++++++
  - Fix ``TypeError`` being raised instead of ``TokenMissing`` error.
  - Raise requests exceptions on 4XX and 5XX responses in the OAuth2 flow.
  - Avoid ``AttributeError`` when initializing the ``OAuth2Session`` class
    without complete client information.

  v0.4.2 (16 October 2014)
  ++++++++++++++++++++++++
  - New ``authorized`` property on OAuth1Session and OAuth2Session, which allows
    you to easily determine if the session is already authorized with OAuth tokens
    or not.
  - New ``TokenMissing`` and ``VerifierMissing`` exception classes for OAuth1Session:
    this will make it easier to catch and identify these exceptions.

  v0.4.1 (6 June 2014)
  ++++++++++++++++++++
  - New install target ``[rsa]`` for people using OAuth1 RSA-SHA1 signature
    method.
  - Fixed bug in OAuth2 where supplied state param was not used in auth url.
  - OAuth2 HTTPS checking can be disabled by setting environment variable
    ``OAUTHLIB_INSECURE_TRANSPORT``.
  - OAuth1 now re-authorize upon redirects.
  - OAuth1 token fetching now raise a detailed error message when the
    response body is incorrectly encoded or the request was denied.
  - Added support for custom OAuth1 clients.
  - OAuth2 compliance fix for Sina Weibo.
  - Multiple fixes to facebook compliance fix.
  - Compliance fixes now re-encode body properly as bytes in Python 3.
  - Logging now properly done under ``requests_oauthlib`` namespace instead
    of piggybacking on oauthlib namespace.
  - Logging introduced for OAuth1 auth and session.

  v0.4.0 (29 September 2013)
  ++++++++++++++++++++++++++
  - OAuth1Session methods only return unicode strings. #55.
  - Renamed requests_oauthlib.core to requests_oauthlib.oauth1_auth for consistency. #79.
  - Added Facebook compliance fix and access_token_response hook to OAuth2Session. #63.
  - Added LinkedIn compliance fix.
  - Added refresh_token_response compliance hook, invoked before parsing the refresh token.
  - Correctly limit compliance hooks to running only once!
  - Content type guessing should only be done when no content type is given
  - OAuth1 now updates r.headers instead of replacing it with non case insensitive dict
  - Remove last use of Response.content (in OAuth1Session). #44.
  - State param can now be supplied in OAuth2Session.authorize_url


pkgId: 372a811d8b37fc9a20607f9d8cf6e53c7cbe5a2c975260d551ff906798ec99b7
name: rh-python36-rsa
arch: noarch
version: 4.0
epoch: 0
release: 1
summary: Pure-Python RSA implementation
url: https://stuvel.eu/rsa
rpm_license: ASL 2
rpm_vendor: Sybren A. Stuvel <sybren@stuvel.eu>
rpm_group: Development/Libraries
rpm_buildhost: a1edf3b6ce944047aa28d650a93b4ae0
rpm_sourcerpm: rh-python36-rsa-4.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387288-rh-python36-rsa/rh-python36-rsa-4.0-1.noarch.rpm
checksum_type: sha256
description:
  Pure Python RSA implementation
  ==============================

  [![PyPI](https://img.shields.io/pypi/v/rsa.svg)](https://pypi.org/project/rsa/)
  [![Build Status](https://travis-ci.org/sybrenstuvel/python-rsa.svg?branch=master)](https://travis-ci.org/sybrenstuvel/python-rsa)
  [![Coverage Status](https://coveralls.io/repos/github/sybrenstuvel/python-rsa/badge.svg?branch=master)](https://coveralls.io/github/sybrenstuvel/python-rsa?branch=master)
  [![Code Climate](https://img.shields.io/codeclimate/github/sybrenstuvel/python-rsa.svg)](https://codeclimate.com/github/sybrenstuvel/python-rsa)

  [Python-RSA](https://stuvel.eu/rsa) is a pure-Python RSA implementation. It supports
  encryption and decryption, signing and verifying signatures, and key
  generation according to PKCS#1 version 1.5. It can be used as a Python
  library as well as on the commandline. The code was mostly written by
  Sybren A.  Stüvel.

  Documentation can be found at the [Python-RSA homepage](https://stuvel.eu/rsa).

  Download and install using:

      pip install rsa

  or download it from the [Python Package Index](https://pypi.org/project/rsa/).

  The source code is maintained at [GitHub](https://github.com/sybrenstuvel/python-rsa/) and is
  licensed under the [Apache License, version 2.0](https://www.apache.org/licenses/LICENSE-2.0)


  Major changes in 4.0
  --------------------

  Version 3.4 was the last version in the 3.x range. Version 4.0 drops the following modules,
  as they are insecure:

  - `rsa._version133`
  - `rsa._version200`
  - `rsa.bigfile`
  - `rsa.varblock`

  Those modules were marked as deprecated in version 3.4.

  Furthermore, in 4.0 the I/O functions is streamlined to always work with bytes on all
  supported versions of Python.

  Version 4.0 drops support for Python 2.6 and 3.3.


pkgId: 4e7d652a45ae23ef3feff9d3d0bad1e7db13cf5a0d69698a527d8f1a5b02eba3
name: rh-python36-ruamel.yaml
arch: src
version: 0.16.5
epoch: 0
release: 1
url: https://bitbucket.org/ruamel/yaml
rpm_license: MIT license
rpm_vendor: Anthon van der Neut <a.van.der.neut@ruamel.eu>
rpm_group: Development/Libraries
rpm_buildhost: e4c5ae8dfcfd44408af989ed49b021d9
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387292-rh-python36-ruamel.yaml/rh-python36-ruamel.yaml-0.16.5-1.src.rpm
checksum_type: sha256
summary:
  ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order

description:
  ruamel.yaml
  ===========

  ``ruamel.yaml`` is a YAML 1.2 loader/dumper package for Python.

  :version:       0.15.99
  :updated:       2019-07-12
  :documentation: http://yaml.readthedocs.io
  :repository:    https://bitbucket.org/ruamel/yaml
  :pypi:          https://pypi.org/project/ruamel.yaml/


  Starting with version 0.15.0 the way YAML files are loaded and dumped
  is changing. See the API doc for details.  Currently existing
  functionality will throw a warning before being changed/removed.
  **For production systems you should pin the version being used with
  ``ruamel.yaml<=0.15``**. There might be bug fixes in the 0.14 series,
  but new functionality is likely only to be available via the new API.

  If your package uses ``ruamel.yaml`` and is not listed on PyPI, drop
  me an email, preferably with some information on how you use the
  package (or a link to bitbucket/github) and I'll keep you informed
  when the status of the API is stable enough to make the transition.

  * `Overview <http://yaml.readthedocs.org/en/latest/overview.html>`_
  * `Installing <http://yaml.readthedocs.org/en/latest/install.html>`_
  * `Basic Usage <http://yaml.readthedocs.org/en/latest/basicuse.html>`_
  * `Details <http://yaml.readthedocs.org/en/latest/detail.html>`_
  * `Examples <http://yaml.readthedocs.org/en/latest/example.html>`_
  * `API <http://yaml.readthedocs.org/en/latest/api.html>`_
  * `Differences with PyYAML <http://yaml.readthedocs.org/en/latest/pyyaml.html>`_

  .. image:: https://readthedocs.org/projects/yaml/badge/?version=stable
     :target: https://yaml.readthedocs.org/en/stable

  .. image:: https://bestpractices.coreinfrastructure.org/projects/1128/badge
     :target: https://bestpractices.coreinfrastructure.org/projects/1128

  .. image:: https://bitbucket.org/ruamel/yaml/raw/default/_doc/_static/license.svg
     :target: https://opensource.org/licenses/MIT

  .. image:: https://bitbucket.org/ruamel/yaml/raw/default/_doc/_static/pypi.svg
     :target: https://pypi.org/project/ruamel.yaml/

  .. image:: https://bitbucket.org/ruamel/oitnb/raw/default/_doc/_static/oitnb.svg
     :target: https://pypi.org/project/oitnb/

  .. image:: http://www.mypy-lang.org/static/mypy_badge.svg
     :target: http://mypy-lang.org/

  ChangeLog
  =========

  .. should insert NEXT: at the beginning of line for next key (with empty line)

  0.15.99 (2019-07-12):
    - add `py.typed` to distribution, based on a PR submitted by
      `Michael Crusoe
      <https://bitbucket.org/%7Bc9fbde69-e746-48f5-900d-34992b7860c8%7D/>`__
    - merge PR 40 (also by Michael Crusoe) to more accurately specify
      repository in the README (also reported in a misunderstood issue
      some time ago)

  0.15.98 (2019-07-09):
    - regenerate ext/_ruamel_yaml.c with Cython version 0.29.12, needed
      for Python 3.8.0b2 (reported by `John Vandenberg
      <https://bitbucket.org/%7B6d4e8487-3c97-4dab-a060-088ec50c682c%7D/>`__)

  0.15.97 (2019-06-06):
    - regenerate ext/_ruamel_yaml.c with Cython version 0.29.10, needed for
      Python 3.8.0b1
    - regenerate ext/_ruamel_yaml.c with Cython version 0.29.9, needed for
      Python 3.8.0a4 (reported by `Anthony Sottile
      <https://bitbucket.org/%7B569cc8ea-0d9e-41cb-94a4-19ea517324df%7D/>`__)

  0.15.96 (2019-05-16):
    - fix failure to indent comments on round-trip anchored block style
      scalars in block sequence (reported by `William Kimball
      <https://bitbucket.org/%7Bba35ed20-4bb0-46f8-bb5d-c29871e86a22%7D/>`__)

  0.15.95 (2019-05-16):
    - fix failure to round-trip anchored scalars in block sequence
      (reported by `William Kimball
      <https://bitbucket.org/%7Bba35ed20-4bb0-46f8-bb5d-c29871e86a22%7D/>`__)
    - wheel files for Python 3.4 no longer provided (`Python 3.4 EOL 2019-03-18
      <https://www.python.org/dev/peps/pep-0429/>`__)

  0.15.94 (2019-04-23):
    - fix missing line-break after end-of-file comments not ending in
      line-break (reported by `Philip Thompson
      <https://bitbucket.org/%7Be42ba205-0876-4151-bcbe-ccaea5bd13ce%7D/>`__)

  0.15.93 (2019-04-21):
    - fix failure to parse empty implicit flow mapping key
    - in YAML 1.1 plains scalars `y`, 'n', `Y`, and 'N' are now
      correctly recognised as booleans and such strings dumped quoted
      (reported by `Marcel Bollmann
      <https://bitbucket.org/%7Bd8850921-9145-4ad0-ac30-64c3bd9b036d%7D/>`__)

  0.15.92 (2019-04-16):
    - fix failure to parse empty implicit block mapping key (reported by
      `Nolan W <https://bitbucket.org/i2labs/>`__)

  0.15.91 (2019-04-05):
    - allowing duplicate keys would not work for merge keys (reported by mamacdon on
      `StackOverflow <https://stackoverflow.com/questions/55540686/>`__

  0.15.90 (2019-04-04):
    - fix issue with updating `CommentedMap` from list of tuples (reported by
      `Peter Henry <https://bitbucket.org/mosbasik/>`__)

  0.15.89 (2019-02-27):
    - fix for items with flow-mapping in block sequence output on single line
      (reported by `Zahari Dim <https://bitbucket.org/zahari_dim/>`__)
    - fix for safe dumping erroring in creation of representereror when dumping namedtuple
      (reported and solution by `Jaakko Kantojärvi <https://bitbucket.org/raphendyr/>`__)

  0.15.88 (2019-02-12):
    - fix inclusing of python code from the subpackage data (containing extra tests,
      reported by `Florian Apolloner <https://bitbucket.org/apollo13/>`__)

  0.15.87 (2019-01-22):
    - fix problem with empty lists and the code to reinsert merge keys (reported via email
       by Zaloo)

  0.15.86 (2019-01-16):
    - reinsert merge key in its old position (reported by grumbler on
      `StackOverflow <https://stackoverflow.com/a/54206512/1307905>`__)
    - fix for issue with non-ASCII anchor names (reported and fix
      provided by Dandaleon Flux via email)
    - fix for issue when parsing flow mapping value starting with colon (in pure Python only)
      (reported by `FichteFoll <https://bitbucket.org/FichteFoll/>`__)

  0.15.85 (2019-01-08):
    - the types used by ``SafeConstructor`` for mappings and sequences can
      now by set by assigning to ``XXXConstructor.yaml_base_dict_type``
      (and ``..._list_type``), preventing the need to copy two methods
      with 50+ lines that had ``var = {}`` hardcoded.  (Implemented to
      help solve an feature request by `Anthony Sottile
      <https://bitbucket.org/asottile/>`__ in an easier way)

  0.15.84 (2019-01-07):
    - fix for ``CommentedMap.copy()`` not returning ``CommentedMap``, let alone copying comments etc.
      (reported by `Anthony Sottile <https://bitbucket.org/asottile/>`__)

  0.15.83 (2019-01-02):
    - fix for bug in roundtripping aliases used as key (reported via email by Zaloo)

  0.15.82 (2018-12-28):
    - anchors and aliases on scalar int, float, string and bool are now preserved. Anchors
      do not need a referring alias for these (reported by
      `Alex Harvey <https://bitbucket.org/alexharv074/>`__)
    - anchors no longer lost on tagged objects when roundtripping (reported by `Zaloo
      <https://bitbucket.org/zaloo/>`__)

  0.15.81 (2018-12-06):
    - fix issue dumping methods of metaclass derived classes (reported and fix provided
      by `Douglas Raillard <https://bitbucket.org/DouglasRaillard/>`__)

  0.15.80 (2018-11-26):
    - fix issue emitting BEL character when round-tripping invalid folded input
      (reported by Isaac on `StackOverflow <https://stackoverflow.com/a/53471217/1307905>`__)

  0.15.79 (2018-11-21):
    - fix issue with anchors nested deeper than alias (reported by gaFF on
      `StackOverflow <https://stackoverflow.com/a/53397781/1307905>`__)

  0.15.78 (2018-11-15):
    - fix setup issue for 3.8 (reported by `Sidney Kuyateh
      <https://bitbucket.org/autinerd/>`__)

  0.15.77 (2018-11-09):
    - setting `yaml.sort_base_mapping_type_on_output = False`, will prevent
      explicit sorting by keys in the base representer of mappings. Roundtrip
      already did not do this. Usage only makes real sense for Python 3.6+
      (feature request by `Sebastian Gerber <https://bitbucket.org/spacemanspiff2007/>`__).
    - implement Python version check in YAML metadata in ``_test/test_z_data.py``

  0.15.76 (2018-11-01):
    - fix issue with empty mapping and sequence loaded as flow-style
      (mapping reported by `Min RK <https://bitbucket.org/minrk/>`__, sequence
      by `Maged Ahmed <https://bitbucket.org/maged2/>`__)

  0.15.75 (2018-10-27):
    - fix issue with single '?' scalar (reported by `Terrance
      <https://bitbucket.org/OllieTerrance/>`__)
    - fix issue with duplicate merge keys (prompted by `answering
      <https://stackoverflow.com/a/52852106/1307905>`__ a
      `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__
      by `math <https://stackoverflow.com/users/1355634/math>`__)

  0.15.74 (2018-10-17):
    - fix dropping of comment on rt before sequence item that is sequence item
      (reported by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__)

  0.15.73 (2018-10-16):
    - fix irregular output on pre-comment in sequence within sequence (reported
      by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__)
    - allow non-compact (i.e. next line) dumping sequence/mapping within sequence.

  0.15.72 (2018-10-06):
    - fix regression on explicit 1.1 loading with the C based scanner/parser
      (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__)

  0.15.71 (2018-09-26):
    - some of the tests now live in YAML files in the
      `yaml.data <https://bitbucket.org/ruamel/yaml.data>`__ repository.
      ``_test/test_z_data.py`` processes these.
    - fix regression where handcrafted CommentedMaps could not be initiated (reported by
      `Dan Helfman <https://bitbucket.org/dhelfman/>`__)
    - fix regression with non-root literal scalars that needed indent indicator
      (reported by `Clark Breyman <https://bitbucket.org/clarkbreyman/>`__)
    - tag:yaml.org,2002:python/object/apply now also uses __qualname__ on PY3
      (reported by `Douglas RAILLARD <https://bitbucket.org/DouglasRaillard/>`__)
    - issue with self-referring object creation
      (reported and fix by `Douglas RAILLARD <https://bitbucket.org/DouglasRaillard/>`__)

  0.15.70 (2018-09-21):
    - reverted CommentedMap and CommentedSeq to subclass ordereddict resp. list,
      reimplemented merge maps so that both ``dict(**commented_map_instance)`` and JSON
      dumping works. This also allows checking with ``isinstance()`` on ``dict`` resp. ``list``.
      (Proposed by `Stuart Berg <https://bitbucket.org/stuarteberg/>`__, with feedback
      from `blhsing <https://stackoverflow.com/users/6890912/blhsing>`__ on
      `StackOverflow <https://stackoverflow.com/q/52314186/1307905>`__)

  0.15.69 (2018-09-20):
    - fix issue with dump_all gobbling end-of-document comments on parsing
      (reported by `Pierre B. <https://bitbucket.org/octplane/>`__)

  0.15.68 (2018-09-20):
    - fix issue with parsabel, but incorrect output with nested flow-style sequences
      (reported by `Dougal Seeley <https://bitbucket.org/dseeley/>`__)
    - fix issue with loading Python objects that have __setstate__ and recursion in parameters
      (reported by `Douglas RAILLARD <https://bitbucket.org/DouglasRaillard/>`__)

  0.15.67 (2018-09-19):
    - fix issue with extra space inserted with non-root literal strings
      (Issue reported and PR with fix provided by
      `Naomi Seyfer <https://bitbucket.org/sixolet/>`__.)

  0.15.66 (2018-09-07):
    - fix issue with fold indicating characters inserted in safe_load-ed folded strings
      (reported by `Maximilian Hils <https://bitbucket.org/mhils/>`__).

  0.15.65 (2018-09-07):
    - fix issue #232 revert to throw ParserError for unexcpected ``]``
      and ``}`` instead of IndexError. (Issue reported and PR with fix
      provided by `Naomi Seyfer <https://bitbucket.org/sixolet/>`__.)
    - added ``key`` and ``reverse`` parameter (suggested by Jannik Klemm via email)
    - indent root level literal scalars that have directive or document end markers
      at the beginning of a line

  0.15.64 (2018-08-30):
    - support round-trip of tagged sequences: ``!Arg [a, {b: 1}]``
    - single entry mappings in flow sequences now written by default without braces,
      set ``yaml.brace_single_entry_mapping_in_flow_sequence=True`` to force
      getting ``[a, {b: 1}, {c: {d: 2}}]`` instead of the default ``[a, b: 1, c: {d: 2}]``
    - fix issue when roundtripping floats starting with a dot such as ``.5``
      (reported by `Harrison Gregg <https://bitbucket.org/HarrisonGregg/>`__)

  0.15.63 (2018-08-29):
    - small fix only necessary for Windows users that don't use wheels.

  0.15.62 (2018-08-29):
    - C based reader/scanner & emitter now allow setting of 1.2 as YAML version.
      ** The loading/dumping is still YAML 1.1 code**, so use the common subset of
      YAML 1.2 and 1.1 (reported by `Ge Yang <https://bitbucket.org/yangge/>`__)

  0.15.61 (2018-08-23):
    - support for round-tripping folded style scalars (initially requested
      by `Johnathan Viduchinsky <https://bitbucket.org/johnathanvidu/>`__)
    - update of C code
    - speed up of scanning (~30% depending on the input)

  0.15.60 (2018-08-18):
    - again allow single entry map in flow sequence context (reported by
      `Lee Goolsbee <https://bitbucket.org/lgoolsbee/>`__)
    - cleanup for mypy
    - spurious print in library (reported by
      `Lele Gaifax <https://bitbucket.org/lele/>`__), now automatically checked

  0.15.59 (2018-08-17):
    - issue with C based loader and leading zeros (reported by
      `Tom Hamilton Stubber <https://bitbucket.org/TomHamiltonStubber/>`__)

  0.15.58 (2018-08-17):
    - simple mappings can now be used as keys when round-tripping::

        {a: 1, b: 2}: hello world

      although using the obvious operations (del, popitem) on the key will
      fail, you can mutilate it by going through its attributes. If you load the
      above YAML in `d`, then changing the value is cumbersome:

          d = {CommentedKeyMap([('a', 1), ('b', 2)]): "goodbye"}

      and changing the key even more so:

          d[CommentedKeyMap([('b', 1), ('a', 2)])] = d.pop(
                       CommentedKeyMap([('a', 1), ('b', 2)]))

      (you can use a `dict` instead of a list of tuples (or ordereddict), but that might result
      in a different order, of the keys of the key, in the output)
    - check integers to dump with 1.2 patterns instead of 1.1 (reported by
      `Lele Gaifax <https://bitbucket.org/lele/>`__)


  0.15.57 (2018-08-15):
    - Fix that CommentedSeq could no longer be used in adding or do a sort
      (reported by `Christopher Wright <https://bitbucket.org/CJ-Wright4242/>`__)

  0.15.56 (2018-08-15):
    - fix issue with ``python -O`` optimizing away code (reported, and detailed cause
      pinpointed, by `Alex Grönholm <https://bitbucket.org/agronholm/>`__)

  0.15.55 (2018-08-14):
    - unmade ``CommentedSeq`` a subclass of ``list``. It is now
      indirectly a subclass of the standard
      ``collections.abc.MutableSequence`` (without .abc if you are
      still on Python2.7). If you do ``isinstance(yaml.load('[1, 2]'),
      list)``) anywhere in your code replace ``list`` with
      ``MutableSequence``.  Directly, ``CommentedSeq`` is a subclass of
      the abstract baseclass ``ruamel.yaml.compat.MutableScliceableSequence``,
      with the result that *(extended) slicing is supported on
      ``CommentedSeq``*.
      (reported by `Stuart Berg <https://bitbucket.org/stuarteberg/>`__)
    - duplicate keys (or their values) with non-ascii now correctly
      report in Python2, instead of raising a Unicode error.
      (Reported by `Jonathan Pyle <https://bitbucket.org/jonathan_pyle/>`__)

  0.15.54 (2018-08-13):
    - fix issue where a comment could pop-up twice in the output (reported by
      `Mike Kazantsev <https://bitbucket.org/mk_fg/>`__ and by
      `Nate Peterson <https://bitbucket.org/ndpete21/>`__)
    - fix issue where JSON object (mapping) without spaces was not parsed
      properly (reported by `Marc Schmidt <https://bitbucket.org/marcj/>`__)
    - fix issue where comments after empty flow-style mappings were not emitted
      (reported by `Qinfench Chen <https://bitbucket.org/flyin5ish/>`__)

  0.15.53 (2018-08-12):
    - fix issue with flow style mapping with comments gobbled newline (reported
      by `Christopher Lambert <https://bitbucket.org/XN137/>`__)
    - fix issue where single '+' under YAML 1.2 was interpreted as
      integer, erroring out (reported by `Jethro Yu
      <https://bitbucket.org/jcppkkk/>`__)

  0.15.52 (2018-08-09):
    - added `.copy()` mapping representation for round-tripping
      (``CommentedMap``) to fix incomplete copies of merged mappings
      (reported by `Will Richards
      <https://bitbucket.org/will_richards/>`__)
    - Also unmade that class a subclass of ordereddict to solve incorrect behaviour
      for ``{**merged-mapping}`` and ``dict(**merged-mapping)`` (reported independently by
      `Tim Olsson <https://bitbucket.org/tgolsson/>`__ and
      `Filip Matzner <https://bitbucket.org/FloopCZ/>`__)

  0.15.51 (2018-08-08):
    - Fix method name dumps (were not dotted) and loads (reported by `Douglas Raillard
      <https://bitbucket.org/DouglasRaillard/>`__)
    - Fix spurious trailing white-space caused when the comment start
      column was no longer reached and there was no actual EOL comment
      (e.g. following empty line) and doing substitutions, or when
      quotes around scalars got dropped.  (reported by `Thomas Guillet
      <https://bitbucket.org/guillett/>`__)

  0.15.50 (2018-08-05):
    - Allow ``YAML()`` as a context manager for output, thereby making it much easier
      to generate multi-documents in a stream.
    - Fix issue with incorrect type information for `load()` and `dump()` (reported
      by `Jimbo Jim <https://bitbucket.org/jimbo1qaz/>`__)

  0.15.49 (2018-08-05):
    - fix preservation of leading newlines in root level literal style scalar,
      and preserve comment after literal style indicator (``|  # some comment``)
      Both needed for round-tripping multi-doc streams in
      `ryd <https://pypi.org/project/ryd/>`__.

  0.15.48 (2018-08-03):
    - housekeeping: ``oitnb`` for formatting, mypy 0.620 upgrade and conformity

  0.15.47 (2018-07-31):
    - fix broken 3.6 manylinux1, the result of an unclean ``build`` (reported by
      `Roman Sichnyi <https://bitbucket.org/rsichnyi-gl/>`__)


  0.15.46 (2018-07-29):
    - fixed DeprecationWarning for importing from ``collections`` on 3.7
      (issue 210, reported by `Reinoud Elhorst
      <https://bitbucket.org/reinhrst/>`__). It was `difficult to find
      why tox/pytest did not report
      <https://stackoverflow.com/q/51573204/1307905>`__ and as time
      consuming to actually `fix
      <https://stackoverflow.com/a/51573205/1307905>`__ the tests.

  0.15.45 (2018-07-26):
    - After adding failing test for ``YAML.load_all(Path())``, remove StopIteration
      (PR provided by `Zachary Buhman <https://bitbucket.org/buhman/>`__,
      also reported by `Steven Hiscocks <https://bitbucket.org/sdhiscocks/>`__.

  0.15.44 (2018-07-14):
    - Correct loading plain scalars consisting of numerals only and
      starting with `0`, when not explicitly specifying YAML version
      1.1. This also fixes the issue about dumping string `'019'` as
      plain scalars as reported by `Min RK
      <https://bitbucket.org/minrk/>`__, that prompted this chance.

  0.15.43 (2018-07-12):
    - merge PR33: Python2.7 on Windows is narrow, but has no
      ``sysconfig.get_config_var('Py_UNICODE_SIZE')``. (merge provided by
      `Marcel Bargull <https://bitbucket.org/mbargull/>`__)
    - ``register_class()`` now returns class (proposed by
      `Mike Nerone <https://bitbucket.org/Manganeez/>`__}

  0.15.42 (2018-07-01):
    - fix regression showing only on narrow Python 2.7 (py27mu) builds
      (with help from
      `Marcel Bargull <https://bitbucket.org/mbargull/>`__ and
      `Colm O'Connor <https://bitbucket.org/colmoconnorgithub/>`__).
    - run pre-commit ``tox`` on Python 2.7 wide and narrow, as well as
      3.4/3.5/3.6/3.7/pypy

  0.15.41 (2018-06-27):
    - add detection of C-compile failure (investigation prompted by
      `StackOverlow <https://stackoverflow.com/a/51057399/1307905>`__ by
      `Emmanuel Blot <https://stackoverflow.com/users/8233409/emmanuel-blot>`__),
      which was removed while no longer dependent on ``libyaml``, C-extensions
      compilation still needs a compiler though.

  0.15.40 (2018-06-18):
    - added links to landing places as suggested in issue 190 by
      `KostisA <https://bitbucket.org/ankostis/>`__
    - fixes issue #201: decoding unicode escaped tags on Python2, reported
      by `Dan Abolafia <https://bitbucket.org/danabo/>`__

  0.15.39 (2018-06-17):
    - merge PR27 improving package startup time (and loading when regexp not
      actually used), provided by
      `Marcel Bargull <https://bitbucket.org/mbargull/>`__

  0.15.38 (2018-06-13):
    - fix for losing precision when roundtripping floats by
      `Rolf Wojtech <https://bitbucket.org/asomov/>`__
    - fix for hardcoded dir separator not working for Windows by
      `Nuno André <https://bitbucket.org/nu_no/>`__
    - typo fix by `Andrey Somov <https://bitbucket.org/asomov/>`__

  0.15.37 (2018-03-21):
    - again trying to create installable files for 187

  0.15.36 (2018-02-07):
    - fix issue 187, incompatibility of C extension with 3.7 (reported by
      Daniel Blanchard)

  0.15.35 (2017-12-03):
    - allow ``None`` as stream when specifying ``transform`` parameters to
      ``YAML.dump()``.
      This is useful if the transforming function doesn't return a meaningful value
      (inspired by `StackOverflow <https://stackoverflow.com/q/47614862/1307905>`__ by
      `rsaw <https://stackoverflow.com/users/406281/rsaw>`__).

  0.15.34 (2017-09-17):
    - fix for issue 157: CDumper not dumping floats (reported by Jan Smitka)

  0.15.33 (2017-08-31):
    - support for "undefined" round-tripping tagged scalar objects (in addition to
      tagged mapping object). Inspired by a use case presented by Matthew Patton
      on `StackOverflow <https://stackoverflow.com/a/45967047/1307905>`__.
    - fix issue 148: replace cryptic error message when using !!timestamp with an
      incorrectly formatted or non- scalar. Reported by FichteFoll.

  0.15.32 (2017-08-21):
    - allow setting ``yaml.default_flow_style = None`` (default: ``False``) for
      for ``typ='rt'``.
    - fix for issue 149: multiplications on ``ScalarFloat`` now return ``float``
      (reported by jan.brezina@tul.cz)

  0.15.31 (2017-08-15):
    - fix Comment dumping

  0.15.30 (2017-08-14):
    - fix for issue with "compact JSON" not parsing: ``{"in":{},"out":{}}``
      (reported on `StackOverflow <https://stackoverflow.com/q/45681626/1307905>`__ by
      `mjalkio <https://stackoverflow.com/users/5130525/mjalkio>`_

  0.15.29 (2017-08-14):
    - fix issue #51: different indents for mappings and sequences (reported by
      Alex Harvey)
    - fix for flow sequence/mapping as element/value of block sequence with
      sequence-indent minus dash-offset not equal two.

  0.15.28 (2017-08-13):
    - fix issue #61: merge of merge cannot be __repr__-ed (reported by Tal Liron)

  0.15.27 (2017-08-13):
    - fix issue 62, YAML 1.2 allows ``?`` and ``:`` in plain scalars if non-ambigious
      (reported by nowox)
    - fix lists within lists which would make comments disappear

  0.15.26 (2017-08-10):
    - fix for disappearing comment after empty flow sequence (reported by
      oit-tzhimmash)

  0.15.25 (2017-08-09):
    - fix for problem with dumping (unloaded) floats (reported by eyenseo)

  0.15.24 (2017-08-09):
    - added ScalarFloat which supports roundtripping of 23.1, 23.100,
      42.00E+56, 0.0, -0.0 etc. while keeping the format. Underscores in mantissas
      are not preserved/supported (yet, is anybody using that?).
    - (finally) fixed longstanding issue 23 (reported by `Antony Sottile
      <https://bitbucket.org/asottile/>`__), now handling comment between block
      mapping key and value correctly
    - warn on YAML 1.1 float input that is incorrect (triggered by invalid YAML
      provided by Cecil Curry)
    - allow setting of boolean representation (`false`, `true`) by using:
      ``yaml.boolean_representation = [u'False', u'True']``

  0.15.23 (2017-08-01):
    - fix for round_tripping integers on 2.7.X > sys.maxint (reported by ccatterina)

  0.15.22 (2017-07-28):
    - fix for round_tripping singe excl. mark tags doubling (reported and fix by Jan Brezina)

  0.15.21 (2017-07-25):
    - fix for writing unicode in new API, (reported on
      `StackOverflow <https://stackoverflow.com/a/45281922/1307905>`__

  0.15.20 (2017-07-23):
    - wheels for windows including C extensions

  0.15.19 (2017-07-13):
    - added object constructor for rt, decorator ``yaml_object`` to replace YAMLObject.
    - fix for problem using load_all with Path() instance
    - fix for load_all in combination with zero indent block style literal
      (``pure=True`` only!)

  0.15.18 (2017-07-04):
    - missing ``pure`` attribute on ``YAML`` useful for implementing `!include` tag
      constructor for `including YAML files in a YAML file
      <https://stackoverflow.com/a/44913652/1307905>`__
    - some documentation improvements
    - trigger of doc build on new revision

  0.15.17 (2017-07-03):
    - support for Unicode supplementary Plane **output**
      (input was already supported, triggered by
      `this <https://stackoverflow.com/a/44875714/1307905>`__ Stack Overflow Q&A)

  0.15.16 (2017-07-01):
    - minor typing issues (reported and fix provided by
      `Manvendra Singh <https://bitbucket.org/manu-chroma/>`__
    - small doc improvements

  0.15.15 (2017-06-27):
    - fix for issue 135, typ='safe' not dumping in Python 2.7
      (reported by Andrzej Ostrowski <https://bitbucket.org/aostr123/>`__)

  0.15.14 (2017-06-25):
    - fix for issue 133, in setup.py: change ModuleNotFoundError to
      ImportError (reported and fix by
      `Asley Drake  <https://github.com/aldraco>`__)

  0.15.13 (2017-06-24):
    - suppress duplicate key warning on mappings with merge keys (reported by
      Cameron Sweeney)

  0.15.12 (2017-06-24):
    - remove fatal dependency of setup.py on wheel package (reported by
      Cameron Sweeney)

  0.15.11 (2017-06-24):
    - fix for issue 130, regression in nested merge keys (reported by
      `David Fee <https://bitbucket.org/dfee/>`__)

  0.15.10 (2017-06-23):
    - top level PreservedScalarString not indented if not explicitly asked to
    - remove Makefile (not very useful anyway)
    - some mypy additions

  0.15.9 (2017-06-16):
    - fix for issue 127: tagged scalars were always quoted and seperated
      by a newline when in a block sequence (reported and largely fixed by
      `Tommy Wang <https://bitbucket.org/twang817/>`__)

  0.15.8 (2017-06-15):
    - allow plug-in install via ``install ruamel.yaml[jinja2]``

  0.15.7 (2017-06-14):
    - add plug-in mechanism for load/dump pre resp. post-processing

  0.15.6 (2017-06-10):
    - a set() with duplicate elements now throws error in rt loading
    - support for toplevel column zero literal/folded scalar in explicit documents

  0.15.5 (2017-06-08):
    - repeat `load()` on a single `YAML()` instance would fail.

  0.15.4 (2017-06-08):
    - `transform` parameter on dump that expects a function taking a
      string and returning a string. This allows transformation of the output
      before it is written to stream. This forces creation of the complete output in memory!
    - some updates to the docs

  0.15.3 (2017-06-07):
    - No longer try to compile C extensions on Windows. Compilation can be forced by setting
      the environment variable `RUAMEL_FORCE_EXT_BUILD` to some value
      before starting the `pip install`.

  0.15.2 (2017-06-07):
    - update to conform to mypy 0.511: mypy --strict

  0.15.1 (2017-06-07):
    - `duplicate keys  <http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys>`__
      in mappings generate an error (in the old API this change generates a warning until 0.16)
    - dependecy on ruamel.ordereddict for 2.7 now via extras_require

  0.15.0 (2017-06-04):
    - it is now allowed to pass in a ``pathlib.Path`` as "stream" parameter to all
      load/dump functions
    - passing in a non-supported object (e.g. a string) as "stream" will result in a
      much more meaningful YAMLStreamError.
    - assigning a normal string value to an existing CommentedMap key or CommentedSeq
      element will result in a value cast to the previous value's type if possible.
    - added ``YAML`` class for new API

  0.14.12 (2017-05-14):
    - fix for issue 119, deepcopy not returning subclasses (reported and PR by
      Constantine Evans <cevans@evanslabs.org>)

  0.14.11 (2017-05-01):
    - fix for issue 103 allowing implicit documents after document end marker line (``...``)
      in YAML 1.2

  0.14.10 (2017-04-26):
    - fix problem with emitting using cyaml

  0.14.9 (2017-04-22):
    - remove dependency on ``typing`` while still supporting ``mypy``
      (http://stackoverflow.com/a/43516781/1307905)
    - fix unclarity in doc that stated 2.6 is supported (reported by feetdust)

  0.14.8 (2017-04-19):
    - fix Text not available on 3.5.0 and 3.5.1, now proactively setting version guards
      on all files (reported by `João Paulo Magalhães <https://bitbucket.org/jpmag/>`__)

  0.14.7 (2017-04-18):
    - round trip of integers (decimal, octal, hex, binary) now preserve
      leading zero(s) padding and underscores. Underscores are presumed
      to be at regular distances (i.e. ``0o12_345_67`` dumps back as
      ``0o1_23_45_67`` as the space from the last digit to the
      underscore before that is the determining factor).

  0.14.6 (2017-04-14):
    - binary, octal and hex integers are now preserved by default. This
      was a known deficiency. Working on this was prompted by the issue report (112)
      from devnoname120, as well as the additional experience with `.replace()`
      on `scalarstring` classes.
    - fix issues 114: cannot install on Buildozer (reported by mixmastamyk).
      Setting env. var ``RUAMEL_NO_PIP_INSTALL_CHECK`` will suppress ``pip``-check.

  0.14.5 (2017-04-04):
    - fix issue 109: None not dumping correctly at top level (reported by Andrea Censi)
    - fix issue 110: .replace on Preserved/DoubleQuoted/SingleQuoted ScalarString
      would give back "normal" string (reported by sandres23)

  0.14.4 (2017-03-31):
    - fix readme

  0.14.3 (2017-03-31):
    - fix for 0o52 not being a string in YAML 1.1 (reported on
      `StackOverflow Q&A 43138503 <http://stackoverflow.com/a/43138503/1307905>`__ by
      `Frank D <http://stackoverflow.com/users/7796630/frank-d>`__)

  0.14.2 (2017-03-23):
    - fix for old default pip on Ubuntu 14.04 (reported by Sébastien Maccagnoni-Munch)

  0.14.1 (2017-03-22):
    - fix Text not available on 3.5.0 and 3.5.1 (reported by Charles Bouchard-Légaré)

  0.14.0 (2017-03-21):
    - updates for mypy --strict
    - preparation for moving away from inheritance in Loader and Dumper, calls from e.g.
      the Representer to the Serializer.serialize() are now done via the attribute
      .serializer.serialize(). Usage of .serialize() outside of Serializer will be
      deprecated soon
    - some extra tests on main.py functions

  ----

  For older changes see the file
  `CHANGES <https://bitbucket.org/ruamel/yaml/src/default/CHANGES>`_


pkgId: 348a6778cb079f45bef1005222e23d56f9024322059279e0e69afc4ccdadcfd1
name: rh-python36-ruamel.yaml-debuginfo
arch: x86_64
version: 0.16.5
epoch: 0
release: 1
summary: Debug information for package rh-python36-ruamel.yaml
url: https://bitbucket.org/ruamel/yaml
rpm_license: MIT license
rpm_vendor: Anthon van der Neut <a.van.der.neut@ruamel.eu>
rpm_group: Development/Debug
rpm_buildhost: 874e2f5068514d13826dacfd83350441
rpm_sourcerpm: rh-python36-ruamel.yaml-0.16.5-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387292-rh-python36-ruamel.yaml/rh-python36-ruamel.yaml-debuginfo-0.16.5-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-ruamel.yaml.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: c51f907efe3e6955a7baea6e1c69f0bead781bed03b1b0b5af96f5f331b75b0d
name: rh-python36-ruamel.yaml.clib
arch: src
version: 0.2.0
epoch: 0
release: 1
summary: C version of reader, parser and emitter for ruamel.yaml derived from libyaml
url: https://bitbucket.org/ruamel/yaml.clib
rpm_license: MIT
rpm_vendor: Anthon van der Neut <a.van.der.neut@ruamel.eu>
rpm_group: Development/Libraries
rpm_buildhost: af61c1039ea34a1b938acd3e75cfb74d
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387298-rh-python36-ruamel.yaml.clib/rh-python36-ruamel.yaml.clib-0.2.0-1.src.rpm
checksum_type: sha256
description:
  ruamel.yaml.clib
  ================

  ``ruamel.yaml.clib`` is the C based reader/scanner and emitter for ruamel.yaml

  :version:       0.2.0
  :updated:       2019-09-26
  :documentation: http://yaml.readthedocs.io
  :repository:    https://bitbucket.org/ruamel/yaml.clib
  :pypi:          https://pypi.org/project/ruamel.yaml.clib/

  This package was split of from ruamel.yaml, so that ruamel.yaml can be build as
  a universal wheel. Apart from the C code seldom changing, and taking a long
  time to compile for all platforms, this allows installation of the .so
  on Linux systems under /usr/lib64/pythonX.Y (without a .pth file or a ruamel
  directory) and the Python code for ruamel.yaml under /usr/lib/pythonX.Y.


  .. image:: https://bestpractices.coreinfrastructure.org/projects/1128/badge
     :target: https://bestpractices.coreinfrastructure.org/projects/1128

  .. image:: https://bitbucket.org/ruamel/yaml/raw/default/_doc/_static/license.svg
     :target: https://opensource.org/licenses/MIT


pkgId: 54215bc17be9165cb5c62d17447c36ec4409dd4fd46995615f9508c865104426
name: rh-python36-ruamel.yaml.clib-debuginfo
arch: x86_64
version: 0.2.0
epoch: 0
release: 1
summary: Debug information for package rh-python36-ruamel.yaml.clib
url: https://bitbucket.org/ruamel/yaml.clib
rpm_license: MIT
rpm_vendor: Anthon van der Neut <a.van.der.neut@ruamel.eu>
rpm_group: Development/Debug
rpm_buildhost: 9c535ed3fdf54b47870f20545aa32474
rpm_sourcerpm: rh-python36-ruamel.yaml.clib-0.2.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387298-rh-python36-ruamel.yaml.clib/rh-python36-ruamel.yaml.clib-debuginfo-0.2.0-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-ruamel.yaml.clib.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: bfc7b9eddbbfb14766b7b4b8c7638732a33722f5761837b66c0f9b67b0b64f3f
name: rh-python36-s3transfer
arch: noarch
version: 0.2.1
epoch: 0
release: 1
summary: An Amazon S3 Transfer Manager
url: https://github.com/boto/s3transfer
rpm_license: Apache License 2.0
rpm_vendor: Amazon Web Services <kyknapp1@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 7b1557ef513d4bbb9ca4897e22a3adc4
rpm_sourcerpm: rh-python36-s3transfer-0.2.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387237-rh-python36-s3transfer/rh-python36-s3transfer-0.2.1-1.noarch.rpm
checksum_type: sha256
description:
  =====================================================
  s3transfer - An Amazon S3 Transfer Manager for Python
  =====================================================

  S3transfer is a Python library for managing Amazon S3 transfers.

  .. note::

    This project is not currently GA. If you are planning to use this code in
    production, make sure to lock to a minor version as interfaces may break
    from minor version to minor version. For a basic, stable interface of
    s3transfer, try the interfaces exposed in `boto3 <https://boto3.readthedocs.io/en/latest/guide/s3.html#using-the-transfer-manager>`__


pkgId: c249496def34c8573904d0a9d9a479ce89f8ef36a35c05cf740f5242247c255b
name: rh-python36-schedule
arch: noarch
version: 0.6.0
epoch: 0
release: 1
summary: Job scheduling for humans.
url: https://github.com/dbader/schedule
rpm_license: MIT
rpm_vendor: Daniel Bader <mail@dbader.org>
rpm_group: Development/Libraries
rpm_buildhost: 849a04c4b26b402298220576b9004fce
rpm_sourcerpm: rh-python36-schedule-0.6.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387299-rh-python36-schedule/rh-python36-schedule-0.6.0-1.noarch.rpm
checksum_type: sha256
description:
  schedule
  ========


  .. image:: https://api.travis-ci.org/dbader/schedule.svg?branch=master
          :target: https://travis-ci.org/dbader/schedule

  .. image:: https://coveralls.io/repos/dbader/schedule/badge.svg?branch=master
          :target: https://coveralls.io/r/dbader/schedule

  .. image:: https://img.shields.io/pypi/v/schedule.svg
          :target: https://pypi.python.org/pypi/schedule

  Python job scheduling for humans.

  An in-process scheduler for periodic jobs that uses the builder pattern
  for configuration. Schedule lets you run Python functions (or any other
  callable) periodically at pre-determined intervals using a simple,
  human-friendly syntax.

  Inspired by `Adam Wiggins' <https://github.com/adamwiggins>`_ article `"Rethinking Cron" <https://adam.herokuapp.com/past/2010/4/13/rethinking_cron/>`_ and the `clockwork <https://github.com/Rykian/clockwork>`_ Ruby module.

  Features
  --------
  - A simple to use API for scheduling jobs.
  - Very lightweight and no external dependencies.
  - Excellent test coverage.
  - Tested on Python 2.7, 3.5, and 3.6

  Usage
  -----

  .. code-block:: bash

      $ pip install schedule

  .. code-block:: python

      import schedule
      import time

      def job():
          print("I'm working...")

      schedule.every(10).minutes.do(job)
      schedule.every().hour.do(job)
      schedule.every().day.at("10:30").do(job)
      schedule.every(5).to(10).minutes.do(job)
      schedule.every().monday.do(job)
      schedule.every().wednesday.at("13:15").do(job)
      schedule.every().minute.at(":17").do(job)

      while True:
          schedule.run_pending()
          time.sleep(1)

  Documentation
  -------------

  Schedule's documentation lives at `schedule.readthedocs.io <https://schedule.readthedocs.io/>`_.

  Please also check the FAQ there with common questions.


  Meta
  ----

  Daniel Bader - `@dbader_org <https://twitter.com/dbader_org>`_ - mail@dbader.org

  Distributed under the MIT license. See `LICENSE.txt <https://github.com/dbader/schedule/blob/master/LICENSE.txt>`_ for more information.

  https://github.com/dbader/schedule


pkgId: 75e8b0d95fc2f9a2957f433b0c09df7fe56e7c49e74a011a6154cd52bb349888
name: rh-python36-service_identity
arch: noarch
version: 18.1.0
epoch: 0
release: 1
summary: Service identity verification for pyOpenSSL & cryptography.
url: https://service-identity.readthedocs.io/
rpm_license: MIT
rpm_vendor: Hynek Schlawack <hs@ox.cx>
rpm_group: Development/Libraries
rpm_buildhost: a305d3e7655942daab5b11a246ced509
rpm_sourcerpm: rh-python36-service_identity-18.1.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387170-rh-python36-service_identity/rh-python36-service_identity-18.1.0-1.noarch.rpm
checksum_type: sha256
description:
  =============================
  Service Identity Verification
  =============================

  .. image:: https://readthedocs.org/projects/service-identity/badge/?version=stable
     :target: https://service-identity.readthedocs.io/en/stable/?badge=stable
     :alt: Documentation Status

  .. image:: https://travis-ci.org/pyca/service_identity.svg?branch=master
     :target: https://travis-ci.org/pyca/service_identity
     :alt: CI status

  .. image:: https://codecov.io/github/pyca/service_identity/branch/master/graph/badge.svg
     :target: https://codecov.io/github/pyca/service_identity
     :alt: Test Coverage

  .. image:: https://img.shields.io/badge/code%20style-black-000000.svg
     :target: https://github.com/ambv/black
     :alt: Code style: black

  .. image:: https://www.irccloud.com/invite-svg?channel=%23cryptography-dev&amp;hostname=irc.freenode.net&amp;port=6697&amp;ssl=1
      :target: https://www.irccloud.com/invite?channel=%23cryptography-dev&amp;hostname=irc.freenode.net&amp;port=6697&amp;ssl=1

  .. begin

  Use this package if:

  - you use pyOpenSSL_ and don’t want to be MITM_\ ed or
  - if you want to verify that a `PyCA cryptography`_ certificate is valid for a certain hostname or IP address.

  ``service_identity`` aspires to give you all the tools you need for verifying whether a certificate is valid for the intended purposes.

  In the simplest case, this means *host name verification*.
  However, ``service_identity`` implements `RFC 6125`_ fully and plans to add other relevant RFCs too.

  ``service_identity``\ ’s documentation lives at `Read the Docs <https://service-identity.readthedocs.io/>`_, the code on `GitHub <https://github.com/pyca/service_identity>`_.


  .. _Twisted: https://twistedmatrix.com/
  .. _pyOpenSSL: https://pypi.org/project/pyOpenSSL/
  .. _MITM: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
  .. _RFC 6125: https://www.rfc-editor.org/info/rfc6125
  .. _PyCA cryptography: https://cryptography.io/


  Release Information
  ===================

  18.1.0 (2018-12-05)
  -------------------

  Changes:
  ^^^^^^^^

  - pyOpenSSL is optional now if you use ``service_identity.cryptography.*`` only.
  - Added support for ``iPAddress`` ``subjectAltName``\ s.
    You can now verify whether a connection or a certificate is valid for an IP address using ``service_identity.pyopenssl.verify_ip_address()`` and ``service_identity.cryptography.verify_certificate_ip_address()``.
    `#12 <https://github.com/pyca/service_identity/pull/12>`_

  `Full changelog <https://service-identity.readthedocs.io/en/stable/changelog.html>`_.

  Authors
  =======

  ``service_identity`` is written and maintained by `Hynek Schlawack <https://hynek.me/>`_.

  The development is kindly supported by `Variomedia AG <https://www.variomedia.de/>`_.

  Other contributors can be found in `GitHub's overview <https://github.com/pyca/service_identity/graphs/contributors>`_.


pkgId: c2e42a6f658f382ac11c9a34802520069205d6b284c2fa20ed094b4c26e7f7eb
name: rh-python36-simplejson
arch: src
version: 3.16.0
epoch: 0
release: 1
summary: Simple, fast, extensible JSON encoder/decoder for Python
url: http://github.com/simplejson/simplejson
rpm_license: MIT License
rpm_vendor: Bob Ippolito <bob@redivi.com>
rpm_group: Development/Libraries
rpm_buildhost: 28104db3e5214a3f8b949f86f9a4ce71
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387300-rh-python36-simplejson/rh-python36-simplejson-3.16.0-1.src.rpm
checksum_type: sha256
description:
  simplejson
  ----------

  .. image:: https://travis-ci.org/simplejson/simplejson.svg?branch=master
      :target: https://travis-ci.org/simplejson/simplejson

  simplejson is a simple, fast, complete, correct and extensible
  JSON <http://json.org> encoder and decoder for Python 2.5+
  and Python 3.3+.  It is pure Python code with no dependencies,
  but includes an optional C extension for a serious speed boost.

  The latest documentation for simplejson can be read online here:
  https://simplejson.readthedocs.io/

  simplejson is the externally maintained development version of the
  json library included with Python 2.6 and Python 3.0, but maintains
  backwards compatibility with Python 2.5.

  The encoder can be specialized to provide serialization in any kind of
  situation, without any special support by the objects to be serialized
  (somewhat like pickle). This is best done with the ``default`` kwarg
  to dumps.

  The decoder can handle incoming JSON strings of any specified encoding
  (UTF-8 by default). It can also be specialized to post-process JSON
  objects with the ``object_hook`` or ``object_pairs_hook`` kwargs. This
  is particularly useful for implementing protocols such as JSON-RPC
  that have a richer type system than JSON itself.

  For those of you that have legacy systems to maintain, there is a
  very old fork of simplejson in the `python2.2`_ branch that supports
  Python 2.2. This is based off of a very old version of simplejson,
  is not maintained, and should only be used as a last resort.

  .. _python2.2: https://github.com/simplejson/simplejson/tree/python2.2


pkgId: a34bdd8f5a33350108b82c2333bef20af159176da8ebef8e8ca89824ee48788e
name: rh-python36-simplejson-debuginfo
arch: x86_64
version: 3.16.0
epoch: 0
release: 1
summary: Debug information for package rh-python36-simplejson
url: http://github.com/simplejson/simplejson
rpm_license: MIT License
rpm_vendor: Bob Ippolito <bob@redivi.com>
rpm_group: Development/Debug
rpm_buildhost: 7cb75d027fc84461a6dd38c7e3f705fd
rpm_sourcerpm: rh-python36-simplejson-3.16.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387300-rh-python36-simplejson/rh-python36-simplejson-debuginfo-3.16.0-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-simplejson.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 7d4763ef77a04db32bf77b5926ae88cbd2f08599cd6ade09600cec96aefd016e
name: rh-python36-six
arch: noarch
version: 1.14.0
epoch: 0
release: 1
summary: Python 2 and 3 compatibility utilities
url: https://github.com/benjaminp/six
rpm_license: MIT
rpm_vendor: Benjamin Peterson <benjamin@python.org>
rpm_group: Development/Libraries
rpm_buildhost: 41d17eb1154049a8942e77790fb4fbab
rpm_sourcerpm: rh-python36-six-1.14.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387178-rh-python36-six/rh-python36-six-1.14.0-1.noarch.rpm
checksum_type: sha256
description:
  .. image:: https://img.shields.io/pypi/v/six.svg
     :target: https://pypi.org/project/six/
     :alt: six on PyPI

  .. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
     :target: https://travis-ci.org/benjaminp/six
     :alt: six on TravisCI

  .. image:: https://readthedocs.org/projects/six/badge/?version=latest
     :target: https://six.readthedocs.io/
     :alt: six's documentation on Read the Docs

  .. image:: https://img.shields.io/badge/license-MIT-green.svg
     :target: https://github.com/benjaminp/six/blob/master/LICENSE
     :alt: MIT License badge

  Six is a Python 2 and 3 compatibility library.  It provides utility functions
  for smoothing over the differences between the Python versions with the goal of
  writing Python code that is compatible on both Python versions.  See the
  documentation for more information on what is provided.

  Six supports every Python version since 2.6.  It is contained in only one Python
  file, so it can be easily copied into your project. (The copyright and license
  notice must be retained.)

  Online documentation is at https://six.readthedocs.io/.

  Bugs can be reported to https://github.com/benjaminp/six.  The code can also
  be found there.

  For questions about six or porting in general, email the python-porting mailing
  list: https://mail.python.org/mailman/listinfo/python-porting


pkgId: e9f8900a70f93775caac5745634a66ba503f0aa7036aebb9be5723c94a8808d9
name: rh-python36-slackclient
arch: noarch
version: 1.1.2
epoch: 0
release: 1
summary: Slack API clients for Web API and RTM API
url: https://github.com/slackapi/python-slackclient
rpm_license: MIT
rpm_vendor: Slack Technologies, Inc. <opensource@slack.com>
rpm_group: Development/Libraries
rpm_buildhost: 2908021f01294646802e1a084bdca8c5
rpm_sourcerpm: rh-python36-slackclient-1.1.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387136-rh-python36-slackclient/rh-python36-slackclient-1.1.2-1.noarch.rpm
checksum_type: sha256
description:
  python-slackclient
  ===================

  A client for Slack, which supports the Slack Web API and Real Time Messaging (RTM) API.

  |build-status| |windows-build-status| |codecov| |doc-status| |pypi-version| |python-version|

  .. |build-status| image:: https://travis-ci.org/slackapi/python-slackclient.svg?branch=master
      :target: https://travis-ci.org/slackapi/python-slackclient
  .. |windows-build-status| image:: https://ci.appveyor.com/api/projects/status/rif04t60ptslj32x/branch/master?svg=true
      :target: https://ci.appveyor.com/project/slackapi/python-slackclient
  .. |codecov| image:: https://codecov.io/gh/slackapi/python-slackclient/branch/master/graph/badge.svg
      :target: https://codecov.io/gh/slackapi/python-slackclient
  .. |doc-status| image:: https://readthedocs.org/projects/python-slackclient/badge/?version=latest
      :target: http://python-slackclient.readthedocs.io/en/latest/?badge=latest
  .. |pypi-version| image:: https://badge.fury.io/py/slackclient.svg
      :target: https://pypi.python.org/pypi/slackclient
  .. |python-version| image:: https://img.shields.io/pypi/pyversions/slackclient.svg
      :target: https://pypi.python.org/pypi/slackclient

  Overview
  --------

  Whether you're building a custom app for your team, or integrating a third party
  service into your Slack workflows, Slack Developer Kit for Python allows you to leverage the flexibility
  of Python to get your project up and running as quickly as possible.


  Requirements and Installation
  ******************************

  We recommend using `PyPI <https://pypi.python.org/pypi>`_ to install Slack Developer Kit for Python

  .. code-block:: bash

  	pip install slackclient

  Of course, if you prefer doing things the hard way, you can always implement Slack Developer Kit for Python
  by pulling down the source code directly into your project:

  .. code-block:: bash

  	git clone https://github.com/slackapi/python-slackclient.git
  	pip install -r requirements.txt

  Documentation
  --------------

  For comprehensive method information and usage examples, see the `full documentation <http://slackapi.github.io/python-slackclient>`_.


  You may also review our `Development Roadmap <https://github.com/slackapi/python-slackclient/wiki/Slack-Python-SDK-Roadmap>`_ in the project wiki.

  Getting Help
  -------------

  If you get stuck, we’re here to help. The following are the best ways to get assistance working through your issue:

  - Use our `Github Issue Tracker <https://github.com/slackapi/python-slackclient/issues>`_ for reporting bugs or requesting features.
  - Visit the `dev4slack channel <http://dev4slack.xoxco.com>`_ for getting help using Slack Developer Kit for Python or just generally bond with your fellow Slack developers.

  Basic Usage
  ------------
  The Slack Web API allows you to build applications that interact with Slack in more complex ways than the integrations
  we provide out of the box.

  This package is a modular wrapper designed to make Slack `Web API <https://api.slack.com/web>`_ calls simpler and easier for your
  app. Provided below are examples of how to interact with commonly used API endpoints, but this is by no means
  a complete list. Review the full list of available methods `here <https://api.slack.com/methods>`_.

  See `Tokens & Authentication <http://slackapi.github.io/python-slackclient/auth.html#handling-tokens>` for API token handling best practices.

  Sending a message
  ********************
  The primary use of Slack is sending messages. Whether you're sending a message
  to a user or to a channel, this method handles both.

  To send a message to a channel, use the channel's ID. For IMs, use the user's ID.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "chat.postMessage",
      channel="#python",
      text="Hello from Python! :tada:"
    )

  There are some unique options specific to sending IMs, so be sure to read the **channels**
  section of the `chat.postMessage <https://api.slack.com/methods/chat.postMessage#channels>`_
  page for a full list of formatting and authorship options.

  Sending an ephemeral message, which is only visible to an assigned user in a specified channel, is nearly the same
  as sending a regular message, but with an additional ``user`` parameter.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "chat.postEphemeral",
      channel="#python",
      text="Hello from Python! :tada:",
      user="U0XXXXXXX"
    )

  See `chat.postEphemeral <https://api.slack.com/methods/chat.postEphemeral>`_ for more info.


  Replying to messages and creating threads
  *****************************************
  Threaded messages are just like regular messages, except thread replies are grouped together to provide greater context
  to the user. You can reply to a thread or start a new threaded conversation by simply passing the original message's ``ts``
  ID in the ``thread_ts`` attribute when posting a message. If you're replying to a threaded message, you'll pass the `thread_ts`
  ID of the message you're replying to.

  A channel or DM conversation is a nearly linear timeline of messages exchanged between people, bots, and apps.
  When one of these messages is replied to, it becomes the parent of a thread. By default, threaded replies do not
  appear directly in the channel, instead relegated to a kind of forked timeline descending from the parent message.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "chat.postMessage",
      channel="#python",
      text="Hello from Python! :tada:",
      thread_ts="1476746830.000003"
    )


  By default, ``reply_broadcast`` is set to ``False``. To indicate your reply is germane to all members of a channel,
  set the ``reply_broadcast`` boolean parameter to ``True``.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "chat.postMessage",
      channel="#python",
      text="Hello from Python! :tada:",
      thread_ts="1476746830.000003",
      reply_broadcast=True
    )


  **Note:** While threaded messages may contain attachments and message buttons, when your reply is broadcast to the
  channel, it'll actually be a reference to your reply, not the reply itself.
  So, when appearing in the channel, it won't contain any attachments or message buttons. Also note that updates and
  deletion of threaded replies works the same as regular messages.

  See the `Threading messages together <https://api.slack.com/docs/message-threading#forking_conversations>`_
  article for more information.


  Deleting a message
  ********************
  Sometimes you need to delete things.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "chat.delete",
      channel="C0XXXXXX",
      ts="1476745373.000002"
    )

  See `chat.delete <https://api.slack.com/methods/chat.delete>`_ for more info.

  Adding or removing an emoji reaction
  ****************************************
  You can quickly respond to any message on Slack with an emoji reaction. Reactions
  can be used for any purpose: voting, checking off to-do items, showing excitement — and just for fun.

  This method adds a reaction (emoji) to an item (``file``, ``file comment``, ``channel message``, ``group message``, or ``direct message``). One of file, file_comment, or the combination of channel and timestamp must be specified.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "reactions.add",
      channel="C0XXXXXXX",
      name="thumbsup",
      timestamp="1234567890.123456"
    )

  Removing an emoji reaction is basically the same format, but you'll use ``reactions.remove`` instead of ``reactions.add``

  .. code-block:: python

    sc.api_call(
      "reactions.remove",
      channel="C0XXXXXXX",
      name="thumbsup",
      timestamp="1234567890.123456"
    )


  See `reactions.add <https://api.slack.com/methods/reactions.add>`_ and `reactions.remove <https://api.slack.com/methods/reactions.remove>`_ for more info.

  Getting a list of channels
  ******************************
  At some point, you'll want to find out what channels are available to your app. This is how you get that list.

  **Note:** This call requires the ``channels:read`` scope.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call("channels.list")

  Archived channels are included by default. You can exclude them by passing ``exclude_archived=1`` to your request.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "channels.list",
      exclude_archived=1
    )

  See `channels.list <https://api.slack.com/methods/channels.list>`_ for more info.

  Getting a channel's info
  *************************
  Once you have the ID for a specific channel, you can fetch information about that channel.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "channels.info",
      channel="C0XXXXXXX"
    )

  See `channels.info <https://api.slack.com/methods/channels.info>`_ for more info.

  Joining a channel
  ********************
  Channels are the social hub of most Slack teams. Here's how you hop into one:

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "channels.join",
      channel="C0XXXXXXY"
    )

  If you are already in the channel, the response is slightly different.
  ``already_in_channel`` will be true, and a limited ``channel`` object will be returned. Bot users cannot join a channel on their own, they need to be invited by another user.

  See `channels.join <https://api.slack.com/methods/channels.join>`_ for more info.

  Leaving a channel
  ********************
  Maybe you've finished up all the business you had in a channel, or maybe you
  joined one by accident. This is how you leave a channel.

  .. code-block:: python

    from slackclient import SlackClient

    slack_token = os.environ["SLACK_API_TOKEN"]
    sc = SlackClient(slack_token)

    sc.api_call(
      "channels.leave",
      channel="C0XXXXXXX"
    )

  See `channels.leave <https://api.slack.com/methods/channels.leave>`_ for more info.

  Additional Information
  ********************************************************************************************
  For comprehensive method information and usage examples, see the `full documentation`_.


pkgId: 977e615cafa0c1f4caf839911c772db1eadecbf679cdf2f516d1e0b66aec1ff6
name: rh-python36-smmap2
arch: noarch
version: 2.0.5
epoch: 0
release: 1
summary: A pure Python implementation of a sliding window memory map manager
url: https://github.com/gitpython-developers/smmap
rpm_license: BSD
rpm_vendor: Sebastian Thiel <byronimo@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 425e3cebb42444a7a7b11f9d8d25e4ca
rpm_sourcerpm: rh-python36-smmap2-2.0.5-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387295-rh-python36-smmap2/rh-python36-smmap2-2.0.5-1.noarch.rpm
checksum_type: sha256
description:
  When reading from many possibly large files in a fashion similar to random access, it is usually the fastest and most efficient to use memory maps.

  Although memory maps have many advantages, they represent a very limited system resource as every map uses one file descriptor, whose amount is limited per process. On 32 bit systems, the amount of memory you can have mapped at a time is naturally limited to theoretical 4GB of memory, which may not be enough for some applications.




  * **System resources (file-handles) are likely to be leaked!** This is due to the library authors reliance on a deterministic `__del__()` destructor.
  * The memory access is read-only by design.




  [![Build Status](https://travis-ci.org/gitpython-developers/smmap.svg?branch=master)](https://travis-ci.org/gitpython-developers/smmap)
  [![Build status](https://ci.appveyor.com/api/projects/status/kuws846av5lvmugo?svg=true&passingText=windows%20OK&failingText=windows%20failed)](https://ci.appveyor.com/project/Byron/smmap)
  [![Coverage Status](https://coveralls.io/repos/gitpython-developers/smmap/badge.png)](https://coveralls.io/r/gitpython-developers/smmap)
  [![Issue Stats](http://www.issuestats.com/github/gitpython-developers/smmap/badge/pr)](http://www.issuestats.com/github/gitpython-developers/smmap)
  [![Issue Stats](http://www.issuestats.com/github/gitpython-developers/smmap/badge/issue)](http://www.issuestats.com/github/gitpython-developers/smmap)

  Smmap wraps an interface around mmap and tracks the mapped files as well as the amount of clients who use it. If the system runs out of resources, or if a memory limit is reached, it will automatically unload unused maps to allow continued operation.

  To allow processing large files even on 32 bit systems, it allows only portions of the file to be mapped. Once the user reads beyond the mapped region, smmap will automatically map the next required region, unloading unused regions using a LRU algorithm.

  The interface also works around the missing offset parameter in python implementations up to python 2.5.

  Although the library can be used most efficiently with its native interface, a Buffer implementation is provided to hide these details behind a simple string-like interface.

  For performance critical 64 bit applications, a simplified version of memory mapping is provided which always maps the whole file, but still provides the benefit of unloading unused mappings on demand.





  * Python 2.7 or 3.4+
  * OSX, Windows or Linux

  The package was tested on all of the previously mentioned configurations.



  [![Documentation Status](https://readthedocs.org/projects/smmap/badge/?version=latest)](https://readthedocs.org/projects/smmap/?badge=latest)

  Its easiest to install smmap using the [pip](http://www.pip-installer.org/en/latest) program:

  ```bash
  $ pip install smmap
  ```

  As the command will install smmap in your respective python distribution, you will most likely need root permissions to authorize the required changes.

  If you have downloaded the source archive, the package can be installed by running the `setup.py` script:

  ```bash
  $ python setup.py install
  ```

  It is advised to have a look at the **Usage Guide** for a brief introduction on the different database implementations.





  The project is home on github at https://github.com/gitpython-developers/smmap .

  The latest source can be cloned from github as well:

  * git://github.com/gitpython-developers/smmap.git


  For support, please use the git-python mailing list:

  * http://groups.google.com/group/git-python


  Issues can be filed on github:

  * https://github.com/gitpython-developers/smmap/issues




  *smmap* is licensed under the New BSD License.


pkgId: 275ccdbbb7e31ec5ad60d3cc8e4f0f72a39a73caa78694a5d41cbf1ff4044929
name: rh-python36-social-auth-app-django
arch: noarch
version: 3.1.0
epoch: 0
release: 1
summary: Python Social Authentication, Django integration.
url: https://github.com/python-social-auth/social-app-django
rpm_license: BSD
rpm_vendor: Matias Aguirre <matiasaguirre@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: dc71057d39b241b79c90aa5b50ad006e
rpm_sourcerpm: rh-python36-social-auth-app-django-3.1.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387114-rh-python36-social-auth-app-django/rh-python36-social-auth-app-django-3.1.0-1.noarch.rpm
checksum_type: sha256
description:
  [![Build Status](https://travis-ci.org/python-social-auth/social-app-django.svg?branch=master)](https://travis-ci.org/python-social-auth/social-app-django)
  [![Donate](https://img.shields.io/badge/Donate-PayPal-orange.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=matiasaguirre%40gmail%2ecom&lc=US&item_name=Python%20Social%20Auth&no_note=0&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHostedGuest)

  Python Social Auth is an easy to setup social authentication/registration
  mechanism with support for several frameworks and auth providers.



  This is the [Django](https://www.djangoproject.com/) component of the
  [python-social-auth ecosystem](https://github.com/python-social-auth/social-core),
  it implements the needed functionality to integrate
  [social-auth-core](https://github.com/python-social-auth/social-core)
  in a Django based project.



  This project will focus on the currently supported Django releases as
  stated on the [Django Project Supported Versions table](https://www.djangoproject.com/download/#supported-versions).

  Backward compatibility with unsupported versions won't be enforced.



  Project documentation is available at http://python-social-auth.readthedocs.org/.



  ```shell
  $ pip install social-auth-app-django
  ```



  See the [CONTRIBUTING.md](CONTRIBUTING.md) document for details.



  This project follows [Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html).



  This project follows the BSD license. See the [LICENSE](LICENSE) for details.



  This project is maintened on my spare time, consider donating to keep
  it improving.

  [![Donate](https://img.shields.io/badge/Donate-PayPal-orange.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=matiasaguirre%40gmail%2ecom&lc=US&item_name=Python%20Social%20Auth&no_note=0&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHostedGuest)


pkgId: 11cf501c0da653fcc7c9115393f6953dc08e7818b4a64f5c0737ea8fa6dcf573
name: rh-python36-social-auth-core
arch: noarch
version: 3.2.0
epoch: 0
release: 1
summary: Python social authentication made simple.
url: https://github.com/python-social-auth/social-core
rpm_license: BSD
rpm_vendor: Matias Aguirre <matiasaguirre@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: bfc4d4f1020a4842bcd378f5becd467a
rpm_sourcerpm: rh-python36-social-auth-core-3.2.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387165-rh-python36-social-auth-core/rh-python36-social-auth-core-3.2.0-1.noarch.rpm
checksum_type: sha256
description:
  [![Build Status](https://travis-ci.org/python-social-auth/social-core.svg?branch=master)](https://travis-ci.org/python-social-auth/social-core)
  [![Donate](https://img.shields.io/badge/Donate-PayPal-orange.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=matiasaguirre%40gmail%2ecom&lc=US&item_name=Python%20Social%20Auth&no_note=0&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHostedGuest)

  Python Social Auth is an easy to setup social authentication/registration
  mechanism with support for several frameworks and auth providers.



  This is the core component of the python-social-auth ecosystem, it
  implements the common interface to define new authentication backends
  to third parties services, implement integrations with web frameworks
  and storage solutions.



  Project documentation is available at http://python-social-auth.readthedocs.org/.



  ```shell
  $ pip install social-auth-core
  ```



  See the [CONTRIBUTING.md](CONTRIBUTING.md) document for details.



  This project follows [Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html).



  This project follows the BSD license. See the [LICENSE](LICENSE) for details.



  This project is maintened on my spare time, consider donating to keep
  it improving.

  [![Donate](https://img.shields.io/badge/Donate-PayPal-orange.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=matiasaguirre%40gmail%2ecom&lc=US&item_name=Python%20Social%20Auth&no_note=0&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHostedGuest)


pkgId: 08af2715e62b2533d1fb67f48ee115fd56c711f54d6d889d5f964adcc4fc35d9
name: rh-python36-sqlparse
arch: noarch
version: 0.3.1
epoch: 0
release: 1
summary: Non-validating SQL parser
url: https://github.com/andialbrecht/sqlparse
rpm_license: BSD
rpm_vendor: Andi Albrecht <albrecht.andi@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 57806a881d7d470dbc01f3cd2df8ecfe
rpm_sourcerpm: rh-python36-sqlparse-0.3.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387277-rh-python36-sqlparse/rh-python36-sqlparse-0.3.1-1.noarch.rpm
checksum_type: sha256
description:
  ``sqlparse`` is a non-validating SQL parser module.
  It provides support for parsing, splitting and formatting SQL statements.

  Visit the `project page <https://github.com/andialbrecht/sqlparse>`_ for
  additional information and documentation.

  **Example Usage**


  Splitting SQL statements::

     >>> import sqlparse
     >>> sqlparse.split('select * from foo; select * from bar;')
     [u'select * from foo; ', u'select * from bar;']


  Formatting statements::

     >>> sql = 'select * from foo where id in (select id from bar);'
     >>> print sqlparse.format(sql, reindent=True, keyword_case='upper')
     SELECT *
     FROM foo
     WHERE id IN
       (SELECT id
        FROM bar);


  Parsing::

     >>> sql = 'select * from someschema.mytable where id = 1'
     >>> res = sqlparse.parse(sql)
     >>> res
     (<Statement 'select...' at 0x9ad08ec>,)
     >>> stmt = res[0]
     >>> str(stmt)  # converting it back to unicode
     'select * from someschema.mytable where id = 1'
     >>> # This is how the internal representation looks like:
     >>> stmt.tokens
     (<DML 'select' at 0x9b63c34>,
      <Whitespace ' ' at 0x9b63e8c>,
      <Operator '*' at 0x9b63e64>,
      <Whitespace ' ' at 0x9b63c5c>,
      <Keyword 'from' at 0x9b63c84>,
      <Whitespace ' ' at 0x9b63cd4>,
      <Identifier 'somes...' at 0x9b5c62c>,
      <Whitespace ' ' at 0x9b63f04>,
      <Where 'where ...' at 0x9b5caac>)


pkgId: 711e60afa84f36cbaa687072d642bb9d47cb8a506f8b918c15fa67bc448d13bb
name: rh-python36-stevedore
arch: noarch
version: 1.31.0
epoch: 0
release: 1
summary: Manage dynamic plugins for Python applications
url: https://docs.openstack.org/stevedore/latest/
rpm_license: UNKNOWN
rpm_vendor: OpenStack <openstack-dev@lists.openstack.org>
rpm_group: Development/Libraries
rpm_buildhost: 98dd77d8d2ea439cb1f0e7c38a5cccd0
rpm_sourcerpm: rh-python36-stevedore-1.31.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387210-rh-python36-stevedore/rh-python36-stevedore-1.31.0-1.noarch.rpm
checksum_type: sha256
description:
  ===========================================================
  stevedore -- Manage dynamic plugins for Python applications
  ===========================================================

  .. image:: https://img.shields.io/pypi/v/stevedore.svg
      :target: https://pypi.python.org/pypi/stevedore/
      :alt: Latest Version

  .. image:: https://img.shields.io/pypi/dm/stevedore.svg
      :target: https://pypi.python.org/pypi/stevedore/
      :alt: Downloads

  .. image:: http://governance.openstack.org/badges/stevedore.svg
      :target: http://governance.openstack.org/reference/tags/index.html

  Python makes loading code dynamically easy, allowing you to configure
  and extend your application by discovering and loading extensions
  ("*plugins*") at runtime. Many applications implement their own
  library for doing this, using ``__import__`` or ``importlib``.
  stevedore avoids creating yet another extension
  mechanism by building on top of `setuptools entry points`_. The code
  for managing entry points tends to be repetitive, though, so stevedore
  provides manager classes for implementing common patterns for using
  dynamically loaded extensions.

  .. _setuptools entry points: http://setuptools.readthedocs.io/en/latest/pkg_resources.html?#entry-points

  * Free software: Apache license
  * Documentation: https://docs.openstack.org/stevedore/latest
  * Source: https://git.openstack.org/cgit/openstack/stevedore
  * Bugs: https://bugs.launchpad.net/python-stevedore


pkgId: c8271e8270f79238ca3b2dff259f78e8bcc6c6a0034ce6fdd7f116897fc835a4
name: rh-python36-tabulate
arch: noarch
version: 0.8.2
epoch: 0
release: 1
summary: Pretty-print tabular data
url: https://bitbucket.org/astanin/python-tabulate
rpm_license: GPL
rpm_vendor: Sergey Astanin <s.astanin@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 66e92634ba464b529de0ebd9f79f69c0
rpm_sourcerpm: rh-python36-tabulate-0.8.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387251-rh-python36-tabulate/rh-python36-tabulate-0.8.2-1.noarch.rpm
checksum_type: sha256
description:
  ===============
  python-tabulate
  ===============

  Pretty-print tabular data in Python, a library and a command-line
  utility.

  The main use cases of the library are:

  * printing small tables without hassle: just one function call,
    formatting is guided by the data itself

  * authoring tabular data for lightweight plain-text markup: multiple
    output formats suitable for further editing or transformation

  * readable presentation of mixed textual and numeric data: smart
    column alignment, configurable number formatting, alignment by a
    decimal point


  Installation
  ------------

  To install the Python library and the command line utility, run::

      pip install tabulate

  The command line utility will be installed as ``tabulate`` to ``bin`` on Linux
  (e.g. ``/usr/bin``); or as ``tabulate.exe`` to ``Scripts`` in your Python
  installation on Windows (e.g. ``C:\Python27\Scripts\tabulate.exe``).

  You may consider installing the library only for the current user::

      pip install tabulate --user

  In this case the command line utility will be installed to ``~/.local/bin/tabulate``
  on Linux and to ``%APPDATA%\Python\Scripts\tabulate.exe`` on Windows.

  To install just the library on Unix-like operating systems::

      TABULATE_INSTALL=lib-only pip install tabulate

  On Windows::

      set TABULATE_INSTALL=lib-only
      pip install tabulate


  Library usage
  -------------

  The module provides just one function, ``tabulate``, which takes a
  list of lists or another tabular data type as the first argument,
  and outputs a nicely formatted plain-text table::

      >>> from tabulate import tabulate

      >>> table = [["Sun",696000,1989100000],["Earth",6371,5973.6],
      ...          ["Moon",1737,73.5],["Mars",3390,641.85]]
      >>> print tabulate(table)
      -----  ------  -------------
      Sun    696000     1.9891e+09
      Earth    6371  5973.6
      Moon     1737    73.5
      Mars     3390   641.85
      -----  ------  -------------

  The following tabular data types are supported:

  * list of lists or another iterable of iterables
  * list or another iterable of dicts (keys as columns)
  * dict of iterables (keys as columns)
  * two-dimensional NumPy array
  * NumPy record arrays (names as columns)
  * pandas.DataFrame

  Examples in this file use Python2. Tabulate supports Python3 too.


  Headers
  ~~~~~~~

  The second optional argument named ``headers`` defines a list of
  column headers to be used::

      >>> print tabulate(table, headers=["Planet","R (km)", "mass (x 10^29 kg)"])
      Planet      R (km)    mass (x 10^29 kg)
      --------  --------  -------------------
      Sun         696000           1.9891e+09
      Earth         6371        5973.6
      Moon          1737          73.5
      Mars          3390         641.85

  If ``headers="firstrow"``, then the first row of data is used::

      >>> print tabulate([["Name","Age"],["Alice",24],["Bob",19]],
      ...                headers="firstrow")
      Name      Age
      ------  -----
      Alice      24
      Bob        19


  If ``headers="keys"``, then the keys of a dictionary/dataframe, or
  column indices are used. It also works for NumPy record arrays and
  lists of dictionaries or named tuples::

      >>> print tabulate({"Name": ["Alice", "Bob"],
      ...                 "Age": [24, 19]}, headers="keys")
        Age  Name
      -----  ------
         24  Alice
         19  Bob


  Row Indices
  ~~~~~~~~~~~

  By default, only pandas.DataFrame tables have an additional column
  called row index. To add a similar column to any other type of table,
  pass ``showindex="always"`` or ``showindex=True`` argument to
  ``tabulate()``. To suppress row indices for all types of data, pass
  ``showindex="never"`` or ``showindex=False``.  To add a custom row
  index column, pass ``showindex=rowIDs``, where ``rowIDs`` is some
  iterable::

      >>> print(tabulate([["F",24],["M",19]], showindex="always"))
      -  -  --
      0  F  24
      1  M  19
      -  -  --


  Table format
  ~~~~~~~~~~~~

  There is more than one way to format a table in plain text.
  The third optional argument named ``tablefmt`` defines
  how the table is formatted.

  Supported table formats are:

  - "plain"
  - "simple"
  - "grid"
  - "fancy_grid"
  - "pipe"
  - "orgtbl"
  - "jira"
  - "psql"
  - "rst"
  - "mediawiki"
  - "moinmoin"
  - "html"
  - "latex"
  - "latex_booktabs"
  - "textile"

  ``plain`` tables do not use any pseudo-graphics to draw lines::

      >>> table = [["spam",42],["eggs",451],["bacon",0]]
      >>> headers = ["item", "qty"]
      >>> print tabulate(table, headers, tablefmt="plain")
      item      qty
      spam       42
      eggs      451
      bacon       0

  ``simple`` is the default format (the default may change in future
  versions).  It corresponds to ``simple_tables`` in `Pandoc Markdown
  extensions`::

      >>> print tabulate(table, headers, tablefmt="simple")
      item      qty
      ------  -----
      spam       42
      eggs      451
      bacon       0

  ``grid`` is like tables formatted by Emacs' `table.el`
  package.  It corresponds to ``grid_tables`` in Pandoc Markdown
  extensions::

      >>> print tabulate(table, headers, tablefmt="grid")
      +--------+-------+
      | item   |   qty |
      +========+=======+
      | spam   |    42 |
      +--------+-------+
      | eggs   |   451 |
      +--------+-------+
      | bacon  |     0 |
      +--------+-------+

  ``fancy_grid`` draws a grid using box-drawing characters::

      >>> print tabulate(table, headers, tablefmt="fancy_grid")
      ╒════════╤═══════╕
      │ item   │   qty │
      ╞════════╪═══════╡
      │ spam   │    42 │
      ├────────┼───────┤
      │ eggs   │   451 │
      ├────────┼───────┤
      │ bacon  │     0 │
      ╘════════╧═══════╛

  ``psql`` is like tables formatted by Postgres' psql cli::

      >>> print tabulate.tabulate()
      +--------+-------+
      | item   |   qty |
      |--------+-------|
      | spam   |    42 |
      | eggs   |   451 |
      | bacon  |     0 |
      +--------+-------+

  ``pipe`` follows the conventions of `PHP Markdown Extra` extension.  It
  corresponds to ``pipe_tables`` in Pandoc. This format uses colons to
  indicate column alignment::

      >>> print tabulate(table, headers, tablefmt="pipe")
      | item   |   qty |
      |:-------|------:|
      | spam   |    42 |
      | eggs   |   451 |
      | bacon  |     0 |

  ``orgtbl`` follows the conventions of Emacs `org-mode`, and is editable
  also in the minor `orgtbl-mode`. Hence its name::

      >>> print tabulate(table, headers, tablefmt="orgtbl")
      | item   |   qty |
      |--------+-------|
      | spam   |    42 |
      | eggs   |   451 |
      | bacon  |     0 |

  ``jira`` follows the conventions of Atlassian Jira markup language::

      >>> print tabulate(table, headers, tablefmt="jira")
      || item   ||   qty ||
      | spam   |    42 |
      | eggs   |   451 |
      | bacon  |     0 |

  ``rst`` formats data like a simple table of the `reStructuredText` format::

      >>> print tabulate(table, headers, tablefmt="rst")
      ======  =====
      item      qty
      ======  =====
      spam       42
      eggs      451
      bacon       0
      ======  =====

  ``mediawiki`` format produces a table markup used in `Wikipedia` and on
  other MediaWiki-based sites::

      >>> print tabulate(table, headers, tablefmt="mediawiki")
      {| class="wikitable" style="text-align: left;"
      |+ <!-- caption -->
      |-
      ! item   !! align="right"|   qty
      |-
      | spam   || align="right"|    42
      |-
      | eggs   || align="right"|   451
      |-
      | bacon  || align="right"|     0
      |}

  ``moinmoin`` format produces a table markup used in `MoinMoin`
  wikis::

      >>> print tabulate(d,headers,tablefmt="moinmoin")
      || ''' item   ''' || ''' quantity   ''' ||
      ||  spam    ||  41.999      ||
      ||  eggs    ||  451         ||
      ||  bacon   ||              ||

  ``textile`` format produces a table markup used in `Textile` format::

      >>> print tabulate(table, headers, tablefmt='textile')
      |_.  item   |_.   qty |
      |<. spam    |>.    42 |
      |<. eggs    |>.   451 |
      |<. bacon   |>.     0 |

  ``html`` produces standard HTML markup::

      >>> print tabulate(table, headers, tablefmt="html")
      <table>
      <tbody>
      <tr><th>item  </th><th style="text-align: right;">  qty</th></tr>
      <tr><td>spam  </td><td style="text-align: right;">   42</td></tr>
      <tr><td>eggs  </td><td style="text-align: right;">  451</td></tr>
      <tr><td>bacon </td><td style="text-align: right;">    0</td></tr>
      </tbody>
      </table>

  ``latex`` format creates a ``tabular`` environment for LaTeX markup::

      >>> print tabulate(table, headers, tablefmt="latex")
      \begin{tabular}{lr}
      \hline
       item   &   qty \\
      \hline
       spam   &    42 \\
       eggs   &   451 \\
       bacon  &     0 \\
      \hline
      \end{tabular}

  ``latex_booktabs`` creates a ``tabular`` environment for LaTeX markup
  using spacing and style from the ``booktabs`` package.


  .. _Pandoc Markdown extensions: http://johnmacfarlane.net/pandoc/README.html#tables
  .. _PHP Markdown Extra: http://michelf.ca/projects/php-markdown/extra/#table
  .. _table.el: http://table.sourceforge.net/
  .. _org-mode: http://orgmode.org/manual/Tables.html
  .. _reStructuredText: http://docutils.sourceforge.net/docs/user/rst/quickref.html#tables
  .. _Textile: http://redcloth.org/hobix.com/textile/
  .. _Wikipedia: http://www.mediawiki.org/wiki/Help:Tables


  Column alignment
  ~~~~~~~~~~~~~~~~

  ``tabulate`` is smart about column alignment. It detects columns which
  contain only numbers, and aligns them by a decimal point (or flushes
  them to the right if they appear to be integers). Text columns are
  flushed to the left.

  You can override the default alignment with ``numalign`` and
  ``stralign`` named arguments. Possible column alignments are:
  ``right``, ``center``, ``left``, ``decimal`` (only for numbers), and
  ``None`` (to disable alignment).

  Aligning by a decimal point works best when you need to compare
  numbers at a glance::

      >>> print tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]])
      ----------
          1.2345
        123.45
         12.345
      12345
       1234.5
      ----------

  Compare this with a more common right alignment::

      >>> print tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]], numalign="right")
      ------
      1.2345
      123.45
      12.345
       12345
      1234.5
      ------

  For ``tabulate``, anything which can be parsed as a number is a
  number. Even numbers represented as strings are aligned properly. This
  feature comes in handy when reading a mixed table of text and numbers
  from a file:

  ::

      >>> import csv ; from StringIO import StringIO
      >>> table = list(csv.reader(StringIO("spam, 42\neggs, 451\n")))
      >>> table
      [['spam', ' 42'], ['eggs', ' 451']]
      >>> print tabulate(table)
      ----  ----
      spam    42
      eggs   451
      ----  ----



  Number formatting
  ~~~~~~~~~~~~~~~~~

  ``tabulate`` allows to define custom number formatting applied to all
  columns of decimal numbers. Use ``floatfmt`` named argument::


      >>> print tabulate([["pi",3.141593],["e",2.718282]], floatfmt=".4f")
      --  ------
      pi  3.1416
      e   2.7183
      --  ------


  Wide (fullwidth CJK) symbols
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  To properly align tables which contain wide characters (typically fullwidth
  glyphs from Chinese, Japanese or Korean languages), the user should install
  ``wcwidth`` library. To install it together with ``tabulate``::

      pip install tabulate[widechars]

  Wide character support is enabled automatically if ``wcwidth`` library is
  already installed.  To disable wide characters support without uninstalling
  ``wcwidth``, set the global module-level flag ``WIDE_CHARS_MODE``::

      import tabulate
      tabulate.WIDE_CHARS_MODE = False


  Usage of the command line utility
  ---------------------------------

  ::

      Usage: tabulate [options] [FILE ...]

      FILE                      a filename of the file with tabular data;
                                if "-" or missing, read data from stdin.

      Options:

      -h, --help                show this message
      -1, --header              use the first row of data as a table header
      -o FILE, --output FILE    print table to FILE (default: stdout)
      -s REGEXP, --sep REGEXP   use a custom column separator (default: whitespace)
      -F FPFMT, --float FPFMT   floating point number format (default: g)
      -f FMT, --format FMT      set output table format; supported formats:
                                plain, simple, grid, fancy_grid, pipe, orgtbl,
                                rst, mediawiki, html, latex, latex_booktabs, tsv
                                (default: simple)


  Performance considerations
  --------------------------

  Such features as decimal point alignment and trying to parse everything
  as a number imply that ``tabulate``:

  * has to "guess" how to print a particular tabular data type
  * needs to keep the entire table in-memory
  * has to "transpose" the table twice
  * does much more work than it may appear

  It may not be suitable for serializing really big tables (but who's
  going to do that, anyway?) or printing tables in performance sensitive
  applications. ``tabulate`` is about two orders of magnitude slower
  than simply joining lists of values with a tab, coma or other
  separator.

  In the same time ``tabulate`` is comparable to other table
  pretty-printers. Given a 10x10 table (a list of lists) of mixed text
  and numeric data, ``tabulate`` appears to be slower than
  ``asciitable``, and faster than ``PrettyTable`` and ``texttable``

  ::

      =================================  ==========  ===========
      Table formatter                      time, μs    rel. time
      =================================  ==========  ===========
      csv to StringIO                          25.3          1.0
      join with tabs and newlines              33.6          1.3
      asciitable (0.8.0)                      590.0         23.4
      tabulate (0.7.7)                       1403.5         55.6
      tabulate (0.7.7, WIDE_CHARS_MODE)      2156.6         85.4
      PrettyTable (0.7.2)                    3377.0        133.7
      texttable (0.8.6)                      3986.3        157.8
      =================================  ==========  ===========


  Version history
  ---------------

  - 0.8: FUTURE RELEASE
  - 0.7.6: Bug fixes. New table formats (``psql``, ``jira``, ``moinmoin``, ``textile``).
    Wide character support. Printing from database cursors.
    Option to print row indices. Boolean columns. Ragged rows.
    Option to disable number parsing.
  - 0.7.5: Bug fixes. ``--float`` format option for the command line utility.
  - 0.7.4: Bug fixes. ``fancy_grid`` and ``html`` formats. Command line utility.
  - 0.7.3: Bug fixes. Python 3.4 support. Iterables of dicts. ``latex_booktabs`` format.
  - 0.7.2: Python 3.2 support.
  - 0.7.1: Bug fixes. ``tsv`` format. Column alignment can be disabled.
  - 0.7: ``latex`` tables. Printing lists of named tuples and NumPy
    record arrays. Fix printing date and time values. Python <= 2.6.4 is supported.
  - 0.6: ``mediawiki`` tables, bug fixes.
  - 0.5.1: Fix README.rst formatting. Optimize (performance similar to 0.4.4).
  - 0.5: ANSI color sequences. Printing dicts of iterables and Pandas' dataframes.
  - 0.4.4: Python 2.6 support.
  - 0.4.3: Bug fix, None as a missing value.
  - 0.4.2: Fix manifest file.
  - 0.4.1: Update license and documentation.
  - 0.4: Unicode support, Python3 support, ``rst`` tables.
  - 0.3: Initial PyPI release. Table formats: ``simple``, ``plain``,
    ``grid``, ``pipe``, and ``orgtbl``.


  How to contribute
  -----------------

  Contributions should include tests and an explanation for the changes they
  propose. Documentation (examples, docstrings, README.rst) should be updated
  accordingly.

  This project uses `nose` testing framework and `tox` to automate testing in
  different environments. Add tests to one of the files in the ``test/`` folder.

  To run tests on all supported Python versions, make sure all Python
  interpreters, ``nose`` and ``tox`` are installed, then run ``tox`` in
  the root of the project source tree.

  On Linux ``tox`` expects to find executables like ``python2.6``,
  ``python2.7``, ``python3.4`` etc. On Windows it looks for
  ``C:\Python26\python.exe``, ``C:\Python27\python.exe`` and
  ``C:\Python34\python.exe`` respectively.

  To test only some Python environements, use ``-e`` option. For
  example, to test only against Python 2.7 and Python 3.4, run::

      tox -e py27,py34

  in the root of the project source tree.

  To enable NumPy and Pandas tests, run::

      tox -e py27-extra,py34-extra

  (this may take a long time the first time, because NumPy and Pandas
  will have to be installed in the new virtual environments)

  See ``tox.ini`` file to learn how to use ``nosetests`` directly to
  test individual Python versions.

  .. _nose: https://nose.readthedocs.org/
  .. _tox: http://tox.testrun.org/


  Contributors
  ------------

  Sergey Astanin, Pau Tallada Crespí, Erwin Marsi, Mik Kocikowski, Bill Ryder,
  Zach Dwiel, Frederik Rietdijk, Philipp Bogensberger, Greg (anonymous),
  Stefan Tatschner, Emiel van Miltenburg, Brandon Bennett, Amjith Ramanujam,
  Jan Schulz, Simon Percivall, Javier Santacruz López-Cepero, Sam Denton,
  Alexey Ziyangirov, acaird, Cesar Sanchez, naught101, John Vandenberg,
  Zack Dever.


pkgId: 8ed2492ecca496faaecd32782c7bcbc5a26641a04f7ce4bb4decf61b4c8a4eb1
name: rh-python36-tempora
arch: noarch
version: 2.1.0
epoch: 0
release: 1
summary: Objects and routines pertaining to date and time (tempora)
url: https://github.com/jaraco/tempora
rpm_license: UNKNOWN
rpm_vendor: Jason R. Coombs <jaraco@jaraco.com>
rpm_group: Development/Libraries
rpm_buildhost: 35b068423f7e41c4923e5fdfea9c8491
rpm_sourcerpm: rh-python36-tempora-2.1.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387172-rh-python36-tempora/rh-python36-tempora-2.1.0-1.noarch.rpm
checksum_type: sha256
description:
  .. image:: https://img.shields.io/pypi/v/tempora.svg
     :target: https://pypi.org/project/tempora

  .. image:: https://img.shields.io/pypi/pyversions/tempora.svg

  .. image:: https://img.shields.io/travis/jaraco/tempora/master.svg
     :target: http://travis-ci.org/jaraco/tempora

  Objects and routines pertaining to date and time (tempora).

  Modules include:

   - tempora (top level package module) contains miscellaneous
     utilities and constants.
   - timing contains routines for measuring and profiling.
   - schedule contains an event scheduler.


pkgId: c9c89e23f47b4c1e436e73a5fe5d4117e651654205f160553763ff1c8c6241c6
name: rh-python36-testtools
arch: noarch
version: 2.3.0
epoch: 0
release: 1
summary: Extensions to the Python standard library unit testing framework
url: https://github.com/testing-cabal/testtools
rpm_license: UNKNOWN
rpm_vendor: Jonathan M. Lange <jml+testtools@mumak.net>
rpm_group: Development/Libraries
rpm_buildhost: f29995994ee74b52a5bcd70ccdf1b0f6
rpm_sourcerpm: rh-python36-testtools-2.3.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387050-rh-python36-testtools/rh-python36-testtools-2.3.0-1.noarch.rpm
checksum_type: sha256
description:
  ======================================
  testtools: tasteful testing for Python
  ======================================

  testtools is a set of extensions to the Python standard library's unit testing
  framework. These extensions have been derived from many years of experience
  with unit testing in Python and come from many different sources.

  What better way to start than with a contrived code snippet?::

    from testtools import TestCase
    from testtools.content import Content
    from testtools.content_type import UTF8_TEXT
    from testtools.matchers import Equals

    from myproject import SillySquareServer

    class TestSillySquareServer(TestCase):

        def setUp(self):
            super(TestSillySquareServer, self).setUp()
            self.server = self.useFixture(SillySquareServer())
            self.addCleanup(self.attach_log_file)

        def attach_log_file(self):
            self.addDetail(
                'log-file',
                Content(UTF8_TEXT,
                        lambda: open(self.server.logfile, 'r').readlines()))

        def test_server_is_cool(self):
            self.assertThat(self.server.temperature, Equals("cool"))

        def test_square(self):
            self.assertThat(self.server.silly_square_of(7), Equals(49))


  Why use testtools?
  ==================

  Better assertion methods
  ------------------------

  The standard assertion methods that come with unittest aren't as helpful as
  they could be, and there aren't quite enough of them.  testtools adds
  ``assertIn``, ``assertIs``, ``assertIsInstance`` and their negatives.


  Matchers: better than assertion methods
  ---------------------------------------

  Of course, in any serious project you want to be able to have assertions that
  are specific to that project and the particular problem that it is addressing.
  Rather than forcing you to define your own assertion methods and maintain your
  own inheritance hierarchy of ``TestCase`` classes, testtools lets you write
  your own "matchers", custom predicates that can be plugged into a unit test::

    def test_response_has_bold(self):
       
       response = self.server.getResponse()
       self.assertThat(response, HTMLContains(Tag('bold', 'b')))


  More debugging info, when you need it
  --------------------------------------

  testtools makes it easy to add arbitrary data to your test result.  If you
  want to know what's in a log file when a test fails, or what the load was on
  the computer when a test started, or what files were open, you can add that
  information with ``TestCase.addDetail``, and it will appear in the test
  results if that test fails.


  Extend unittest, but stay compatible and re-usable
  --------------------------------------------------

  testtools goes to great lengths to allow serious test authors and test
  *framework* authors to do whatever they like with their tests and their
  extensions while staying compatible with the standard library's unittest.

  testtools has completely parametrized how exceptions raised in tests are
  mapped to ``TestResult`` methods and how tests are actually executed (ever
  wanted ``tearDown`` to be called regardless of whether ``setUp`` succeeds?)

  It also provides many simple but handy utilities, like the ability to clone a
  test, a ``MultiTestResult`` object that lets many result objects get the
  results from one test suite, adapters to bring legacy ``TestResult`` objects
  into our new golden age.


  Cross-Python compatibility
  --------------------------

  testtools gives you the very latest in unit testing technology in a way that
  will work with Python 2.7, 3.3, 3.4, 3.5, and pypy.

  If you wish to use testtools with Python 2.4 or 2.5, then please use testtools
  0.9.15.

  If you wish to use testtools with Python 2.6 or 3.2, then please use testtools
  1.9.0.


pkgId: 2c1f579b1b2d334e4a1d84e786f4d92ff4728075d025d042af6e13dcd4d1f29e
name: rh-python36-traceback2
arch: noarch
version: 1.4.0
epoch: 0
release: 1
summary: Backports of the traceback module
url: https://github.com/testing-cabal/traceback2
rpm_license: UNKNOWN
rpm_vendor: Testing-cabal <testing-cabal@lists.launchpad.net>
rpm_group: Development/Libraries
rpm_buildhost: 5f8b83ee365946499532d8cdac95ebad
rpm_sourcerpm: rh-python36-traceback2-1.4.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387062-rh-python36-traceback2/rh-python36-traceback2-1.4.0-1.noarch.rpm
checksum_type: sha256
description:
  A backport of traceback to older supported Pythons.

   >>> import traceback2 as traceback

  Profit.

  Things to be aware of!

  In Python 2.x, unlike traceback, traceback2 creates unicode output (because it
  depends on the linecache2 module).

  Exception frame clearing silently does nothing if the interpreter in use does
  not support it.

  traceback2._some_str, which while not an official API is so old its likely in
  use behaves similarly to the Python3 version - objects where unicode(obj) fails
  but str(object) works will be shown as b'thestrvaluerepr'.


pkgId: 2ce569f050009899aa48f2b4b177568908b6f762c9055b4a852a27f1d5fcda2c
name: rh-python36-twilio
arch: noarch
version: 6.35.2
epoch: 0
release: 1
summary: Twilio API client and TwiML generator
url: https://github.com/twilio/twilio-python/
rpm_license: UNKNOWN
rpm_vendor: Twilio <help@twilio.com>
rpm_group: Development/Libraries
rpm_buildhost: a5aeea71344440eba134bb3eb2357fb4
rpm_sourcerpm: rh-python36-twilio-6.35.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387173-rh-python36-twilio/rh-python36-twilio-6.35.2-1.noarch.rpm
checksum_type: sha256
description:
      Python Twilio Helper Library
      ----------------------------

      DESCRIPTION
      The Twilio REST SDK simplifies the process of making calls using the Twilio REST API.
      The Twilio REST API lets to you initiate outgoing calls, list previous calls,
      and much more.  See https://www.github.com/twilio/twilio-python for more information.

       LICENSE The Twilio Python Helper Library is distributed under the MIT
      License


pkgId: 6ca202d7796c16cd33b030d7f2d072b8388040953931f205a665ab6630c6ea77
name: rh-python36-txaio
arch: noarch
version: 20.1.1
epoch: 0
release: 1
summary: Compatibility API between asyncio/Twisted/Trollius
url: https://github.com/crossbario/txaio
rpm_license: MIT License
rpm_vendor: Crossbar.io Technologies GmbH <autobahnws@googlegroups.com>
rpm_group: Development/Libraries
rpm_buildhost: 91a6652abc9c4373b8eced0292ebb40e
rpm_sourcerpm: rh-python36-txaio-20.1.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387116-rh-python36-txaio/rh-python36-txaio-20.1.1-1.noarch.rpm
checksum_type: sha256
description:
  txaio
  =====

  | |Version| |Build Status| |Coverage| |Docs|

  --------------

  **txaio** is a helper library for writing code that runs unmodified on
  both `Twisted <https://twistedmatrix.com/>`_ and `asyncio <https://docs.python.org/3/library/asyncio.html>`_ / `Trollius <http://trollius.readthedocs.org/en/latest/index.html>`_.

  This is like `six <http://pythonhosted.org/six/>`_, but for wrapping
  over differences between Twisted and asyncio so one can write code
  that runs unmodified on both (aka *source code compatibility*). In
  other words: your *users* can choose if they want asyncio **or** Twisted
  as a dependency.

  Note that, with this approach, user code **runs under the native event
  loop of either Twisted or asyncio**. This is different from attaching
  either one's event loop to the other using some event loop adapter.


  Platform support
  ----------------

  **txaio** runs on CPython 2.7/3.3+ and PyPy 2/3, on top of Twisted or asyncio. Specifically, **txaio** is tested on the following platforms:

  **Python 2:**

  * CPython 2.7 on Twisted 12.1, 13.2, 15.4, 16.5, trunk and on Trollius 2.0
  * PyPy 2 on Twisted 12.1, 13.2, 15.4, 16.5, trunk and on Trollius 2.0

  **Python 3:**

  * CPython 3.3 on Twisted 15.4, 16.5, trunk and on Trollius 2.0
  * CPython 3.4 on Twisted 15.4, 16.5, trunk and on asyncio (stdlib)
  * CPython 3.5 on Twisted 15.4, 16.5, trunk and on asyncio (stdlib)
  * CPython 3.6 on Twisted 15.4, 16.5, trunk and on asyncio (stdlib)
  * PyPy 3 on Twisted 15.4, 16.5, trunk and on asyncio (stdlib)


  How it works
  ------------

  Instead of directly importing, instantiating and using ``Deferred``
  (for Twisted) or ``Future`` (for asyncio) objects, **txaio** provides
  helper-functions to do that for you, as well as associated things like
  adding callbacks or errbacks.

  This obviously changes the style of your code, but then you can choose
  at runtime (or import time) which underlying event-loop to use. This
  means you can write **one** code-base that can run on Twisted *or*
  asyncio (without a Twisted dependency) as you or your users see fit.

  Code like the following can then run on *either* system:

  .. sourcecode:: python

      import txaio
      txaio.use_twisted()  # or .use_asyncio()

      f0 = txaio.create_future()
      f1 = txaio.as_future(some_func, 1, 2, key='word')
      txaio.add_callbacks(f0, callback, errback)
      txaio.add_callbacks(f1, callback, errback)
      
      txaio.resolve(f0, "value")
      txaio.reject(f1, RuntimeError("it failed"))

  Please refer to the `documentation <https://txaio.readthedocs.io/en/latest/>`_ for description and usage of the library features.


  .. |Version| image:: https://img.shields.io/pypi/v/txaio.svg
     :target: https://pypi.python.org/pypi/txaio

  .. |Build Status| image:: https://travis-ci.org/crossbario/txaio.svg?branch=master
     :target: https://travis-ci.org/crossbario/txaio

  .. |Coverage| image:: https://codecov.io/github/crossbario/txaio/coverage.svg?branch=master
     :target: https://codecov.io/github/crossbario/txaio

  .. |Docs| image:: https://readthedocs.org/projects/txaio/badge/?version=latest
     :target: https://txaio.readthedocs.io/en/latest/


pkgId: bdb2503d0cf4135ec8ae7da357803ce1934dbefced28dd6830544ead31a05135
name: rh-python36-typing
arch: noarch
version: 3.7.4.1
epoch: 0
release: 1
summary: Type Hints for Python
url: https://docs.python.org/3/library/typing.html
rpm_license: PSF
rpm_vendor: Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Ivan Levkivskyi <jukka.lehtosalo@iki.fi>
rpm_group: Development/Libraries
rpm_buildhost: bf7068262ae34cc98497a0392768aeab
rpm_sourcerpm: rh-python36-typing-3.7.4.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387166-rh-python36-typing/rh-python36-typing-3.7.4.1-1.noarch.rpm
checksum_type: sha256
description:
  Typing -- Type Hints for Python

  This is a backport of the standard library typing module to Python
  versions older than 3.5.  (See note below for newer versions.)

  Typing defines a standard notation for Python function and variable
  type annotations. The notation can be used for documenting code in a
  concise, standard format, and it has been designed to also be used by
  static and runtime type checkers, static analyzers, IDEs and other
  tools.

  NOTE: in Python 3.5 and later, the typing module lives in the stdlib,
  and installing this package has NO EFFECT.  To get a newer version of
  the typing module in Python 3.5 or later, you have to upgrade to a
  newer Python (bugfix) version.  For example, typing in Python 3.6.0 is
  missing the definition of 'Type' -- upgrading to 3.6.2 will fix this.

  Also note that most improvements to the typing module in Python 3.7
  will not be included in this package, since Python 3.7 has some
  built-in support that is not present in older versions (See PEP 560.)


pkgId: 8a4f92b8c14547ac4af1e69c19a450b0faa025b0671e4f6bd224ce2c8f763d73
name: rh-python36-typing_extensions
arch: noarch
version: 3.7.4.1
epoch: 0
release: 1
summary: Backported and Experimental Type Hints for Python 3.5+
url: https://github.com/python/typing/blob/master/typing_extensions/README.rst
rpm_license: PSF
rpm_vendor: Guido van Rossum, Jukka Lehtosalo, Lukasz Langa, Michael Lee <levkivskyi@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 1d51cd84ab994e05952309e5b63f9f0a
rpm_sourcerpm: rh-python36-typing_extensions-3.7.4.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387009-rh-python36-typing_extensions/rh-python36-typing_extensions-3.7.4.1-1.noarch.rpm
checksum_type: sha256
description:
  Typing Extensions -- Backported and Experimental Type Hints for Python

  The ``typing`` module was added to the standard library in Python 3.5 on
  a provisional basis and will no longer be provisional in Python 3.7. However,
  this means users of Python 3.5 - 3.6 who are unable to upgrade will not be
  able to take advantage of new types added to the ``typing`` module, such as
  ``typing.Text`` or ``typing.Coroutine``.

  The ``typing_extensions`` module contains both backports of these changes
  as well as experimental types that will eventually be added to the ``typing``
  module, such as ``Protocol`` or ``TypedDict``.

  Users of other Python versions should continue to install and use
  the ``typing`` module from PyPi instead of using this one unless specifically
  writing code that must be compatible with multiple Python versions or requires
  experimental types.


pkgId: 5fabe5f35019083ac6f45eb8598fa06def1c9ee136e7d46fad97afceb52da3c3
name: rh-python36-unittest2
arch: noarch
version: 1.1.0
epoch: 0
release: 1
summary: The new features in unittest backported to Python 2.4+.
url: http://pypi.python.org/pypi/unittest2
rpm_license: UNKNOWN
rpm_vendor: Robert Collins <rbtcollins@hp.com>
rpm_group: Development/Libraries
rpm_buildhost: 5215638c0e1a458d906951332a0cbad7
rpm_sourcerpm: rh-python36-unittest2-1.1.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387057-rh-python36-unittest2/rh-python36-unittest2-1.1.0-1.noarch.rpm
checksum_type: sha256
description:
  unittest2 is a backport of the new features added to the unittest testing
  framework in Python 2.7 and onwards. It is tested to run on Python 2.6, 2.7,
  3.2, 3.3, 3.4 and pypy.

  To use unittest2 instead of unittest simply replace ``import unittest`` with
  ``import unittest2``.

  unittest2 is maintained in a mercurial repository. The issue tracker is on
  google code:

  * `unittest2 hg <http://hg.python.org/unittest2>`_
  * `unittest2 issue tracker
    <http://code.google.com/p/unittest-ext/issues/list>`_
  * `Article / Docs: New features in unittest
    <http://www.voidspace.org.uk/python/articles/unittest2.shtml>`_

  Thanks to Mark Roddy, there is a distribution of unittest2 0.5.1 for Python 2.3.
  This is maintained as a separate branch and is a separate download.

  To avoid problems with ``pip`` installing the wrong distribution, the Python 2.3
  version of unittest2 can't be hosted on PyPI:

  * `Download unittest2 0.5.1 for Python 2.3 <http://voidspace.org.uk/downloads/unittest2-0.5.1-python2.3.zip>`_

  There was a separate version of unittest2 for Python 3. This is no longer
  needed, but still exists on PyPI. This had the project name "unittest2py3k" but
  uses the same package name ("unittest2"):

  * `unittest2 for Python 3 <http://pypi.python.org/pypi/unittest2py3k>`_

  Classes in unittest2 derive from the appropriate classes in unittest, so it
  should be possible to use the unittest2 test running infrastructure without
  having to switch all your tests to using unittest2 immediately. Similarly
  you can use the new assert methods on ``unittest2.TestCase`` with the standard
  unittest test running infrastructure. Not all of the new features in unittest2
  will work with the standard unittest test loaders, runners result objects
  however.

  In general for documentation on unittest2 see the current latest documented of
  CPython:

  * `CPython unittest documentation <https://docs.python.org/dev/library/unittest.html>`_

  New features include:

  * ``addCleanups`` - better resource management
  * *many* new assert methods including better defaults for comparing lists,
    sets, dicts unicode strings etc and the ability to specify new default methods
    for comparing specific types
  * ``assertRaises`` as context manager, with access to the exception afterwards
  * test discovery and new command line options (including failfast and better
    handling of ctrl-C during test runs)
  * class and module level fixtures: ``setUpClass``, ``tearDownClass``,
    ``setUpModule``, ``tearDownModule``
  * test skipping and expected failures
  * new ``delta`` keyword argument to ``assertAlmostEqual`` for more useful
    comparison and for comparing non-numeric objects (like datetimes)
  * ``load_tests`` protocol for loading tests from modules or packages
  * ``startTestRun`` and ``stopTestRun`` methods on TestResult
  * various other API improvements and fixes

  .. note:: Command line usage

      In Python 2.7 you invoke the unittest command line features (including test
      discover) with ``python -m unittest <args>``. As unittest is a package, and
      the ability to invoke packages with ``python -m ...`` is new in Python 2.7,
      we can't do this for unittest2.

      Instead unittest2 comes with a script ``unit2``.
      `Command line usage
      <http://docs.python.org/dev/library/unittest.html#command-line-interface>`_::

          unit2 discover
          unit2 -v test_module

      There is also a copy of this script called ``unit2.py``, useful for Windows
      which uses file-extensions rather than shebang lines to determine what
      program to execute files with. Both of these scripts are installed by
      distutils.

  Until I write proper documentation, the best information on all the new features
  is the development version of the Python documentation for Python 2.7:

  * http://docs.python.org/dev/library/unittest.html

  Look for notes about features added or changed in Python 2.7.

  .. note::

      unittest2 is already in use for development of `distutils2
      <http://hg.python.org/distutils2>`_.

      Version 0.5.1 of unittest2 has feature parity with unittest_ in Python 2.7
      final. If you want to ensure that your tests run identically under unittest2
      and unittest in Python 2.7 you should use unittest2 0.5.1.

      Later versions of unittest2 include changes in unittest made in Python 3.2
      and onwards after the release of Python 2.7.


  .. _unittest: http://docs.python.org/release/2.7/library/unittest.html


  Differences
  ===========

  Differences between unittest2 and unittest in Python 2.7:

  ``assertItemsEqual`` does not silence Py3k warnings as this uses
  ``warnings.catch_warnings()`` which is new in Python 2.6 (and is used as a
  context manager which would be a pain to make work with Python 2.4).

  ``TestCase.longMessage`` defaults to True because it is better. It defaults to
  False in Python 2.7 for backwards compatibility reasons.

  ``python -m package`` doesn't work in versions of Python before Python 2.7. The
  command line features of unittest2 are provided by a ``unit2`` (and
  ``unit2.py``) script instead.

  unittest2 includes a very basic setuptools compatible test collector. Specify
  ``test_suite = 'unittest2.collector'`` in your setup.py. This starts test
  discovery with the default parameters from the directory containing setup.py, so
  it is perhaps most useful as an example (see unittest2/collector.py).

  In unittest2 TextTestResult.stopTestRun is responsible for calling printErrors.
  This is desirable behaviour but in Python 3.1 TestResult.stopTestRun was
  documented as being empty and subclasses shouldn't need to call it. This would
  make the change backwards incompatible and needs thinking about.



  Issues
  ======

  A ``TestResult`` object with unexpected successes returns True
  for ``result.wasSuccessful()``. Difficult to know if this is the correct
  behaviour or not.

  If a dotted path name is used for test discovery then a globally installed
  module/package will still be used in preference of one in the current
  directory. When doing discovery from a dotted path name we could check for this
  specific case.

  The ``removeHandler`` decorator could also be a context manager.

  `Issue 8313: <http://bugs.python.org/issue8313>`_, \<unprintable AssertionError object\>
  message in unittest tracebacks, is hard to fix in versions of Python before 2.7.
  The fix in Python 2.7 relies on changes to both the traceback module and
  traceback objects. As the issue is rare I am leaving it unfixed in unittest2.

  There are several places in unittest2 (and unittest) that call ``str(...)`` on
  exceptions to get the exception message. This can fail if the exception was
  created with non-ascii unicode. This is rare and I won't address it unless it is
  actually reported as a problem for someone.

  A comparison of text or long sequences (using ``assertSequenceEqual`` or
  ``assertMultiLineEqual`` etc) can take a *long* time to generate diffs for
  failure messages. These methods use ``prettyprint`` and ``difflib``.

  ``pip install -e .`` on Python3.2 in the unittest2 source will fail unless
  setuptools > 0.6.24 is already installed. This is a combination of needing a
  newer setuptools (to avoid the use of execfile) and setup_requires falling back
  to easy_install that doesn't know how to upgrade setuptools just-in-time that
  prevents it being fixed in unittest2.


  CHANGELOG
  =========

  2015-06-20 - 1.1.0
  ------------------

  - Issue #15836: assertRaises(), assertRaisesRegex(), assertWarns() and
    assertWarnsRegex() assertments now check the type of the first argument
    to prevent possible user error.  Based on patch by Daniel Wagner-Hall.

  - Issue #24134: assertRaises(), assertRaisesRegex(), assertWarns() and
    assertWarnsRegex() checks now emits a deprecation warning when callable is
    None or keyword arguments except msg is passed in the context manager mode.

  - Issue #22903: The fake test case created by unittest.loader when it fails
    importing a test module is now picklable.


  2015-03-12 - 1.0.1
  ------------------

  - Unittest2 issue #94: Need at least 1.4 of six.

  2015-03-06 - 1.0.0
  ------------------

  - Issue #22936: Permit showing local variables in tracebacks.

  2014/11/05 - 0.8
  ----------------

  - Issue #22457: Honour load_tests in the start_dir of discovery.

  - Issue #22894: TestCase.subTest() would cause the test suite to be stopped
    when in failfast mode, even in the absence of failures.

  2014/10/31 - 0.7.1
  ------------------

  Fix for 0.7.0 being broken. Also switches from both manual and entrypoint
  scripts to just entrypoint scripts to reduce the possibility of similar
  oversights in future.

  2014/10/31 - 0.7.0
  ------------------

  This release contains backports from cPython 3.5 of all (I think) commits since
  2010, as of today.

  2014/10/28 - 0.6.0
  ------------------

  Many thanks to Mark Roddy and Ezio Melotti who contributed substantially to
  this release.

  * Changed supported Python versions to start at 2.6, and include all released 3.x
    and pypy. (Robert Collins)
  * Invoking `unit2` without args starts test discovery
  * Added `TestCase.assertWarns` and `TestCase.assertWarnsRegexp` context managers
  * Fix Python issue 9926. TestSuite subclasses that override __call__ are called
    correctly.
  * Removed unused `maxDiff` parameter from `TestCase.assertSequenceEqual`.
  * DeprecationWarning for unsupported result objects (missing addSkip method)
    became RuntimeWarning.
  * Addition of `TestCase.assertWarns` as a context manager.


  2010/07/12 - 0.5.1
  ------------------

  Reverted script names created by setuptools back to "unit2" instead of
  "unit2.py". (Not necessary as setuptools creates stub .exes for console scripts
  anyway.)


  2010/07/11 - 0.5.0
  ------------------

  Addition of a setuptools compatible test collector (very basic). Specify
  ``test_suite = 'unittest2.collector'`` in your setup.py.

  ``TestSuite.debug()`` and ``TestCase.debug()`` now execute cleanup functions
  and class and module level setups and teardowns.

  No longer monkey-patch os.path.relpath for Python 2.4 / 2.5 so that projects
  don't accidentally depend on our patching. Contributed by Konrad Delong.

  Added a Python version specific unit2 entrypoint. This will, for example,
  create a ``unit2-2.6`` script if unittest2 is installed with Python 2.6.
  (Requires setuptools or distribute.)

  Python 2.3 compatibility (in the python2.3 branch of the repository),
  contributed by Mark Roddy.

  setuptools console script entry points are created as '.py' scripts on Windows.

  Feature parity with the Python 2.7 final release.


  2010/06/06 - 0.4.2
  ------------------

  Improved help message for ``unit2 discover -h``.

  SkipTest in unittest.TestCase.setUpClass or setUpModule is now reported as a
  skip rather than an error.

  Excessively large diffs due to ``TestCase.assertSequenceEqual`` are no
  longer included in failure reports. (Controlled by ``TestCase.maxDiff``.)

  Matching files during test discovery is done in ``TestLoader._match_path``. This
  method can be overriden in subclasses to, for example, match on the full file
  path or use regular expressions for matching.

  Addition of a setuptools compatible entrypoint for the unit2 test runner script.
  Contributed by Chris Withers.

  Tests fixed to be compatible with Python 2.7, where deprecation warnings are
  silenced by default.

  Feature parity with unittest in Python 2.7 RC 1.


  2010/05/09 - 0.4.1
  ------------------

  If test discovery imports a module from the wrong location (usually because the
  module is globally installed and the user is expecting to run tests against a
  development version in a different location) then discovery halts with an
  ``ImportError`` and the problem is reported.

  Added docstrings to ``assertRegexpMatches`` and ``assertNotRegexpMatches``.

  Putting functions in test suites no longer crashes.

  Feature parity with unittest in Python 2.7 Beta 2.

  2010/04/08 - 0.4.0
  ------------------

  Addition of ``removeHandler`` for removing the control-C handler.

  ``delta`` keyword argument for ``assertAlmostEqual`` and
  ``assertNotAlmostEqual``.

  Addition of -b command line option (and ``TestResult.buffer``) for buffering
  stdout / stderr during test runs.

  Addition of ``TestCase.assertNotRegexpMatches``.

  Allow test discovery using dotted module names instead of a path.

  All imports requiring the signal module are now optional, for compatiblity
  with IronPython (or other platforms without this module).

  Tests fixed to be compatible with nosetest.


  2010/03/26 - 0.3.0
  ------------------

  ``assertSameElements`` removed and ``assertItemsEqual`` added; assert that
  sequences contain the same elements.

  Addition of -f/--failfast command line option, stopping test run on first
  failure or error.

  Addition of -c/--catch command line option for better control-C handling during
  test runs.

  Added ``BaseTestSuite``, for use by frameworks that don't want to support shared
  class and module fixtures.

  Skipped test methods no longer have ``setUp`` and ``tearDown`` called around
  them.

  Faulty ``load_tests`` functions no longer halt test discovery.

  Using non-strings for failure messages now works.

  Potential for ``UnicodeDecodeError`` whilst creating failure messages fixed.

  Split out monolithic test module into a package.

  BUGFIX: Correct usage message now shown for unit2 scripts.

  BUGFIX: ``__unittest`` in module globals trims frames from that module in
  reported stacktraces.


  2010/03/06 - 0.2.0
  ------------------

  The ``TextTestRunner`` is now compatible with old result objects and standard
  (non-TextTestResult) ``TestResult`` objects.

  ``setUpClass`` / ``tearDownClass`` / ``setUpModule`` / ``tearDownModule`` added.


  2010/02/22 - 0.1.6
  ------------------

  Fix for compatibility with old ``TestResult`` objects. New tests can now be run
  with nosetests (with a DeprecationWarning for ``TestResult`` objects without
  methods to support skipping etc).


  0.1
  ---

  Initial release.


  TODO
  ====

  * Document ``SkipTest``, ``BaseTestSuite```

  Release process
  ===============

  1. Make sure there is an entry in the Changelog in this document.
  1. Update __version__ in unittest2/__init__.py
  1. Commit.
  1. Create a tag for the version (e.g. ``hg tag 0.6.0``)
  1. Push so there is no outstanding patches and no room for races.
  1. Run ``make release`` to build an sdist and wheel and upload to pypi.


pkgId: 868465e3cbda141a24e14b7d30619132d29a937bf9531eae333b85b1cd9170d7
name: rh-python36-urllib3
arch: noarch
version: 1.25.8
epoch: 0
release: 1
summary: HTTP library with thread-safe connection pooling, file post, and more.
url: https://urllib3.readthedocs.io/
rpm_license: MIT
rpm_vendor: Andrey Petrov <andrey.petrov@shazow.net>
rpm_group: Development/Libraries
rpm_buildhost: c87773261ad548929f531123c40a439b
rpm_sourcerpm: rh-python36-urllib3-1.25.8-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387179-rh-python36-urllib3/rh-python36-urllib3-1.25.8-1.noarch.rpm
checksum_type: sha256
description:
  urllib3
  =======

  .. image:: https://travis-ci.org/urllib3/urllib3.svg?branch=master
          :alt: Build status on Travis
          :target: https://travis-ci.org/urllib3/urllib3

  .. image:: https://img.shields.io/appveyor/ci/urllib3/urllib3/master.svg
          :alt: Build status on AppVeyor
          :target: https://ci.appveyor.com/project/urllib3/urllib3

  .. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest
          :alt: Documentation Status
          :target: https://urllib3.readthedocs.io/en/latest/

  .. image:: https://img.shields.io/codecov/c/github/urllib3/urllib3.svg
          :alt: Coverage Status
          :target: https://codecov.io/gh/urllib3/urllib3

  .. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400
          :alt: PyPI version
          :target: https://pypi.org/project/urllib3/

  .. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525
          :alt: Bountysource
          :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE

  .. image:: https://badges.gitter.im/python-urllib3/Lobby.svg
          :alt: Gitter
          :target: https://gitter.im/python-urllib3/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge

  urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the
  Python ecosystem already uses urllib3 and you should too.
  urllib3 brings many critical features that are missing from the Python
  standard libraries:

  - Thread safety.
  - Connection pooling.
  - Client-side SSL/TLS verification.
  - File uploads with multipart encoding.
  - Helpers for retrying requests and dealing with HTTP redirects.
  - Support for gzip and deflate encoding.
  - Proxy support for HTTP and SOCKS.
  - 100% test coverage.

  urllib3 is powerful and easy to use::

      >>> import urllib3
      >>> http = urllib3.PoolManager()
      >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
      >>> r.status
      200
      >>> r.data
      'User-agent: *\nDisallow: /deny\n'


  Installing
  ----------

  urllib3 can be installed with `pip <https://pip.pypa.io>`_::

      $ pip install urllib3

  Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::

      $ git clone git://github.com/urllib3/urllib3.git
      $ python setup.py install


  Documentation
  -------------

  urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.


  Contributing
  ------------

  urllib3 happily accepts contributions. Please see our
  `contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_
  for some tips on getting started.


  Maintainers
  -----------

  - `@theacodes <https://github.com/theacodes>`_ (Thea Flowers)
  - `@SethMichaelLarson <https://github.com/SethMichaelLarson>`_ (Seth M. Larson)
  - `@haikuginger <https://github.com/haikuginger>`_ (Jesse Shapiro)
  - `@lukasa <https://github.com/lukasa>`_ (Cory Benfield)
  - `@sigmavirus24 <https://github.com/sigmavirus24>`_ (Ian Cordasco)
  - `@shazow <https://github.com/shazow>`_ (Andrey Petrov)

  👋


  Sponsorship
  -----------

  If your company benefits from this library, please consider `sponsoring its
  development <https://urllib3.readthedocs.io/en/latest/contributing.html#sponsorship>`_.

  Sponsors include:

  - Google Cloud Platform (2018-present), sponsors `@theacodes <https://github.com/theacodes>`_'s work on an ongoing basis
  - Abbott (2018-present), sponsors `@SethMichaelLarson <https://github.com/SethMichaelLarson>`_'s work on an ongoing basis
  - Akamai (2017-present), sponsors `@haikuginger <https://github.com/haikuginger>`_'s work on an ongoing basis
  - Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s <https://github.com/Lukasa>`_ work on urllib3


  Changes
  =======

  1.24 (2018-10-16)
  -----------------

  * Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)

  * Test against Python 3.7 on AppVeyor. (Pull #1453)

  * Early-out ipv6 checks when running on App Engine. (Pull #1450)

  * Change ambiguous description of backoff_factor (Pull #1436)

  * Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)

  * Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).

  * Add a server_hostname parameter to HTTPSConnection which allows for
    overriding the SNI hostname sent in the handshake. (Pull #1397)

  * Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)

  * Fixed bug where responses with header Content-Type: message/* erroneously
    raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)

  * Move urllib3 to src/urllib3 (Pull #1409)


  1.23 (2018-06-04)
  -----------------

  * Allow providing a list of headers to strip from requests when redirecting
    to a different host. Defaults to the ``Authorization`` header. Different
    headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)

  * Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).

  * Dropped Python 3.3 support. (Pull #1242)

  * Put the connection back in the pool when calling stream() or read_chunked() on
    a chunked HEAD response. (Issue #1234)

  * Fixed pyOpenSSL-specific ssl client authentication issue when clients
    attempted to auth via certificate + chain (Issue #1060)

  * Add the port to the connectionpool connect print (Pull #1251)

  * Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)

  * ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)

  * Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)

  * Added support for auth info in url for SOCKS proxy (Pull #1363)


  1.22 (2017-07-20)
  -----------------

  * Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via
    IPv6 proxy. (Issue #1222)

  * Made the connection pool retry on ``SSLError``.  The original ``SSLError``
    is available on ``MaxRetryError.reason``. (Issue #1112)

  * Drain and release connection before recursing on retry/redirect.  Fixes
    deadlocks with a blocking connectionpool. (Issue #1167)

  * Fixed compatibility for cookiejar. (Issue #1229)

  * pyopenssl: Use vendored version of ``six``. (Issue #1231)


  1.21.1 (2017-05-02)
  -------------------

  * Fixed SecureTransport issue that would cause long delays in response body
    delivery. (Pull #1154)

  * Fixed regression in 1.21 that threw exceptions when users passed the
    ``socket_options`` flag to the ``PoolManager``.  (Issue #1165)

  * Fixed regression in 1.21 that threw exceptions when users passed the
    ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.
    (Pull #1157)


  1.21 (2017-04-25)
  -----------------

  * Improved performance of certain selector system calls on Python 3.5 and
    later. (Pull #1095)

  * Resolved issue where the PyOpenSSL backend would not wrap SysCallError
    exceptions appropriately when sending data. (Pull #1125)

  * Selectors now detects a monkey-patched select module after import for modules
    that patch the select module like eventlet, greenlet. (Pull #1128)

  * Reduced memory consumption when streaming zlib-compressed responses
    (as opposed to raw deflate streams). (Pull #1129)

  * Connection pools now use the entire request context when constructing the
    pool key. (Pull #1016)

  * ``PoolManager.connection_from_*`` methods now accept a new keyword argument,
    ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.
    (Pull #1016)

  * Add retry counter for ``status_forcelist``. (Issue #1147)

  * Added ``contrib`` module for using SecureTransport on macOS:
    ``urllib3.contrib.securetransport``.  (Pull #1122)

  * urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:
    for schemes it does not recognise, it assumes they are case-sensitive and
    leaves them unchanged.
    (Issue #1080)


  1.20 (2017-01-19)
  -----------------

  * Added support for waiting for I/O using selectors other than select,
    improving urllib3's behaviour with large numbers of concurrent connections.
    (Pull #1001)

  * Updated the date for the system clock check. (Issue #1005)

  * ConnectionPools now correctly consider hostnames to be case-insensitive.
    (Issue #1032)

  * Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module
    to fail when it is injected, rather than at first use. (Pull #1063)

  * Outdated versions of cryptography now cause the PyOpenSSL contrib module
    to fail when it is injected, rather than at first use. (Issue #1044)

  * Automatically attempt to rewind a file-like body object when a request is
    retried or redirected. (Pull #1039)

  * Fix some bugs that occur when modules incautiously patch the queue module.
    (Pull #1061)

  * Prevent retries from occurring on read timeouts for which the request method
    was not in the method whitelist. (Issue #1059)

  * Changed the PyOpenSSL contrib module to lazily load idna to avoid
    unnecessarily bloating the memory of programs that don't need it. (Pull
    

  * Add support for IPv6 literals with zone identifiers. (Pull #1013)

  * Added support for socks5h:// and socks4a:// schemes when working with SOCKS
    proxies, and controlled remote DNS appropriately. (Issue #1035)


  1.19.1 (2016-11-16)
  -------------------

  * Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)


  1.19 (2016-11-03)
  -----------------

  * urllib3 now respects Retry-After headers on 413, 429, and 503 responses when
    using the default retry logic. (Pull #955)

  * Remove markers from setup.py to assist ancient setuptools versions. (Issue
    

  * Disallow superscripts and other integerish things in URL ports. (Issue #989)

  * Allow urllib3's HTTPResponse.stream() method to continue to work with
    non-httplib underlying FPs. (Pull #990)

  * Empty filenames in multipart headers are now emitted as such, rather than
    being suppressed. (Issue #1015)

  * Prefer user-supplied Host headers on chunked uploads. (Issue #1009)


  1.18.1 (2016-10-27)
  -------------------

  * CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with
    PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This
    release fixes a vulnerability whereby urllib3 in the above configuration
    would silently fail to validate TLS certificates due to erroneously setting
    invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous
    flags do not cause a problem in OpenSSL versions before 1.1.0, which
    interprets the presence of any flag as requesting certificate validation.

    There is no PR for this patch, as it was prepared for simultaneous disclosure
    and release. The master branch received the same fix in PR #1010.


  1.18 (2016-09-26)
  -----------------

  * Fixed incorrect message for IncompleteRead exception. (PR #973)

  * Accept ``iPAddress`` subject alternative name fields in TLS certificates.
    (Issue #258)

  * Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.
    (Issue #977)

  * Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)


  1.17 (2016-09-06)
  -----------------

  * Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)

  * ConnectionPool debug log now includes scheme, host, and port. (Issue #897)

  * Substantially refactored documentation. (Issue #887)

  * Used URLFetch default timeout on AppEngine, rather than hardcoding our own.
    (Issue #858)

  * Normalize the scheme and host in the URL parser (Issue #833)

  * ``HTTPResponse`` contains the last ``Retry`` object, which now also
    contains retries history. (Issue #848)

  * Timeout can no longer be set as boolean, and must be greater than zero.
    (PR #924)

  * Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
    now use cryptography and idna, both of which are already dependencies of
    PyOpenSSL. (PR #930)

  * Fixed infinite loop in ``stream`` when amt=None. (Issue #928)

  * Try to use the operating system's certificates when we are using an
    ``SSLContext``. (PR #941)

  * Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
    ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947)

  * Updated cipher suite list to remove 3DES-based cipher suites. (PR #958)

  * Removed the cipher suite fallback to allow HIGH ciphers. (PR #958)

  * Implemented ``length_remaining`` to determine remaining content
    to be read. (PR #949)

  * Implemented ``enforce_content_length`` to enable exceptions when
    incomplete data chunks are received. (PR #949)

  * Dropped connection start, dropped connection reset, redirect, forced retry,
    and new HTTPS connection log levels to DEBUG, from INFO. (PR #967)


  1.16 (2016-06-11)
  -----------------

  * Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)

  * Provide ``key_fn_by_scheme`` pool keying mechanism that can be
    overridden. (Issue #830)

  * Normalize scheme and host to lowercase for pool keys, and include
    ``source_address``. (Issue #830)

  * Cleaner exception chain in Python 3 for ``_make_request``.
    (Issue #861)

  * Fixed installing ``urllib3[socks]`` extra. (Issue #864)

  * Fixed signature of ``ConnectionPool.close`` so it can actually safely be
    called by subclasses. (Issue #873)

  * Retain ``release_conn`` state across retries. (Issues #651, #866)

  * Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to
    ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)


  1.15.1 (2016-04-11)
  -------------------

  * Fix packaging to include backports module. (Issue #841)


  1.15 (2016-04-06)
  -----------------

  * Added Retry(raise_on_status=False). (Issue #720)

  * Always use setuptools, no more distutils fallback. (Issue #785)

  * Dropped support for Python 3.2. (Issue #786)

  * Chunked transfer encoding when requesting with ``chunked=True``.
    (Issue #790)

  * Fixed regression with IPv6 port parsing. (Issue #801)

  * Append SNIMissingWarning messages to allow users to specify it in
    the PYTHONWARNINGS environment variable. (Issue #816)

  * Handle unicode headers in Py2. (Issue #818)

  * Log certificate when there is a hostname mismatch. (Issue #820)

  * Preserve order of request/response headers. (Issue #821)


  1.14 (2015-12-29)
  -----------------

  * contrib: SOCKS proxy support! (Issue #762)

  * Fixed AppEngine handling of transfer-encoding header and bug
    in Timeout defaults checking. (Issue #763)


  1.13.1 (2015-12-18)
  -------------------

  * Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)


  1.13 (2015-12-14)
  -----------------

  * Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)

  * pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)

  * pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)

  * Close connections more defensively on exception. (Issue #734)

  * Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without
    repeatedly flushing the decoder, to function better on Jython. (Issue #743)

  * Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)


  1.12 (2015-09-03)
  -----------------

  * Rely on ``six`` for importing ``httplib`` to work around
    conflicts with other Python 3 shims. (Issue #688)

  * Add support for directories of certificate authorities, as supported by
    OpenSSL. (Issue #701)

  * New exception: ``NewConnectionError``, raised when we fail to establish
    a new connection, usually ``ECONNREFUSED`` socket error.


  1.11 (2015-07-21)
  -----------------

  * When ``ca_certs`` is given, ``cert_reqs`` defaults to
    ``'CERT_REQUIRED'``. (Issue #650)

  * ``pip install urllib3[secure]`` will install Certifi and
    PyOpenSSL as dependencies. (Issue #678)

  * Made ``HTTPHeaderDict`` usable as a ``headers`` input value
    (Issues #632, #679)

  * Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_
    which has an ``AppEngineManager`` for using ``URLFetch`` in a
    Google AppEngine environment. (Issue #664)

  * Dev: Added test suite for AppEngine. (Issue #631)

  * Fix performance regression when using PyOpenSSL. (Issue #626)

  * Passing incorrect scheme (e.g. ``foo://``) will raise
    ``ValueError`` instead of ``AssertionError`` (backwards
    compatible for now, but please migrate). (Issue #640)

  * Fix pools not getting replenished when an error occurs during a
    request using ``release_conn=False``. (Issue #644)

  * Fix pool-default headers not applying for url-encoded requests
    like GET. (Issue #657)

  * log.warning in Python 3 when headers are skipped due to parsing
    errors. (Issue #642)

  * Close and discard connections if an error occurs during read.
    (Issue #660)

  * Fix host parsing for IPv6 proxies. (Issue #668)

  * Separate warning type SubjectAltNameWarning, now issued once
    per host. (Issue #671)

  * Fix ``httplib.IncompleteRead`` not getting converted to
    ``ProtocolError`` when using ``HTTPResponse.stream()``
    (Issue #674)

  1.10.4 (2015-05-03)
  -------------------

  * Migrate tests to Tornado 4. (Issue #594)

  * Append default warning configuration rather than overwrite.
    (Issue #603)

  * Fix streaming decoding regression. (Issue #595)

  * Fix chunked requests losing state across keep-alive connections.
    (Issue #599)

  * Fix hanging when chunked HEAD response has no body. (Issue #605)


  1.10.3 (2015-04-21)
  -------------------

  * Emit ``InsecurePlatformWarning`` when SSLContext object is missing.
    (Issue #558)

  * Fix regression of duplicate header keys being discarded.
    (Issue #563)

  * ``Response.stream()`` returns a generator for chunked responses.
    (Issue #560)

  * Set upper-bound timeout when waiting for a socket in PyOpenSSL.
    (Issue #585)

  * Work on platforms without `ssl` module for plain HTTP requests.
    (Issue #587)

  * Stop relying on the stdlib's default cipher list. (Issue #588)


  1.10.2 (2015-02-25)
  -------------------

  * Fix file descriptor leakage on retries. (Issue #548)

  * Removed RC4 from default cipher list. (Issue #551)

  * Header performance improvements. (Issue #544)

  * Fix PoolManager not obeying redirect retry settings. (Issue #553)


  1.10.1 (2015-02-10)
  -------------------

  * Pools can be used as context managers. (Issue #545)

  * Don't re-use connections which experienced an SSLError. (Issue #529)

  * Don't fail when gzip decoding an empty stream. (Issue #535)

  * Add sha256 support for fingerprint verification. (Issue #540)

  * Fixed handling of header values containing commas. (Issue #533)


  1.10 (2014-12-14)
  -----------------

  * Disabled SSLv3. (Issue #473)

  * Add ``Url.url`` property to return the composed url string. (Issue #394)

  * Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)

  * ``MaxRetryError.reason`` will always be an exception, not string.
    (Issue #481)

  * Fixed SSL-related timeouts not being detected as timeouts. (Issue #492)

  * Py3: Use ``ssl.create_default_context()`` when available. (Issue #473)

  * Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.
    (Issue #496)

  * Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.
    (Issue #499)

  * Close and discard sockets which experienced SSL-related errors.
    (Issue #501)

  * Handle ``body`` param in ``.request(...)``. (Issue #513)

  * Respect timeout with HTTPS proxy. (Issue #505)

  * PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)


  1.9.1 (2014-09-13)
  ------------------

  * Apply socket arguments before binding. (Issue #427)

  * More careful checks if fp-like object is closed. (Issue #435)

  * Fixed packaging issues of some development-related files not
    getting included. (Issue #440)

  * Allow performing *only* fingerprint verification. (Issue #444)

  * Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)

  * Fixed PyOpenSSL compatibility with PyPy. (Issue #450)

  * Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.
    (Issue #443)



  1.9 (2014-07-04)
  ----------------

  * Shuffled around development-related files. If you're maintaining a distro
    package of urllib3, you may need to tweak things. (Issue #415)

  * Unverified HTTPS requests will trigger a warning on the first request. See
    our new `security documentation
    <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.
    (Issue #426)

  * New retry logic and ``urllib3.util.retry.Retry`` configuration object.
    (Issue #326)

  * All raised exceptions should now wrapped in a
    ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326)

  * All errors during a retry-enabled request should be wrapped in
    ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions
    which were previously exempt. Underlying error is accessible from the
    ``.reason`` property. (Issue #326)

  * ``urllib3.exceptions.ConnectionError`` renamed to
    ``urllib3.exceptions.ProtocolError``. (Issue #326)

  * Errors during response read (such as IncompleteRead) are now wrapped in
    ``urllib3.exceptions.ProtocolError``. (Issue #418)

  * Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``.
    (Issue #417)

  * Catch read timeouts over SSL connections as
    ``urllib3.exceptions.ReadTimeoutError``. (Issue #419)

  * Apply socket arguments before connecting. (Issue #427)


  1.8.3 (2014-06-23)
  ------------------

  * Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)

  * Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)

  * Wrap ``socket.timeout`` exception with
    ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)

  * Fixed proxy-related bug where connections were being reused incorrectly.
    (Issues #366, #369)

  * Added ``socket_options`` keyword parameter which allows to define
    ``setsockopt`` configuration of new sockets. (Issue #397)

  * Removed ``HTTPConnection.tcp_nodelay`` in favor of
    ``HTTPConnection.default_socket_options``. (Issue #397)

  * Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)


  1.8.2 (2014-04-17)
  ------------------

  * Fix ``urllib3.util`` not being included in the package.


  1.8.1 (2014-04-17)
  ------------------

  * Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)

  * Don't install ``dummyserver`` into ``site-packages`` as it's only needed
    for the test suite. (Issue #362)

  * Added support for specifying ``source_address``. (Issue #352)


  1.8 (2014-03-04)
  ----------------

  * Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in
    username, and blank ports like 'hostname:').

  * New ``urllib3.connection`` module which contains all the HTTPConnection
    objects.

  * Several ``urllib3.util.Timeout``-related fixes. Also changed constructor
    signature to a more sensible order. [Backwards incompatible]
    (Issues #252, #262, #263)

  * Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)

  * Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which
    returns the number of bytes read so far. (Issue #277)

  * Support for platforms without threading. (Issue #289)

  * Expand default-port comparison in ``HTTPConnectionPool.is_same_host``
    to allow a pool with no specified port to be considered equal to to an
    HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305)

  * Improved default SSL/TLS settings to avoid vulnerabilities.
    (Issue #309)

  * Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors.
    (Issue #310)

  * Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests
    will send the entire HTTP request ~200 milliseconds faster; however, some of
    the resulting TCP packets will be smaller. (Issue #254)

  * Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl``
    from the default 64 to 1024 in a single certificate. (Issue #318)

  * Headers are now passed and stored as a custom
    ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.
    (Issue #329, #333)

  * Headers no longer lose their case on Python 3. (Issue #236)

  * ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA
    certificates on inject. (Issue #332)

  * Requests with ``retries=False`` will immediately raise any exceptions without
    wrapping them in ``MaxRetryError``. (Issue #348)

  * Fixed open socket leak with SSL-related failures. (Issue #344, #348)


  1.7.1 (2013-09-25)
  ------------------

  * Added granular timeout support with new ``urllib3.util.Timeout`` class.
    (Issue #231)

  * Fixed Python 3.4 support. (Issue #238)


  1.7 (2013-08-14)
  ----------------

  * More exceptions are now pickle-able, with tests. (Issue #174)

  * Fixed redirecting with relative URLs in Location header. (Issue #178)

  * Support for relative urls in ``Location: ...`` header. (Issue #179)

  * ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus
    file-like functionality. (Issue #187)

  * Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will
    skip hostname verification for SSL connections. (Issue #194)

  * New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a
    generator wrapped around ``.read(...)``. (Issue #198)

  * IPv6 url parsing enforces brackets around the hostname. (Issue #199)

  * Fixed thread race condition in
    ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)

  * ``ProxyManager`` requests now include non-default port in ``Host: ...``
    header. (Issue #217)

  * Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)

  * New ``RequestField`` object can be passed to the ``fields=...`` param which
    can specify headers. (Issue #220)

  * Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.
    (Issue #221)

  * Use international headers when posting file names. (Issue #119)

  * Improved IPv6 support. (Issue #203)


  1.6 (2013-04-25)
  ----------------

  * Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)

  * ``ProxyManager`` automatically adds ``Host: ...`` header if not given.

  * Improved SSL-related code. ``cert_req`` now optionally takes a string like
    "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23"
    The string values reflect the suffix of the respective constant variable.
    (Issue #130)

  * Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly
    closed proxy connections and larger read buffers. (Issue #135)

  * Ensure the connection is closed if no data is received, fixes connection leak
    on some platforms. (Issue #133)

  * Added SNI support for SSL/TLS connections on Py32+. (Issue #89)

  * Tests fixed to be compatible with Py26 again. (Issue #125)

  * Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant
    to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109)

  * Allow an explicit content type to be specified when encoding file fields.
    (Issue #126)

  * Exceptions are now pickleable, with tests. (Issue #101)

  * Fixed default headers not getting passed in some cases. (Issue #99)

  * Treat "content-encoding" header value as case-insensitive, per RFC 2616
    Section 3.5. (Issue #110)

  * "Connection Refused" SocketErrors will get retried rather than raised.
    (Issue #92)

  * Updated vendored ``six``, no longer overrides the global ``six`` module
    namespace. (Issue #113)

  * ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding
    the exception that prompted the final retry. If ``reason is None`` then it
    was due to a redirect. (Issue #92, #114)

  * Fixed ``PoolManager.urlopen()`` from not redirecting more than once.
    (Issue #149)

  * Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters
    that are not files. (Issue #111)

  * Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122)

  * Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or
    against an arbitrary hostname (when connecting by IP or for misconfigured
    servers). (Issue #140)

  * Streaming decompression support. (Issue #159)


  1.5 (2012-08-02)
  ----------------

  * Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug
    logging in urllib3.

  * Native full URL parsing (including auth, path, query, fragment) available in
    ``urllib3.util.parse_url(url)``.

  * Built-in redirect will switch method to 'GET' if status code is 303.
    (Issue #11)

  * ``urllib3.PoolManager`` strips the scheme and host before sending the request
    uri. (Issue #8)

  * New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding,
    based on the Content-Type header, fails.

  * Fixed bug with pool depletion and leaking connections (Issue #76). Added
    explicit connection closing on pool eviction. Added
    ``urllib3.PoolManager.clear()``.

  * 99% -> 100% unit test coverage.


  1.4 (2012-06-16)
  ----------------

  * Minor AppEngine-related fixes.

  * Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.

  * Improved url parsing. (Issue #73)

  * IPv6 url support. (Issue #72)


  1.3 (2012-03-25)
  ----------------

  * Removed pre-1.0 deprecated API.

  * Refactored helpers into a ``urllib3.util`` submodule.

  * Fixed multipart encoding to support list-of-tuples for keys with multiple
    values. (Issue #48)

  * Fixed multiple Set-Cookie headers in response not getting merged properly in
    Python 3. (Issue #53)

  * AppEngine support with Py27. (Issue #61)

  * Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs
    bytes.


  1.2.2 (2012-02-06)
  ------------------

  * Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)


  1.2.1 (2012-02-05)
  ------------------

  * Fixed another bug related to when ``ssl`` module is not available. (Issue #41)

  * Location parsing errors now raise ``urllib3.exceptions.LocationParseError``
    which inherits from ``ValueError``.


  1.2 (2012-01-29)
  ----------------

  * Added Python 3 support (tested on 3.2.2)

  * Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)

  * Use ``select.poll`` instead of ``select.select`` for platforms that support
    it.

  * Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive
    connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.

  * Fixed ``ImportError`` during install when ``ssl`` module is not available.
    (Issue #41)

  * Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not
    completing properly. (Issue #28, uncovered by Issue #10 in v1.1)

  * Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +
    ``eventlet``. Removed extraneous unsupported dummyserver testing backends.
    Added socket-level tests.

  * More tests. Achievement Unlocked: 99% Coverage.


  1.1 (2012-01-07)
  ----------------

  * Refactored ``dummyserver`` to its own root namespace module (used for
    testing).

  * Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in
    Py32's ``ssl_match_hostname``. (Issue #25)

  * Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)

  * Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue
    

  * Fixed timeout-related bugs. (Issues #17, #23)


  1.0.2 (2011-11-04)
  ------------------

  * Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if
    you're using the object manually. (Thanks pyos)

  * Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by
    wrapping the access log in a mutex. (Thanks @christer)

  * Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and
    ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.


  1.0.1 (2011-10-10)
  ------------------

  * Fixed a bug where the same connection would get returned into the pool twice,
    causing extraneous "HttpConnectionPool is full" log warnings.


  1.0 (2011-10-08)
  ----------------

  * Added ``PoolManager`` with LRU expiration of connections (tested and
    documented).
  * Added ``ProxyManager`` (needs tests, docs, and confirmation that it works
    with HTTPS proxies).
  * Added optional partial-read support for responses when
    ``preload_content=False``. You can now make requests and just read the headers
    without loading the content.
  * Made response decoding optional (default on, same as before).
  * Added optional explicit boundary string for ``encode_multipart_formdata``.
  * Convenience request methods are now inherited from ``RequestMethods``. Old
    helpers like ``get_url`` and ``post_url`` should be abandoned in favour of
    the new ``request(method, url, ...)``.
  * Refactored code to be even more decoupled, reusable, and extendable.
  * License header added to ``.py`` files.
  * Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
    and docs in ``docs/`` and on https://urllib3.readthedocs.io/.
  * Embettered all the things!
  * Started writing this file.


  0.4.1 (2011-07-17)
  ------------------

  * Minor bug fixes, code cleanup.


  0.4 (2011-03-01)
  ----------------

  * Better unicode support.
  * Added ``VerifiedHTTPSConnection``.
  * Added ``NTLMConnectionPool`` in contrib.
  * Minor improvements.


  0.3.1 (2010-07-13)
  ------------------

  * Added ``assert_host_name`` optional parameter. Now compatible with proxies.


  0.3 (2009-12-10)
  ----------------

  * Added HTTPS support.
  * Minor bug fixes.
  * Refactored, broken backwards compatibility with 0.2.
  * API to be treated as stable from this version forward.


  0.2 (2008-11-17)
  ----------------

  * Added unit tests.
  * Bug fixes.


  0.1 (2008-11-16)
  ----------------

  * First release.


pkgId: 6e155847af7e0bc3f6a8fe6473c19a67047899f1e85bdce0d463c0366a598b4d
name: rh-python36-uwsgi-debuginfo
arch: x86_64
version: 2.0.18
epoch: 0
release: 1
summary: Debug information for package rh-python36-uwsgi
url: https://uwsgi-docs.readthedocs.io/en/latest/
rpm_license: GPL2
rpm_vendor: Unbit <info@unbit.it>
rpm_group: Development/Debug
rpm_buildhost: 58162f98858e4c0b88772e69b3dba0ca
rpm_sourcerpm: rh-python36-uwsgi-2.0.18-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387141-rh-python36-uwsgi/rh-python36-uwsgi-debuginfo-2.0.18-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-uwsgi.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 9c24e62768995c02377fc70b3fbe89bde8f9f78a5b04167efac4061cbc936e18
name: rh-python36-uwsgitop
arch: noarch
version: 0.11
epoch: 0
release: 1
summary: uWSGI top-like interface
rpm_license: MIT
rpm_vendor: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 073e072798e94af19a2a5835836dedd5
rpm_sourcerpm: rh-python36-uwsgitop-0.11-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387115-rh-python36-uwsgitop/rh-python36-uwsgitop-0.11-1.noarch.rpm
checksum_type: sha256
description:
  uwsgitop
  ========

  ``uwsgitop`` is a top-like command that uses the uWSGI Stats Server to
  monitor your uwsgi application.

  To use uWSGI Stat Server simply use the ``stats`` option followed by
  a valid socket address, for example::

      uwsgi --module myapp --socket :3030 --stats /tmp/stats.socket

  To start monitoring your application with ``uwsgitop`` call it with
  the socket address like so::

      uwsgitop /tmp/stats.socket

  If you want the stats served over HTTP you will need to add
  the ``stats-http`` option in uWSGI::

      uwsgi --module myapp --http :3030 --stats :3031 --stats-http

  You'll now need to call uwsgitop as::

      uwsgitop http://127.0.0.1:3031

  Installation
  ------------

  ::

      pip install uwsgitop

  Usage
  -----

  To display async core statistics (e.g. when using gevent) or to switch between
  core statistics display mode, press ``a``. To refresh the screen super fast press ``f``,
  and to quit, press ``q``.

  +--------+---------------------------------------------------------------+
  | Field  |  Description                                                  |
  +========+===============================================================+
  | WID    | Worker ID                                                     |
  +--------+---------------------------------------------------------------+
  | %      | Worker usage                                                  |
  +--------+---------------------------------------------------------------+
  | PID    | Worker PID                                                    |
  +--------+---------------------------------------------------------------+
  | REQ    | How many requests worker did since worker (re)spawn           |
  +--------+---------------------------------------------------------------+
  | RPS    | Requests per second                                           |
  +--------+---------------------------------------------------------------+
  | EXC    | Exceptions                                                    |
  +--------+---------------------------------------------------------------+
  | STATUS | Worker is busy or free to use?                                |
  +--------+---------------------------------------------------------------+
  | AVG    | Average request time                                          |
  +--------+---------------------------------------------------------------+
  | RSS    | Worker RSS (Resident Set Size, see linux memory management)   |
  +--------+---------------------------------------------------------------+
  | VSZ    | Worker VSZ (Virtual Memory Size, see linux memory management) |
  +--------+---------------------------------------------------------------+
  | TX     | How many data was transmitted by worker                       |
  +--------+---------------------------------------------------------------+
  | RunT   | How long worker is working                                    |
  +--------+---------------------------------------------------------------+

  Colors
  ------

  Lines would be displayed in different colors:

  - default console text color, if the worker is idle
  - ``green``, if the worker is busy
  - ``magenta``, if the worker is in ``cheap`` mode
  - ``yellow``, if the worker is handling an uwsgi signal
  - ``blue``, if the worker is ``suspended``


  Remember to enable ``memory-report`` in your uwsgi configuration to see how
  much memory resources your uwsgi processes are consuming.

  Further Reading
  ---------------

  For more info on uWSGI Stats Server see http://projects.unbit.it/uwsgi/wiki/StatsServer


pkgId: b8218cf2d738bc6cd4fd68610860c7cafb6a58ba2a8828833e84a04a50ce8ec1
name: rh-python36-wcwidth
arch: noarch
version: 0.1.7
epoch: 0
release: 1
summary: Measures number of Terminal column cells of wide-character codes
url: https://github.com/jquast/wcwidth
rpm_license: MIT
rpm_vendor: Jeff Quast <contact@jeffquast.com>
rpm_group: Development/Libraries
rpm_buildhost: 6a1613a034d9464cbbae9c097ff20ae7
rpm_sourcerpm: rh-python36-wcwidth-0.1.7-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387060-rh-python36-wcwidth/rh-python36-wcwidth-0.1.7-1.noarch.rpm
checksum_type: sha256
description:
  .. image:: https://img.shields.io/travis/jquast/wcwidth.svg
      :target: https://travis-ci.org/jquast/wcwidth
      :alt: Travis Continous Integration

  .. image:: https://img.shields.io/coveralls/jquast/wcwidth.svg
      :target: https://coveralls.io/r/jquast/wcwidth
      :alt: Coveralls Code Coverage

  .. image:: https://img.shields.io/pypi/v/wcwidth.svg
      :target: https://pypi.python.org/pypi/wcwidth/
      :alt: Latest Version

  .. image:: https://img.shields.io/github/license/jquast/wcwidth.svg
      :target: https://pypi.python.org/pypi/wcwidth/
      :alt: License

  .. image:: https://img.shields.io/pypi/wheel/wcwidth.svg
      :alt: Wheel Status

  .. image:: https://img.shields.io/pypi/dm/wcwidth.svg
      :target: https://pypi.python.org/pypi/wcwidth/
      :alt: Downloads

  ============
  Introduction
  ============

  This Library is mainly for those implementing a Terminal Emulator, or programs
  that carefully produce output to be interpreted by one.

  **Problem Statement**: When printed to the screen, the length of the string is
  usually equal to the number of cells it occupies.  However, there are
  categories of characters that occupy 2 cells (full-wide), and others that
  occupy 0.


  **Solution**: POSIX.1-2001 and POSIX.1-2008 conforming systems provide
  `wcwidth(3)`_ and `wcswidth(3)`_ C functions of which this python module's
  functions precisely copy.  *These functions return the number of cells a
  unicode string is expected to occupy.*

  This library aims to be forward-looking, portable, and most correct.  The most
  current release of this API is based on the Unicode Standard release files:

  ``DerivedGeneralCategory-9.0.0.txt``
    *Date: 2016-06-01, 10:34:26 GMT*
    © 2016 Unicode®, Inc.

  ``EastAsianWidth-9.0.0.txt``
    *Date: 2016-05-27, 17:00:00 GMT [KW, LI]*
    © 2016 Unicode®, Inc.


  Installation
  ------------

  The stable version of this package is maintained on pypi, install using pip::

      pip install wcwidth

  Example
  -------

  To Display ``u'コンニチハ'`` right-adjusted on screen of 80 columns::

      >>> from wcwidth import wcswidth
      >>> text = u'コンニチハ'
      >>> text_len = wcswidth(text)
      >>> print(u' ' * (80 - text_len) + text)

  wcwidth, wcswidth
  -----------------
  Use function ``wcwidth()`` to determine the length of a *single unicode
  character*, and ``wcswidth()`` to determine the length of a several, or a
  *string of unicode characters*.

  Briefly, return values of function ``wcwidth()`` are:

  ``-1``
    Indeterminate (not printable).

  ``0``
    Does not advance the cursor, such as NULL or Combining.

  ``2``
    Characters of category East Asian Wide (W) or East Asian
    Full-width (F) which are displayed using two terminal cells.

  ``1``
    All others.

  Function ``wcswidth()`` simply returns the sum of all values for each character
  along a string, or ``-1`` when it occurs anywhere along a string.

  More documentation is available using pydoc::

      $ pydoc wcwidth

  =======
  Caveats
  =======

  This library attempts to determine the printable width by an unknown targeted
  terminal emulator.  It does not provide any ability to discern what the target
  emulator software, version, of level of support is.  Results may vary!

  A `crude method
  <http://blessed.readthedocs.org/en/latest/examples.html#detect-multibyte-py>`_
  of determining the level of unicode support by the target emulator may be
  performed using the VT100 Query Cursor Position sequence.

  The libc version of `wcwidth(3)`_ is often several unicode releases behind,
  and therefor several levels of support lower than this python library.  You
  may determine an exacting list of these discrepancies using the project
  file `wcwidth-libc-comparator.py
  <https://github.com/jquast/wcwidth/tree/master/bin/wcwidth-libc-comparator.py>`_.


  ==========
  Developing
  ==========

  Install wcwidth in editable mode::

     pip install -e.

  Install developer requirements::

     pip install -r requirements-develop.txt

  Execute unit tests using tox::

     tox

  Updating Tables
  ---------------

  The command ``python setup.py update`` will fetch the following resources:

  - http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
  - http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt

  And generates the table files:

  - `wcwidth/table_wide.py <https://github.com/jquast/wcwidth/tree/master/wcwidth/table_wide.py>`_
  - `wcwidth/table_zero.py <https://github.com/jquast/wcwidth/tree/master/wcwidth/table_zero.py>`_

  Uses
  ----

  This library is used in:

  - `jquast/blessed`_, a simplified wrapper around curses.

  - `jonathanslenders/python-prompt-toolkit`_, a Library for building powerful
    interactive command lines in Python.

  Additional tools for displaying and testing wcwidth are found in the `bin/
  <https://github.com/jquast/wcwidth/tree/master/bin>`_ folder of this project's
  source code.  They are not distributed.

  =======
  History
  =======

  0.1.7 *2016-07-01*
    * **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).

  0.1.6 *2016-01-08 Production/Stable*
    * ``LICENSE`` file now included with distribution.

  0.1.5 *2015-09-13 Alpha*
    * **Bugfix**:
      Resolution of "combining_ character width" issue, most especially
      those that previously returned -1 now often (correctly) return 0.
      resolved by `Philip Craig`_ via `PR #11`_.
    * **Deprecated**:
      The module path ``wcwidth.table_comb`` is no longer available,
      it has been superseded by module path ``wcwidth.table_zero``.

  0.1.4 *2014-11-20 Pre-Alpha*
    * **Feature**: ``wcswidth()`` now determines printable length
      for (most) combining_ characters.  The developer's tool
      `bin/wcwidth-browser.py`_ is improved to display combining_
      characters when provided the ``--combining`` option
      (`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).
    * **Feature**: added static analysis (prospector_) to testing
      framework.

  0.1.3 *2014-10-29 Pre-Alpha*
    * **Bugfix**: 2nd parameter of wcswidth was not honored.
      (`Thomas Ballinger`_, `PR #4`_).

  0.1.2 *2014-10-28 Pre-Alpha*
    * **Updated** tables to Unicode Specification 7.0.0.
      (`Thomas Ballinger`_, `PR #3`_).

  0.1.1 *2014-05-14 Pre-Alpha*
    * Initial release to pypi, Based on Unicode Specification 6.3.0

  This code was originally derived directly from C code of the same name,
  whose latest version is available at
  http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::

   * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
   *
   * Permission to use, copy, modify, and distribute this software
   * for any purpose and without fee is hereby granted. The author
   * disclaims all warranties with regard to this software.

  .. _`prospector`: https://github.com/landscapeio/prospector
  .. _`combining`: https://en.wikipedia.org/wiki/Combining_character
  .. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/tree/master/bin/wcwidth-browser.py
  .. _`Thomas Ballinger`: https://github.com/thomasballinger
  .. _`Leta Montopoli`: https://github.com/lmontopo
  .. _`Philip Craig`: https://github.com/philipc
  .. _`PR #3`: https://github.com/jquast/wcwidth/pull/3
  .. _`PR #4`: https://github.com/jquast/wcwidth/pull/4
  .. _`PR #5`: https://github.com/jquast/wcwidth/pull/5
  .. _`PR #11`: https://github.com/jquast/wcwidth/pull/11
  .. _`PR #18`: https://github.com/jquast/wcwidth/pull/18
  .. _`jquast/blessed`: https://github.com/jquast/blessed
  .. _`jonathanslenders/python-prompt-toolkit`: https://github.com/jonathanslenders/python-prompt-toolkit
  .. _`wcwidth(3)`:  http://man7.org/linux/man-pages/man3/wcwidth.3.html
  .. _`wcswidth(3)`: http://man7.org/linux/man-pages/man3/wcswidth.3.html


pkgId: bc0c358520d4cca47114a495fdc1f4e13cd4bc538dc5fff00c57f3870baaa01c
name: rh-python36-websocket_client
arch: noarch
version: 0.57.0
epoch: 0
release: 1
summary: WebSocket client for Python. hybi13 is supported.
url: https://github.com/websocket-client/websocket-client.git
rpm_license: BSD
rpm_vendor: liris <liris.pp@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 467508098668428b9c94b921ba3f92d6
rpm_sourcerpm: rh-python36-websocket_client-0.57.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387140-rh-python36-websocket_client/rh-python36-websocket_client-0.57.0-1.noarch.rpm
checksum_type: sha256
description:
  =================
  websocket-client
  =================

  websocket-client module  is WebSocket client for python. This provide the low level APIs for WebSocket. All APIs are the synchronous functions.

  websocket-client supports only hybi-13.


  License
  =======

   - BSD

  Installation
  ============

  This module is tested on Python 2.7 and Python 3.4+.

  Type "python setup.py install" or "pip install websocket-client" to install.

  .. CAUTION::

    from v0.16.0, we can install by "pip install websocket-client" for Python 3.

  This module depends on

   - six
   - backports.ssl_match_hostname for Python 2.x

  Performance
  -----------

  The "send" and "validate_utf8" methods are too slow on pure python. If you want to get better performace, please install both numpy and wsaccel.


  How about Python 3
  ==================

  Now, we support Python 3 on single source code from version 0.14.0. Thanks, @battlemidget and @ralphbean.

  HTTP Proxy
  ==========

  Support websocket access via http proxy.
  The proxy server must allow "CONNECT" method to websocket port.
  Default squid setting is "ALLOWED TO CONNECT ONLY HTTPS PORT".

  Current implementation of websocket-client is using "CONNECT" method via proxy.


  example

  .. code:: python

      import websocket
      ws = websocket.WebSocket()
      ws.connect("ws://example.com/websocket", http_proxy_host="proxy_host_name", http_proxy_port=3128)



  Examples
  ========

  Long-lived connection
  ---------------------
  This example is similar to how WebSocket code looks in browsers using JavaScript.

  .. code:: python

      import websocket
      try:
          import thread
      except ImportError:
          import _thread as thread
      import time

      def on_message(ws, message):
          print(message)

      def on_error(ws, error):
          print(error)

      def on_close(ws):
          print("### closed ###")

      def on_open(ws):
          def run(*args):
              for i in range(3):
                  time.sleep(1)
                  ws.send("Hello %d" % i)
              time.sleep(1)
              ws.close()
              print("thread terminating...")
          thread.start_new_thread(run, ())


      if __name__ == "__main__":
          websocket.enableTrace(True)
          ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                                    on_message = on_message,
                                    on_error = on_error,
                                    on_close = on_close)
          ws.on_open = on_open
          ws.run_forever()



  Short-lived one-off send-receive
  --------------------------------
  This is if you want to communicate a short message and disconnect immediately when done.

  .. code:: python

      from websocket import create_connection
      ws = create_connection("ws://echo.websocket.org/")
      print("Sending 'Hello, World'...")
      ws.send("Hello, World")
      print("Sent")
      print("Receiving...")
      result =  ws.recv()
      print("Received '%s'" % result)
      ws.close()


  If you want to customize socket options, set sockopt.

  sockopt example

  .. code:: python

      from websocket import create_connection
      ws = create_connection("ws://echo.websocket.org/",
                              sockopt=((socket.IPPROTO_TCP, socket.TCP_NODELAY),))


  More advanced: Custom class
  ---------------------------
  You can also write your own class for the connection, if you want to handle the nitty-gritty details yourself.

  .. code:: python

      import socket
      from websocket import create_connection, WebSocket
      class MyWebSocket(WebSocket):
          def recv_frame(self):
              frame = super().recv_frame()
              print('yay! I got this frame: ', frame)
              return frame

      ws = create_connection("ws://echo.websocket.org/",
                              sockopt=((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),), class_=MyWebSocket)


  FAQ
  ===

  How to disable ssl cert verification?
  -------------------------------------

  Please set sslopt to {"cert_reqs": ssl.CERT_NONE}.

  WebSocketApp sample

  .. code:: python

      ws = websocket.WebSocketApp("wss://echo.websocket.org")
      ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})


  create_connection sample

  .. code:: python

      ws = websocket.create_connection("wss://echo.websocket.org",
        sslopt={"cert_reqs": ssl.CERT_NONE})


  WebSocket sample

  .. code:: python

      ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
      ws.connect("wss://echo.websocket.org")


  How to disable hostname verification?
  -------------------------------------

  Please set sslopt to {"check_hostname": False}.
  (since v0.18.0)

  WebSocketApp sample

  .. code:: python

      ws = websocket.WebSocketApp("wss://echo.websocket.org")
      ws.run_forever(sslopt={"check_hostname": False})


  create_connection sample

  .. code:: python

      ws = websocket.create_connection("wss://echo.websocket.org",
        sslopt={"check_hostname": False})


  WebSocket sample

  .. code:: python

      ws = websocket.WebSocket(sslopt={"check_hostname": False})
      ws.connect("wss://echo.websocket.org")


  How to enable `SNI <http://en.wikipedia.org/wiki/Server_Name_Indication>`_?
  ---------------------------------------------------------------------------

  SNI support is available for Python 2.7.9+ and 3.2+. It will be enabled automatically whenever possible.


  Sub Protocols.
  --------------

  The server needs to support sub protocols, please set the subprotocol like this.


  Subprotocol sample

  .. code:: python

      ws = websocket.create_connection("ws://example.com/websocket", subprotocols=["binary", "base64"])



  wsdump.py
  =========

  wsdump.py is simple WebSocket test(debug) tool.

  sample for echo.websocket.org::

    $ wsdump.py ws://echo.websocket.org/
    Press Ctrl+C to quit
    > Hello, WebSocket
    < Hello, WebSocket
    > How are you?
    < How are you?


  Usage
  -----

  usage::

    wsdump.py [-h] [-v [VERBOSE]] ws_url


  WebSocket Simple Dump Tool

  positional arguments:
    ws_url                websocket url. ex. ws://echo.websocket.org/


  optional arguments:
    -h, --help                           show this help message and exit
  WebSocketApp
    -v VERBOSE, --verbose VERBOSE    set verbose mode. If set to 1, show opcode. If set to 2, enable to trace websocket module


  example::

    $ wsdump.py ws://echo.websocket.org/
    $ wsdump.py ws://echo.websocket.org/ -v
    $ wsdump.py ws://echo.websocket.org/ -vv


pkgId: a7e262e219b7a517434eabe4aa48412ace8993265eca6417dd66640026368b4f
name: rh-python36-wheel
arch: noarch
version: 0.33.6
epoch: 0
release: 1
summary: A built-package format for Python.
url: https://github.com/pypa/wheel
rpm_license: MIT
rpm_vendor: Alex Grönholm <alex.gronholm@nextday.fi>
rpm_group: Development/Libraries
rpm_buildhost: 65d6aa83259649e89c6460c2574f6db4
rpm_sourcerpm: rh-python36-wheel-0.33.6-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387281-rh-python36-wheel/rh-python36-wheel-0.33.6-1.noarch.rpm
checksum_type: sha256
description:
  wheel
  =====

  This library is the reference implementation of the Python wheel packaging
  standard, as defined in `PEP 427`_.

  It has two different roles:


     ``bdist_wheel`` setuptools command


  It should be noted that wheel is **not** intended to be used as a library, and
  as such there is no stable, public API.

  .. _PEP 427: https://www.python.org/dev/peps/pep-0427/
  .. _setuptools: https://pypi.org/project/setuptools/


  Code of Conduct
  ---------------

  Everyone interacting in the wheel project's codebases, issue trackers, chat
  rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

  .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/


pkgId: 66cab0b3d8bb8810f2bb05f1da35267eaf52207c6bd9e2b5b8f5af808f76e35a
name: rh-python36-wrapt
arch: src
version: 1.11.1
epoch: 0
release: 1
summary: Module for decorators, wrappers and monkey patching.
url: https://github.com/GrahamDumpleton/wrapt
rpm_license: BSD
rpm_vendor: Graham Dumpleton <Graham.Dumpleton@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: 2eab4b2b7357408782aacec5a7c03a09
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387063-rh-python36-wrapt/rh-python36-wrapt-1.11.1-1.src.rpm
checksum_type: sha256
description:
  wrapt
  =====

  |Travis| |AppVeyor| |Coveralls| |PyPI|

  The aim of the **wrapt** module is to provide a transparent object proxy
  for Python, which can be used as the basis for the construction of function
  wrappers and decorator functions.

  The **wrapt** module focuses very much on correctness. It therefore goes
  way beyond existing mechanisms such as ``functools.wraps()`` to ensure that
  decorators preserve introspectability, signatures, type checking abilities
  etc. The decorators that can be constructed using this module will work in
  far more scenarios than typical decorators and provide more predictable and
  consistent behaviour.

  To ensure that the overhead is as minimal as possible, a C extension module
  is used for performance critical components. An automatic fallback to a
  pure Python implementation is also provided where a target system does not
  have a compiler to allow the C extension to be compiled.

  Documentation
  -------------

  For further information on the **wrapt** module see:

  * http://wrapt.readthedocs.org/

  Quick Start
  -----------

  To implement your decorator you need to first define a wrapper function.
  This will be called each time a decorated function is called. The wrapper
  function needs to take four positional arguments:

  * ``wrapped`` - The wrapped function which in turns needs to be called by your wrapper function.
  * ``instance`` - The object to which the wrapped function was bound when it was called.
  * ``args`` - The list of positional arguments supplied when the decorated function was called.
  * ``kwargs`` - The dictionary of keyword arguments supplied when the decorated function was called.

  The wrapper function would do whatever it needs to, but would usually in
  turn call the wrapped function that is passed in via the ``wrapped``
  argument.

  The decorator ``@wrapt.decorator`` then needs to be applied to the wrapper
  function to convert it into a decorator which can in turn be applied to
  other functions.

  ::

      import wrapt

      @wrapt.decorator
      def pass_through(wrapped, instance, args, kwargs):
          return wrapped(*args, **kwargs)

      @pass_through
      def function():
          pass

  If you wish to implement a decorator which accepts arguments, then wrap the
  definition of the decorator in a function closure. Any arguments supplied
  to the outer function when the decorator is applied, will be available to
  the inner wrapper when the wrapped function is called.

  ::

      import wrapt

      def with_arguments(myarg1, myarg2):
          @wrapt.decorator
          def wrapper(wrapped, instance, args, kwargs):
              return wrapped(*args, **kwargs)
          return wrapper

      @with_arguments(1, 2)
      def function():
          pass

  When applied to a normal function or static method, the wrapper function
  when called will be passed ``None`` as the ``instance`` argument.

  When applied to an instance method, the wrapper function when called will
  be passed the instance of the class the method is being called on as the
  ``instance`` argument. This will be the case even when the instance method
  was called explicitly via the class and the instance passed as the first
  argument. That is, the instance will never be passed as part of ``args``.

  When applied to a class method, the wrapper function when called will be
  passed the class type as the ``instance`` argument.

  When applied to a class, the wrapper function when called will be passed
  ``None`` as the ``instance`` argument. The ``wrapped`` argument in this
  case will be the class.

  The above rules can be summarised with the following example.

  ::

      import inspect

      @wrapt.decorator
      def universal(wrapped, instance, args, kwargs):
          if instance is None:
              if inspect.isclass(wrapped):
                  
                  return wrapped(*args, **kwargs)
              else:
                  
                  return wrapped(*args, **kwargs)
          else:
              if inspect.isclass(instance):
                  
                  return wrapped(*args, **kwargs)
              else:
                  
                  return wrapped(*args, **kwargs)

  Using these checks it is therefore possible to create a universal decorator
  that can be applied in all situations. It is no longer necessary to create
  different variants of decorators for normal functions and instance methods,
  or use additional wrappers to convert a function decorator into one that
  will work for instance methods.

  In all cases, the wrapped function passed to the wrapper function is called
  in the same way, with ``args`` and ``kwargs`` being passed. The
  ``instance`` argument doesn't need to be used in calling the wrapped
  function.

  Repository
  ----------

  Full source code for the **wrapt** module, including documentation files
  and unit tests, can be obtained from github.

  * https://github.com/GrahamDumpleton/wrapt

  .. |Travis| image:: https://travis-ci.org/GrahamDumpleton/wrapt.svg?branch=develop
     :target: https://travis-ci.org/GrahamDumpleton/wrapt
  .. |Appveyor| image:: https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true
     :target: https://ci.appveyor.com/project/GrahamDumpleton/wrapt/branch/develop
  .. |Coveralls| image:: https://img.shields.io/coveralls/GrahamDumpleton/wrapt/develop.svg
     :target: https://coveralls.io/github/GrahamDumpleton/wrapt?branch=develop
  .. |PyPI| image:: https://img.shields.io/pypi/v/wrapt.svg
     :target: https://pypi.python.org/pypi/wrapt


pkgId: a953214f556c1351375af41ed1206d5ddf3c093c445d0a0bad77f7c2df19f7fc
name: rh-python36-wrapt-debuginfo
arch: x86_64
version: 1.11.1
epoch: 0
release: 1
summary: Debug information for package rh-python36-wrapt
url: https://github.com/GrahamDumpleton/wrapt
rpm_license: BSD
rpm_vendor: Graham Dumpleton <Graham.Dumpleton@gmail.com>
rpm_group: Development/Debug
rpm_buildhost: e6e6edd931d04814b96ab1ab199fa9bd
rpm_sourcerpm: rh-python36-wrapt-1.11.1-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387063-rh-python36-wrapt/rh-python36-wrapt-debuginfo-1.11.1-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-wrapt.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 758eef2a8fb2b6db66e9c30c5eb34a3acbd0350f47dd26038197939f3aa1dc74
name: rh-python36-yarl
arch: src
version: 1.4.2
epoch: 0
release: 1
summary: Yet another URL library
url: https://github.com/aio-libs/yarl/
rpm_license: Apache 2
rpm_vendor: Andrew Svetlov <andrew.svetlov@gmail.com>
rpm_group: Development/Libraries
rpm_buildhost: cd6a53a34d1c44799c88603a4c26a6fc
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387008-rh-python36-yarl/rh-python36-yarl-1.4.2-1.src.rpm
checksum_type: sha256
description:
  yarl
  ====

  .. image:: https://dev.azure.com/aio-libs/yarl/_apis/build/status/CI?branchName=master
    :target: https://dev.azure.com/aio-libs/yarl/_build/latest?definitionId=7&branchName=master
    :align: right

  .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg
    :target: https://codecov.io/gh/aio-libs/yarl

  .. image:: https://badge.fury.io/py/yarl.svg
      :target: https://badge.fury.io/py/yarl


  .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest
      :target: https://yarl.readthedocs.io


  .. image:: https://img.shields.io/pypi/pyversions/yarl.svg
      :target: https://pypi.python.org/pypi/yarl

  .. image:: https://badges.gitter.im/Join%20Chat.svg
      :target: https://gitter.im/aio-libs/Lobby
      :alt: Chat on Gitter

  Introduction
  ------------

  Url is constructed from ``str``::

     >>> from yarl import URL
     >>> url = URL('https://www.python.org/~guido?arg=1#frag')
     >>> url
     URL('https://www.python.org/~guido?arg=1#frag')

  All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*,
  *query* and *fragment* are accessible by properties::

     >>> url.scheme
     'https'
     >>> url.host
     'www.python.org'
     >>> url.path
     '/~guido'
     >>> url.query_string
     'arg=1'
     >>> url.query
     <MultiDictProxy('arg': '1')>
     >>> url.fragment
     'frag'

  All url manipulations produce a new url object::

     >>> url.parent / 'downloads/source'
     URL('https://www.python.org/downloads/source')

  Strings passed to constructor and modification methods are
  automatically encoded giving canonical representation as result::

     >>> url = URL('https://www.python.org/путь')
     >>> url
     URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C')

  Regular properties are *percent-decoded*, use ``raw_`` versions for
  getting *encoded* strings::

     >>> url.path
     '/путь'

     >>> url.raw_path
     '/%D0%BF%D1%83%D1%82%D1%8C'

  Human readable representation of URL is available as ``.human_repr()``::

     >>> url.human_repr()
     'https://www.python.org/путь'

  For full documentation please read https://yarl.readthedocs.org.


  Installation
  ------------

  ::

     $ pip install yarl

  The library is Python 3 only!


  Dependencies
  ------------

  YARL requires multidict_ library.


  API documentation
  ------------------

  The documentation is located at https://yarl.readthedocs.org

  Comparison with other URL libraries
  ------------------------------------

  * furl (https://pypi.python.org/pypi/furl)

    The library has rich functionality but the ``furl`` object is mutable.

    I'm afraid to pass this object into foreign code: who knows if the
    code will modify my url in a terrible way while I just want to send URL
    with handy helpers for accessing URL properties.

    ``furl`` has other non-obvious tricky things but the main objection
    is mutability.

  * URLObject (https://pypi.python.org/pypi/URLObject)

    URLObject is immutable, that's pretty good.

    Every URL change generates a new URL object.

    But the library doesn't do any decode/encode transformations leaving the
    end user to cope with these gory details.


  Source code
  -----------

  The project is hosted on GitHub_

  Please file an issue on the `bug tracker
  <https://github.com/aio-libs/yarl/issues>`_ if you have found a bug
  or have some suggestion in order to improve the library.

  The library uses `Azure Pipelines <https://dev.azure.com/aio-libs/yarl>`_ for
  Continuous Integration.

  Discussion list
  ---------------

  *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs

  Feel free to post your questions and ideas here.


  Authors and License
  -------------------

  The ``yarl`` package is written by Andrew Svetlov.

  It's *Apache 2* licensed and freely available.


  .. _GitHub: https://github.com/aio-libs/yarl

  .. _multidict: https://github.com/aio-libs/multidict


  =========
  Changelog
  =========

  ..
      You should *NOT* be adding new change log entries to this file, this
      file is managed by towncrier. You *may* edit previous change logs to
      fix problems like typo corrections or such.
      To add a new change log entry, please see
      https://pip.pypa.io/en/latest/development/#adding-a-news-entry
      we named the news folder "changes".

      WARNING: Don't drop the next directive!

  .. towncrier release notes start

  1.4.1 (2019-11-29)
  ==================

  * Fix regression, make the library work on Python 3.5 and 3.6 again.

  1.4.0 (2019-11-29)
  ==================

  * Distinguish an empty password in URL from a password not provided at all (#262)

  * Fixed annotations for optional parameters of ``URL.build`` (#309)

  * Use None as default value of ``user`` parameter of ``URL.build`` (#309)

  * Enforce building C Accelerated modules when installing from source tarball, use
    ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python
    implementation (#329)

  * Drop Python 3.5 support

  * Fix quoting of plus in path by pure python version (#339)

  * Don't create a new URL if fragment is unchanged (#292)

  * Included in error msg the path that produces starting slash forbidden error (#376)

  * Skip slow IDNA encoding for ASCII-only strings (#387)


  1.3.0 (2018-12-11)
  ==================

  * Fix annotations for ``query`` parameter (#207)

  * An incoming query sequence can have int variables (the same as for
    Mapping type) (#208)

  * Add ``URL.explicit_port`` property (#218)

  * Give a friendlier error when port cant be converted to int (#168)

  * ``bool(URL())`` now returns ``False`` (#272)

  1.2.6 (2018-06-14)
  ==================

  * Drop Python 3.4 trove classifier (#205)

  1.2.5 (2018-05-23)
  ==================

  * Fix annotations for ``build`` (#199)

  1.2.4 (2018-05-08)
  ==================

  * Fix annotations for ``cached_property`` (#195)

  1.2.3 (2018-05-03)
  ==================

  * Accept ``str`` subclasses in ``URL`` constructor (#190)

  1.2.2 (2018-05-01)
  ==================

  * Fix build

  1.2.1 (2018-04-30)
  ==================

  * Pin minimal required Python to 3.5.3 (#189)

  1.2.0 (2018-04-30)
  ==================

  * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171)

  * Support PEP-561 (provide type hinting marker) (#182)

  1.1.1 (2018-02-17)
  ==================

  * Fix performance regression: don't encode enmpty netloc (#170)

  1.1.0 (2018-01-21)
  ==================

  * Make pure Python quoter consistent with Cython version (#162)

  1.0.0 (2018-01-15)
  ==================

  * Use fast path if quoted string does not need requoting (#154)

  * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155)

  * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155)

  * Add custom string writer, reuse static buffer if available (#157)
    Code is 50-80 times faster than Pure Python version (was 4-5 times faster)

  * Don't recode IP zone (#144)

  * Support ``encoded=True`` in ``yarl.URL.build()`` (#158)

  * Fix updating query with multiple keys (#160)

  0.18.0 (2018-01-10)
  ===================

  * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)

  0.17.0 (2017-12-30)
  ===================

  * Use IDNA 2008 for domain name processing (#149)

  0.16.0 (2017-12-07)
  ===================

  * Fix raising ``TypeError`` by ``url.query_string()`` after
    ``url.with_query({})`` (empty mapping) (#141)

  0.15.0 (2017-11-23)
  ===================

  * Add ``raw_path_qs`` attribute (#137)

  0.14.2 (2017-11-14)
  ===================

  * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote``

  0.14.1 (2017-11-13)
  ===================

  * Restore ``strict`` parameter as no-op for sake of compatibility with
    aiohttp 2.2

  0.14.0 (2017-11-11)
  ===================

  * Drop strict mode (#123)

  * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124)

  0.13.0 (2017-10-01)
  ===================

  * Document ``encoded`` parameter (#102)

  * Support relative urls like ``'?key=value'`` (#100)

  * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104)

  * Process passwords without user names (#95)

  0.12.0 (2017-06-26)
  ===================

  * Properly support paths without leading slash in ``URL.with_path()`` (#90)

  * Enable type annotation checks

  0.11.0 (2017-06-26)
  ===================

  * Normalize path (#86)

  * Clear query and fragment parts in ``.with_path()`` (#85)

  0.10.3 (2017-06-13)
  ===================

  * Prevent double URL args unquoting (#83)

  0.10.2 (2017-05-05)
  ===================

  * Unexpected hash behaviour (#75)


  0.10.1 (2017-05-03)
  ===================

  * Unexpected compare behaviour (#73)

  * Do not quote or unquote + if not a query string. (#74)


  0.10.0 (2017-03-14)
  ===================

  * Added ``URL.build`` class method (#58)

  * Added ``path_qs`` attribute (#42)


  0.9.8 (2017-02-16)
  ==================

  * Do not quote ``:`` in path


  0.9.7 (2017-02-16)
  ==================

  * Load from pickle without _cache (#56)

  * Percent-encoded pluses in path variables become spaces (#59)


  0.9.6 (2017-02-15)
  ==================

  * Revert backward incompatible change (BaseURL)


  0.9.5 (2017-02-14)
  ==================

  * Fix BaseURL rich comparison support


  0.9.4 (2017-02-14)
  ==================

  * Use BaseURL


  0.9.3 (2017-02-14)
  ==================

  * Added BaseURL


  0.9.2 (2017-02-08)
  ==================

  * Remove debug print


  0.9.1 (2017-02-07)
  ==================

  * Do not lose tail chars (#45)


  0.9.0 (2017-02-07)
  ==================

  * Allow to quote ``%`` in non strict mode (#21)

  * Incorrect parsing of query parameters with %3B (;) inside (#34)

  * Fix core dumps (#41)

  * tmpbuf - compiling error (#43)

  * Added ``URL.update_path()`` method

  * Added ``URL.update_query()`` method (#47)


  0.8.1 (2016-12-03)
  ==================

  * Fix broken aiohttp: revert back ``quote`` / ``unquote``.


  0.8.0 (2016-12-03)
  ==================

  * Support more verbose error messages in ``.with_query()`` (#24)

  * Don't percent-encode ``@`` and ``:`` in path (#32)

  * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are
    part of private API

  0.7.1 (2016-11-18)
  ==================

  * Accept not only ``str`` but all classes inherited from ``str`` also (#25)

  0.7.0 (2016-11-07)
  ==================

  * Accept ``int`` as value for ``.with_query()``

  0.6.0 (2016-11-07)
  ==================

  * Explicitly use UTF8 encoding in setup.py (#20)
  * Properly unquote non-UTF8 strings (#19)

  0.5.3 (2016-11-02)
  ==================

  * Don't use namedtuple fields but indexes on URL construction

  0.5.2 (2016-11-02)
  ==================

  * Inline ``_encode`` class method

  0.5.1 (2016-11-02)
  ==================

  * Make URL construction faster by removing extra classmethod calls

  0.5.0 (2016-11-02)
  ==================

  * Add cython optimization for quoting/unquoting
  * Provide binary wheels

  0.4.3 (2016-09-29)
  ==================

  * Fix typing stubs

  0.4.2 (2016-09-29)
  ==================

  * Expose ``quote()`` and ``unquote()`` as public API

  0.4.1 (2016-09-28)
  ==================

  * Support empty values in query (``'/path?arg'``)

  0.4.0 (2016-09-27)
  ==================

  * Introduce ``relative()`` (#16)

  0.3.2 (2016-09-27)
  ==================

  * Typo fixes #15

  0.3.1 (2016-09-26)
  ==================

  * Support sequence of pairs as ``with_query()`` parameter

  0.3.0 (2016-09-26)
  ==================

  * Introduce ``is_default_port()``

  0.2.1 (2016-09-26)
  ==================

  * Raise ValueError for URLs like 'http://:8080/'

  0.2.0 (2016-09-18)
  ==================

  * Avoid doubling slashes when joining paths (#13)

  * Appending path starting from slash is forbidden (#12)

  0.1.4 (2016-09-09)
  ==================

  * Add kwargs support for ``with_query()`` (#10)

  0.1.3 (2016-09-07)
  ==================

  * Document ``with_query()``, ``with_fragment()`` and ``origin()``

  * Allow ``None`` for ``with_query()`` and ``with_fragment()``

  0.1.2 (2016-09-07)
  ==================

  * Fix links, tune docs theme.

  0.1.1 (2016-09-06)
  ==================

  * Update README, old version used obsolete API

  0.1.0 (2016-09-06)
  ==================

  * The library was deeply refactored, bytes are gone away but all
    accepted strings are encoded if needed.

  0.0.1 (2016-08-30)
  ==================

  * The first release.


pkgId: 07083b1cbbafce51a3f0f49ac1628c9931d804f723266e34e00a8ad2d9e105ee
name: rh-python36-yarl-debuginfo
arch: x86_64
version: 1.4.2
epoch: 0
release: 1
summary: Debug information for package rh-python36-yarl
url: https://github.com/aio-libs/yarl/
rpm_license: Apache 2
rpm_vendor: Andrew Svetlov <andrew.svetlov@gmail.com>
rpm_group: Development/Debug
rpm_buildhost: 29f46585dddf49ce824c4c7df6b1edc5
rpm_sourcerpm: rh-python36-yarl-1.4.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387008-rh-python36-yarl/rh-python36-yarl-debuginfo-1.4.2-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-yarl.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: a797a2c182666becf2f6002cd2d652547ad9bf23e8964a7a848b50f5dcd6d9e8
name: rh-python36-zipp
arch: noarch
version: 1.0.0
epoch: 0
release: 1
summary: Backport of pathlib-compatible object wrapper for zip files
url: https://github.com/jaraco/zipp
rpm_license: UNKNOWN
rpm_vendor: Jason R. Coombs <jaraco@jaraco.com>
rpm_group: Development/Libraries
rpm_buildhost: 1e5128fd46bb46e2ae2402c36c5b06b8
rpm_sourcerpm: rh-python36-zipp-1.0.0-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387301-rh-python36-zipp/rh-python36-zipp-1.0.0-1.noarch.rpm
checksum_type: sha256
description:
  .. image:: https://img.shields.io/pypi/v/zipp.svg
     :target: https://pypi.org/project/zipp

  .. image:: https://img.shields.io/pypi/pyversions/zipp.svg

  .. image:: https://img.shields.io/travis/jaraco/zipp/master.svg
     :target: https://travis-ci.org/jaraco/zipp

  .. image:: https://img.shields.io/badge/code%20style-black-000000.svg
     :target: https://github.com/ambv/black
     :alt: Code style: Black

  .. image:: https://img.shields.io/appveyor/ci/jaraco/zipp/master.svg
     :target: https://ci.appveyor.com/project/jaraco/zipp/branch/master

  .. .. image:: https://readthedocs.org/projects/zipp/badge/?version=latest
  ..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest


  A pathlib-compatible Zipfile object wrapper. A backport of the
  `Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.


pkgId: 7caf1020ccabf06243363e3b2b4226862f2b66c33d07c09c66891ed4691794ab
name: rh-python36-zope.interface
arch: src
version: 4.7.2
epoch: 0
release: 1
summary: Interfaces for Python
url: https://github.com/zopefoundation/zope.interface
rpm_license: ZPL 2.1
rpm_vendor: Zope Foundation and Contributors <zope-dev@zope.org>
rpm_group: Development/Libraries
rpm_buildhost: 85474d5e279e4bf5aa51abc270e0d167
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387167-rh-python36-zope.interface/rh-python36-zope.interface-4.7.2-1.src.rpm
checksum_type: sha256
description:
  ``zope.interface``
  ==================

  .. image:: https://img.shields.io/pypi/v/zope.interface.svg
      :target: https://pypi.python.org/pypi/zope.interface/
      :alt: Latest Version

  .. image:: https://travis-ci.org/zopefoundation/zope.interface.png?branch=master
          :target: https://travis-ci.org/zopefoundation/zope.interface

  .. image:: https://readthedocs.org/projects/zopeinterface/badge/?version=latest
          :target: https://zopeinterface.readthedocs.io/en/latest/
          :alt: Documentation Status

  This package is intended to be independently reusable in any Python
  project. It is maintained by the `Zope Toolkit project
  <http://docs.zope.org/zopetoolkit/>`_.

  This package provides an implementation of "object interfaces" for Python.
  Interfaces are a mechanism for labeling objects as conforming to a given
  API or contract. So, this package can be considered as implementation of
  the `Design By Contract`_ methodology support in Python.

  .. _Design By Contract: http://en.wikipedia.org/wiki/Design_by_contract

  For detailed documentation, please see https://zopeinterface.readthedocs.io/en/latest/

  Changes
  =======

  4.4.3 (2017-09-22)
  ------------------

  - Avoid exceptions when the ``__annotations__`` attribute is added to
    interface definitions with Python 3.x type hints. See `issue 98
    <https://github.com/zopefoundation/zope.interface/issues/98>`_.
  - Fix the possibility of a rare crash in the C extension when
    deallocating items. See `issue 100
    <https://github.com/zopefoundation/zope.interface/issues/100>`_.


  4.4.2 (2017-06-14)
  ------------------

  - Fix a regression storing
    ``zope.component.persistentregistry.PersistentRegistry`` instances.
    See `issue 85 <https://github.com/zopefoundation/zope.interface/issues/85>`_.

  - Fix a regression that could lead to the utility registration cache
    of ``Components`` getting out of sync. See `issue 93
    <https://github.com/zopefoundation/zope.interface/issues/93>`_.

  4.4.1 (2017-05-13)
  ------------------

  - Simplify the caching of utility-registration data. In addition to
    simplification, avoids spurious test failures when checking for
    leaks in tests with persistent registries. See `pull 84
    <https://github.com/zopefoundation/zope.interface/pull/84>`_.

  - Raise ``ValueError`` when non-text names are passed to adapter registry
    methods:  prevents corruption of lookup caches.

  4.4.0 (2017-04-21)
  ------------------

  - Avoid a warning from the C compiler.
    (https://github.com/zopefoundation/zope.interface/issues/71)

  - Add support for Python 3.6.

  4.3.3 (2016-12-13)
  ------------------

  - Correct typos and ReST formatting errors in documentation.

  - Add API documentation for the adapter registry.

  - Ensure that the ``LICENSE.txt`` file is included in built wheels.

  - Fix C optimizations broken on Py3k.  See the Python bug at:
    http://bugs.python.org/issue15657
    (https://github.com/zopefoundation/zope.interface/issues/60)


  4.3.2 (2016-09-05)
  ------------------

  - Fix equality testing of ``implementedBy`` objects and proxies.
    (https://github.com/zopefoundation/zope.interface/issues/55)


  4.3.1 (2016-08-31)
  ------------------

  - Support Components subclasses that are not hashable.
    (https://github.com/zopefoundation/zope.interface/issues/53)


  4.3.0 (2016-08-31)
  ------------------

  - Add the ability to sort the objects returned by ``implementedBy``.
    This is compatible with the way interface classes sort so they can
    be used together in ordered containers like BTrees.
    (https://github.com/zopefoundation/zope.interface/issues/42)

  - Make ``setuptools`` a hard dependency of ``setup.py``.
    (https://github.com/zopefoundation/zope.interface/issues/13)

  - Change a linear algorithm (O(n)) in ``Components.registerUtility`` and
    ``Components.unregisterUtility`` into a dictionary lookup (O(1)) for
    hashable components. This substantially improves the time taken to
    manipulate utilities in large registries at the cost of some
    additional memory usage. (https://github.com/zopefoundation/zope.interface/issues/46)


  4.2.0 (2016-06-10)
  ------------------

  - Add support for Python 3.5

  - Drop support for Python 2.6 and 3.2.


  4.1.3 (2015-10-05)
  ------------------

  - Fix installation without a C compiler on Python 3.5
    (https://github.com/zopefoundation/zope.interface/issues/24).


  4.1.2 (2014-12-27)
  ------------------

  - Add support for PyPy3.

  - Remove unittest assertions deprecated in Python3.x.

  - Add ``zope.interface.document.asReStructuredText``, which formats the
    generated text for an interface using ReST double-backtick markers.


  4.1.1 (2014-03-19)
  ------------------

  - Add support for Python 3.4.


  4.1.0 (2014-02-05)
  ------------------

  - Update ``boostrap.py`` to version 2.2.

  - Add ``@named(name)`` declaration, that specifies the component name, so it
    does not have to be passed in during registration.


  4.0.5 (2013-02-28)
  ------------------

  - Fix a bug where a decorated method caused false positive failures on
    ``verifyClass()``.


  4.0.4 (2013-02-21)
  ------------------

  - Fix a bug that was revealed by porting zope.traversing. During a loop, the
    loop body modified a weakref dict causing a ``RuntimeError`` error.

  4.0.3 (2012-12-31)
  ------------------

  - Fleshed out PyPI Trove classifiers.

  4.0.2 (2012-11-21)
  ------------------

  - Add support for Python 3.3.

  - Restored ability to install the package in the absence of ``setuptools``.

  - LP #1055223:  Fix test which depended on dictionary order and failed randomly
    in Python 3.3.

  4.0.1 (2012-05-22)
  ------------------

  - Drop explicit ``DeprecationWarnings`` for "class advice" APIS (these
    APIs are still deprecated under Python 2.x, and still raise an exception
    under Python 3.x, but no longer cause a warning to be emitted under
    Python 2.x).

  4.0.0 (2012-05-16)
  ------------------

  - Automated build of Sphinx HTML docs and running doctest snippets via tox.

  - Deprecate the "class advice" APIs from ``zope.interface.declarations``:
    ``implements``, ``implementsOnly``, and ``classProvides``.  In their place,
    prefer the equivalent class decorators: ``@implementer``,
    ``@implementer_only``, and ``@provider``.  Code which uses the deprecated
    APIs will not work as expected under Py3k.

  - Remove use of '2to3' and associated fixers when installing under Py3k.
    The code is now in a "compatible subset" which supports Python 2.6, 2.7,
    and 3.2, including PyPy 1.8 (the version compatible with the 2.7 language
    spec).

  - Drop explicit support for Python 2.4 / 2.5 / 3.1.

  - Add support for PyPy.

  - Add support for continuous integration using ``tox`` and ``jenkins``.

  - Add 'setup.py dev' alias (runs ``setup.py develop`` plus installs
    ``nose`` and ``coverage``).

  - Add 'setup.py docs' alias (installs ``Sphinx`` and dependencies).

  - Replace all unittest coverage previously accomplished via doctests with
    unittests.  The doctests have been moved into a ``docs`` section, managed
    as a Sphinx collection.

  - LP #910987:  Ensure that the semantics of the ``lookup`` method of
    ``zope.interface.adapter.LookupBase`` are the same in both the C and
    Python implementations.

  - LP #900906:  Avoid exceptions due to tne new ``__qualname__`` attribute
    added in Python 3.3 (see PEP 3155 for rationale).  Thanks to Antoine
    Pitrou for the patch.

  3.8.0 (2011-09-22)
  ------------------

  - New module ``zope.interface.registry``.  This is code moved from
    ``zope.component.registry`` which implements a basic nonperistent component
    registry as ``zope.interface.registry.Components``.  This class was moved
    from ``zope.component`` to make porting systems (such as Pyramid) that rely
    only on a basic component registry to Python 3 possible without needing to
    port the entirety of the ``zope.component`` package.  Backwards
    compatibility import shims have been left behind in ``zope.component``, so
    this change will not break any existing code.

  - New ``tests_require`` dependency: ``zope.event`` to test events sent by
    Components implementation.  The ``zope.interface`` package does not have a
    hard dependency on ``zope.event``, but if ``zope.event`` is importable, it
    will send component registration events when methods of an instance of
    ``zope.interface.registry.Components`` are called.

  - New interfaces added to support ``zope.interface.registry.Components``
    addition: ``ComponentLookupError``, ``Invalid``, ``IObjectEvent``,
    ``ObjectEvent``, ``IComponentLookup``, ``IRegistration``,
    ``IUtilityRegistration``, ``IAdapterRegistration``,
    ``ISubscriptionAdapterRegistration``, ``IHandlerRegistration``,
    ``IRegistrationEvent``, ``RegistrationEvent``, ``IRegistered``,
    ``Registered``, ``IUnregistered``, ``Unregistered``,
    ``IComponentRegistry``, and ``IComponents``.

  - No longer Python 2.4 compatible (tested under 2.5, 2.6, 2.7, and 3.2).

  3.7.0 (2011-08-13)
  ------------------

  - Move changes from 3.6.2 - 3.6.5 to a new 3.7.x release line.

  3.6.7 (2011-08-20)
  ------------------

  - Fix sporadic failures on x86-64 platforms in tests of rich comparisons
    of interfaces.

  3.6.6 (2011-08-13)
  ------------------

  - LP #570942:  Now correctly compare interfaces  from different modules but
    with the same names.

    N.B.: This is a less intrusive / destabilizing fix than the one applied in
    3.6.3:  we only fix the underlying cmp-alike function, rather than adding
    the other "rich comparison" functions.

  - Revert to software as released with 3.6.1 for "stable" 3.6 release branch.

  3.6.5 (2011-08-11)
  ------------------

  - LP #811792:  work around buggy behavior in some subclasses of
    ``zope.interface.interface.InterfaceClass``, which invoke ``__hash__``
    before initializing ``__module__`` and ``__name__``.  The workaround
    returns a fixed constant hash in such cases, and issues a ``UserWarning``.

  - LP #804832:  Under PyPy, ``zope.interface`` should not build its C
    extension.  Also, prevent attempting to build it under Jython.

  - Add a tox.ini for easier xplatform testing.

  - Fix testing deprecation warnings issued when tested under Py3K.

  3.6.4 (2011-07-04)
  ------------------

  - LP 804951:  InterfaceClass instances were unhashable under Python 3.x.

  3.6.3 (2011-05-26)
  ------------------

  - LP #570942:  Now correctly compare interfaces  from different modules but
    with the same names.

  3.6.2 (2011-05-17)
  ------------------

  - Moved detailed documentation out-of-line from PyPI page, linking instead to
    http://docs.zope.org/zope.interface .

  - Fixes for small issues when running tests under Python 3.2 using
    ``zope.testrunner``.

  - LP # 675064:  Specify return value type for C optimizations module init
    under Python 3:  undeclared value caused warnings, and segfaults on some
    64 bit architectures.

  - setup.py now raises RuntimeError if you don't have Distutils installed when
    running under Python 3.

  3.6.1 (2010-05-03)
  ------------------

  - A non-ASCII character in the changelog made 3.6.0 uninstallable on
    Python 3 systems with another default encoding than UTF-8.

  - Fix compiler warnings under GCC 4.3.3.

  3.6.0 (2010-04-29)
  ------------------

  - LP #185974:  Clear the cache used by ``Specificaton.get`` inside
    ``Specification.changed``.  Thanks to Jacob Holm for the patch.

  - Add support for Python 3.1. Contributors:

      Lennart Regebro
      Martin v Loewis
      Thomas Lotze
      Wolfgang Schnerring

    The 3.1 support is completely backwards compatible. However, the implements
    syntax used under Python 2.X does not work under 3.X, since it depends on
    how metaclasses are implemented and this has changed. Instead it now supports
    a decorator syntax (also under Python 2.X)::

      class Foo:
          implements(IFoo)
          ...

    can now also be written::

      @implementer(IFoo):
      class Foo:
          ...

    There are 2to3 fixers available to do this change automatically in the
    zope.fixers package.

  - Python 2.3 is no longer supported.


  3.5.4 (2009-12-23)
  ------------------

  - Use the standard Python doctest module instead of zope.testing.doctest, which
    has been deprecated.


  3.5.3 (2009-12-08)
  ------------------

  - Fix an edge case: make providedBy() work when a class has '__provides__' in
    its __slots__ (see http://thread.gmane.org/gmane.comp.web.zope.devel/22490)


  3.5.2 (2009-07-01)
  ------------------

  - BaseAdapterRegistry.unregister, unsubscribe: Remove empty portions of
    the data structures when something is removed.  This avoids leaving
    references to global objects (interfaces) that may be slated for
    removal from the calling application.


  3.5.1 (2009-03-18)
  ------------------

  - verifyObject: use getattr instead of hasattr to test for object attributes
    in order to let exceptions other than AttributeError raised by properties
    propagate to the caller

  - Add Sphinx-based documentation building to the package buildout
    configuration. Use the ``bin/docs`` command after buildout.

  - Improve package description a bit. Unify changelog entries formatting.

  - Change package's mailing list address to zope-dev at zope.org as
    zope3-dev at zope.org is now retired.


  3.5.0 (2008-10-26)
  ------------------

  - Fix declaration of _zope_interface_coptimizations, it's not a top level
    package.

  - Add a DocTestSuite for odd.py module, so their tests are run.

  - Allow to bootstrap on Jython.

  - Fix https://bugs.launchpad.net/zope3/3.3/+bug/98388: ISpecification
    was missing a declaration for __iro__.

  - Add optional code optimizations support, which allows the building
    of C code optimizations to fail (Jython).

  - Replace `_flatten` with a non-recursive implementation, effectively making
    it 3x faster.


  3.4.1 (2007-10-02)
  ------------------

  - Fix a setup bug that prevented installation from source on systems
    without setuptools.


  3.4.0 (2007-07-19)
  ------------------

  - Final release for 3.4.0.


  3.4.0b3 (2007-05-22)
  --------------------


  - When checking whether an object is already registered, use identity
    comparison, to allow adding registering with picky custom comparison methods.


  3.3.0.1 (2007-01-03)
  --------------------

  - Made a reference to OverflowWarning, which disappeared in Python
    2.5, conditional.


  3.3.0 (2007/01/03)
  ------------------

  New Features
  ++++++++++++

  - Refactor the adapter-lookup algorithim to make it much simpler and faster.

    Also, implement more of the adapter-lookup logic in C, making
    debugging of application code easier, since there is less
    infrastructre code to step through.

  - Treat objects without interface declarations as if they
    declared that they provide ``zope.interface.Interface``.

  - Add a number of richer new adapter-registration interfaces
    that provide greater control and introspection.

  - Add a new interface decorator to zope.interface that allows the
    setting of tagged values on an interface at definition time (see
    zope.interface.taggedValue).

  Bug Fixes
  +++++++++

  - A bug in multi-adapter lookup sometimes caused incorrect adapters to
    be returned.


  3.2.0.2 (2006-04-15)
  --------------------

  - Fix packaging bug:  'package_dir' must be a *relative* path.


  3.2.0.1 (2006-04-14)
  --------------------

  - Packaging change:  suppress inclusion of 'setup.cfg' in 'sdist' builds.


  3.2.0 (2006-01-05)
  ------------------

  - Corresponds to the verison of the zope.interface package shipped as part of
    the Zope 3.2.0 release.


  3.1.0 (2005-10-03)
  ------------------

  - Corresponds to the verison of the zope.interface package shipped as part of
    the Zope 3.1.0 release.

  - Made attribute resolution order consistent with component lookup order,
    i.e. new-style class MRO semantics.

  - Deprecate 'isImplementedBy' and 'isImplementedByInstancesOf' APIs in
    favor of 'implementedBy' and 'providedBy'.


  3.0.1 (2005-07-27)
  ------------------

  - Corresponds to the verison of the zope.interface package shipped as part of
    the Zope X3.0.1 release.

  - Fix a bug reported by James Knight, which caused adapter registries
    to fail occasionally to reflect declaration changes.


  3.0.0 (2004-11-07)
  ------------------

  - Corresponds to the verison of the zope.interface package shipped as part of
    the Zope X3.0.0 release.


pkgId: 54f07369328266e0c1a118c5bb49596d39f973bc94ed819cfd1cf9cc4b36ac29
name: rh-python36-zope.interface-debuginfo
arch: x86_64
version: 4.7.2
epoch: 0
release: 1
summary: Debug information for package rh-python36-zope.interface
url: https://github.com/zopefoundation/zope.interface
rpm_license: ZPL 2.1
rpm_vendor: Zope Foundation and Contributors <zope-dev@zope.org>
rpm_group: Development/Debug
rpm_buildhost: b746ed1126834497a03083d58ff0b913
rpm_sourcerpm: rh-python36-zope.interface-4.7.2-1.src.rpm
rpm_packager: Martin Juhl <m@rtinjuhl.dk>
location_href: 01387167-rh-python36-zope.interface/rh-python36-zope.interface-debuginfo-4.7.2-1.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package rh-python36-zope.interface.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 448bc9937d329da67fe2db8eb733483a42b84d6abbf1fd96b02ea8dbcc11598d
name: scl-utils-build-helpers
arch: noarch
version: 0
epoch: 0
release: 7.el7
summary: RPM macros and scripts for SCL maintainers
url: https://github.com/sclorg/scl-utils-build-helpers
rpm_license: LGPLv2+
rpm_group: Unspecified
rpm_buildhost: 540ab11f2e5b4e1b8cc535b058b7f6fa
rpm_sourcerpm: scl-utils-build-helpers-0-7.el7.src.rpm
location_href: 01387284-scl-utils-build-helpers/scl-utils-build-helpers-0-7.el7.noarch.rpm
checksum_type: sha256
description:
  Several RPM macros and convenience scripts to make the maintenance of packages
  for Software Collections easier.  The aim is to move as much duplicated code as
  possible into one (dedicated) place.


pkgId: cbf61ada7a92beeaca13b287c4540d1072f57dc8170da0ac5f2dfe09db26683f
name: sqlite
arch: src
version: 3.29.0
epoch: 0
release: 1.el7
summary: Library that implements an embeddable SQL database engine
url: http://www.sqlite.org/
rpm_license: Public Domain
rpm_group: Applications/Databases
rpm_buildhost: 9bf74faf5bc04c06b8b02270525448e0
location_href: 01387278-sqlite/sqlite-3.29.0-1.el7.src.rpm
checksum_type: sha256
description:
  SQLite is a C library that implements an SQL database engine. A large
  subset of SQL92 is supported. A complete database is stored in a
  single disk file. The API is designed for convenience and ease of use.
  Applications that link against SQLite can enjoy the power and
  flexibility of an SQL database without the administrative hassles of
  supporting a separate database server.  Version 2 and version 3 binaries
  are named to permit each to be installed on a single host


pkgId: e829fd0f1c0b13bb358fd175ad91ef6c1448fdeef1fa59aa775fb0de7df2b90e
name: sqlite-debuginfo
arch: x86_64
version: 3.29.0
epoch: 0
release: 1.el7
summary: Debug information for package sqlite
url: http://www.sqlite.org/
rpm_license: Public Domain
rpm_group: Development/Debug
rpm_buildhost: a697f928f8014be08ee2fbb35163a41c
rpm_sourcerpm: sqlite-3.29.0-1.el7.src.rpm
location_href: 01387278-sqlite/sqlite-debuginfo-3.29.0-1.el7.x86_64.rpm
checksum_type: sha256
description:
  This package provides debug information for package sqlite.
  Debug information is useful when developing applications that use this
  package or when debugging this package.


pkgId: 44faaf22eb87bc69d1af4cbe80d3c7e6458576d870773dba83797e4e7298fd2f
name: sqlite-devel
arch: x86_64
version: 3.29.0
epoch: 0
release: 1.el7
summary: Development tools for the sqlite3 embeddable SQL database engine
url: http://www.sqlite.org/
rpm_license: Public Domain
rpm_group: Development/Libraries
rpm_buildhost: a697f928f8014be08ee2fbb35163a41c
rpm_sourcerpm: sqlite-3.29.0-1.el7.src.rpm
location_href: 01387278-sqlite/sqlite-devel-3.29.0-1.el7.x86_64.rpm
checksum_type: sha256
description:
  This package contains the header files and development documentation
  for sqlite. If you like to develop programs using sqlite, you will need
  to install sqlite-devel.


pkgId: 1dcb683d170363c6f11ea743c385308b5ca6b71fe2459bc411b15b49d6ab52d6
name: sqlite-doc
arch: noarch
version: 3.29.0
epoch: 0
release: 1.el7
summary: Documentation for sqlite
url: http://www.sqlite.org/
rpm_license: Public Domain
rpm_group: Documentation
rpm_buildhost: a697f928f8014be08ee2fbb35163a41c
rpm_sourcerpm: sqlite-3.29.0-1.el7.src.rpm
location_href: 01387278-sqlite/sqlite-doc-3.29.0-1.el7.noarch.rpm
checksum_type: sha256
description:
  This package contains most of the static HTML files that comprise the
  www.sqlite.org website, including all of the SQL Syntax and the
  C/C++ interface specs and other miscellaneous documentation.


