@@ -233,3 +233,204 @@ class D(B, C): pass
233233expected = (D , B , C , A , object )
234234got = inspect .getmro (D )
235235test (expected == got , "expected %r mro, got %r" , expected , got )
236+
237+ # Test classify_class_attrs.
238+ def attrs_wo_objs (cls ):
239+ return [t [:3 ] for t in inspect .classify_class_attrs (cls )]
240+
241+ class A :
242+ def s (): pass
243+ s = staticmethod (s )
244+
245+ def c (cls ): pass
246+ c = classmethod (c )
247+
248+ def getp (self ): pass
249+ p = property (getp )
250+
251+ def m (self ): pass
252+
253+ def m1 (self ): pass
254+
255+ datablob = '1'
256+
257+ attrs = attrs_wo_objs (A )
258+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
259+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
260+ test (('p' , 'property' , A ) in attrs , 'missing property' )
261+ test (('m' , 'method' , A ) in attrs , 'missing plain method' )
262+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
263+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
264+
265+ class B (A ):
266+ def m (self ): pass
267+
268+ attrs = attrs_wo_objs (B )
269+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
270+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
271+ test (('p' , 'property' , A ) in attrs , 'missing property' )
272+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
273+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
274+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
275+
276+
277+ class C (A ):
278+ def m (self ): pass
279+ def c (self ): pass
280+
281+ attrs = attrs_wo_objs (C )
282+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
283+ test (('c' , 'method' , C ) in attrs , 'missing plain method' )
284+ test (('p' , 'property' , A ) in attrs , 'missing property' )
285+ test (('m' , 'method' , C ) in attrs , 'missing plain method' )
286+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
287+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
288+
289+ class D (B , C ):
290+ def m1 (self ): pass
291+
292+ attrs = attrs_wo_objs (D )
293+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
294+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
295+ test (('p' , 'property' , A ) in attrs , 'missing property' )
296+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
297+ test (('m1' , 'method' , D ) in attrs , 'missing plain method' )
298+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
299+
300+ # Repeat all that, but w/ new-style non-dynamic classes.
301+
302+ class A (object ):
303+ __dynamic__ = 0
304+
305+ def s (): pass
306+ s = staticmethod (s )
307+
308+ def c (cls ): pass
309+ c = classmethod (c )
310+
311+ def getp (self ): pass
312+ p = property (getp )
313+
314+ def m (self ): pass
315+
316+ def m1 (self ): pass
317+
318+ datablob = '1'
319+
320+ attrs = attrs_wo_objs (A )
321+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
322+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
323+ test (('p' , 'property' , A ) in attrs , 'missing property' )
324+ test (('m' , 'method' , A ) in attrs , 'missing plain method' )
325+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
326+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
327+
328+ class B (A ):
329+ __dynamic__ = 0
330+
331+ def m (self ): pass
332+
333+ attrs = attrs_wo_objs (B )
334+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
335+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
336+ test (('p' , 'property' , A ) in attrs , 'missing property' )
337+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
338+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
339+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
340+
341+
342+ class C (A ):
343+ __dynamic__ = 0
344+
345+ def m (self ): pass
346+ def c (self ): pass
347+
348+ attrs = attrs_wo_objs (C )
349+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
350+ test (('c' , 'method' , C ) in attrs , 'missing plain method' )
351+ test (('p' , 'property' , A ) in attrs , 'missing property' )
352+ test (('m' , 'method' , C ) in attrs , 'missing plain method' )
353+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
354+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
355+
356+ class D (B , C ):
357+ __dynamic__ = 0
358+
359+ def m1 (self ): pass
360+
361+ attrs = attrs_wo_objs (D )
362+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
363+ test (('c' , 'method' , C ) in attrs , 'missing plain method' )
364+ test (('p' , 'property' , A ) in attrs , 'missing property' )
365+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
366+ test (('m1' , 'method' , D ) in attrs , 'missing plain method' )
367+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
368+
369+ # And again, but w/ new-style dynamic classes.
370+
371+ class A (object ):
372+ __dynamic__ = 1
373+
374+ def s (): pass
375+ s = staticmethod (s )
376+
377+ def c (cls ): pass
378+ c = classmethod (c )
379+
380+ def getp (self ): pass
381+ p = property (getp )
382+
383+ def m (self ): pass
384+
385+ def m1 (self ): pass
386+
387+ datablob = '1'
388+
389+ attrs = attrs_wo_objs (A )
390+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
391+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
392+ test (('p' , 'property' , A ) in attrs , 'missing property' )
393+ test (('m' , 'method' , A ) in attrs , 'missing plain method' )
394+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
395+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
396+
397+ class B (A ):
398+ __dynamic__ = 1
399+
400+ def m (self ): pass
401+
402+ attrs = attrs_wo_objs (B )
403+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
404+ test (('c' , 'class method' , A ) in attrs , 'missing class method' )
405+ test (('p' , 'property' , A ) in attrs , 'missing property' )
406+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
407+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
408+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
409+
410+
411+ class C (A ):
412+ __dynamic__ = 1
413+
414+ def m (self ): pass
415+ def c (self ): pass
416+
417+ attrs = attrs_wo_objs (C )
418+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
419+ test (('c' , 'method' , C ) in attrs , 'missing plain method' )
420+ test (('p' , 'property' , A ) in attrs , 'missing property' )
421+ test (('m' , 'method' , C ) in attrs , 'missing plain method' )
422+ test (('m1' , 'method' , A ) in attrs , 'missing plain method' )
423+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
424+
425+ class D (B , C ):
426+ __dynamic__ = 1
427+
428+ def m1 (self ): pass
429+
430+ attrs = attrs_wo_objs (D )
431+ test (('s' , 'static method' , A ) in attrs , 'missing static method' )
432+ test (('c' , 'method' , C ) in attrs , 'missing plain method' )
433+ test (('p' , 'property' , A ) in attrs , 'missing property' )
434+ test (('m' , 'method' , B ) in attrs , 'missing plain method' )
435+ test (('m1' , 'method' , D ) in attrs , 'missing plain method' )
436+ test (('datablob' , 'data' , A ) in attrs , 'missing data' )
0 commit comments