{ "info": { "author": "Manuel Krebber", "author_email": "admin@wheerd.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython" ], "description": "MatchPy\n=======\n\nMatchPy is a library for pattern matching on symbolic expressions in Python.\n\n**Work in progress**\n\n|pypi| |conda| |coverage| |build| |docs| |joss| |doi|\n\nInstallation\n------------\n\nMatchPy is available via `PyPI `_, and for Conda via `conda-forge `_. It can be installed with ``pip install matchpy`` or ``conda install -c conda-forge matchpy``.\n\nOverview\n--------\n\nThis package implements `pattern matching `_ in Python. Pattern matching is a powerful tool for symbolic computations, operating on symbolic expressions. Given a pattern and an expression (which is usually called *subject*), the goal of pattern matching is to find a substitution for all the variables in the pattern such that the pattern becomes the subject. As an example, consider the pattern :math:`f(x)`, where :math:`f` is a function and :math:`x` is a variable, and the subject :math:`f(a)`, where :math:`a` is a constant symbol. Then the substitution that replaces :math:`x` with :math:`a` is a match. MatchPy supports associative and/or commutative function symbols, as well as sequence variables, similar to pattern matching in `Mathematica `_. \n\nA detailed example of how to use MatchPy can be found `here `_.\n\nMatchPy supports both one-to-one and many-to-one pattern matching. The latter makes use of similarities between patterns to efficiently find matches for multiple patterns at the same time.\n\nA list of publications about MatchPy can be found `below <#publications>`_.\n\nExpressions\n...........\n\nExpressions are tree-like data structures, consisting of operations (functions, internal nodes) and symbols (constants, leaves):\n\n>>> from matchpy import Operation, Symbol, Arity\n>>> f = Operation.new('f', Arity.binary)\n>>> a = Symbol('a')\n>>> print(f(a, a))\nf(a, a)\n\nPatterns are expressions which may contain wildcards (variables):\n\n>>> from matchpy import Pattern, Wildcard\n>>> x = Wildcard.dot('x')\n>>> print(Pattern(f(a, x)))\nf(a, x_)\n\nIn the previous example, x is the name of the variable. However, it is also possible to use wildcards without names:\n\n>>> w = Wildcard.dot()\n>>> print(Pattern(f(w, w)))\nf(_, _)\n\nIt is also possible to assign variable names to entire subexpressions:\n\n>>> print(Pattern(f(w, a, variable_name='y')))\ny: f(_, a)\n\nPattern Matching\n................\n\nGiven a pattern and an expression (which is usually called subject), the idea of pattern matching is to find a substitution that maps wildcards to expressions such that the pattern becomes the subject. In MatchPy, a substitution is a dict that maps variable names to expressions.\n\n>>> from matchpy import match\n>>> y = Wildcard.dot('y')\n>>> b = Symbol('b')\n>>> subject = f(a, b)\n>>> pattern = Pattern(f(x, y))\n>>> substitution = next(match(subject, pattern))\n>>> print(substitution)\n{x \u21a6 a, y \u21a6 b}\n\nApplying the substitution to the pattern results in the original expression.\n\n>>> from matchpy import substitute\n>>> print(substitute(pattern, substitution))\nf(a, b)\n\nSequence Wildcards\n..................\n\nSequence wildcards are wildcards that can match a sequence of expressions instead of just a single expression:\n\n>>> z = Wildcard.plus('z')\n>>> pattern = Pattern(f(z))\n>>> subject = f(a, b)\n>>> substitution = next(match(subject, pattern))\n>>> print(substitution)\n{z \u21a6 (a, b)}\n\nAssociativity and Commutativity\n...............................\n\nMatchPy natively supports associative and/or commutative operations. Nested associative operators are automatically flattened, the operands in commutative operations are sorted:\n\n>>> g = Operation.new('g', Arity.polyadic, associative=True, commutative=True)\n>>> print(g(a, g(b, a)))\ng(a, a, b)\n\nAssociativity and commutativity is also considered for pattern matching:\n\n>>> pattern = Pattern(g(b, x))\n>>> subject = g(a, a, b)\n>>> print(next(match(subject, pattern)))\n{x \u21a6 g(a, a)}\n>>> h = Operation.new('h', Arity.polyadic)\n>>> pattern = Pattern(h(b, x))\n>>> subject = h(a, a, b)\n>>> list(match(subject, pattern))\n[]\n\nMany-to-One Matching\n....................\n\nWhen a fixed set of patterns is matched repeatedly against different subjects, matching can be sped up significantly by using many-to-one matching. The idea of many-to-one matching is to construct a so called discrimination net, a data structure similar to a decision tree or a finite automaton that exploits similarities between patterns. In MatchPy, there are two such data structures, implemented as classes: `DiscriminationNet `_ and `ManyToOneMatcher `_. The DiscriminationNet class only supports syntactic pattern matching, that is, operations are neither associative nor commutative. Sequence variables are not supported either. The ManyToOneMatcher class supports associative and/or commutative matching with sequence variables. For syntactic pattern matching, the DiscriminationNet should be used, as it is usually faster.\n\n>>> pattern1 = Pattern(f(a, x))\n>>> pattern2 = Pattern(f(y, b))\n>>> matcher = ManyToOneMatcher(pattern1, pattern2)\n>>> subject = f(a, b)\n>>> matches = matcher.match(subject)\n>>> for matched_pattern, substitution in sorted(map(lambda m: (str(m[0]), str(m[1])), matches)):\n... print('{} matched with {}'.format(matched_pattern, substitution))\nf(a, x_) matched with {x \u21a6 b}\nf(y_, b) matched with {y \u21a6 a}\n\nRoadmap\n-------\n\nBesides the existing features, we plan on adding the following to MatchPy:\n\n- Support for Mathematica's ``Alternatives``: For example ``f(a | b)`` would match either ``f(a)`` or ``f(b)``.\n- Support for Mathematica's ``Repeated``: For example ``f(a..)`` would match ``f(a)``, ``f(a, a)``, ``f(a, a, a)``, etc.\n- Support pattern sequences (``PatternSequence`` in Mathematica). These are mainly useful in combination with\n ``Alternatives`` or ``Repeated``, e.g. ``f(a | (b, c))`` would match either ``f(a)`` or ``f(b, c)``.\n ``f((a a)..)`` would match any ``f`` with an even number of ``a`` arguments.\n- All these additional pattern features need to be supported in the ``ManyToOneMatcher`` as well.\n- Better integration with existing types such as ``dict``.\n- Code generation for both one-to-one and many-to-one matching. There is already an experimental implementation, but it still has some dependencies on MatchPy which can probably be removed.\n- Improving the documentation with more examples.\n- Better test coverage with more randomized tests.\n- Implementation of the matching algorithms in a lower-level language, for example C, both for performance and to make MatchPy's functionality available in other languages.\n\nContributing\n------------\n\nIf you have some issue or want to contribute, please feel free to open an issue or create a pull request. Help is always appreciated!\n\nThe Makefile has several tasks to help development:\n\n- To install all needed packages, you can use ``make init`` .\n- To run the tests you can use ``make test``. The tests use `pytest `_.\n- To generate the documentation you can use ``make docs`` .\n- To run the style checker (`pylint `_) you can use ``make check`` .\n\nIf you have any questions or need help with setting things up, please open an issue and we will try the best to assist you.\n\nPublications\n------------\n\n`MatchPy: Pattern Matching in Python `_ |br|\nManuel Krebber and Henrik Barthels |br|\nJournal of Open Source Software, Volume 3(26), pp. 2, June 2018.\n\n`Efficient Pattern Matching in Python `_ |br|\nManuel Krebber, Henrik Barthels and Paolo Bientinesi |br|\nProceedings of the 7th Workshop on Python for High-Performance and Scientific Computing, November 2017.\n\n`MatchPy: A Pattern Matching Library `_ |br|\nManuel Krebber, Henrik Barthels and Paolo Bientinesi |br|\nProceedings of the 15th Python in Science Conference, July 2017.\n\n`Non-linear Associative-Commutative Many-to-One Pattern Matching with Sequence Variables `_ |br|\nManuel Krebber |br|\nMaster Thesis, RWTH Aachen University, May 2017\n\nIf you want to cite MatchPy, please reference the JOSS paper::\n\n @article{krebber2018,\n author = {Manuel Krebber and Henrik Barthels},\n title = {{M}atch{P}y: {P}attern {M}atching in {P}ython},\n journal = {Journal of Open Source Software},\n year = 2018,\n pages = 2,\n month = jun,\n volume = {3},\n number = {26},\n doi = \"10.21105/joss.00670\",\n web = \"http://joss.theoj.org/papers/10.21105/joss.00670\",\n }\n\n.. |br| raw:: html\n\n
\n\n.. |pypi| image:: https://img.shields.io/pypi/v/matchpy.svg?style=flat\n :target: https://pypi.org/project/matchpy/\n :alt: Latest version released on PyPi\n\n.. |conda| image:: https://img.shields.io/conda/vn/conda-forge/matchpy.svg\n :target: https://anaconda.org/conda-forge/matchpy\n :alt: Latest version released via conda-forge\n\n.. |coverage| image:: https://coveralls.io/repos/github/HPAC/matchpy/badge.svg?branch=master\n :target: https://coveralls.io/github/HPAC/matchpy?branch=master\n :alt: Test coverage\n\n.. |build| image:: https://travis-ci.org/HPAC/matchpy.svg?branch=master\n :target: https://travis-ci.org/HPAC/matchpy\n :alt: Build status of the master branch\n\n.. |docs| image:: https://readthedocs.org/projects/matchpy/badge/?version=latest\n :target: https://matchpy.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. |joss| image:: http://joss.theoj.org/papers/e456bc05880b533652980aee6550a3cb/status.svg\n :target: http://joss.theoj.org/papers/e456bc05880b533652980aee6550a3cb\n :alt: The Journal of Open Source Software\n\n.. |doi| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.1294930.svg\n :target: https://doi.org/10.5281/zenodo.1294930\n :alt: Digital Object Identifier\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/HPAC/matchpy", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "matchpy", "package_url": "https://pypi.org/project/matchpy/", "platform": "", "project_url": "https://pypi.org/project/matchpy/", "project_urls": { "Documentation": "https://matchpy.readthedocs.io/", "Homepage": "https://github.com/HPAC/matchpy", "Source": "https://github.com/HPAC/matchpy", "Tracker": "https://github.com/HPAC/matchpy/issues" }, "release_url": "https://pypi.org/project/matchpy/0.5.1/", "requires_dist": [ "hopcroftkarp (<2.0,>=1.2)", "multiset (<3.0,>=2.0)", "sphinx-rtd-theme ; extra == 'develop'", "Sphinx (<2.0,>=1.4) ; extra == 'develop'", "pytest (<4.0,>=3.0) ; extra == 'develop'", "hypothesis (<4.0,>=3.6) ; extra == 'develop'", "pylint (<2.0,>=1.6) ; extra == 'develop'", "coverage (<5.0,>=4.2) ; extra == 'develop'", "pytest-cov (<3.0,>=2.4) ; extra == 'develop'", "coveralls ; extra == 'develop'", "flake8 ; extra == 'develop'", "sphinx-rtd-theme ; extra == 'docs'", "Sphinx (<2.0,>=1.4) ; extra == 'docs'", "graphviz (<0.6,>=0.5) ; extra == 'graphs'", "pytest (<4.0,>=3.0) ; extra == 'tests'", "hypothesis (<4.0,>=3.6) ; extra == 'tests'" ], "requires_python": ">=3.6", "summary": "A library for pattern matching on symbolic expressions.", "version": "0.5.1" }, "last_serial": 5207768, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "0cf1c82ec75cbff4f7cc0679a13d53b0", "sha256": "1e3d6e4afa37c51fa512a6c99a50a9dbccc98525716ba22a588ce07ae07b2a8c" }, "downloads": -1, "filename": "matchpy-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0cf1c82ec75cbff4f7cc0679a13d53b0", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 54952, "upload_time": "2017-01-09T13:38:59", "url": "https://files.pythonhosted.org/packages/41/03/f513080c2b52356b1202a72849ae5b23a1e5a3972e61762d491c98b3fcb2/matchpy-0.1.1-py3-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "226bc41cac5523471d2a9191bb9ee8a4", "sha256": "146c4665fa6324ad94371e8d0817a1f9d4d0fb3440d2c5a1591bd31e22265203" }, "downloads": -1, "filename": "matchpy-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "226bc41cac5523471d2a9191bb9ee8a4", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 54922, "upload_time": "2017-01-20T09:25:38", "url": "https://files.pythonhosted.org/packages/82/88/7ed2bf60ed7124df83317230c08c74c1ff5cf620b856b585bc436cebeb19/matchpy-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ca658973a385cf0b69dee49f51d9f65", "sha256": "7382bb22020def30d9e38c5a61a206012076c0e9af7dc32dace3bbaf7c040b00" }, "downloads": -1, "filename": "matchpy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "5ca658973a385cf0b69dee49f51d9f65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 78989, "upload_time": "2017-01-20T09:25:36", "url": "https://files.pythonhosted.org/packages/d6/ad/b4e6874f57a5d0f3bf1cd5b55d6900761ad0555aef3fa69fb003f6d98e4a/matchpy-0.1.2.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "64a2e02f80d5a5dfd8d1803f027ed3d9", "sha256": "b2cb65ffeadcf7e133d41402de262a0980c06ba3e4c95f700c8496dbfb7a25e5" }, "downloads": -1, "filename": "matchpy-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "64a2e02f80d5a5dfd8d1803f027ed3d9", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 55676, "upload_time": "2017-04-03T13:11:58", "url": "https://files.pythonhosted.org/packages/93/90/6faf12e8af2c962671384554bee30b09d5f41ecd1431870fc9b3d7d4f5c2/matchpy-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2853cc18f545ede53c996413801b5d14", "sha256": "c5c1a1291e9ef52edfe69cf492111f50d673ccf62a06dbf5d745ea1ab4483a88" }, "downloads": -1, "filename": "matchpy-0.2.tar.gz", "has_sig": false, "md5_digest": "2853cc18f545ede53c996413801b5d14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84393, "upload_time": "2017-04-03T13:11:56", "url": "https://files.pythonhosted.org/packages/a6/87/552d9cd463ea00b2e771cafc25691b1bc1516ca38dc76882a4f397554587/matchpy-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "38cb2e9a7c84471bd8dc9b95192bfbdb", "sha256": "38256de2048fd0ef576a5b5533313f8c002c17a1a80c9672ff7e8c519eda1bdd" }, "downloads": -1, "filename": "matchpy-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "38cb2e9a7c84471bd8dc9b95192bfbdb", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 59465, "upload_time": "2017-05-22T09:18:36", "url": "https://files.pythonhosted.org/packages/f1/99/b28d88216c1d95256ff72eceb4eef2fd46686ebe2c8ec4cdcad0c337cebf/matchpy-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ce5f6e31c15663ef7596e0b023f2446", "sha256": "596669149bd1020f7d731939eae2c8491f4892137e3b9ccd95bf87825944ac9a" }, "downloads": -1, "filename": "matchpy-0.3.tar.gz", "has_sig": false, "md5_digest": "2ce5f6e31c15663ef7596e0b023f2446", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87703, "upload_time": "2017-05-22T09:18:34", "url": "https://files.pythonhosted.org/packages/a0/b1/dcc3f407fe60a7cc867af8471050189913ee2314876e14f54a5e5a1a674b/matchpy-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "7a74aab744445abcdd082b61c0ec7199", "sha256": "c42a15dfb784675364e1cf85c826db39f42f057d940a3e377ad7b9efb1362272" }, "downloads": -1, "filename": "matchpy-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7a74aab744445abcdd082b61c0ec7199", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 59619, "upload_time": "2017-05-29T11:05:29", "url": "https://files.pythonhosted.org/packages/a1/2c/222d7b3c0e8089b97da58a82bbc66c6471619347b72565e14d6d4010487f/matchpy-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a7be06a11663555fd71c2d79f0619aa", "sha256": "fde92a8ef4d45ac3ecb2af7686c27c992ba4e3f3163c06020c54fc8bb44ae344" }, "downloads": -1, "filename": "matchpy-0.3.1.tar.gz", "has_sig": false, "md5_digest": "9a7be06a11663555fd71c2d79f0619aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87838, "upload_time": "2017-05-29T11:05:27", "url": "https://files.pythonhosted.org/packages/9f/6c/79f693341ec816e50f843efe7b5079a990cb0f6f00d53386ec0fd037327e/matchpy-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "b5ca2c563a35c694e378d2cd00793f26", "sha256": "870f60b421675224d7e237f1c8dd53161bc6b3b3ccc0899244925584785d4853" }, "downloads": -1, "filename": "matchpy-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b5ca2c563a35c694e378d2cd00793f26", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 60159, "upload_time": "2017-06-16T08:11:59", "url": "https://files.pythonhosted.org/packages/ac/05/26cf5940e0a346217095ad134423408ccc0e9209f5bea8edfc82bc18e983/matchpy-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "75c2186490fd43634e0b06985cf4964f", "sha256": "5fd1657986262440bf965b7a0c39151097c114afce4acb52a593083404e418ce" }, "downloads": -1, "filename": "matchpy-0.3.2.tar.gz", "has_sig": false, "md5_digest": "75c2186490fd43634e0b06985cf4964f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 88303, "upload_time": "2017-06-16T08:12:02", "url": "https://files.pythonhosted.org/packages/1b/2d/fd8ce442eeff0ccb9903b82fb39c3bfee785c95ca99bba891ed62ca3c7bd/matchpy-0.3.2.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "9ca65aa94c1aaccb802fec6b16c3d89f", "sha256": "de01b5060941ac4ca4086dc2513d20c5918abfe4f1d092a0c44fc5fb3febaa26" }, "downloads": -1, "filename": "matchpy-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9ca65aa94c1aaccb802fec6b16c3d89f", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 60801, "upload_time": "2017-06-27T10:48:25", "url": "https://files.pythonhosted.org/packages/46/32/26efe0db8e9f6622cb8d17bf2b21dd8568f36e0665070d49d3b617a32c7f/matchpy-0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2492d5578ff7cacb735fbe46504355a4", "sha256": "7a6a2ba82e1ce2dc2217a13d8aced949381c525f370c42749c6d96c0277a5732" }, "downloads": -1, "filename": "matchpy-0.4.tar.gz", "has_sig": false, "md5_digest": "2492d5578ff7cacb735fbe46504355a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89393, "upload_time": "2017-06-27T10:48:22", "url": "https://files.pythonhosted.org/packages/73/3e/8086d71cf20848d80c7d534e36e128a0b5beadc7b89c822cee2fa6d6d4e2/matchpy-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "6ed8474ed6624fe4b8908ec7cab60f95", "sha256": "6cf44ef604053e182df9b72dbeb0c74a7b16eefcd45b905d8228326db29cb25d" }, "downloads": -1, "filename": "matchpy-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6ed8474ed6624fe4b8908ec7cab60f95", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 63412, "upload_time": "2017-07-16T03:05:48", "url": "https://files.pythonhosted.org/packages/f7/74/99d2509dce92d10f6b0101e9496f041a3356173586b18c7dcea5d350d638/matchpy-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8915ec4f9a622bfc28b81cb4d4ef1cda", "sha256": "74f9cf07ae85c85f4889e1df1cafd4f9c4d3370e2de406c20902512d1e0caa90" }, "downloads": -1, "filename": "matchpy-0.4.1.tar.gz", "has_sig": false, "md5_digest": "8915ec4f9a622bfc28b81cb4d4ef1cda", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91710, "upload_time": "2017-07-16T03:05:46", "url": "https://files.pythonhosted.org/packages/98/84/6b43fa30b2777d8a916f4992a4c17f180e70ec68ad5d8334c6c8e0f1ec67/matchpy-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "2ba4dab0c00ad79b360e81016073a74a", "sha256": "1d95325ca883023d6896a70d64335302c99cd416830a060fd3dffd76be057436" }, "downloads": -1, "filename": "matchpy-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "2ba4dab0c00ad79b360e81016073a74a", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 63468, "upload_time": "2017-07-16T14:08:47", "url": "https://files.pythonhosted.org/packages/b8/d5/8cb6c7edb7d0556df687c3005644403c72e824d7c4d4bada859cd8419450/matchpy-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "684829b5e10a0618711ce79babd1a7c8", "sha256": "8692731cb91708c5e0dbf70eea1926223dbe899e065f23274794c73a08a564bf" }, "downloads": -1, "filename": "matchpy-0.4.2.tar.gz", "has_sig": false, "md5_digest": "684829b5e10a0618711ce79babd1a7c8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91832, "upload_time": "2017-07-16T14:08:45", "url": "https://files.pythonhosted.org/packages/90/64/9cb9d12edda067faeffbbd377620a46515a8e86c08a488c050df264d0f56/matchpy-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "92e7e0d0e9919aeb7447bc6c0834d4ea", "sha256": "febaeb058f530be634281d7c6e281495df03467b04e1ae1b64706bf4e2a8e927" }, "downloads": -1, "filename": "matchpy-0.4.3-py3-none-any.whl", "has_sig": false, "md5_digest": "92e7e0d0e9919aeb7447bc6c0834d4ea", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 68595, "upload_time": "2017-08-06T21:15:46", "url": "https://files.pythonhosted.org/packages/c1/f1/8cb48b9aa9e38f4027ba079630622205018a8c6cfc21afbadad1f38f5c02/matchpy-0.4.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "86c6fd87f06bb8a45e6fb0441e01bf7f", "sha256": "46a0b8dab6feea67cdc58438237ef353d069c1d81cc50f159ec1e52aaf58139f" }, "downloads": -1, "filename": "matchpy-0.4.3.tar.gz", "has_sig": false, "md5_digest": "86c6fd87f06bb8a45e6fb0441e01bf7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98417, "upload_time": "2017-08-06T21:15:48", "url": "https://files.pythonhosted.org/packages/cc/fa/196fdf16ee5659a0f1e18d6353087161fba03d99de59d0eb0ca32ece3c85/matchpy-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "71618200f8eb4aaba6148a43538a1b59", "sha256": "8de067f7537988280891bfdc8df6f498b1f314a51de3fc41c87815fa95068ce6" }, "downloads": -1, "filename": "matchpy-0.4.4.tar.gz", "has_sig": false, "md5_digest": "71618200f8eb4aaba6148a43538a1b59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98602, "upload_time": "2017-10-06T08:52:59", "url": "https://files.pythonhosted.org/packages/be/bb/3182ad35af1e76d9a2fbad62fdb36ba9a6864f5ef5679559ff9c9e19fef1/matchpy-0.4.4.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "0be8363dbe6513d8a4203d68a86d8f7c", "sha256": "169f800011cca1b5af4e33c3259fc75cd8e6595e09a8a3c1e10e8f8c2ccbef67" }, "downloads": -1, "filename": "matchpy-0.4.6-py3-none-any.whl", "has_sig": false, "md5_digest": "0be8363dbe6513d8a4203d68a86d8f7c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66564, "upload_time": "2018-09-16T17:40:07", "url": "https://files.pythonhosted.org/packages/27/85/b2db4a350a0005e7d1b5c5c1ba0d5f17e1a548d3e296ccfcea7afab8a5db/matchpy-0.4.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da36f57c821035313e555242131584c6", "sha256": "eefa1e50a10e1255db61bc2522a6768ad0701f8854859f293ebaa442286faadd" }, "downloads": -1, "filename": "matchpy-0.4.6.tar.gz", "has_sig": false, "md5_digest": "da36f57c821035313e555242131584c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106934, "upload_time": "2018-09-16T18:31:25", "url": "https://files.pythonhosted.org/packages/6a/ac/e182fab88c08ada01e39224bd583be6aae086ba014d2f9c20c0714e46b01/matchpy-0.4.6.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "faa5fb6143983dbfef25350d626ec0ab", "sha256": "8485b5dcdda497d3b3c917fe7f7a23ed3b0986fbfee44f51d4eb27d1bbf74a3c" }, "downloads": -1, "filename": "matchpy-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "faa5fb6143983dbfef25350d626ec0ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 66959, "upload_time": "2019-03-23T21:37:18", "url": "https://files.pythonhosted.org/packages/50/3f/2361b0514f7f957bb2571789b79ebca28b29905ab66d484e9219e0841139/matchpy-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e044eb3748613dd297709038e72b654f", "sha256": "22fd6eb6561f8fcdc7bbb9b18035871fe606cd99fbc86903010712db1cad05a3" }, "downloads": -1, "filename": "matchpy-0.5.0.tar.gz", "has_sig": false, "md5_digest": "e044eb3748613dd297709038e72b654f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 102864, "upload_time": "2019-03-23T21:37:21", "url": "https://files.pythonhosted.org/packages/81/af/76642735a1e464733a374e04bb8b378b46292302de9d80363dd118768cea/matchpy-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "bf444c84a9fed8c5506cecd50fe43ee1", "sha256": "2fe29a24306371ed395991e6bc564798323f88f1e34724f49f14d4e54427658a" }, "downloads": -1, "filename": "matchpy-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bf444c84a9fed8c5506cecd50fe43ee1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 67813, "upload_time": "2019-04-30T11:17:40", "url": "https://files.pythonhosted.org/packages/47/95/d265b944ce391bb2fa9982d7506bbb197bb55c5088ea74448a5ffcaeefab/matchpy-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6eb3e7ba5e34aa15df22d9cf4252ed7", "sha256": "59444ab56f67251d96291231b9f7a328340b0670895dbf7f0dbff0991a0b6eef" }, "downloads": -1, "filename": "matchpy-0.5.1.tar.gz", "has_sig": false, "md5_digest": "f6eb3e7ba5e34aa15df22d9cf4252ed7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 121681, "upload_time": "2019-04-30T11:17:56", "url": "https://files.pythonhosted.org/packages/b4/d8/54832956be55e1f910a82d959d63e6675920d7e93e1748a98e275b17c0ee/matchpy-0.5.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bf444c84a9fed8c5506cecd50fe43ee1", "sha256": "2fe29a24306371ed395991e6bc564798323f88f1e34724f49f14d4e54427658a" }, "downloads": -1, "filename": "matchpy-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bf444c84a9fed8c5506cecd50fe43ee1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 67813, "upload_time": "2019-04-30T11:17:40", "url": "https://files.pythonhosted.org/packages/47/95/d265b944ce391bb2fa9982d7506bbb197bb55c5088ea74448a5ffcaeefab/matchpy-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6eb3e7ba5e34aa15df22d9cf4252ed7", "sha256": "59444ab56f67251d96291231b9f7a328340b0670895dbf7f0dbff0991a0b6eef" }, "downloads": -1, "filename": "matchpy-0.5.1.tar.gz", "has_sig": false, "md5_digest": "f6eb3e7ba5e34aa15df22d9cf4252ed7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 121681, "upload_time": "2019-04-30T11:17:56", "url": "https://files.pythonhosted.org/packages/b4/d8/54832956be55e1f910a82d959d63e6675920d7e93e1748a98e275b17c0ee/matchpy-0.5.1.tar.gz" } ] }