Skip to content

Commit 0626ecb

Browse files
committed
chore: make tooling like slot_shadow able to report all issues
Change this implementation so it collects all issues, instead of failing out for the first issue found. Signed-off-by: Brian Harring <ferringb@gmail.com>
1 parent caafeee commit 0626ecb

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/snakeoil/test/mixins.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import abc
12
import errno
23
import inspect
34
import os
45
import stat
56
import sys
7+
import warnings
8+
9+
import pytest
610

711
from ..compatibility import IGNORED_EXCEPTIONS
812

@@ -142,13 +146,29 @@ def load_namespaces(self, namespace=None):
142146
pass
143147

144148

145-
class _classWalker:
149+
class _classWalker(abc.ABC):
146150
cls_blacklist = frozenset()
151+
collected_issues: list[str]
152+
153+
@pytest.fixture(scope="function")
154+
@staticmethod
155+
def issue_collector(request):
156+
request.cls.collected_issues = []
157+
yield request.cls.collected_issues
158+
collected = request.cls.collected_issues
159+
if not collected:
160+
return
161+
collected_issues = sorted(collected)
162+
if getattr(request.cls, "strict"):
163+
s = "\n".join(collected_issues)
164+
pytest.fail(f"multiple failures detected:\n{s}")
165+
for issue in collected_issues:
166+
warnings.warn(issue)
147167

148168
def is_blacklisted(self, cls):
149169
return cls.__name__ in self.cls_blacklist
150170

151-
def test_object_derivatives(self, *args, **kwds):
171+
def test_object_derivatives(self, *args, issue_collector, **kwds):
152172
# first load all namespaces...
153173
self.load_namespaces()
154174

@@ -164,7 +184,7 @@ def iter_builtin_targets(self):
164184
continue
165185
yield obj
166186

167-
def test_builtin_derivatives(self, *args, **kwds):
187+
def test_builtin_derivatives(self, *args, issue_collector, **kwds):
168188
self.load_namespaces()
169189
for obj in self.iter_builtin_targets():
170190
for cls in self.walk_derivatives(obj, *args, **kwds):
@@ -174,9 +194,13 @@ def test_builtin_derivatives(self, *args, **kwds):
174194
def walk_derivatives(self, obj):
175195
raise NotImplementedError(self.__class__, "walk_derivatives")
176196

177-
def run_check(self, cls):
197+
@abc.abstractmethod
198+
def run_check(self, cls: type) -> None:
178199
raise NotImplementedError
179200

201+
def report_issue(self, message):
202+
self.collected_issues.append(message)
203+
180204

181205
class SubclassWalker(_classWalker):
182206
def walk_derivatives(self, cls, seen=None):

src/snakeoil/test/slot_shadowing.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
import warnings
2-
3-
import pytest
4-
51
from . import mixins
62

73

@@ -86,9 +82,3 @@ def run_check(self, kls):
8682
self.report_issue(
8783
f"cls {kls!r}; slot {slot!r} was already defined at {slotting[slot]!r}"
8884
)
89-
90-
def report_issue(self, message):
91-
if self.strict:
92-
pytest.fail(message)
93-
else:
94-
warnings.warn(f"slot_shadowing detected: {message}")

0 commit comments

Comments
 (0)