1+ import abc
12import errno
23import inspect
34import os
45import stat
56import sys
7+ import warnings
8+
9+ import pytest
610
711from ..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
181205class SubclassWalker (_classWalker ):
182206 def walk_derivatives (self , cls , seen = None ):
0 commit comments