pyre2


Namepyre2 JSON
Version 0.3.6 PyPI version JSON
download
home_pagehttps://github.com/andreasvc/pyre2
SummaryPython wrapper for Google\'s RE2 using Cython
upload_time2021-05-05 17:38:19
maintainerSteve Arnold
docs_urlNone
authorAndreas van Cranenburgh
requires_python>=3.6
licenseBSD
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ===============================================================
 pyre2: Python RE2 wrapper for linear-time regular expressions
===============================================================

.. image:: https://github.com/andreasvc/pyre2/workflows/Build/badge.svg
    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Build
    :alt: Build CI Status

.. image:: https://github.com/andreasvc/pyre2/workflows/Release/badge.svg
    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Release
    :alt: Release CI Status

.. image:: https://img.shields.io/github/v/tag/andreasvc/pyre2?color=green&include_prereleases&label=latest%20release
    :target: https://github.com/andreasvc/pyre2/releases
    :alt: GitHub tag (latest SemVer, including pre-release)

.. image:: https://badge.fury.io/py/pyre2.svg
   :target: https://badge.fury.io/py/pyre2
    :alt: Pypi version

.. image:: https://github.com/andreasvc/pyre2/workflows/Conda/badge.svg
    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Conda
    :alt: Conda CI Status

.. image:: https://img.shields.io/github/license/andreasvc/pyre2
    :target: https://github.com/andreasvc/pyre2/blob/master/LICENSE
    :alt: License

.. image:: https://img.shields.io/badge/python-3.6+-blue.svg
    :target: https://www.python.org/downloads/
    :alt: Python version

.. image:: https://anaconda.org/conda-forge/pyre2/badges/version.svg
   :target: https://anaconda.org/conda-forge/pyre2
   :alt: version

.. image:: https://anaconda.org/conda-forge/pyre2/badges/platforms.svg
   :target: https://anaconda.org/conda-forge/pyre2
   :alt: platforms

.. image:: https://anaconda.org/conda-forge/pyre2/badges/downloads.svg
   :target: https://anaconda.org/conda-forge/pyre2
   :alt: downloads


.. contents:: Table of Contents
   :depth: 2
   :backlinks: top


Summary
=======

pyre2 is a Python extension that wraps
`Google's RE2 regular expression library <https://github.com/google/re2>`_.
The RE2 engine compiles (strictly) regular expressions to
deterministic finite automata, which guarantees linear-time behavior.

Intended as a drop-in replacement for ``re``. Unicode is supported by encoding
to UTF-8, and bytes strings are treated as UTF-8 when the UNICODE flag is given.
For best performance, work with UTF-8 encoded bytes strings.

Installation
============

Normal usage for Linux/Mac/Windows::

  $ pip install pyre2

Compiling from source
---------------------

Requirements for building the C++ extension from the repo source:

* A build environment with ``gcc`` or ``clang`` (e.g. ``sudo apt-get install build-essential``)
* Build tools and libraries: RE2, pybind11, and cmake installed in the build
  environment.

  + On Ubuntu/Debian: ``sudo apt-get install build-essential cmake ninja-build python3-dev cython3 pybind11-dev libre2-dev``
  + On Gentoo, install dev-util/cmake, dev-python/pybind11, and dev-libs/re2
  + For a venv you can install the pybind11, cmake, and cython packages from PyPI

On MacOS, use the ``brew`` package manager::

  $ brew install -s re2 pybind11

On Windows use the ``vcpkg`` package manager::

  $ vcpkg install re2:x64-windows pybind11:x64-windows

You can pass some cmake environment variables to alter the build type or
pass a toolchain file (the latter is required on Windows) or specify the
cmake generator.  For example::

  $ CMAKE_GENERATOR="Unix Makefiles" CMAKE_TOOLCHAIN_FILE=clang_toolchain.cmake tox -e deploy

For development, get the source::

    $ git clone git://github.com/andreasvc/pyre2.git
    $ cd pyre2
    $ make install


Platform-agnostic building with conda
-------------------------------------

An alternative to the above is provided via the `conda`_ recipe (use the
`miniconda installer`_ if you don't have ``conda`` installed already).


.. _conda: https://anaconda.org/conda-forge/pyre2
.. _miniconda installer: https://docs.conda.io/en/latest/miniconda.html


Backwards Compatibility
=======================

The stated goal of this module is to be a drop-in replacement for ``re``, i.e.::

    try:
        import re2 as re
    except ImportError:
        import re

That being said, there are features of the ``re`` module that this module may
never have; these will be handled through fallback to the original ``re`` module:

* lookahead assertions ``(?!...)``
* backreferences (``\\n`` in search pattern)
* \W and \S not supported inside character classes

On the other hand, unicode character classes are supported (e.g., ``\p{Greek}``).
Syntax reference: https://github.com/google/re2/wiki/Syntax

However, there are times when you may want to be notified of a failover. The
function ``set_fallback_notification`` determines the behavior in these cases::

    try:
        import re2 as re
    except ImportError:
        import re
    else:
        re.set_fallback_notification(re.FALLBACK_WARNING)

``set_fallback_notification`` takes three values:
``re.FALLBACK_QUIETLY`` (default), ``re.FALLBACK_WARNING`` (raise a warning),
and ``re.FALLBACK_EXCEPTION`` (raise an exception).

Documentation
=============

Consult the docstrings in the source code or interactively
through ipython or ``pydoc re2`` etc.

Unicode Support
===============

Python ``bytes`` and ``unicode`` strings are fully supported, but note that
``RE2`` works with UTF-8 encoded strings under the hood, which means that
``unicode`` strings need to be encoded and decoded back and forth.
There are two important factors:

* whether a ``unicode`` pattern and search string is used (will be encoded to UTF-8 internally)
* the ``UNICODE`` flag: whether operators such as ``\w`` recognize Unicode characters.

To avoid the overhead of encoding and decoding to UTF-8, it is possible to pass
UTF-8 encoded bytes strings directly but still treat them as ``unicode``::

    In [18]: re2.findall(u'\w'.encode('utf8'), u'Mötley Crüe'.encode('utf8'), flags=re2.UNICODE)
    Out[18]: ['M', '\xc3\xb6', 't', 'l', 'e', 'y', 'C', 'r', '\xc3\xbc', 'e']
    In [19]: re2.findall(u'\w'.encode('utf8'), u'Mötley Crüe'.encode('utf8'))
    Out[19]: ['M', 't', 'l', 'e', 'y', 'C', 'r', 'e']

However, note that the indices in ``Match`` objects will refer to the bytes string.
The indices of the match in the ``unicode`` string could be computed by
decoding/encoding, but this is done automatically and more efficiently if you
pass the ``unicode`` string::

    >>> re2.search(u'ü'.encode('utf8'), u'Mötley Crüe'.encode('utf8'), flags=re2.UNICODE)
    <re2.Match object; span=(10, 12), match='\xc3\xbc'>
    >>> re2.search(u'ü', u'Mötley Crüe', flags=re2.UNICODE)
    <re2.Match object; span=(9, 10), match=u'\xfc'>

Finally, if you want to match bytes without regard for Unicode characters,
pass bytes strings and leave out the ``UNICODE`` flag (this will cause Latin 1
encoding to be used with ``RE2`` under the hood)::

    >>> re2.findall(br'.', b'\x80\x81\x82')
    ['\x80', '\x81', '\x82']

Performance
===========

Performance is of course the point of this module, so it better perform well.
Regular expressions vary widely in complexity, and the salient feature of ``RE2`` is
that it behaves well asymptotically. This being said, for very simple substitutions,
I've found that occasionally python's regular ``re`` module is actually slightly faster.
However, when the ``re`` module gets slow, it gets *really* slow, while this module
buzzes along.

In the below example, I'm running the data against 8MB of text from the colossal Wikipedia
XML file. I'm running them multiple times, being careful to use the ``timeit`` module.
To see more details, please see the `performance script <http://github.com/andreasvc/pyre2/tree/master/tests/performance.py>`_.

+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+
|Test             |Description                                                                |# total runs|``re`` time(s)|``re2`` time(s)|% ``re`` time|``regex`` time(s)|% ``regex`` time|
+=================+===========================================================================+============+==============+===============+=============+=================+================+
|Findall URI|Email|Find list of '([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?|([^ @]+)@([^ @]+)'|2           |6.262         |0.131          |2.08%        |5.119            |2.55%           |
+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+
|Replace WikiLinks|This test replaces links of the form [[Obama|Barack_Obama]] to Obama.      |100         |4.374         |0.815          |18.63%       |1.176            |69.33%          |
+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+
|Remove WikiLinks |This test splits the data by the <page> tag.                               |100         |4.153         |0.225          |5.43%        |0.537            |42.01%          |
+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+

Feel free to add more speed tests to the bottom of the script and send a pull request my way!

Current Status
==============

The tests show the following differences with Python's ``re`` module:

* The ``$`` operator in Python's ``re`` matches twice if the string ends
  with ``\n``. This can be simulated using ``\n?$``, except when doing
  substitutions.
* The ``pyre2`` module and Python's ``re`` may behave differently with nested groups.
  See ``tests/test_emptygroups.txt`` for the examples.

Please report any further issues with ``pyre2``.

Tests
=====

If you would like to help, one thing that would be very useful
is writing comprehensive tests for this. It's actually really easy:

* Come up with regular expression problems using the regular python 're' module.
* Write a session in python traceback format `Example <http://github.com/andreasvc/pyre2/blob/master/tests/test_search.txt>`_.
* Replace your ``import re`` with ``import re2 as re``.
* Save it with as ``test_<name>.txt`` in the tests directory. You can comment on it however you like and indent the code with 4 spaces.


Credits
=======
This code builds on the following projects (in chronological order):

- Google's RE2 regular expression library: https://github.com/google/re2
- Facebook's pyre2 github repository: http://github.com/facebook/pyre2/
- Mike Axiak's Cython version of this: http://github.com/axiak/pyre2/ (seems not actively maintained)
- This fork adds Python 3 support and other improvements.




            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/andreasvc/pyre2",
    "name": "pyre2",
    "maintainer": "Steve Arnold",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "nerdboy@gentoo.org",
    "keywords": "",
    "author": "Andreas van Cranenburgh",
    "author_email": "andreas@unstable.nl",
    "download_url": "https://files.pythonhosted.org/packages/f6/71/e38ed302e3a01df2e233e77802e7ec92436621893a12824ad2f0e388dca0/pyre2-0.3.6.tar.gz",
    "platform": "",
    "description": "===============================================================\n pyre2: Python RE2 wrapper for linear-time regular expressions\n===============================================================\n\n.. image:: https://github.com/andreasvc/pyre2/workflows/Build/badge.svg\n    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Build\n    :alt: Build CI Status\n\n.. image:: https://github.com/andreasvc/pyre2/workflows/Release/badge.svg\n    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Release\n    :alt: Release CI Status\n\n.. image:: https://img.shields.io/github/v/tag/andreasvc/pyre2?color=green&include_prereleases&label=latest%20release\n    :target: https://github.com/andreasvc/pyre2/releases\n    :alt: GitHub tag (latest SemVer, including pre-release)\n\n.. image:: https://badge.fury.io/py/pyre2.svg\n   :target: https://badge.fury.io/py/pyre2\n    :alt: Pypi version\n\n.. image:: https://github.com/andreasvc/pyre2/workflows/Conda/badge.svg\n    :target: https://github.com/andreasvc/pyre2/actions?query=workflow:Conda\n    :alt: Conda CI Status\n\n.. image:: https://img.shields.io/github/license/andreasvc/pyre2\n    :target: https://github.com/andreasvc/pyre2/blob/master/LICENSE\n    :alt: License\n\n.. image:: https://img.shields.io/badge/python-3.6+-blue.svg\n    :target: https://www.python.org/downloads/\n    :alt: Python version\n\n.. image:: https://anaconda.org/conda-forge/pyre2/badges/version.svg\n   :target: https://anaconda.org/conda-forge/pyre2\n   :alt: version\n\n.. image:: https://anaconda.org/conda-forge/pyre2/badges/platforms.svg\n   :target: https://anaconda.org/conda-forge/pyre2\n   :alt: platforms\n\n.. image:: https://anaconda.org/conda-forge/pyre2/badges/downloads.svg\n   :target: https://anaconda.org/conda-forge/pyre2\n   :alt: downloads\n\n\n.. contents:: Table of Contents\n   :depth: 2\n   :backlinks: top\n\n\nSummary\n=======\n\npyre2 is a Python extension that wraps\n`Google's RE2 regular expression library <https://github.com/google/re2>`_.\nThe RE2 engine compiles (strictly) regular expressions to\ndeterministic finite automata, which guarantees linear-time behavior.\n\nIntended as a drop-in replacement for ``re``. Unicode is supported by encoding\nto UTF-8, and bytes strings are treated as UTF-8 when the UNICODE flag is given.\nFor best performance, work with UTF-8 encoded bytes strings.\n\nInstallation\n============\n\nNormal usage for Linux/Mac/Windows::\n\n  $ pip install pyre2\n\nCompiling from source\n---------------------\n\nRequirements for building the C++ extension from the repo source:\n\n* A build environment with ``gcc`` or ``clang`` (e.g. ``sudo apt-get install build-essential``)\n* Build tools and libraries: RE2, pybind11, and cmake installed in the build\n  environment.\n\n  + On Ubuntu/Debian: ``sudo apt-get install build-essential cmake ninja-build python3-dev cython3 pybind11-dev libre2-dev``\n  + On Gentoo, install dev-util/cmake, dev-python/pybind11, and dev-libs/re2\n  + For a venv you can install the pybind11, cmake, and cython packages from PyPI\n\nOn MacOS, use the ``brew`` package manager::\n\n  $ brew install -s re2 pybind11\n\nOn Windows use the ``vcpkg`` package manager::\n\n  $ vcpkg install re2:x64-windows pybind11:x64-windows\n\nYou can pass some cmake environment variables to alter the build type or\npass a toolchain file (the latter is required on Windows) or specify the\ncmake generator.  For example::\n\n  $ CMAKE_GENERATOR=\"Unix Makefiles\" CMAKE_TOOLCHAIN_FILE=clang_toolchain.cmake tox -e deploy\n\nFor development, get the source::\n\n    $ git clone git://github.com/andreasvc/pyre2.git\n    $ cd pyre2\n    $ make install\n\n\nPlatform-agnostic building with conda\n-------------------------------------\n\nAn alternative to the above is provided via the `conda`_ recipe (use the\n`miniconda installer`_ if you don't have ``conda`` installed already).\n\n\n.. _conda: https://anaconda.org/conda-forge/pyre2\n.. _miniconda installer: https://docs.conda.io/en/latest/miniconda.html\n\n\nBackwards Compatibility\n=======================\n\nThe stated goal of this module is to be a drop-in replacement for ``re``, i.e.::\n\n    try:\n        import re2 as re\n    except ImportError:\n        import re\n\nThat being said, there are features of the ``re`` module that this module may\nnever have; these will be handled through fallback to the original ``re`` module:\n\n* lookahead assertions ``(?!...)``\n* backreferences (``\\\\n`` in search pattern)\n* \\W and \\S not supported inside character classes\n\nOn the other hand, unicode character classes are supported (e.g., ``\\p{Greek}``).\nSyntax reference: https://github.com/google/re2/wiki/Syntax\n\nHowever, there are times when you may want to be notified of a failover. The\nfunction ``set_fallback_notification`` determines the behavior in these cases::\n\n    try:\n        import re2 as re\n    except ImportError:\n        import re\n    else:\n        re.set_fallback_notification(re.FALLBACK_WARNING)\n\n``set_fallback_notification`` takes three values:\n``re.FALLBACK_QUIETLY`` (default), ``re.FALLBACK_WARNING`` (raise a warning),\nand ``re.FALLBACK_EXCEPTION`` (raise an exception).\n\nDocumentation\n=============\n\nConsult the docstrings in the source code or interactively\nthrough ipython or ``pydoc re2`` etc.\n\nUnicode Support\n===============\n\nPython ``bytes`` and ``unicode`` strings are fully supported, but note that\n``RE2`` works with UTF-8 encoded strings under the hood, which means that\n``unicode`` strings need to be encoded and decoded back and forth.\nThere are two important factors:\n\n* whether a ``unicode`` pattern and search string is used (will be encoded to UTF-8 internally)\n* the ``UNICODE`` flag: whether operators such as ``\\w`` recognize Unicode characters.\n\nTo avoid the overhead of encoding and decoding to UTF-8, it is possible to pass\nUTF-8 encoded bytes strings directly but still treat them as ``unicode``::\n\n    In [18]: re2.findall(u'\\w'.encode('utf8'), u'M\u00f6tley Cr\u00fce'.encode('utf8'), flags=re2.UNICODE)\n    Out[18]: ['M', '\\xc3\\xb6', 't', 'l', 'e', 'y', 'C', 'r', '\\xc3\\xbc', 'e']\n    In [19]: re2.findall(u'\\w'.encode('utf8'), u'M\u00f6tley Cr\u00fce'.encode('utf8'))\n    Out[19]: ['M', 't', 'l', 'e', 'y', 'C', 'r', 'e']\n\nHowever, note that the indices in ``Match`` objects will refer to the bytes string.\nThe indices of the match in the ``unicode`` string could be computed by\ndecoding/encoding, but this is done automatically and more efficiently if you\npass the ``unicode`` string::\n\n    >>> re2.search(u'\u00fc'.encode('utf8'), u'M\u00f6tley Cr\u00fce'.encode('utf8'), flags=re2.UNICODE)\n    <re2.Match object; span=(10, 12), match='\\xc3\\xbc'>\n    >>> re2.search(u'\u00fc', u'M\u00f6tley Cr\u00fce', flags=re2.UNICODE)\n    <re2.Match object; span=(9, 10), match=u'\\xfc'>\n\nFinally, if you want to match bytes without regard for Unicode characters,\npass bytes strings and leave out the ``UNICODE`` flag (this will cause Latin 1\nencoding to be used with ``RE2`` under the hood)::\n\n    >>> re2.findall(br'.', b'\\x80\\x81\\x82')\n    ['\\x80', '\\x81', '\\x82']\n\nPerformance\n===========\n\nPerformance is of course the point of this module, so it better perform well.\nRegular expressions vary widely in complexity, and the salient feature of ``RE2`` is\nthat it behaves well asymptotically. This being said, for very simple substitutions,\nI've found that occasionally python's regular ``re`` module is actually slightly faster.\nHowever, when the ``re`` module gets slow, it gets *really* slow, while this module\nbuzzes along.\n\nIn the below example, I'm running the data against 8MB of text from the colossal Wikipedia\nXML file. I'm running them multiple times, being careful to use the ``timeit`` module.\nTo see more details, please see the `performance script <http://github.com/andreasvc/pyre2/tree/master/tests/performance.py>`_.\n\n+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+\n|Test             |Description                                                                |# total runs|``re`` time(s)|``re2`` time(s)|% ``re`` time|``regex`` time(s)|% ``regex`` time|\n+=================+===========================================================================+============+==============+===============+=============+=================+================+\n|Findall URI|Email|Find list of '([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?|([^ @]+)@([^ @]+)'|2           |6.262         |0.131          |2.08%        |5.119            |2.55%           |\n+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+\n|Replace WikiLinks|This test replaces links of the form [[Obama|Barack_Obama]] to Obama.      |100         |4.374         |0.815          |18.63%       |1.176            |69.33%          |\n+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+\n|Remove WikiLinks |This test splits the data by the <page> tag.                               |100         |4.153         |0.225          |5.43%        |0.537            |42.01%          |\n+-----------------+---------------------------------------------------------------------------+------------+--------------+---------------+-------------+-----------------+----------------+\n\nFeel free to add more speed tests to the bottom of the script and send a pull request my way!\n\nCurrent Status\n==============\n\nThe tests show the following differences with Python's ``re`` module:\n\n* The ``$`` operator in Python's ``re`` matches twice if the string ends\n  with ``\\n``. This can be simulated using ``\\n?$``, except when doing\n  substitutions.\n* The ``pyre2`` module and Python's ``re`` may behave differently with nested groups.\n  See ``tests/test_emptygroups.txt`` for the examples.\n\nPlease report any further issues with ``pyre2``.\n\nTests\n=====\n\nIf you would like to help, one thing that would be very useful\nis writing comprehensive tests for this. It's actually really easy:\n\n* Come up with regular expression problems using the regular python 're' module.\n* Write a session in python traceback format `Example <http://github.com/andreasvc/pyre2/blob/master/tests/test_search.txt>`_.\n* Replace your ``import re`` with ``import re2 as re``.\n* Save it with as ``test_<name>.txt`` in the tests directory. You can comment on it however you like and indent the code with 4 spaces.\n\n\nCredits\n=======\nThis code builds on the following projects (in chronological order):\n\n- Google's RE2 regular expression library: https://github.com/google/re2\n- Facebook's pyre2 github repository: http://github.com/facebook/pyre2/\n- Mike Axiak's Cython version of this: http://github.com/axiak/pyre2/ (seems not actively maintained)\n- This fork adds Python 3 support and other improvements.\n\n\n\n",
    "bugtrack_url": null,
    "license": "BSD",
    "summary": "Python wrapper for Google\\'s RE2 using Cython",
    "version": "0.3.6",
    "project_urls": {
        "Homepage": "https://github.com/andreasvc/pyre2"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a77475d4ac90b684303cb6d97ab49ba5b2f858709d206d9e9e43596b34acb60b",
                "md5": "276e489fb6c5ec76bd41e4bf6b4e6cfa",
                "sha256": "6d8e550899886ee01f1b8149ba1c336e1c749cec2e33414815a76fb5649cdf67"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp36-cp36m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "276e489fb6c5ec76bd41e4bf6b4e6cfa",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 297851,
            "upload_time": "2021-05-05T17:38:01",
            "upload_time_iso_8601": "2021-05-05T17:38:01.834738Z",
            "url": "https://files.pythonhosted.org/packages/a7/74/75d4ac90b684303cb6d97ab49ba5b2f858709d206d9e9e43596b34acb60b/pyre2-0.3.6-cp36-cp36m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b62fd0aa660e24ae145457f65e23790555e85b72a0590495de4380036afd7809",
                "md5": "63a90ef746fec0aeffa1a46c7320c73a",
                "sha256": "310d5c98495114692940ffa020aaeef1341427755b6ca5a17c63092060ed93dc"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp36-cp36m-manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "63a90ef746fec0aeffa1a46c7320c73a",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 819505,
            "upload_time": "2021-05-05T17:38:03",
            "upload_time_iso_8601": "2021-05-05T17:38:03.038782Z",
            "url": "https://files.pythonhosted.org/packages/b6/2f/d0aa660e24ae145457f65e23790555e85b72a0590495de4380036afd7809/pyre2-0.3.6-cp36-cp36m-manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4c0e143bb11016481013baeb3155d0f62bb7925ef4e442775cc74168db8e4ca1",
                "md5": "51365be088add569661e7ff59486f696",
                "sha256": "97de5d4cf7d8b9be7dbe0dc0941c4a6c1395fc598722d9644adc55427d3dd083"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp36-cp36m-manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "51365be088add569661e7ff59486f696",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 843373,
            "upload_time": "2021-05-05T17:38:04",
            "upload_time_iso_8601": "2021-05-05T17:38:04.206800Z",
            "url": "https://files.pythonhosted.org/packages/4c/0e/143bb11016481013baeb3155d0f62bb7925ef4e442775cc74168db8e4ca1/pyre2-0.3.6-cp36-cp36m-manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ee60151d40ee2987a92290c3a014e66a1601a91488aa1083a9b04e51f0a822f1",
                "md5": "26c7e78703fcc39db1e874e1fade67c9",
                "sha256": "18cd5d76973ee57232a5d851489c202105e4752aee6dcbd38742c0475f3f1c4e"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "26c7e78703fcc39db1e874e1fade67c9",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 1036744,
            "upload_time": "2021-05-05T17:38:05",
            "upload_time_iso_8601": "2021-05-05T17:38:05.508007Z",
            "url": "https://files.pythonhosted.org/packages/ee/60/151d40ee2987a92290c3a014e66a1601a91488aa1083a9b04e51f0a822f1/pyre2-0.3.6-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f34051be79e1756b0df7a1e71b7d5fcb52a358d700483f463862694e11deedd5",
                "md5": "97e821eafeabb4f2c34d74a7299ed7e1",
                "sha256": "225784d7bd905bc3e87d4bbcc6ac4087ccea8905dd657273fd71bfb113e50e82"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "97e821eafeabb4f2c34d74a7299ed7e1",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 298100,
            "upload_time": "2021-05-05T17:38:06",
            "upload_time_iso_8601": "2021-05-05T17:38:06.694283Z",
            "url": "https://files.pythonhosted.org/packages/f3/40/51be79e1756b0df7a1e71b7d5fcb52a358d700483f463862694e11deedd5/pyre2-0.3.6-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2cde0360ffc2149ede84d0a1c4199616d5727dd38a32fdf0043507ced6965631",
                "md5": "ba7e6e86dfa73d6795360d79d2ee24ea",
                "sha256": "c3b45f789374d0f95866330fcd34bb6b93705e8f5c276d9d70d318a227ba5954"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp37-cp37m-manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "ba7e6e86dfa73d6795360d79d2ee24ea",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 817578,
            "upload_time": "2021-05-05T17:38:07",
            "upload_time_iso_8601": "2021-05-05T17:38:07.866018Z",
            "url": "https://files.pythonhosted.org/packages/2c/de/0360ffc2149ede84d0a1c4199616d5727dd38a32fdf0043507ced6965631/pyre2-0.3.6-cp37-cp37m-manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f8c3625745d9cd8d247cffe5f0ffc5c420fe42d87711e6897bd74fc55693a329",
                "md5": "883263ee67552bab51ebdb14e07bedff",
                "sha256": "f3467dd9a4c8100f6406bc6277d945a13b7fd7c4426d2415564de1324b5db94f"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp37-cp37m-manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "883263ee67552bab51ebdb14e07bedff",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 836520,
            "upload_time": "2021-05-05T17:38:09",
            "upload_time_iso_8601": "2021-05-05T17:38:09.059317Z",
            "url": "https://files.pythonhosted.org/packages/f8/c3/625745d9cd8d247cffe5f0ffc5c420fe42d87711e6897bd74fc55693a329/pyre2-0.3.6-cp37-cp37m-manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "984baf8bd3adf695e55f1b79006270e9ae7c1fa7cdb5ef6934b83e881f5a69fe",
                "md5": "74e9bc7555926d994ad06f6a41ebc63e",
                "sha256": "608558276d3539002ad6300d0b0a2b0941577fdea009715ff4d31052e05cb409"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "74e9bc7555926d994ad06f6a41ebc63e",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 1037680,
            "upload_time": "2021-05-05T17:38:10",
            "upload_time_iso_8601": "2021-05-05T17:38:10.286871Z",
            "url": "https://files.pythonhosted.org/packages/98/4b/af8bd3adf695e55f1b79006270e9ae7c1fa7cdb5ef6934b83e881f5a69fe/pyre2-0.3.6-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0f08bf349a74974da745592549d2dd8c69a66fb8c8d8a3fc8b8da8b4828419bb",
                "md5": "565169ef1e3561d57fe940ad214cd83e",
                "sha256": "ebe92a3222f2f6f176eeb3859638734e4f9a82d5940ad7d6f0c1288153c70ce2"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "565169ef1e3561d57fe940ad214cd83e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 300701,
            "upload_time": "2021-05-05T17:38:11",
            "upload_time_iso_8601": "2021-05-05T17:38:11.491355Z",
            "url": "https://files.pythonhosted.org/packages/0f/08/bf349a74974da745592549d2dd8c69a66fb8c8d8a3fc8b8da8b4828419bb/pyre2-0.3.6-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d81eb6285f702f74cd359325a6f8b48cd06d47e3748334e57fd4503a76710a32",
                "md5": "281fd77b59fd99ed90098953b452d252",
                "sha256": "961020835a3b805eed51a082e5effdccb51979c4efef2a17f17122967cb4749a"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp38-cp38-manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "281fd77b59fd99ed90098953b452d252",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 930409,
            "upload_time": "2021-05-05T17:38:12",
            "upload_time_iso_8601": "2021-05-05T17:38:12.722741Z",
            "url": "https://files.pythonhosted.org/packages/d8/1e/b6285f702f74cd359325a6f8b48cd06d47e3748334e57fd4503a76710a32/pyre2-0.3.6-cp38-cp38-manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "702a423fa95b1829527be3ffe031e03080bbee7989ea4778b207500756cb81d2",
                "md5": "bb0782b65b829bcf6a378087e8a4c6fc",
                "sha256": "cc180989186f05b75020b53c79059c338e9e1940d325fc945c84aab2b5c57525"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp38-cp38-manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bb0782b65b829bcf6a378087e8a4c6fc",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 952823,
            "upload_time": "2021-05-05T17:38:13",
            "upload_time_iso_8601": "2021-05-05T17:38:13.708343Z",
            "url": "https://files.pythonhosted.org/packages/70/2a/423fa95b1829527be3ffe031e03080bbee7989ea4778b207500756cb81d2/pyre2-0.3.6-cp38-cp38-manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c0cef6fae545cdee96cd382cd751e82ad4e3992bdce0e2d9d7c2b65e93ad9fac",
                "md5": "bd5cc010aef7f727eafc3bb515956465",
                "sha256": "7c398942c3467fe23b2dd4a11dd78da8aee774d0b481e84b1b208819ee724cca"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "bd5cc010aef7f727eafc3bb515956465",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 1068483,
            "upload_time": "2021-05-05T17:38:14",
            "upload_time_iso_8601": "2021-05-05T17:38:14.653601Z",
            "url": "https://files.pythonhosted.org/packages/c0/ce/f6fae545cdee96cd382cd751e82ad4e3992bdce0e2d9d7c2b65e93ad9fac/pyre2-0.3.6-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f81eb80c85203e657fa123ec7322bf7f84eed16cca543eb46a442664e530f568",
                "md5": "256471ccaca9810cc97770f2e31f7a06",
                "sha256": "617c4d75b41b34afe7590e144efad1c564a8b49a1e0827872afc2243b24beada"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "256471ccaca9810cc97770f2e31f7a06",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 303015,
            "upload_time": "2021-05-05T17:38:15",
            "upload_time_iso_8601": "2021-05-05T17:38:15.674788Z",
            "url": "https://files.pythonhosted.org/packages/f8/1e/b80c85203e657fa123ec7322bf7f84eed16cca543eb46a442664e530f568/pyre2-0.3.6-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6cacc082863bb08d62abf95aef89af4c8f87010b1b8087b6a5deafd7e2720c9b",
                "md5": "7349fbaa1276229ce51ad2ea14b6a500",
                "sha256": "f3ae7b087abcbc4b910d535c2fb877ef452b61d2514a63fd15b8b020b51fe4b5"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp39-cp39-manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "7349fbaa1276229ce51ad2ea14b6a500",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 886924,
            "upload_time": "2021-05-05T17:38:16",
            "upload_time_iso_8601": "2021-05-05T17:38:16.703539Z",
            "url": "https://files.pythonhosted.org/packages/6c/ac/c082863bb08d62abf95aef89af4c8f87010b1b8087b6a5deafd7e2720c9b/pyre2-0.3.6-cp39-cp39-manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "74b2d19fa0269c8e5e68ce0398f02e12fbbafd24c28ae5e17eacbef6366be899",
                "md5": "9c0387eb2d4c6c655beca72a2e782837",
                "sha256": "b87e9aeee74376210bd82c8328eb007b93378f3cd61fa6176161c3b9037e8474"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp39-cp39-manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9c0387eb2d4c6c655beca72a2e782837",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 909452,
            "upload_time": "2021-05-05T17:38:17",
            "upload_time_iso_8601": "2021-05-05T17:38:17.978791Z",
            "url": "https://files.pythonhosted.org/packages/74/b2/d19fa0269c8e5e68ce0398f02e12fbbafd24c28ae5e17eacbef6366be899/pyre2-0.3.6-cp39-cp39-manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b59adea24501b16481210ffa5335bf0daf2f4511b62a1d86146e41e9e8072f77",
                "md5": "7c641c5eb84a1341edab2b686c715f26",
                "sha256": "1efec117f2543b38adcbe038a2ae156eb91b6ed8a73c998c3752a766d6241075"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7c641c5eb84a1341edab2b686c715f26",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 1072482,
            "upload_time": "2021-05-05T17:38:18",
            "upload_time_iso_8601": "2021-05-05T17:38:18.976969Z",
            "url": "https://files.pythonhosted.org/packages/b5/9a/dea24501b16481210ffa5335bf0daf2f4511b62a1d86146e41e9e8072f77/pyre2-0.3.6-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f671e38ed302e3a01df2e233e77802e7ec92436621893a12824ad2f0e388dca0",
                "md5": "0a82005f47a2c4a34f2147594422228a",
                "sha256": "6fe972c0cadec49a5a055690e5aa29f8aebaed0fa9b7d8d3530e33719b61f91c"
            },
            "downloads": -1,
            "filename": "pyre2-0.3.6.tar.gz",
            "has_sig": false,
            "md5_digest": "0a82005f47a2c4a34f2147594422228a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 1887208,
            "upload_time": "2021-05-05T17:38:19",
            "upload_time_iso_8601": "2021-05-05T17:38:19.975001Z",
            "url": "https://files.pythonhosted.org/packages/f6/71/e38ed302e3a01df2e233e77802e7ec92436621893a12824ad2f0e388dca0/pyre2-0.3.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2021-05-05 17:38:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "andreasvc",
    "github_project": "pyre2",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "pyre2"
}
        
Elapsed time: 0.99873s