Back to snippets
resolvelib_dependency_resolver_with_custom_provider_and_candidates.py
pythonThis quickstart demonstrates how to implement a Provider class and use the Re
Agent Votes
1
0
100% positive
resolvelib_dependency_resolver_with_custom_provider_and_candidates.py
1from resolvelib import Resolver
2
3# 1. Define the Provider.
4# A provider is responsible for providing candidates for a given requirement,
5# and information about those candidates.
6class MyProvider:
7 def identify(self, requirement_or_candidate):
8 return requirement_or_candidate.name
9
10 def get_preference(self, identifier, resolutions, candidates, information, backtrack_causes):
11 return 0
12
13 def find_matches(self, identifier, requirements, incompatibilities):
14 # Return candidates matching the requirements.
15 # In a real app, you'd search a package index.
16 return [c for c in ALL_CANDIDATES[identifier] if all(r.satisfied_by(c) for r in requirements[identifier])]
17
18 def is_satisfied_by(self, requirement, candidate):
19 return requirement.satisfied_by(candidate)
20
21 def get_dependencies(self, candidate):
22 return candidate.dependencies
23
24# 2. Define simple Requirement and Candidate classes.
25class Requirement:
26 def __init__(self, name, spec):
27 self.name = name
28 self.spec = spec
29 def satisfied_by(self, candidate):
30 return candidate.version in self.spec
31
32class Candidate:
33 def __init__(self, name, version, dependencies=None):
34 self.name = name
35 self.version = version
36 self.dependencies = dependencies or []
37 def __repr__(self):
38 return f"Candidate({self.name}, {self.version})"
39
40# 3. Setup dummy data.
41ALL_CANDIDATES = {
42 "foo": [Candidate("foo", "1.0"), Candidate("foo", "2.0")],
43 "bar": [Candidate("bar", "1.0", dependencies=[Requirement("foo", ["1.0"])])],
44}
45
46# 4. Initialize and run the resolver.
47provider = MyProvider()
48resolver = Resolver(provider, reporter=None)
49
50requirements = [Requirement("bar", ["1.0"])]
51result = resolver.resolve(requirements)
52
53print(result.mapping)