|License| |Build Status| |Docs| |Python Versions| |Downloads| |Status| |Code Coverage|
.. image:: https://github.com/python-constraint/python-constraint/raw/main/docs/assets/logo/N-Queens_problem_Python.svg
:align: center
:width: 50%
python-constraint
=================
| This software is now back to active development / maintainance status.
| IMPORTANT: the new version can be installed with `pip install python-constraint2`, as the original pip release will not be updated.
| For an overview of recent changes, visit the `Changelog <https://github.com/python-constraint/python-constraint/blob/main/CHANGELOG.md>`_.
| The complete documentation can be found `here <http://python-constraint.github.io/python-constraint/>`_.
| New: writing constraints in the new string format is preferable over functions and lambdas.
| These strings, even as compound statements, are automatically parsed to faster built-in constraints, are more concise, and do not require constraint solving familiarity by the user to be efficient.
| For example, :code:`problem.addConstraint(["50 <= x * y < 100"])` is parsed to :code:`[MinProdConstraint(50, ["x", "y"]), MaxProdConstraint(100, ["x", "y"])]`.
| This feature is in beta and subject to possible change, please provide feedback.
.. contents::
:local:
:depth: 1
Introduction
------------
The :code:`python-constraint` module offers efficient solvers for `Constraint Satisfaction Problems (CSPs) <https://en.wikipedia.org/wiki/Constraint_satisfaction_problem>`_ over finite domains in an accessible Python package.
CSP is class of problems which may be represented in terms of variables (a, b, ...), domains (a in [1, 2, 3], ...), and constraints (a < b, ...).
Examples
--------
Basics
~~~~~~
This interactive Python session demonstrates basic operations:
.. code-block:: python
>>> from constraint import *
>>> problem = Problem()
>>> problem.addVariable("a", [1,2,3])
>>> problem.addVariable("b", [4,5,6])
>>> problem.getSolutions()
[{'a': 3, 'b': 6}, {'a': 3, 'b': 5}, {'a': 3, 'b': 4},
{'a': 2, 'b': 6}, {'a': 2, 'b': 5}, {'a': 2, 'b': 4},
{'a': 1, 'b': 6}, {'a': 1, 'b': 5}, {'a': 1, 'b': 4}]
>>> problem.addConstraint("a*2 == b") # string constraints are preferable over the black-box problem.addConstraint(lambda a, b: a*2 == b, ("a", "b"))
>>> problem.getSolutions()
[{'a': 3, 'b': 6}, {'a': 2, 'b': 4}]
>>> problem = Problem()
>>> problem.addVariables(["a", "b"], [1, 2, 3])
>>> problem.addConstraint(AllDifferentConstraint())
>>> problem.getSolutions()
[{'a': 3, 'b': 2}, {'a': 3, 'b': 1}, {'a': 2, 'b': 3},
{'a': 2, 'b': 1}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
Rooks problem
~~~~~~~~~~~~~
The following example solves the classical Eight Rooks problem:
.. code-block:: python
>>> problem = Problem()
>>> numpieces = 8
>>> cols = range(numpieces)
>>> rows = range(numpieces)
>>> problem.addVariables(cols, rows)
>>> for col1 in cols:
... for col2 in cols:
... if col1 < col2:
... problem.addConstraint(lambda row1, row2: row1 != row2,
... (col1, col2))
>>> solutions = problem.getSolutions()
>>> solutions
>>> solutions
[{0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 1, 7: 0},
{0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 0, 7: 1},
{0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 1, 6: 2, 7: 0},
{0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 1, 6: 0, 7: 2},
...
{0: 7, 1: 5, 2: 3, 3: 6, 4: 2, 5: 1, 6: 4, 7: 0},
{0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 2, 6: 0, 7: 4},
{0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 2, 6: 4, 7: 0},
{0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 4, 6: 2, 7: 0},
{0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 4, 6: 0, 7: 2},
...]
Magic squares
~~~~~~~~~~~~~
This example solves a 4x4 magic square:
.. code-block:: python
>>> problem = Problem()
>>> problem.addVariables(range(0, 16), range(1, 16 + 1))
>>> problem.addConstraint(AllDifferentConstraint(), range(0, 16))
>>> problem.addConstraint(ExactSumConstraint(34), [0, 5, 10, 15])
>>> problem.addConstraint(ExactSumConstraint(34), [3, 6, 9, 12])
>>> for row in range(4):
... problem.addConstraint(ExactSumConstraint(34),
[row * 4 + i for i in range(4)])
>>> for col in range(4):
... problem.addConstraint(ExactSumConstraint(34),
[col + 4 * i for i in range(4)])
>>> solutions = problem.getSolutions()
Features
--------
The following solvers are available:
- Backtracking solver
- Optimized backtracking solver
- Recursive backtracking solver
- Minimum conflicts solver
- Parallel solver
.. role:: python(code)
:language: python
Predefined constraint types currently available:
- :python:`FunctionConstraint`
- :python:`AllDifferentConstraint`
- :python:`AllEqualConstraint`
- :python:`MaxSumConstraint`
- :python:`ExactSumConstraint`
- :python:`MinSumConstraint`
- :python:`MaxProdConstraint`
- :python:`MinProdConstraint`
- :python:`InSetConstraint`
- :python:`NotInSetConstraint`
- :python:`SomeInSetConstraint`
- :python:`SomeNotInSetConstraint`
API documentation
-----------------
Documentation for the module is available at: http://python-constraint.github.io/python-constraint/.
It can be built locally by running :code:`make clean html` from the `docs` folder.
For viewing RST files locally, `restview <https://pypi.org/project/restview/>`_ is recommended.
Download and install
--------------------
.. code-block:: shell
$ pip install python-constraint2
Testing
-------
Run :code:`nox` (tests for all supported Python versions in own virtual environment).
To test against your local Python version: make sure you have the development dependencies installed.
Run :code:`pytest` (optionally add :code:`--no-cov` if you have the C-extensions enabled).
Contributing
------------
Feel free to contribute by `submitting pull requests <https://github.com/python-constraint/python-constraint/pulls>`_ or `opening issues <https://github.com/python-constraint/python-constraint/issues>`_.
Please refer to the `contribution guidelines <https://github.com/python-constraint/python-constraint/contribute>`_ before doing so.
Roadmap
-------
This GitHub organization and repository is a global effort to help to maintain :code:`python-constraint`, which was written by Gustavo Niemeyer and originaly located at https://labix.org/python-constraint.
For an overview of recent changes, visit the `Changelog <https://github.com/python-constraint/python-constraint/blob/main/CHANGELOG.md>`_.
Planned development:
- Add `benchmarking tests <https://pypi.org/project/pytest-benchmark/>`_ automated with `GH actions <https://github.com/benchmark-action/github-action-benchmark>`_
- Versioned documentation
Contact
-------
- `Floris-Jan Willemsen <https://github.com/fjwillemsen>`_ <fjwillemsen97@gmail.com> (current maintainer)
- `Sébastien Celles <https://github.com/s-celles/>`_ <s.celles@gmail.com> (former maintainer)
- `Gustavo Niemeyer <https://github.com/niemeyer/>`_ <gustavo@niemeyer.net> (initial developer)
But it's probably better to `open an issue <https://github.com/python-constraint/python-constraint/issues>`_.
.. |License| image:: https://img.shields.io/pypi/l/python-constraint2
:alt: PyPI - License
.. |Build Status| image:: https://github.com/python-constraint/python-constraint/actions/workflows/build-test-python-package.yml/badge.svg
:target: https://github.com/python-constraint/python-constraint/actions/workflows/build-test-python-package.yml
:alt: Build Status
.. |Docs| image:: https://img.shields.io/github/actions/workflow/status/python-constraint/python-constraint/publish-documentation.yml?label=Docs
:target: http://python-constraint.github.io/python-constraint/
:alt: Documentation Status
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/python-constraint2
:alt: PyPI - Python Versions
.. |Downloads| image:: https://img.shields.io/pypi/dm/python-constraint2
:alt: PyPI - Downloads
.. |Status| image:: https://img.shields.io/pypi/status/python-constraint2
:alt: PyPI - Status
.. |Code Coverage| image:: https://coveralls.io/repos/github/python-constraint/python-constraint/badge.svg
:target: https://coveralls.io/github/python-constraint/python-constraint
:alt: Code Coverage
Raw data
{
"_id": null,
"home_page": null,
"name": "python-constraint2",
"maintainer": "Floris-Jan Willemsen",
"docs_url": null,
"requires_python": "<3.15,>=3.9",
"maintainer_email": "fjwillemsen97@gmail.com",
"keywords": "CSP, constraint solving problems, problem solver, SMT, satisfiability modulo theory, SAT",
"author": "Gustavo Niemeyer",
"author_email": "gustavo@niemeyer.net",
"download_url": "https://files.pythonhosted.org/packages/a0/b3/ee7e34955b6dd0db88177a0993d283581d137f69e6b825405d92b7146821/python_constraint2-2.1.0.tar.gz",
"platform": null,
"description": "|License| |Build Status| |Docs| |Python Versions| |Downloads| |Status| |Code Coverage|\n\n.. image:: https://github.com/python-constraint/python-constraint/raw/main/docs/assets/logo/N-Queens_problem_Python.svg\n :align: center\n :width: 50%\n\npython-constraint\n=================\n\n| This software is now back to active development / maintainance status.\n| IMPORTANT: the new version can be installed with `pip install python-constraint2`, as the original pip release will not be updated.\n| For an overview of recent changes, visit the `Changelog <https://github.com/python-constraint/python-constraint/blob/main/CHANGELOG.md>`_.\n| The complete documentation can be found `here <http://python-constraint.github.io/python-constraint/>`_.\n\n| New: writing constraints in the new string format is preferable over functions and lambdas. \n| These strings, even as compound statements, are automatically parsed to faster built-in constraints, are more concise, and do not require constraint solving familiarity by the user to be efficient.\n| For example, :code:`problem.addConstraint([\"50 <= x * y < 100\"])` is parsed to :code:`[MinProdConstraint(50, [\"x\", \"y\"]), MaxProdConstraint(100, [\"x\", \"y\"])]`. \n| This feature is in beta and subject to possible change, please provide feedback.\n\n.. contents::\n :local:\n :depth: 1\n\nIntroduction\n------------\nThe :code:`python-constraint` module offers efficient solvers for `Constraint Satisfaction Problems (CSPs) <https://en.wikipedia.org/wiki/Constraint_satisfaction_problem>`_ over finite domains in an accessible Python package.\nCSP is class of problems which may be represented in terms of variables (a, b, ...), domains (a in [1, 2, 3], ...), and constraints (a < b, ...).\n\nExamples\n--------\n\nBasics\n~~~~~~\n\nThis interactive Python session demonstrates basic operations:\n\n.. code-block:: python\n\n >>> from constraint import *\n >>> problem = Problem()\n >>> problem.addVariable(\"a\", [1,2,3])\n >>> problem.addVariable(\"b\", [4,5,6])\n >>> problem.getSolutions()\n [{'a': 3, 'b': 6}, {'a': 3, 'b': 5}, {'a': 3, 'b': 4},\n {'a': 2, 'b': 6}, {'a': 2, 'b': 5}, {'a': 2, 'b': 4},\n {'a': 1, 'b': 6}, {'a': 1, 'b': 5}, {'a': 1, 'b': 4}]\n\n >>> problem.addConstraint(\"a*2 == b\") # string constraints are preferable over the black-box problem.addConstraint(lambda a, b: a*2 == b, (\"a\", \"b\"))\n >>> problem.getSolutions()\n [{'a': 3, 'b': 6}, {'a': 2, 'b': 4}]\n\n >>> problem = Problem()\n >>> problem.addVariables([\"a\", \"b\"], [1, 2, 3])\n >>> problem.addConstraint(AllDifferentConstraint())\n >>> problem.getSolutions()\n [{'a': 3, 'b': 2}, {'a': 3, 'b': 1}, {'a': 2, 'b': 3},\n {'a': 2, 'b': 1}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]\n\nRooks problem\n~~~~~~~~~~~~~\n\nThe following example solves the classical Eight Rooks problem:\n\n.. code-block:: python\n\n >>> problem = Problem()\n >>> numpieces = 8\n >>> cols = range(numpieces)\n >>> rows = range(numpieces)\n >>> problem.addVariables(cols, rows)\n >>> for col1 in cols:\n ... for col2 in cols:\n ... if col1 < col2:\n ... problem.addConstraint(lambda row1, row2: row1 != row2,\n ... (col1, col2))\n >>> solutions = problem.getSolutions()\n >>> solutions\n >>> solutions\n [{0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 1, 7: 0},\n {0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 0, 7: 1},\n {0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 1, 6: 2, 7: 0},\n {0: 7, 1: 6, 2: 5, 3: 4, 4: 3, 5: 1, 6: 0, 7: 2},\n ...\n {0: 7, 1: 5, 2: 3, 3: 6, 4: 2, 5: 1, 6: 4, 7: 0},\n {0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 2, 6: 0, 7: 4},\n {0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 2, 6: 4, 7: 0},\n {0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 4, 6: 2, 7: 0},\n {0: 7, 1: 5, 2: 3, 3: 6, 4: 1, 5: 4, 6: 0, 7: 2},\n ...]\n\n\nMagic squares\n~~~~~~~~~~~~~\n\nThis example solves a 4x4 magic square:\n\n.. code-block:: python\n\n >>> problem = Problem()\n >>> problem.addVariables(range(0, 16), range(1, 16 + 1))\n >>> problem.addConstraint(AllDifferentConstraint(), range(0, 16))\n >>> problem.addConstraint(ExactSumConstraint(34), [0, 5, 10, 15])\n >>> problem.addConstraint(ExactSumConstraint(34), [3, 6, 9, 12])\n >>> for row in range(4):\n ... problem.addConstraint(ExactSumConstraint(34),\n [row * 4 + i for i in range(4)])\n >>> for col in range(4):\n ... problem.addConstraint(ExactSumConstraint(34),\n [col + 4 * i for i in range(4)])\n >>> solutions = problem.getSolutions()\n\nFeatures\n--------\n\nThe following solvers are available:\n\n- Backtracking solver\n- Optimized backtracking solver\n- Recursive backtracking solver\n- Minimum conflicts solver\n- Parallel solver\n\n.. role:: python(code)\n :language: python\n\nPredefined constraint types currently available:\n\n- :python:`FunctionConstraint`\n- :python:`AllDifferentConstraint`\n- :python:`AllEqualConstraint`\n- :python:`MaxSumConstraint`\n- :python:`ExactSumConstraint`\n- :python:`MinSumConstraint`\n- :python:`MaxProdConstraint`\n- :python:`MinProdConstraint`\n- :python:`InSetConstraint`\n- :python:`NotInSetConstraint`\n- :python:`SomeInSetConstraint`\n- :python:`SomeNotInSetConstraint`\n\nAPI documentation\n-----------------\nDocumentation for the module is available at: http://python-constraint.github.io/python-constraint/.\nIt can be built locally by running :code:`make clean html` from the `docs` folder.\nFor viewing RST files locally, `restview <https://pypi.org/project/restview/>`_ is recommended.\n\nDownload and install\n--------------------\n\n.. code-block:: shell\n\n $ pip install python-constraint2\n\nTesting\n-------\n\nRun :code:`nox` (tests for all supported Python versions in own virtual environment).\n\nTo test against your local Python version: make sure you have the development dependencies installed.\nRun :code:`pytest` (optionally add :code:`--no-cov` if you have the C-extensions enabled).\n\nContributing\n------------\n\nFeel free to contribute by `submitting pull requests <https://github.com/python-constraint/python-constraint/pulls>`_ or `opening issues <https://github.com/python-constraint/python-constraint/issues>`_.\nPlease refer to the `contribution guidelines <https://github.com/python-constraint/python-constraint/contribute>`_ before doing so.\n\nRoadmap\n-------\n\nThis GitHub organization and repository is a global effort to help to maintain :code:`python-constraint`, which was written by Gustavo Niemeyer and originaly located at https://labix.org/python-constraint.\nFor an overview of recent changes, visit the `Changelog <https://github.com/python-constraint/python-constraint/blob/main/CHANGELOG.md>`_.\n\nPlanned development:\n\n- Add `benchmarking tests <https://pypi.org/project/pytest-benchmark/>`_ automated with `GH actions <https://github.com/benchmark-action/github-action-benchmark>`_\n- Versioned documentation\n\nContact\n-------\n- `Floris-Jan Willemsen <https://github.com/fjwillemsen>`_ <fjwillemsen97@gmail.com> (current maintainer)\n- `S\u00e9bastien Celles <https://github.com/s-celles/>`_ <s.celles@gmail.com> (former maintainer)\n- `Gustavo Niemeyer <https://github.com/niemeyer/>`_ <gustavo@niemeyer.net> (initial developer)\n\nBut it's probably better to `open an issue <https://github.com/python-constraint/python-constraint/issues>`_.\n\n.. |License| image:: https://img.shields.io/pypi/l/python-constraint2\n :alt: PyPI - License\n\n.. |Build Status| image:: https://github.com/python-constraint/python-constraint/actions/workflows/build-test-python-package.yml/badge.svg\n :target: https://github.com/python-constraint/python-constraint/actions/workflows/build-test-python-package.yml\n :alt: Build Status\n\n.. |Docs| image:: https://img.shields.io/github/actions/workflow/status/python-constraint/python-constraint/publish-documentation.yml?label=Docs\n :target: http://python-constraint.github.io/python-constraint/\n :alt: Documentation Status\n\n.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/python-constraint2\n :alt: PyPI - Python Versions\n\n.. |Downloads| image:: https://img.shields.io/pypi/dm/python-constraint2\n :alt: PyPI - Downloads\n\n.. |Status| image:: https://img.shields.io/pypi/status/python-constraint2\n :alt: PyPI - Status\n\n.. |Code Coverage| image:: https://coveralls.io/repos/github/python-constraint/python-constraint/badge.svg\n :target: https://coveralls.io/github/python-constraint/python-constraint\n :alt: Code Coverage\n\n",
"bugtrack_url": null,
"license": "BSD-2-Clause",
"summary": "python-constraint is a module for efficiently solving CSPs (Constraint Solving Problems) over finite domains.",
"version": "2.1.0",
"project_urls": {
"Documentation": "http://python-constraint.github.io/python-constraint/",
"Repository": "https://github.com/python-constraint/python-constraint"
},
"split_keywords": [
"csp",
" constraint solving problems",
" problem solver",
" smt",
" satisfiability modulo theory",
" sat"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0cb338170df2d6b3640dddf5cda438f9bd6aad3982643c3a89ebce3d94b921d0",
"md5": "28ee48c227b8c1d9738717c14ebf43d7",
"sha256": "e29bed90abe1240bf24794e73e4d8fa3e50b6aa9226d915b1902cdd03375c28b"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp310-cp310-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "28ee48c227b8c1d9738717c14ebf43d7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.15,>=3.9",
"size": 1335185,
"upload_time": "2025-02-11T16:10:18",
"upload_time_iso_8601": "2025-02-11T16:10:18.835693Z",
"url": "https://files.pythonhosted.org/packages/0c/b3/38170df2d6b3640dddf5cda438f9bd6aad3982643c3a89ebce3d94b921d0/python_constraint2-2.1.0-cp310-cp310-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b74d6b7c34e7dc7fc6632834da199ff8c384938d73005bf226ca567a80b599b7",
"md5": "d50f942ca6e2235a7682bed1f69a06e9",
"sha256": "f28d07eae04d83d454f0e6ba2da0678786a21f2d405998a3eec960b56d809692"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp310-cp310-manylinux_2_39_x86_64.whl",
"has_sig": false,
"md5_digest": "d50f942ca6e2235a7682bed1f69a06e9",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.15,>=3.9",
"size": 2904919,
"upload_time": "2025-02-11T16:10:22",
"upload_time_iso_8601": "2025-02-11T16:10:22.638640Z",
"url": "https://files.pythonhosted.org/packages/b7/4d/6b7c34e7dc7fc6632834da199ff8c384938d73005bf226ca567a80b599b7/python_constraint2-2.1.0-cp310-cp310-manylinux_2_39_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7ff02b31509060c98731934e85dd010a8906c738e65cbc206f3096e2f50297c9",
"md5": "ef82c297944b3548ea41a1eb36c72a84",
"sha256": "441f6a06e6c88c5fbe724b834c820d959ba7542037139153d1466c7be00c7cc0"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "ef82c297944b3548ea41a1eb36c72a84",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.15,>=3.9",
"size": 610888,
"upload_time": "2025-02-11T16:10:40",
"upload_time_iso_8601": "2025-02-11T16:10:40.171513Z",
"url": "https://files.pythonhosted.org/packages/7f/f0/2b31509060c98731934e85dd010a8906c738e65cbc206f3096e2f50297c9/python_constraint2-2.1.0-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c9202bcc53f69cd2e570f270f119ec03e9192f87d3f8b7b944e6ac5544720954",
"md5": "2e95b098305ba37f3fc982fb0e34c15f",
"sha256": "1c650d717c2585fd8b2247f680ca1dcc6ea970cc5644c1d847f97eacb9f7dce2"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp311-cp311-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "2e95b098305ba37f3fc982fb0e34c15f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.15,>=3.9",
"size": 1338138,
"upload_time": "2025-02-11T16:10:53",
"upload_time_iso_8601": "2025-02-11T16:10:53.166070Z",
"url": "https://files.pythonhosted.org/packages/c9/20/2bcc53f69cd2e570f270f119ec03e9192f87d3f8b7b944e6ac5544720954/python_constraint2-2.1.0-cp311-cp311-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97bb2d5777bb05a42337312474d734b4b1b3e8a897193f2198d9e374610cc4dd",
"md5": "5ed65331707cda7d2424d42f9161e3b0",
"sha256": "38e4dbb2522ca2295873a57f6e0fddbb0856a780c87edd79b4074fd78790fed3"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp311-cp311-manylinux_2_39_x86_64.whl",
"has_sig": false,
"md5_digest": "5ed65331707cda7d2424d42f9161e3b0",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.15,>=3.9",
"size": 3169026,
"upload_time": "2025-02-11T16:10:56",
"upload_time_iso_8601": "2025-02-11T16:10:56.537966Z",
"url": "https://files.pythonhosted.org/packages/97/bb/2d5777bb05a42337312474d734b4b1b3e8a897193f2198d9e374610cc4dd/python_constraint2-2.1.0-cp311-cp311-manylinux_2_39_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "25b2aabd8eafb13c0619c047fcf05690fae608f1573c7aa3d9a3e624ffa098eb",
"md5": "48f46ff8dfb3382343d2813126ec03b7",
"sha256": "6b8f82be66242fc5587011360b07c39e6e71e5d1c8f26a107dd2b04ab7854fcc"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "48f46ff8dfb3382343d2813126ec03b7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.15,>=3.9",
"size": 610887,
"upload_time": "2025-02-11T16:11:06",
"upload_time_iso_8601": "2025-02-11T16:11:06.606069Z",
"url": "https://files.pythonhosted.org/packages/25/b2/aabd8eafb13c0619c047fcf05690fae608f1573c7aa3d9a3e624ffa098eb/python_constraint2-2.1.0-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6e18a6866206081db3188f04d3d4f7e8f38c60fbee48c2b50d13a1ff585335db",
"md5": "53e6b45372bdefa535a14b252ddb111f",
"sha256": "ee3d33ca5694724a17bb596b93ff8687c70b4c07945e40a9007250e282e7ab28"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp312-cp312-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "53e6b45372bdefa535a14b252ddb111f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.15,>=3.9",
"size": 1352421,
"upload_time": "2025-02-11T16:11:09",
"upload_time_iso_8601": "2025-02-11T16:11:09.188818Z",
"url": "https://files.pythonhosted.org/packages/6e/18/a6866206081db3188f04d3d4f7e8f38c60fbee48c2b50d13a1ff585335db/python_constraint2-2.1.0-cp312-cp312-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "823a912322e0e22f278ba4903993c701ff72105b2ea0a0ea3b49395425272aa4",
"md5": "5528b7dd88618b8cabc2ba80bfdd883c",
"sha256": "b2385c99a9fe67ae26085a5a048c1d206cf0bd74acf0cd036227afa2a90fa4fd"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp312-cp312-manylinux_2_39_x86_64.whl",
"has_sig": false,
"md5_digest": "5528b7dd88618b8cabc2ba80bfdd883c",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.15,>=3.9",
"size": 3146326,
"upload_time": "2025-02-11T16:11:11",
"upload_time_iso_8601": "2025-02-11T16:11:11.963508Z",
"url": "https://files.pythonhosted.org/packages/82/3a/912322e0e22f278ba4903993c701ff72105b2ea0a0ea3b49395425272aa4/python_constraint2-2.1.0-cp312-cp312-manylinux_2_39_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a222726de2d23d5558ab5fd35edc180c15391782b48e01f724ec70e0621676f3",
"md5": "7778ef11250c6137c3a2489bd8729162",
"sha256": "0e5ece0b4e85ed680af6b9db33ef3497a6f9499b8957cd830cd139f17ac29aef"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "7778ef11250c6137c3a2489bd8729162",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.15,>=3.9",
"size": 610888,
"upload_time": "2025-02-11T16:11:14",
"upload_time_iso_8601": "2025-02-11T16:11:14.028189Z",
"url": "https://files.pythonhosted.org/packages/a2/22/726de2d23d5558ab5fd35edc180c15391782b48e01f724ec70e0621676f3/python_constraint2-2.1.0-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "57d1da7254c53b90d01c3c7c263379c18d1f88586b000ec74c2a6af2d0775c16",
"md5": "bffa1415d28c24a7cb5281c5471f9299",
"sha256": "ace17786565250de48b8d18da555feb31f5fb3521b2bd65e9871459e1d179600"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp313-cp313-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "bffa1415d28c24a7cb5281c5471f9299",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.15,>=3.9",
"size": 1342805,
"upload_time": "2025-02-11T16:11:17",
"upload_time_iso_8601": "2025-02-11T16:11:17.211352Z",
"url": "https://files.pythonhosted.org/packages/57/d1/da7254c53b90d01c3c7c263379c18d1f88586b000ec74c2a6af2d0775c16/python_constraint2-2.1.0-cp313-cp313-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "415bae532923a214452f2348ff64676c9e09293073976770a1250a944e12311d",
"md5": "410b94862f9a91ad233dfd3482b5a18f",
"sha256": "abea9ae443bf33fb396a6fb597b713e110f2abd9ecf1a656cd81f53da6751b79"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp313-cp313-manylinux_2_39_x86_64.whl",
"has_sig": false,
"md5_digest": "410b94862f9a91ad233dfd3482b5a18f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.15,>=3.9",
"size": 3137276,
"upload_time": "2025-02-11T16:11:21",
"upload_time_iso_8601": "2025-02-11T16:11:21.060357Z",
"url": "https://files.pythonhosted.org/packages/41/5b/ae532923a214452f2348ff64676c9e09293073976770a1250a944e12311d/python_constraint2-2.1.0-cp313-cp313-manylinux_2_39_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9db7dd91fb2d19c6782a699a386c0b295bf7702c2e05211157e193bcadb9c604",
"md5": "063fbd5084a47d3ebc709361274518c7",
"sha256": "fc3cffd0f16cb9b34d2e95bd6d27425dd24044073760477a1341e835fc9c45f4"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "063fbd5084a47d3ebc709361274518c7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<3.15,>=3.9",
"size": 610887,
"upload_time": "2025-02-11T16:11:23",
"upload_time_iso_8601": "2025-02-11T16:11:23.958212Z",
"url": "https://files.pythonhosted.org/packages/9d/b7/dd91fb2d19c6782a699a386c0b295bf7702c2e05211157e193bcadb9c604/python_constraint2-2.1.0-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8cbe6d817ba783b85485fde5e85356d300869a68e9de08149357561837f96b68",
"md5": "e6ab76e516ee835e7809cb29b9677f7f",
"sha256": "02f46e4a7e8a46048604870287f1c55312eea47c2c15dd58b51057cb7d057bdc"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp39-cp39-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "e6ab76e516ee835e7809cb29b9677f7f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.15,>=3.9",
"size": 1337520,
"upload_time": "2025-02-11T16:11:26",
"upload_time_iso_8601": "2025-02-11T16:11:26.382264Z",
"url": "https://files.pythonhosted.org/packages/8c/be/6d817ba783b85485fde5e85356d300869a68e9de08149357561837f96b68/python_constraint2-2.1.0-cp39-cp39-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8e66b2a631e345a6cad5ddb8dfd709460cabef8b3d55372a42ed48bdb358e579",
"md5": "82edc2e54918c0f030897897ce2da109",
"sha256": "0f3a09c1947e6a90b9558cd1651e86dbe10f698aad56247596f2b856307707f0"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp39-cp39-manylinux_2_39_x86_64.whl",
"has_sig": false,
"md5_digest": "82edc2e54918c0f030897897ce2da109",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.15,>=3.9",
"size": 2904802,
"upload_time": "2025-02-11T16:11:28",
"upload_time_iso_8601": "2025-02-11T16:11:28.812416Z",
"url": "https://files.pythonhosted.org/packages/8e/66/b2a631e345a6cad5ddb8dfd709460cabef8b3d55372a42ed48bdb358e579/python_constraint2-2.1.0-cp39-cp39-manylinux_2_39_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fde37a08114099db26d75fdee8cb24f397190a6ced3c7defe128b4b846fdde29",
"md5": "0384817475b1cfffa9b744787d6a0309",
"sha256": "8086a21724048746e68ab721cb4a216db15f86bb700d557af0ac60f2087d4d4e"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "0384817475b1cfffa9b744787d6a0309",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.15,>=3.9",
"size": 610886,
"upload_time": "2025-02-11T16:11:30",
"upload_time_iso_8601": "2025-02-11T16:11:30.743781Z",
"url": "https://files.pythonhosted.org/packages/fd/e3/7a08114099db26d75fdee8cb24f397190a6ced3c7defe128b4b846fdde29/python_constraint2-2.1.0-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a0b3ee7e34955b6dd0db88177a0993d283581d137f69e6b825405d92b7146821",
"md5": "ceeb6a0c4d670fbeb78c4c5487a81cd4",
"sha256": "fbb6ab033a7a4250bce11ca12fdf8958c6c42853e933cf585dbd265e0967dd93"
},
"downloads": -1,
"filename": "python_constraint2-2.1.0.tar.gz",
"has_sig": false,
"md5_digest": "ceeb6a0c4d670fbeb78c4c5487a81cd4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.15,>=3.9",
"size": 599056,
"upload_time": "2025-02-11T16:11:33",
"upload_time_iso_8601": "2025-02-11T16:11:33.429064Z",
"url": "https://files.pythonhosted.org/packages/a0/b3/ee7e34955b6dd0db88177a0993d283581d137f69e6b825405d92b7146821/python_constraint2-2.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-11 16:11:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "python-constraint",
"github_project": "python-constraint",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"lcname": "python-constraint2"
}