@@ -835,6 +835,47 @@ class C:
835835 nonlocal __firstlineno__
836836 self .assertRaises (OSError , inspect .getsource , C )
837837
838+ class TestGetsourceStdlib (unittest .TestCase ):
839+ # Test Python implementations of the stdlib modules
840+
841+ def test_getsource_stdlib_collections_abc (self ):
842+ import collections .abc
843+ lines , lineno = inspect .getsourcelines (collections .abc .Sequence )
844+ self .assertEqual (lines [0 ], 'class Sequence(Reversible, Collection):\n ' )
845+ src = inspect .getsource (collections .abc .Sequence )
846+ self .assertEqual (src .splitlines (True ), lines )
847+
848+ def test_getsource_stdlib_tomllib (self ):
849+ import tomllib
850+ self .assertRaises (OSError , inspect .getsource , tomllib .TOMLDecodeError )
851+ self .assertRaises (OSError , inspect .getsourcelines , tomllib .TOMLDecodeError )
852+
853+ def test_getsource_stdlib_abc (self ):
854+ # Pure Python implementation
855+ abc = import_helper .import_fresh_module ('abc' , blocked = ['_abc' ])
856+ with support .swap_item (sys .modules , 'abc' , abc ):
857+ self .assertRaises (OSError , inspect .getsource , abc .ABCMeta )
858+ self .assertRaises (OSError , inspect .getsourcelines , abc .ABCMeta )
859+ # With C acceleration
860+ import abc
861+ try :
862+ src = inspect .getsource (abc .ABCMeta )
863+ lines , lineno = inspect .getsourcelines (abc .ABCMeta )
864+ except OSError :
865+ pass
866+ else :
867+ self .assertEqual (lines [0 ], ' class ABCMeta(type):\n ' )
868+ self .assertEqual (src .splitlines (True ), lines )
869+
870+ def test_getsource_stdlib_decimal (self ):
871+ # Pure Python implementation
872+ decimal = import_helper .import_fresh_module ('decimal' , blocked = ['_decimal' ])
873+ with support .swap_item (sys .modules , 'decimal' , decimal ):
874+ src = inspect .getsource (decimal .Decimal )
875+ lines , lineno = inspect .getsourcelines (decimal .Decimal )
876+ self .assertEqual (lines [0 ], 'class Decimal(object):\n ' )
877+ self .assertEqual (src .splitlines (True ), lines )
878+
838879class TestGetsourceInteractive (unittest .TestCase ):
839880 def test_getclasses_interactive (self ):
840881 # bpo-44648: simulate a REPL session;
@@ -947,6 +988,11 @@ def test_typeddict(self):
947988 self .assertSourceEqual (mod2 .td354 , 354 , 356 )
948989 self .assertRaises (OSError , inspect .getsource , mod2 .td359 )
949990
991+ def test_dataclass (self ):
992+ self .assertSourceEqual (mod2 .dc364 , 364 , 367 )
993+ self .assertRaises (OSError , inspect .getsource , mod2 .dc370 )
994+ self .assertRaises (OSError , inspect .getsource , mod2 .dc371 )
995+
950996class TestBlockComments (GetSourceBase ):
951997 fodderModule = mod
952998
@@ -1010,17 +1056,28 @@ def test_findsource_without_filename(self):
10101056 self .assertRaises (IOError , inspect .findsource , co )
10111057 self .assertRaises (IOError , inspect .getsource , co )
10121058
1013- def test_findsource_with_out_of_bounds_lineno (self ):
1059+ def test_findsource_on_func_with_out_of_bounds_lineno (self ):
10141060 mod_len = len (inspect .getsource (mod ))
10151061 src = '\n ' * 2 * mod_len + "def f(): pass"
10161062 co = compile (src , mod .__file__ , "exec" )
10171063 g , l = {}, {}
10181064 eval (co , g , l )
10191065 func = l ['f' ]
10201066 self .assertEqual (func .__code__ .co_firstlineno , 1 + 2 * mod_len )
1021- with self .assertRaisesRegex (IOError , "lineno is out of bounds" ):
1067+ with self .assertRaisesRegex (OSError , "lineno is out of bounds" ):
10221068 inspect .findsource (func )
10231069
1070+ def test_findsource_on_class_with_out_of_bounds_lineno (self ):
1071+ mod_len = len (inspect .getsource (mod ))
1072+ src = '\n ' * 2 * mod_len + "class A: pass"
1073+ co = compile (src , mod .__file__ , "exec" )
1074+ g , l = {'__name__' : mod .__name__ }, {}
1075+ eval (co , g , l )
1076+ cls = l ['A' ]
1077+ self .assertEqual (cls .__firstlineno__ , 1 + 2 * mod_len )
1078+ with self .assertRaisesRegex (OSError , "lineno is out of bounds" ):
1079+ inspect .findsource (cls )
1080+
10241081 def test_getsource_on_method (self ):
10251082 self .assertSourceEqual (mod2 .ClassWithMethod .method , 118 , 119 )
10261083
0 commit comments