Skip to content

Commit 251c749

Browse files
committed
fix typing
Signed-off-by: Frost Ming <me@frostming.com>
1 parent 569084f commit 251c749

File tree

15 files changed

+49
-122
lines changed

15 files changed

+49
-122
lines changed

examples/reporter_demo.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from collections import namedtuple
22

3+
import resolvelib
34
from packaging.specifiers import SpecifierSet
45
from packaging.version import Version
56

6-
import resolvelib
7-
87
index = """
98
first 1.0.0
109
second == 1.0.0
@@ -53,9 +52,7 @@ def read_spec(lines):
5352
candidates[latest] = set()
5453
else:
5554
if latest is None:
56-
raise RuntimeError(
57-
"Spec has dependencies before first candidate"
58-
)
55+
raise RuntimeError("Spec has dependencies before first candidate")
5956
name, specifier = splitstrip(line, 2)
6057
specifier = SpecifierSet(specifier)
6158
candidates[latest].add(Requirement(name, specifier))

examples/visualization/reporter.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@ def _get_subgraph(self, name, *, must_exist_already=True):
6262
if subgraph is None:
6363
if must_exist_already:
6464
existing = [s.name for s in self.graph.subgraphs_iter()]
65-
raise RuntimeError(
66-
f"Graph for {name} not found. Existing: {existing}"
67-
)
65+
raise RuntimeError(f"Graph for {name} not found. Existing: {existing}")
6866
else:
6967
subgraph = self.graph.add_subgraph(name=c_name, label=name)
7068

@@ -151,9 +149,7 @@ def adding_requirement(self, req, parent):
151149
# We're seeing the parent candidate (which is being "evaluated"), so
152150
# color all "active" requirements pointing to the it.
153151
# TODO: How does this interact with revisited candidates?
154-
for parent_req in self._active_requirements[
155-
canonicalize_name(parent.name)
156-
]:
152+
for parent_req in self._active_requirements[canonicalize_name(parent.name)]:
157153
self._ensure_edge(parent_req, to=parent, color="#80CC80")
158154

159155
def backtracking(self, candidate, internal=False):
@@ -175,9 +171,7 @@ def backtracking(self, candidate, internal=False):
175171

176172
# Trim "active" requirements to remove anything not relevant now.
177173
for requirement in self._dependencies[candidate]:
178-
active = self._active_requirements[
179-
canonicalize_name(requirement.name)
180-
]
174+
active = self._active_requirements[canonicalize_name(requirement.name)]
181175
active[requirement] -= 1
182176
if not active[requirement]:
183177
del active[requirement]
@@ -194,12 +188,8 @@ def pinning(self, candidate):
194188
node.attr.update(color="#80CC80")
195189

196190
# Requirement -> Candidate edges, from this candidate.
197-
for req in self._active_requirements[
198-
canonicalize_name(candidate.name)
199-
]:
200-
self._ensure_edge(
201-
req, to=candidate, arrowhead="vee", color="#80CC80"
202-
)
191+
for req in self._active_requirements[canonicalize_name(candidate.name)]:
192+
self._ensure_edge(req, to=candidate, arrowhead="vee", color="#80CC80")
203193

204194
# Candidate -> Requirement edges, from this candidate.
205195
for edge in self.graph.out_edges_iter([node_name]):

examples/visualization/run.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ def process_arguments(function, args):
2525
to_convert, _, args = args.partition(", ")
2626
value = int(to_convert)
2727
elif arg_type == "requirement":
28-
match = re.match(
29-
r"^<Requirement\('?([\w\-\._~]+)(.*?)'?\)>(.*)", args
30-
)
28+
match = re.match(r"^<Requirement\('?([\w\-\._~]+)(.*?)'?\)>(.*)", args)
3129
assert match, repr(args)
3230
name, spec, args = match.groups()
3331
value = Requirement(name, spec)

noxfile.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
@nox.session
1616
def lint(session):
1717
session.install(".[lint, test]")
18-
19-
session.run("black", "--check", ".")
20-
session.run("isort", ".")
18+
session.run("ruff", "format", "--check", ".")
2119
session.run("ruff", "check", ".")
2220
session.run("mypy", "src", "tests")
2321

pyproject.toml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ Homepage = "https://github.com/sarugaku/resolvelib"
2525

2626
[project.optional-dependencies]
2727
lint = [
28-
"black==23.12.1",
2928
"ruff",
30-
"isort",
3129
"mypy",
3230
"types-requests",
3331
]
@@ -57,16 +55,6 @@ version = {attr = "resolvelib.__version__"}
5755
[tool.distutils.bdist_wheel]
5856
universal = true
5957

60-
61-
[tool.black]
62-
line-length = 79
63-
include = '^/(docs|examples|src|tasks|tests)/.+\.py$'
64-
65-
[tool.isort]
66-
profile = "black"
67-
line_length = 79
68-
multi_line_output = 3
69-
7058
[tool.towncrier]
7159
package = 'resolvelib'
7260
package_dir = 'src'
@@ -108,6 +96,9 @@ exclude = [
10896
"*.pyi"
10997
]
11098

99+
[tool.ruff.lint.isort]
100+
known-first-party = ["resolvelib"]
101+
111102
[tool.mypy]
112103
warn_unused_configs = true
113104

src/resolvelib/providers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
from typing import Any, Protocol
1616

1717
class Preference(Protocol):
18-
def __lt__(self, __other: Any) -> bool:
19-
...
18+
def __lt__(self, __other: Any) -> bool: ...
2019

2120

2221
class AbstractProvider(Generic[RT, CT, KT]):

src/resolvelib/reporters.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ def resolving_conflicts(
5353
:param causes: The information on the collision that caused the backtracking.
5454
"""
5555

56-
def rejecting_candidate(
57-
self, criterion: Criterion[RT, CT], candidate: CT
58-
) -> None:
56+
def rejecting_candidate(self, criterion: Criterion[RT, CT], candidate: CT) -> None:
5957
"""Called when rejecting a candidate during backtracking."""
6058

6159
def pinning(self, candidate: CT) -> None:

src/resolvelib/resolvers/abstract.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ def __init__(
3232
self.provider = provider
3333
self.reporter = reporter
3434

35-
def resolve(
36-
self, requirements: Iterable[RT], **kwargs: Any
37-
) -> Result[RT, CT, KT]:
35+
def resolve(self, requirements: Iterable[RT], **kwargs: Any) -> Result[RT, CT, KT]:
3836
"""Take a collection of constraints, spit out the resolution result.
3937
4038
This returns a representation of the final resolution state, with one

src/resolvelib/resolvers/criterion.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,7 @@ def _is_current_pin_satisfying(
209209
for r in criterion.iter_requirement()
210210
)
211211

212-
def _get_updated_criteria(
213-
self, candidate: CT
214-
) -> dict[KT, Criterion[RT, CT]]:
212+
def _get_updated_criteria(self, candidate: CT) -> dict[KT, Criterion[RT, CT]]:
215213
criteria = self.state.criteria.copy()
216214
for requirement in self._p.get_dependencies(candidate=candidate):
217215
self._add_to_criteria(criteria, requirement, parent=candidate)
@@ -245,7 +243,7 @@ def _attempt_to_pin_criterion(self, name: KT) -> list[Criterion[RT, CT]]:
245243

246244
# Put newly-pinned candidate at the end. This is essential because
247245
# backtracking looks at this mapping to get the last pin.
248-
self.state.mapping.pop(name, None) # type: ignore[arg-type]
246+
self.state.mapping.pop(name, None)
249247
self.state.mapping[name] = candidate
250248

251249
return []
@@ -347,8 +345,7 @@ def _backjump(self, causes: list[RequirementInformation[RT, CT]]) -> bool:
347345
# If the current dependencies and the incompatible dependencies
348346
# are overlapping then we have found a cause of the incompatibility
349347
current_dependencies = {
350-
self._p.identify(d)
351-
for d in self._p.get_dependencies(candidate)
348+
self._p.identify(d) for d in self._p.get_dependencies(candidate)
352349
}
353350
if not current_dependencies.isdisjoint(incompatible_deps):
354351
break
@@ -360,8 +357,7 @@ def _backjump(self, causes: list[RequirementInformation[RT, CT]]) -> bool:
360357
break
361358

362359
incompatibilities_from_broken = [
363-
(k, list(v.incompatibilities))
364-
for k, v in broken_state.criteria.items()
360+
(k, list(v.incompatibilities)) for k, v in broken_state.criteria.items()
365361
]
366362

367363
# Also mark the newly known incompatibility.
@@ -384,13 +380,9 @@ def _extract_causes(
384380
self, criteron: list[Criterion[RT, CT]]
385381
) -> list[RequirementInformation[RT, CT]]:
386382
"""Extract causes from list of criterion and deduplicate"""
387-
return list(
388-
{id(i): i for c in criteron for i in c.information}.values()
389-
)
383+
return list({id(i): i for c in criteron for i in c.information}.values())
390384

391-
def resolve(
392-
self, requirements: Iterable[RT], max_rounds: int
393-
) -> State[RT, CT, KT]:
385+
def resolve(self, requirements: Iterable[RT], max_rounds: int) -> State[RT, CT, KT]:
394386
if self._states:
395387
raise RuntimeError("already resolved")
396388

@@ -430,9 +422,7 @@ def resolve(
430422
return self.state
431423

432424
# keep track of satisfied names to calculate diff after pinning
433-
satisfied_names = set(self.state.criteria.keys()) - set(
434-
unsatisfied_names
435-
)
425+
satisfied_names = set(self.state.criteria.keys()) - set(unsatisfied_names)
436426

437427
# Choose the most preferred unpinned criterion to try.
438428
name = min(unsatisfied_names, key=self._get_preference)

src/resolvelib/structs.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
from __future__ import annotations
22

33
import itertools
4-
from abc import ABCMeta
54
from collections import namedtuple
65
from typing import (
76
TYPE_CHECKING,
87
Callable,
98
Collection,
10-
Container,
119
Generic,
1210
Iterable,
1311
Iterator,
@@ -150,7 +148,7 @@ def __len__(self) -> int:
150148
return len(self._mapping) + more
151149

152150

153-
class _FactoryIterableView(Generic[RT]):
151+
class _FactoryIterableView(Iterable[RT]):
154152
"""Wrap an iterator factory returned by `find_matches()`.
155153
156154
Calling `iter()` on this class would invoke the underlying iterator
@@ -174,14 +172,12 @@ def __bool__(self) -> bool:
174172
return True
175173

176174
def __iter__(self) -> Iterator[RT]:
177-
iterable = (
178-
self._factory() if self._iterable is None else self._iterable
179-
)
175+
iterable = self._factory() if self._iterable is None else self._iterable
180176
self._iterable, current = itertools.tee(iterable)
181177
return current
182178

183179

184-
class _SequenceIterableView(Generic[RT]):
180+
class _SequenceIterableView(Iterable[RT]):
185181
"""Wrap an iterable returned by find_matches().
186182
187183
This is essentially just a proxy to the underlying sequence that provides
@@ -201,19 +197,18 @@ def __iter__(self) -> Iterator[RT]:
201197
return iter(self._sequence)
202198

203199

204-
class IterableView(Container[CT], Iterator[CT], metaclass=ABCMeta):
205-
pass
206-
207-
208200
def build_iter_view(
209-
matches: Iterable[CT] | Callable[[], Iterable[CT]]
210-
) -> IterableView[CT]:
201+
matches: Iterable[CT] | Callable[[], Iterable[CT]],
202+
) -> Iterable[CT]:
211203
"""Build an iterable view from the value returned by `find_matches()`."""
212204
if callable(matches):
213-
return _FactoryIterableView(matches) # type: ignore[return-value]
205+
return _FactoryIterableView(matches)
214206
if not isinstance(matches, Sequence):
215207
matches = list(matches)
216-
return _SequenceIterableView(matches) # type: ignore[return-value]
208+
return _SequenceIterableView(matches)
209+
210+
211+
IterableView = Iterable
217212

218213

219214
class Criterion(Generic[RT, CT]):
@@ -238,7 +233,7 @@ class Criterion(Generic[RT, CT]):
238233

239234
def __init__(
240235
self,
241-
candidates: IterableView[CT],
236+
candidates: Iterable[CT],
242237
information: Collection[RequirementInformation[RT, CT]],
243238
incompatibilities: Collection[CT],
244239
) -> None:

tests/functional/cocoapods/test_resolvers_cocoapods.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ def __init__(self, filename):
165165
for key, spec in case_data["requested"].items()
166166
]
167167
self.pinned_versions = {
168-
entry["name"]: Version(entry["version"])
169-
for entry in case_data["base"]
168+
entry["name"]: Version(entry["version"]) for entry in case_data["base"]
170169
}
171170
self.expected_resolution = dict(_iter_resolved(case_data["resolved"]))
172171
self.expected_conflicts = set(case_data["conflicts"])
@@ -193,8 +192,7 @@ def _iter_matches(self, name, requirements, incompatibilities):
193192
for entry in data:
194193
version = Version(entry["version"])
195194
if any(
196-
not _version_in_specset(version, r.spec)
197-
for r in requirements[name]
195+
not _version_in_specset(version, r.spec) for r in requirements[name]
198196
):
199197
continue
200198
if version in bad_versions:
@@ -253,8 +251,7 @@ def _format_conflicts(exc):
253251

254252
def _format_resolution(result):
255253
return {
256-
identifier: candidate.ver
257-
for identifier, candidate in result.mapping.items()
254+
identifier: candidate.ver for identifier, candidate in result.mapping.items()
258255
}
259256

260257

tests/functional/python/py2index.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,7 @@ def iter_package_entries(self, name: str) -> Iterator[PackageEntry]:
251251
dependencies: list[str] = data.get_all("Requires-Dist", [])
252252
yield PackageEntry(version, dependencies)
253253

254-
def process_package_entry(
255-
self, name: str, entry: PackageEntry
256-
) -> set[str] | None:
254+
def process_package_entry(self, name: str, entry: PackageEntry) -> set[str] | None:
257255
more = set()
258256
for dep in entry.dependencies:
259257
try:

tests/functional/python/test_resolvers_python.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,13 @@ def __init__(self, filename):
3737
case_data = json.load(f)
3838

3939
index_name = os.path.normpath(
40-
os.path.join(
41-
filename, "..", "..", "index", case_data["index"] + ".json"
42-
),
40+
os.path.join(filename, "..", "..", "index", case_data["index"] + ".json"),
4341
)
4442
with open(index_name) as f:
4543
self.index = json.load(f)
4644

4745
self.root_requirements = [
48-
packaging.requirements.Requirement(r)
49-
for r in case_data["requested"]
46+
packaging.requirements.Requirement(r) for r in case_data["requested"]
5047
]
5148

5249
if "resolved" in case_data:
@@ -182,17 +179,13 @@ def test_resolver(provider, reporter):
182179
if provider.expected_unvisited:
183180
visited_versions = defaultdict(set)
184181
for visited_candidate in reporter.visited:
185-
visited_versions[visited_candidate.name].add(
186-
str(visited_candidate.version)
187-
)
182+
visited_versions[visited_candidate.name].add(str(visited_candidate.version))
188183

189184
for name, versions in provider.expected_unvisited.items():
190185
if name not in visited_versions:
191186
continue
192187

193-
unexpected_versions = set(versions).intersection(
194-
visited_versions[name]
195-
)
188+
unexpected_versions = set(versions).intersection(visited_versions[name])
196189
assert (
197190
not unexpected_versions
198191
), f"Unexpcted versions visited {name}: {', '.join(unexpected_versions)}"

tests/functional/swift-package-manager/test_resolvers_swift.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ def __init__(self, filename):
6666
input_data = json.load(f)
6767

6868
self.containers = {
69-
container["identifier"]: container
70-
for container in input_data["containers"]
69+
container["identifier"]: container for container in input_data["containers"]
7170
}
7271
self.root_requirements = [
7372
Requirement(self.containers[constraint["identifier"]], constraint)

0 commit comments

Comments
 (0)