python-constraint2


Namepython-constraint2 JSON
Version 2.4.0 PyPI version JSON
download
home_pageNone
Summarypython-constraint is a module for efficiently solving CSPs (Constraint Solving Problems) over finite domains.
upload_time2025-07-23 09:41:48
maintainerFloris-Jan Willemsen
docs_urlNone
authorFloris-Jan Willemsen
requires_python>=3.9
licenseBSD-2-Clause
keywords csp constraint solving problems problem solver smt satisfiability modulo theory sat
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            |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"])]`. 
| Similarly, :code:`problem.addConstraint(["x / y == z"])` is parsed to :code:`[ExactProdConstraint("x", ["z", "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()  # doctest: +NORMALIZE_WHITESPACE
    [{'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()  # doctest: +NORMALIZE_WHITESPACE
    [{'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   # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
    [{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()  # doctest: +SKIP

Features
--------

The following solvers are available:

- :code:`OptimizedBacktrackingSolver` (default)
- :code:`BacktrackingSolver`
- :code:`RecursiveBacktrackingSolver`
- :code:`MinConflictsSolver`
- :code:`ParallelSolver`

.. role:: python(code)
   :language: python

Predefined constraint types currently available (use the parsing for automatic conversion to these types):

- :code:`FunctionConstraint`
- :code:`AllDifferentConstraint`
- :code:`AllEqualConstraint`
- :code:`ExactSumConstraint`
- :code:`MinSumConstraint`
- :code:`MaxSumConstraint`
- :code:`MinProdConstraint`
- :code:`ExactProdConstraint`
- :code:`MaxProdConstraint`
- :code:`VariableExactSumConstraint`
- :code:`VariableMinSumConstraint`
- :code:`VariableMaxSumConstraint`
- :code:`VariableMinProdConstraint`
- :code:`VariableExactProdConstraint`
- :code:`VariableMaxProdConstraint`
- :code:`InSetConstraint`
- :code:`NotInSetConstraint`
- :code:`SomeInSetConstraint`
- :code:`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:

- Support constant modifiers on parsed (variable) constraints instead defaulting to `FunctionConstraint`, e.g. :code:`problem.addConstraint("a+2 == b")` or :code:`problem.addConstraint("x / y == 100")`
- Parse using Abstract Syntax Trees (AST) instead of the current parser to be more robust and support decomposing lambdas
- Rewrite hotspots in C / Pyx instead of pure python mode
- Improvements to make the ParallelSolver competitive (experiments reveal the freethreading mode to be promising)
- 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.9",
    "maintainer_email": "fjwillemsen97@gmail.com",
    "keywords": "CSP, constraint solving problems, problem solver, SMT, satisfiability modulo theory, SAT",
    "author": "Floris-Jan Willemsen",
    "author_email": "fjwillemsen97@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/42/de/3c414a193d606c724efb29e30ebbb7241af853bf973f1a55f63b1190ae78/python_constraint2-2.4.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| Similarly, :code:`problem.addConstraint([\"x / y == z\"])` is parsed to :code:`[ExactProdConstraint(\"x\", [\"z\", \"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()  # doctest: +NORMALIZE_WHITESPACE\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()  # doctest: +NORMALIZE_WHITESPACE\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, (col1, col2))\n    >>> solutions = problem.getSolutions()\n    >>> solutions   # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS\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), [row * 4 + i for i in range(4)])\n    >>> for col in range(4):\n    ...     problem.addConstraint(ExactSumConstraint(34), [col + 4 * i for i in range(4)])\n    >>> solutions = problem.getSolutions()  # doctest: +SKIP\n\nFeatures\n--------\n\nThe following solvers are available:\n\n- :code:`OptimizedBacktrackingSolver` (default)\n- :code:`BacktrackingSolver`\n- :code:`RecursiveBacktrackingSolver`\n- :code:`MinConflictsSolver`\n- :code:`ParallelSolver`\n\n.. role:: python(code)\n   :language: python\n\nPredefined constraint types currently available (use the parsing for automatic conversion to these types):\n\n- :code:`FunctionConstraint`\n- :code:`AllDifferentConstraint`\n- :code:`AllEqualConstraint`\n- :code:`ExactSumConstraint`\n- :code:`MinSumConstraint`\n- :code:`MaxSumConstraint`\n- :code:`MinProdConstraint`\n- :code:`ExactProdConstraint`\n- :code:`MaxProdConstraint`\n- :code:`VariableExactSumConstraint`\n- :code:`VariableMinSumConstraint`\n- :code:`VariableMaxSumConstraint`\n- :code:`VariableMinProdConstraint`\n- :code:`VariableExactProdConstraint`\n- :code:`VariableMaxProdConstraint`\n- :code:`InSetConstraint`\n- :code:`NotInSetConstraint`\n- :code:`SomeInSetConstraint`\n- :code:`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- Support constant modifiers on parsed (variable) constraints instead defaulting to `FunctionConstraint`, e.g. :code:`problem.addConstraint(\"a+2 == b\")` or :code:`problem.addConstraint(\"x / y == 100\")`\n- Parse using Abstract Syntax Trees (AST) instead of the current parser to be more robust and support decomposing lambdas\n- Rewrite hotspots in C / Pyx instead of pure python mode\n- Improvements to make the ParallelSolver competitive (experiments reveal the freethreading mode to be promising)\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.4.0",
    "project_urls": {
        "Changelog": "https://github.com/python-constraint/python-constraint/blob/main/CHANGELOG.md",
        "Documentation": "http://python-constraint.github.io/python-constraint/",
        "Homepage": "http://python-constraint.github.io/python-constraint/",
        "Issues": "https://github.com/python-constraint/python-constraint/issues",
        "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": "9bfd0445d81d47acf3dd616f1ccb4f70835db7035339b0ebb7121edb67ea0594",
                "md5": "98c2e60b0bc3280abacb89945d545e4d",
                "sha256": "1194431d5d992f66b910b7acfdcb07147a55e36e418540f98d0e8927fdbb9ae0"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp310-cp310-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "98c2e60b0bc3280abacb89945d545e4d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1725075,
            "upload_time": "2025-07-23T09:41:15",
            "upload_time_iso_8601": "2025-07-23T09:41:15.824627Z",
            "url": "https://files.pythonhosted.org/packages/9b/fd/0445d81d47acf3dd616f1ccb4f70835db7035339b0ebb7121edb67ea0594/python_constraint2-2.4.0-cp310-cp310-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7e6b2e91185549a244b540efaa33f317debc75524ab253137616eb20b69289f1",
                "md5": "4e4749282c46953ccf421e1933c79091",
                "sha256": "aa241c56136d6016353f8edb9c206b6ed9499af97e4e61b603861dcc5450c4e9"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp310-cp310-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4e4749282c46953ccf421e1933c79091",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 3992512,
            "upload_time": "2025-07-23T09:41:18",
            "upload_time_iso_8601": "2025-07-23T09:41:18.122095Z",
            "url": "https://files.pythonhosted.org/packages/7e/6b/2e91185549a244b540efaa33f317debc75524ab253137616eb20b69289f1/python_constraint2-2.4.0-cp310-cp310-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8962920ad6d58061666cf571292eeaef0e0993d9b62f07204950d193988b82c3",
                "md5": "56c789da9572d446e9ab18b50a6ab6ce",
                "sha256": "5f9f47d1689119fbf71d6dd028975ccaaa2c6ed45ff8b1119f174d5df65bd5a9"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp310-cp310-manylinux_2_39_x86_64.whl",
            "has_sig": false,
            "md5_digest": "56c789da9572d446e9ab18b50a6ab6ce",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 4126944,
            "upload_time": "2025-07-23T09:41:19",
            "upload_time_iso_8601": "2025-07-23T09:41:19.675824Z",
            "url": "https://files.pythonhosted.org/packages/89/62/920ad6d58061666cf571292eeaef0e0993d9b62f07204950d193988b82c3/python_constraint2-2.4.0-cp310-cp310-manylinux_2_39_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1b4b05047d010682ed4207fe528b1260ecae83a3ae7a9130a9f8b01a1be9fade",
                "md5": "20bdce68b92e7139e6530b7234a0c31f",
                "sha256": "446296fc4a4dda78acc0ef1b809849e898581f0ac5443557da2a28da00056c6f"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "20bdce68b92e7139e6530b7234a0c31f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 796496,
            "upload_time": "2025-07-23T09:41:21",
            "upload_time_iso_8601": "2025-07-23T09:41:21.075821Z",
            "url": "https://files.pythonhosted.org/packages/1b/4b/05047d010682ed4207fe528b1260ecae83a3ae7a9130a9f8b01a1be9fade/python_constraint2-2.4.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d137f510658a0ed0853c0c5edcefab5ac19af19a848225148dbb60cabd9c61ca",
                "md5": "5c3232c7815043268dae0bcea18902d7",
                "sha256": "3316d6f01ab572a6fdcd4d196a22b896265b1cc7d2fd900574cc5dd07a12a540"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp311-cp311-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "5c3232c7815043268dae0bcea18902d7",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1743061,
            "upload_time": "2025-07-23T09:41:22",
            "upload_time_iso_8601": "2025-07-23T09:41:22.788390Z",
            "url": "https://files.pythonhosted.org/packages/d1/37/f510658a0ed0853c0c5edcefab5ac19af19a848225148dbb60cabd9c61ca/python_constraint2-2.4.0-cp311-cp311-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "746c08b016cb313a4e35968736c9a2da7ce1a8705b28e6d552a8d50772bdda99",
                "md5": "e0a7d2cc95183dba2898cd8d7b4d837c",
                "sha256": "3cc496c06b7dcc1c528dd59493b92a995a07dbecdc48c888bba6db8990998f10"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp311-cp311-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e0a7d2cc95183dba2898cd8d7b4d837c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 4189944,
            "upload_time": "2025-07-23T09:41:24",
            "upload_time_iso_8601": "2025-07-23T09:41:24.195167Z",
            "url": "https://files.pythonhosted.org/packages/74/6c/08b016cb313a4e35968736c9a2da7ce1a8705b28e6d552a8d50772bdda99/python_constraint2-2.4.0-cp311-cp311-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5113f3af35006b0891dc34d1d6794e4102e6cc40bdb27b8729db318897f656b1",
                "md5": "2bd1f04f41bc46d3d026fe7a2f1d47fa",
                "sha256": "301942cfbb666d948eb1c1ae026de9abdaed55e05853b318a08f77e9001d129d"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp311-cp311-manylinux_2_39_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2bd1f04f41bc46d3d026fe7a2f1d47fa",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 4318021,
            "upload_time": "2025-07-23T09:41:25",
            "upload_time_iso_8601": "2025-07-23T09:41:25.647088Z",
            "url": "https://files.pythonhosted.org/packages/51/13/f3af35006b0891dc34d1d6794e4102e6cc40bdb27b8729db318897f656b1/python_constraint2-2.4.0-cp311-cp311-manylinux_2_39_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bdf85ef87551416cbb3fdebd3e8d91fba710f943bfcc063fb708809dd05b8979",
                "md5": "442bd7f2e21b2bf31eba04a61ac210d2",
                "sha256": "ab88df4a1508d2a641358d44745c173ee7124603812120f539b273a54b9c3fcb"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "442bd7f2e21b2bf31eba04a61ac210d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 796497,
            "upload_time": "2025-07-23T09:41:27",
            "upload_time_iso_8601": "2025-07-23T09:41:27.033306Z",
            "url": "https://files.pythonhosted.org/packages/bd/f8/5ef87551416cbb3fdebd3e8d91fba710f943bfcc063fb708809dd05b8979/python_constraint2-2.4.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1ef7d529ac5b68625d74616d32b47163a7c5017eabf9b06107fdb52f20255bbe",
                "md5": "ddf487bee25d0b646e5eac20002548fc",
                "sha256": "80116f87fa385cfd91177c234217abeee1859aac936b1841c3364e6d814445db"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp312-cp312-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ddf487bee25d0b646e5eac20002548fc",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1751189,
            "upload_time": "2025-07-23T09:41:28",
            "upload_time_iso_8601": "2025-07-23T09:41:28.729268Z",
            "url": "https://files.pythonhosted.org/packages/1e/f7/d529ac5b68625d74616d32b47163a7c5017eabf9b06107fdb52f20255bbe/python_constraint2-2.4.0-cp312-cp312-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3c9f90b9c1b0fa7533a635f46882cc29491a18eb1bb7d108718f8563ab3dbbc0",
                "md5": "efaa94ef68d65ff95e155f37561a563d",
                "sha256": "783e5875a6f757f4f83442114b8993418d68eb8e1c0e622ff6458dc90be4dca9"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp312-cp312-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "efaa94ef68d65ff95e155f37561a563d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 4132590,
            "upload_time": "2025-07-23T09:41:30",
            "upload_time_iso_8601": "2025-07-23T09:41:30.453884Z",
            "url": "https://files.pythonhosted.org/packages/3c/9f/90b9c1b0fa7533a635f46882cc29491a18eb1bb7d108718f8563ab3dbbc0/python_constraint2-2.4.0-cp312-cp312-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b96c16d8bb3a3237f60a2e317412034cf988922efcf159dd372861f49b5a80cf",
                "md5": "46e174496a6636642f993043e01aa082",
                "sha256": "c54d5b25d3dac08aff00898284e3384fa6e569a1e721cbb346b7a2642d0f3336"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp312-cp312-manylinux_2_39_x86_64.whl",
            "has_sig": false,
            "md5_digest": "46e174496a6636642f993043e01aa082",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 4272272,
            "upload_time": "2025-07-23T09:41:31",
            "upload_time_iso_8601": "2025-07-23T09:41:31.787734Z",
            "url": "https://files.pythonhosted.org/packages/b9/6c/16d8bb3a3237f60a2e317412034cf988922efcf159dd372861f49b5a80cf/python_constraint2-2.4.0-cp312-cp312-manylinux_2_39_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "18438923e81a4ba55c13f71930597620f7e52f60a768f48585440ce3458bd59e",
                "md5": "cdd05f426b1ea5c23e35ac8f436ec110",
                "sha256": "3a6436c7c9c5acc82d64ec2ed03fa687d623c38d5a096ed5d7b40acbdbff598d"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "cdd05f426b1ea5c23e35ac8f436ec110",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 796496,
            "upload_time": "2025-07-23T09:41:33",
            "upload_time_iso_8601": "2025-07-23T09:41:33.436066Z",
            "url": "https://files.pythonhosted.org/packages/18/43/8923e81a4ba55c13f71930597620f7e52f60a768f48585440ce3458bd59e/python_constraint2-2.4.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b153a42a433856f3b3fb15d26af590dd26548b7d5d6e7c28a8de68475f5b83b0",
                "md5": "c60da0e13dea9df764cc52016cc02426",
                "sha256": "55b4c331f62ba0ebd30b4619dea729717f8993214937b6aaa1c9862f14981b77"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp313-cp313-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c60da0e13dea9df764cc52016cc02426",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1745080,
            "upload_time": "2025-07-23T09:41:34",
            "upload_time_iso_8601": "2025-07-23T09:41:34.647156Z",
            "url": "https://files.pythonhosted.org/packages/b1/53/a42a433856f3b3fb15d26af590dd26548b7d5d6e7c28a8de68475f5b83b0/python_constraint2-2.4.0-cp313-cp313-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ae7dcd388e9aca2cfdfdfa951ea535a7edeaf1eae9094b2db414ec88c4dc7c01",
                "md5": "754cb6dc25b5fa8fa203b0909fa6b48d",
                "sha256": "36b30afaa8449a7af6e4a7f5f7c2b3347fdbba8f1cd880e44a93cc55ecf4eb98"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp313-cp313-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "754cb6dc25b5fa8fa203b0909fa6b48d",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 4137090,
            "upload_time": "2025-07-23T09:41:36",
            "upload_time_iso_8601": "2025-07-23T09:41:36.586686Z",
            "url": "https://files.pythonhosted.org/packages/ae/7d/cd388e9aca2cfdfdfa951ea535a7edeaf1eae9094b2db414ec88c4dc7c01/python_constraint2-2.4.0-cp313-cp313-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c6ffddd0e883c4b7aaa2218db8c7d6675107afa38f06dd2d880dccfd9f61a8e1",
                "md5": "23e43d310ac79ac424d3943dddf59c7e",
                "sha256": "89b78071eb8452a44091f3224d81838378c65f569bf6cc14f83b47d7a44d96d2"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp313-cp313-manylinux_2_39_x86_64.whl",
            "has_sig": false,
            "md5_digest": "23e43d310ac79ac424d3943dddf59c7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 4266383,
            "upload_time": "2025-07-23T09:41:38",
            "upload_time_iso_8601": "2025-07-23T09:41:38.372022Z",
            "url": "https://files.pythonhosted.org/packages/c6/ff/ddd0e883c4b7aaa2218db8c7d6675107afa38f06dd2d880dccfd9f61a8e1/python_constraint2-2.4.0-cp313-cp313-manylinux_2_39_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "acf0ddd3fbb544e17047366efd9c07c4bd3ac76079e39c39d7f8e20c4fa23130",
                "md5": "5b2ea8a1e93932c50b14aa958431fe7a",
                "sha256": "36ddddafa21e3d6ead8db14dc9c6659ae0e1eb8ad194431cf8530642dfbfbd64"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "5b2ea8a1e93932c50b14aa958431fe7a",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 796495,
            "upload_time": "2025-07-23T09:41:39",
            "upload_time_iso_8601": "2025-07-23T09:41:39.837780Z",
            "url": "https://files.pythonhosted.org/packages/ac/f0/ddd3fbb544e17047366efd9c07c4bd3ac76079e39c39d7f8e20c4fa23130/python_constraint2-2.4.0-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "29ac8e6e65952285e2fec196edea9c2594fcd6705c87a6163daa4aea940361d6",
                "md5": "eb29d994884fd3d94a6ca26768dcf00f",
                "sha256": "80691cc5b0406da96fef115391d726802490333339dad21d748fd933ed8e7dcd"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp39-cp39-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "eb29d994884fd3d94a6ca26768dcf00f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1731659,
            "upload_time": "2025-07-23T09:41:41",
            "upload_time_iso_8601": "2025-07-23T09:41:41.399687Z",
            "url": "https://files.pythonhosted.org/packages/29/ac/8e6e65952285e2fec196edea9c2594fcd6705c87a6163daa4aea940361d6/python_constraint2-2.4.0-cp39-cp39-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f2baf2ead263a90a4898c52b885d81c8c5a899e5d784a119b81fe83ae2cd1bd5",
                "md5": "2bddfc568b5b61d16c27b918c20e3772",
                "sha256": "f85cf4735908a32c5c25d42bfeb33fab5963d973893107c5aab047a30efdf13c"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp39-cp39-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2bddfc568b5b61d16c27b918c20e3772",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 3982745,
            "upload_time": "2025-07-23T09:41:42",
            "upload_time_iso_8601": "2025-07-23T09:41:42.855964Z",
            "url": "https://files.pythonhosted.org/packages/f2/ba/f2ead263a90a4898c52b885d81c8c5a899e5d784a119b81fe83ae2cd1bd5/python_constraint2-2.4.0-cp39-cp39-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6ac38f90c72ef103fac3e3e07bf0b2bf7bf4e4e7ddc14636135e6c4ff32b94ed",
                "md5": "c47543a6d5e298c720e24887b3319f82",
                "sha256": "eb966076e75d373bc3b4598d790484748f848f62123de995a4dc0c007076b8f3"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp39-cp39-manylinux_2_39_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c47543a6d5e298c720e24887b3319f82",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 4096555,
            "upload_time": "2025-07-23T09:41:44",
            "upload_time_iso_8601": "2025-07-23T09:41:44.397457Z",
            "url": "https://files.pythonhosted.org/packages/6a/c3/8f90c72ef103fac3e3e07bf0b2bf7bf4e4e7ddc14636135e6c4ff32b94ed/python_constraint2-2.4.0-cp39-cp39-manylinux_2_39_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2765e80146fa1256e765912646ea48d5955ea1db1cfc24cc7fbd597551f34620",
                "md5": "a559b5a820ecd660d55404ac7001126a",
                "sha256": "3f5e32b0c0d941a45010eb4d8584ab69cfc962ca671330954e6e94d92e7ace10"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a559b5a820ecd660d55404ac7001126a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 796496,
            "upload_time": "2025-07-23T09:41:46",
            "upload_time_iso_8601": "2025-07-23T09:41:46.812429Z",
            "url": "https://files.pythonhosted.org/packages/27/65/e80146fa1256e765912646ea48d5955ea1db1cfc24cc7fbd597551f34620/python_constraint2-2.4.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "42de3c414a193d606c724efb29e30ebbb7241af853bf973f1a55f63b1190ae78",
                "md5": "0790a17950ee2123aac1358110cecc7f",
                "sha256": "b5ed6dbaf6361310f001335a2319bd85cc2a3ae5ef3ccc5cf5385aae0eb67310"
            },
            "downloads": -1,
            "filename": "python_constraint2-2.4.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0790a17950ee2123aac1358110cecc7f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 778139,
            "upload_time": "2025-07-23T09:41:48",
            "upload_time_iso_8601": "2025-07-23T09:41:48.035105Z",
            "url": "https://files.pythonhosted.org/packages/42/de/3c414a193d606c724efb29e30ebbb7241af853bf973f1a55f63b1190ae78/python_constraint2-2.4.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-23 09:41:48",
    "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"
}
        
Elapsed time: 2.57972s