{"id":22574806,"url":"https://github.com/thoth-station/solver","last_synced_at":"2025-04-10T16:10:41.608Z","repository":{"id":39380617,"uuid":"120300624","full_name":"thoth-station/solver","owner":"thoth-station","description":"Dependency solver for the Thoth project","archived":false,"fork":false,"pushed_at":"2024-01-30T00:02:21.000Z","size":2228,"stargazers_count":20,"open_issues_count":28,"forks_count":12,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-24T13:51:23.893Z","etag":null,"topics":["artificial-intelligence","hacktoberfest","software-quality","thoth"],"latest_commit_sha":null,"homepage":"https://thoth-station.ninja/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thoth-station.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-02-05T12:17:24.000Z","updated_at":"2024-06-17T21:32:39.000Z","dependencies_parsed_at":"2023-02-10T04:45:55.307Z","dependency_job_id":"8a72a8fe-9bd3-4af5-b528-1b6e541f0f5b","html_url":"https://github.com/thoth-station/solver","commit_stats":{"total_commits":840,"total_committers":34,"mean_commits":"24.705882352941178","dds":0.7059523809523809,"last_synced_commit":"1a68b49811cb060e764c7205493f663b958a5245"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thoth-station%2Fsolver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thoth-station%2Fsolver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thoth-station%2Fsolver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thoth-station%2Fsolver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thoth-station","download_url":"https://codeload.github.com/thoth-station/solver/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248250809,"owners_count":21072683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["artificial-intelligence","hacktoberfest","software-quality","thoth"],"created_at":"2024-12-08T03:08:03.711Z","updated_at":"2025-04-10T16:10:41.588Z","avatar_url":"https://github.com/thoth-station.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Thoth Solver\n------------\n\nPython dependency solver used in `Thoth project\n\u003chttps://thoth-station.ninja\u003e`__.\n\nAs Python is a dynamic programming language, Thoth runs several types of\nsolvers that differ in software environment (operating system, native packages\npresent, system symbols and their versions and Python interpreter version). An\nexample can be a solver which is running raw RHEL 8.0 with Python 3.6, another\nexample can be a solver with Fedora 33 with Python 3.9 installed with different\nversion of glibc and some of the ABI symbols of native libraries provided by\noperating system (see also Python manylinux standards and devtools for more\ninfo).\n\nSee the listing built solvers used in Thoth:\n\n* `quay.io/thoth-station/solver-rhel-8-py38 \u003chttps://quay.io/repository/thoth-station/solver-rhel-8-py38\u003e`__\n\n* `quay.io/thoth-station/solver-rhel-8-py36 \u003chttps://quay.io/repository/thoth-station/solver-rhel-8-py36\u003e`__\n\n* `quay.io/thoth-station/solver-fedora-34-py39 \u003chttps://quay.io/repository/thoth-station/solver-fedora-34-py39\u003e`__\n\nFor a `detailed explanation see this blog post\n\u003chttps://dev.to/fridex/how-to-beat-python-s-pip-solving-python-dependencies-2d6e\u003e`__.\n\nThis solver is run in different environments (different operating systems with\nvarious native packages provided) to obtain dependency information about Python\npackages.  An important information is also the fact whether the given Python\npackage is installable into the environment (e.g. dependencies on native\npackages being present in the environment). An example could be UBI 8 specific\nsolver running Python 3.8 or UBI 8 running Python 3.6 with gcc tooling for\nbuilding native extensions.\n\nThe source code is based on the original solver code that was implemented by\nPavel Odvody in project CuCoS.\n\nProject Scope\n=============\n\nThe aim of this project is to answer a simple question - what packages will be\ninstalled (resolved by pip or any Python compliant dependency resolver) for the\nprovided stack?\n\nImagine you have an application that has one dependency:\n\n.. code-block:: console\n\n  tensorflow\n\nTool provided by this project will tell you what dependencies will be\nconsidered during resolution (the whole dependency graph):\n\n.. code-block:: console\n\n  thoth-solver --verbose python -r tensorflow\n\nThe output of this solver is a dependency analysis for the given software stack\n- in the example above, package ``tensorflow`` in any release with analysis of\nits all dependencies (direct and indirect ones) with additional information\nfrom Python ecosystem needed for a Python resolver to perform the actual\n``tensorflow`` resolution.\n\nThe tool also allows specifying custom Python package indexes which conform to\n`PEP-503 \u003chttps://www.python.org/dev/peps/pep-0503/\u003e`__ - see the ``--index``\noption for analyzing your custom Python packages provided by your repositories.\n\nIt is also possible to restrict version using standard Python version range\nspecifiers and/or limit the output just to direct dependencies.\n\nProduced output\n===============\n\nThis tool (unless ``--no-transitive`` is specified) recursively analyzes all\nthe dependencies of the desired package inside a specific environment.\nDependencies to be analyzed can be defined in similar to ``requirements.txt``\nfile or as a string in a form of:\n\n.. code-block:: console\n\n  \u003cpackage-name\u003e\u003cversion-cmp\u003e\u003cversion-identifier\u003e\n\nWhere ``\u003cpackage-name\u003e`` is the analyzed package name (as present on PyPI for\nexample), part ``\u003cversion-cmp\u003e\u003cversion-identifier\u003e`` is optional and creates\nversion specifier for the given package (if not specified, all versions are\nconsidered).\n\nAn example output shown bellow can be reproduced by running the tool with the\nfollowing arguments (with an example of produced log):\n\n.. code-block:: console\n\n  $ thoth-solver python --requirements 'tensorflow==2.0.0' --index https://pypi.org/simple --no-transitive\n  2019-10-01 14:01:02,756 [31432] INFO     root:128: Logging to a Sentry instance is turned off\n  2019-10-01 14:01:02,756 [31432] INFO     root:150: Logging to rsyslog endpoint is turned off\n  2019-10-01 14:01:06,838 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'tensorflow==2.0.0'\n  2019-10-01 14:01:07,003 [31432] INFO     thoth.solver.python.python:356: Using index 'https://pypi.org/simple' to discover package 'tensorflow' in version '2.0.0'\n  2019-10-01 14:01:40,568 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'absl-py' with range '\u003e=0.7.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:40,568 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'absl-py\u003e=0.7.0'\n  2019-10-01 14:01:40,689 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'astor' with range '\u003e=0.6.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:40,689 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'astor\u003e=0.6.0'\n  2019-10-01 14:01:40,841 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'gast' with range '==0.2.2' from 'https://pypi.org/simple'\n  2019-10-01 14:01:40,841 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'gast==0.2.2'\n  2019-10-01 14:01:40,984 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'google-pasta' with range '\u003e=0.1.6' from 'https://pypi.org/simple'\n  2019-10-01 14:01:40,985 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'google-pasta\u003e=0.1.6'\n  2019-10-01 14:01:41,104 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'keras-applications' with range '\u003e=1.0.8' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,104 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'keras-applications\u003e=1.0.8'\n  2019-10-01 14:01:41,273 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'keras-preprocessing' with range '\u003e=1.0.5' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,274 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'keras-preprocessing\u003e=1.0.5'\n  2019-10-01 14:01:41,443 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'numpy' with range '\u003c2.0,\u003e=1.16.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,443 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'numpy\u003c2.0,\u003e=1.16.0'\n  2019-10-01 14:01:41,723 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'opt-einsum' with range '\u003e=2.3.2' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,723 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'opt-einsum\u003e=2.3.2'\n  2019-10-01 14:01:41,828 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'six' with range '\u003e=1.10.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,828 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'six\u003e=1.10.0'\n  2019-10-01 14:01:41,942 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'protobuf' with range '\u003e=3.6.1' from 'https://pypi.org/simple'\n  2019-10-01 14:01:41,943 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'protobuf\u003e=3.6.1'\n  2019-10-01 14:01:42,095 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'tensorboard' with range '\u003c2.1.0,\u003e=2.0.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:42,095 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'tensorboard\u003c2.1.0,\u003e=2.0.0'\n  2019-10-01 14:01:42,286 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'tensorflow-estimator' with range '\u003c2.1.0,\u003e=2.0.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:42,287 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'tensorflow-estimator\u003c2.1.0,\u003e=2.0.0'\n  2019-10-01 14:01:42,411 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'termcolor' with range '\u003e=1.1.0' from 'https://pypi.org/simple'\n  2019-10-01 14:01:42,411 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'termcolor\u003e=1.1.0'\n  2019-10-01 14:01:42,580 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'wrapt' with range '\u003e=1.11.1' from 'https://pypi.org/simple'\n  2019-10-01 14:01:42,581 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'wrapt\u003e=1.11.1'\n  2019-10-01 14:01:42,693 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'grpcio' with range '\u003e=1.8.6' from 'https://pypi.org/simple'\n  2019-10-01 14:01:42,693 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'grpcio\u003e=1.8.6'\n  2019-10-01 14:01:43,007 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'wheel' with range '\u003e=0.26' from 'https://pypi.org/simple'\n  2019-10-01 14:01:43,008 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'wheel\u003e=0.26'\n  2019-10-01 14:01:43,116 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'backports-weakref' with range '\u003e=1.0rc1' from 'https://pypi.org/simple'\n  2019-10-01 14:01:43,117 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'backports-weakref\u003e=1.0rc1'\n  2019-10-01 14:01:43,262 [31432] INFO     thoth.solver.python.python:405: Resolving dependency versions for 'enum34' with range '\u003e=1.1.6' from 'https://pypi.org/simple'\n  2019-10-01 14:01:43,262 [31432] INFO     thoth.solver.python.python_solver:113: Parsing dependency 'enum34\u003e=1.1.6'\n\nAn the output can be pretty verbose, the following section describes some most\ninteresting parts of the output using JSONPath:\n\n* ``.metadata`` - metadata assigned to the solver run - these metadata are especially useful within project Thoth, where analyzer is run in a cluster, the purpose of metadata is to capture information which could be beneficial when debugging issues which arise in the cluster due to different container environment (e.g. Python version)\n* ``.result`` - the actual result as produced by this tool\n* ``.result.unparsed`` - a list of requirements that failed to be parsed (wrong dependency specification not conforming to Python standards)\n* ``.result.unresolved`` - a list of requirements that failed to be resolved - the reason behind failure can be for example non-existing package or its version on the given Python package index, or for example incompatibility of package distribution with the solver's software environment (Python version, environment markers, ...), or bogus distribution (e.g. forgotten ``requirements.txt`` in the distribution required by ``setup.py`` on package build).\n* ``.result.tree`` - the actual serialized dependency tree (broken dependency graph as cyclic dependencies are possible in Python ecosystem)\n* ``.result.tree[*].package_name`` - name of the analyzed package\n* ``.result.tree[*].package_version`` - version of the analyzed package\n* ``.result.tree[*].sha256`` - sha256 digests of artifacts present on the given Python package index\n* ``.result.tree[*].importlib_metadata`` - metadata associated with the given package, these metadata are obtained using `importlib-metadata \u003chttps://pypi.org/project/importlib-metadata/\u003e`__, fallback to standard `importlib.metadata \u003chttps://docs.python.org/3.9/library/importlib.metadata.html\u003e`__ on Python3.9+\n\n  * ``.result.tree[*].importlib_metadata.metadata`` - package metadata - see `packaging docs for more info \u003chttps://packaging.python.org/specifications/core-metadata/\u003e`__\n  * ``.result.tree[*].importlib_metadata.requires`` - raw strings which declare the given Python package requirements as obtained by ``importlib_metadata.requires``\n  * ``.result.tree[*].importlib_metadata.version`` - version as obtained by ``importlib_metadata.requires``\n  * ``.result.tree[*].importlib_metadata.files`` - file information about the given package (additionally parsed to provide digest, file size and path) as obtained by ``importlib_metadata.files``\n  * ``.result.tree[*].importlib_metadata.entry_points`` - entry points as obtained by ``importlib_metadata.entry_points`` (additionally parsed to provide entry point name, group and value)\n\n  .. code-block:: json\n\n    {\n      \"entry_points\": [\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"saved_model_cli\",\n          \"value\": \"tensorflow.python.tools.saved_model_cli:main\"\n        },\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"tensorboard\",\n          \"value\": \"tensorboard.main:run_main\"\n        },\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"tf_upgrade_v2\",\n          \"value\": \"tensorflow.tools.compatibility.tf_upgrade_v2_main:main\"\n        },\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"tflite_convert\",\n          \"value\": \"tensorflow.lite.python.tflite_convert:main\"\n        },\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"toco\",\n          \"value\": \"tensorflow.lite.python.tflite_convert:main\"\n        },\n        {\n          \"group\": \"console_scripts\",\n          \"name\": \"toco_from_protos\",\n          \"value\": \"tensorflow.lite.toco.python.toco_from_protos:main\"\n        }\n      ],\n      \"files\": [\n        {\n          \"hash\": {\n            \"mode\": \"sha256\",\n            \"value\": \"47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU\"\n          },\n          \"path\": \"tensorflow_core/tools/pip_package/__init__.py\",\n          \"size\": 0\n        }\n      ],\n      \"metadata\": {\n        \"Author\": \"Google Inc.\",\n        \"Author-email\": \"packages@tensorflow.org\",\n        \"Classifier\": [\n          \"Development Status :: 5 - Production/Stable\",\n          \"Intended Audience :: Developers\",\n          \"Intended Audience :: Education\",\n          \"Intended Audience :: Science/Research\",\n          \"License :: OSI Approved :: Apache Software License\",\n          \"Programming Language :: Python :: 2\",\n          \"Programming Language :: Python :: 2.7\",\n          \"Programming Language :: Python :: 3\",\n          \"Programming Language :: Python :: 3.4\",\n          \"Programming Language :: Python :: 3.5\",\n          \"Programming Language :: Python :: 3.6\",\n          \"Programming Language :: Python :: 3.7\",\n          \"Topic :: Scientific/Engineering\",\n          \"Topic :: Scientific/Engineering :: Mathematics\",\n          \"Topic :: Scientific/Engineering :: Artificial Intelligence\",\n          \"Topic :: Software Development\",\n          \"Topic :: Software Development :: Libraries\",\n          \"Topic :: Software Development :: Libraries :: Python Modules\"\n        ],\n        \"Download-URL\": \"https://github.com/tensorflow/tensorflow/tags\",\n        \"Home-page\": \"https://www.tensorflow.org/\",\n        \"Keywords\": \"tensorflow tensor machine learning\",\n        \"License\": \"Apache 2.0\",\n        \"Metadata-Version\": \"2.1\",\n        \"Name\": \"tensorflow\",\n        \"Platform\": [\n          \"UNKNOWN\"\n        ],\n        \"Requires-Dist\": [\n          \"absl-py (\u003e=0.7.0)\",\n          \"astor (\u003e=0.6.0)\",\n          \"gast (==0.2.2)\",\n          \"google-pasta (\u003e=0.1.6)\",\n          \"keras-applications (\u003e=1.0.8)\",\n          \"keras-preprocessing (\u003e=1.0.5)\",\n          \"numpy (\u003c2.0,\u003e=1.16.0)\",\n          \"opt-einsum (\u003e=2.3.2)\",\n          \"six (\u003e=1.10.0)\",\n          \"protobuf (\u003e=3.6.1)\",\n          \"tensorboard (\u003c2.1.0,\u003e=2.0.0)\",\n          \"tensorflow-estimator (\u003c2.1.0,\u003e=2.0.0)\",\n          \"termcolor (\u003e=1.1.0)\",\n          \"wrapt (\u003e=1.11.1)\",\n          \"grpcio (\u003e=1.8.6)\",\n          \"wheel (\u003e=0.26)\",\n          \"backports.weakref (\u003e=1.0rc1) ; python_version \u003c \\\"3.4\\\"\",\n          \"enum34 (\u003e=1.1.6) ; python_version \u003c \\\"3.4\\\"\"\n        ],\n        \"Summary\": \"TensorFlow is an open source machine learning framework for everyone.\",\n        \"Version\": \"2.0.0\"\n      },\n      \"requires\": [\n        \"absl-py (\u003e=0.7.0)\",\n        \"astor (\u003e=0.6.0)\",\n        \"gast (==0.2.2)\",\n        \"google-pasta (\u003e=0.1.6)\",\n        \"keras-applications (\u003e=1.0.8)\",\n        \"keras-preprocessing (\u003e=1.0.5)\",\n        \"numpy (\u003c2.0,\u003e=1.16.0)\",\n        \"opt-einsum (\u003e=2.3.2)\",\n        \"six (\u003e=1.10.0)\",\n        \"protobuf (\u003e=3.6.1)\",\n        \"tensorboard (\u003c2.1.0,\u003e=2.0.0)\",\n        \"tensorflow-estimator (\u003c2.1.0,\u003e=2.0.0)\",\n        \"termcolor (\u003e=1.1.0)\",\n        \"wrapt (\u003e=1.11.1)\",\n        \"grpcio (\u003e=1.8.6)\",\n        \"wheel (\u003e=0.26)\",\n        \"backports.weakref (\u003e=1.0rc1) ; python_version \u003c \\\"3.4\\\"\",\n        \"enum34 (\u003e=1.1.6) ; python_version \u003c \\\"3.4\\\"\"\n      ],\n      \"version\": \"2.0.0\"\n    }\n\n  The example above shows data associated with ``tensorflow==2.0.0``. The ``files``\n  section is intentionally snipped, the file digest is signed as described in\n  `PEP-427 \u003chttps://www.python.org/dev/peps/pep-0427/#id16\u003e`__.\n\n* ``.result.tree[*].dependencies`` - a list of dependencies which can be resolved given requirements specification of the analyzed package\n* ``.result.tree[*].dependencies[*].extras`` - name of extras signalizing the given package should be installed with extras as specified in `PEP-508 in extras section \u003chttps://www.python.org/dev/peps/pep-0508/#extras\u003e`__\n* ``.result.tree[*].dependencies[*].extra`` - name of extra which should be required to take into account this dependency as specified `PEP-508 in extras section \u003chttps://www.python.org/dev/peps/pep-0508/#extras\u003e`__\n* ``.result.tree[*].dependencies[*].marker`` - a full specification of the environment marker as described in `PEP-508 in environment markers section \u003chttps://www.python.org/dev/peps/pep-0508/#environment-markers\u003e`__\n* ``.result.tree[*].dependencies[*].marker_evaluation_error`` - a string capturing error information when marker evaluation failed in the run software environment, otherwise ``null``\n* ``.result.tree[*].dependencies[*].marker_evaluated`` - marker defined by the package, but additionally adjusted for evaluation for the current environment (see notes bellow).\n* ``.result.tree[*].dependencies[*].marker_evaluation_result`` - a boolean representing if the given marker evaluation was evaluated as ``true`` (the given environment accepts marker) or ``false`` (marker not accepted), a special value of `null` signalizes marker evaluation error (see ``marker_evaluation_error`` for more info)\n* ``.result.tree[*].dependencies[*].normalized_package_name`` - a string representing normalized package name as described in `PEP-503 in normalized names section \u003chttps://www.python.org/dev/peps/pep-0503/#normalized-names\u003e`__\n* ``.result.tree[*].dependencies[*].specifier`` - a version range specifier which was declared by package which depends on the given dependency conforming to `PEP-440 \u003chttps://www.python.org/dev/peps/pep-0440/\u003e`__\n* ``.result.tree[*].dependencies[*].resolved_versions`` - a list of versions which were resolved given the version range specifier and specified Python package indexes (passed ``--index`` option can specify multiple indexes which causes package discovery on each of them)\n\nAn example of a dependency entry (an entry from one of ``.result.tree[*].dependencies``:\n\n.. code-block:: json\n\n  {\n    \"extras\": [],\n    \"extra\": [],\n    \"marker\": \"python_version \u003c \\\"3.4\\\"\",\n    \"marker_evaluated\": \"python_version \u003c \\\"3.4\\\"\",\n    \"marker_evaluation_error\": null,\n    \"marker_evaluation_result\": false,\n    \"normalized_package_name\": \"backports-weakref\",\n    \"package_name\": \"backports.weakref\",\n    \"parsed_markers\": [\n      {\n        \"op\": \"\u003c\",\n        \"value\": \"3.4\",\n        \"variable\": \"python_version\"\n      }\n    ],\n    \"resolved_versions\": [\n      {\n        \"index\": \"https://pypi.org/simple\",\n        \"versions\": [\n          \"1.0rc1\",\n          \"1.0.post1\"\n        ]\n      }\n    ],\n    \"specifier\": \"\u003e=1.0rc1\"\n  }\n\nTo evaluate environment markers inside solver environment, there was a need to\nadjust marker so that it can be evaluated in the solver environment - see\n`PEP-508 in environment markers section\n\u003chttps://www.python.org/dev/peps/pep-0508/#environment-markers\u003e`__\nspecification, specifically the following section:\n\n.. code-block::\n\n  The \"extra\" variable is special. It is used by wheels to signal which\n  specifications apply to a given extra in the wheel METADATA file, but since\n  the METADATA file is based on a draft version of PEP-426, there is no current\n  specification for this. Regardless, outside of a context where this special\n  handling is taking place, the \"extra\" variable should result in an error like\n  all other unknown variables.\n\nInstallation and Deployment\n===========================\n\nThis project is also released on `PyPI\n\u003chttps://pypi.org/project/thoth-solver\u003e`__, so the latest release can be\ninstalled via pip or `Pipenv \u003chttps://pipenv.readthedocs.io\u003e`__:\n\n.. code-block:: console\n\n  pipenv install thoth-solver\n\nSolver is run in `project Thoth \u003chttps://thoth-station.ninja\u003e`__ to gather\ninformation about package dependencies. Check `thoth-station/thoth-application\n\u003chttps://github.com/thoth-station/thoth-application\u003e`__ repository for\ndeployment and installation instructions.\n\nRunning solver locally\n======================\n\nTo run solver locally, first clone the repo and install the project:\n\n.. code-block:: console\n\n  git clone git@github.com:thoth-station/solver.git thoth-solver\n  cd thoth-solver\n  pipenv install --dev\n  PYTHONPATH='.' ./thoth-solver-cli --help\n\nNow you can run the solver:\n\n.. code-block:: console\n\n  pipenv run python3 ./thoth-solver --verbose python -r 'selinon==1.0.0' -i https://pypi.org/simple --no-transitive\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthoth-station%2Fsolver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthoth-station%2Fsolver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthoth-station%2Fsolver/lists"}