@@ -838,6 +838,47 @@ class C:
838838 nonlocal __firstlineno__
839839 self .assertRaises (OSError , inspect .getsource , C )
840840
841+ class TestGetsourceStdlib (unittest .TestCase ):
842+ # Test Python implementations of the stdlib modules
843+
844+ def test_getsource_stdlib_collections_abc (self ):
845+ import collections .abc
846+ lines , lineno = inspect .getsourcelines (collections .abc .Sequence )
847+ self .assertEqual (lines [0 ], 'class Sequence(Reversible, Collection):\n ' )
848+ src = inspect .getsource (collections .abc .Sequence )
849+ self .assertEqual (src .splitlines (True ), lines )
850+
851+ def test_getsource_stdlib_tomllib (self ):
852+ import tomllib
853+ self .assertRaises (OSError , inspect .getsource , tomllib .TOMLDecodeError )
854+ self .assertRaises (OSError , inspect .getsourcelines , tomllib .TOMLDecodeError )
855+
856+ def test_getsource_stdlib_abc (self ):
857+ # Pure Python implementation
858+ abc = import_helper .import_fresh_module ('abc' , blocked = ['_abc' ])
859+ with support .swap_item (sys .modules , 'abc' , abc ):
860+ self .assertRaises (OSError , inspect .getsource , abc .ABCMeta )
861+ self .assertRaises (OSError , inspect .getsourcelines , abc .ABCMeta )
862+ # With C acceleration
863+ import abc
864+ try :
865+ src = inspect .getsource (abc .ABCMeta )
866+ lines , lineno = inspect .getsourcelines (abc .ABCMeta )
867+ except OSError :
868+ pass
869+ else :
870+ self .assertEqual (lines [0 ], ' class ABCMeta(type):\n ' )
871+ self .assertEqual (src .splitlines (True ), lines )
872+
873+ def test_getsource_stdlib_decimal (self ):
874+ # Pure Python implementation
875+ decimal = import_helper .import_fresh_module ('decimal' , blocked = ['_decimal' ])
876+ with support .swap_item (sys .modules , 'decimal' , decimal ):
877+ src = inspect .getsource (decimal .Decimal )
878+ lines , lineno = inspect .getsourcelines (decimal .Decimal )
879+ self .assertEqual (lines [0 ], 'class Decimal(object):\n ' )
880+ self .assertEqual (src .splitlines (True ), lines )
881+
841882class TestGetsourceInteractive (unittest .TestCase ):
842883 def test_getclasses_interactive (self ):
843884 # bpo-44648: simulate a REPL session;
@@ -950,6 +991,11 @@ def test_typeddict(self):
950991 self .assertSourceEqual (mod2 .td354 , 354 , 356 )
951992 self .assertRaises (OSError , inspect .getsource , mod2 .td359 )
952993
994+ def test_dataclass (self ):
995+ self .assertSourceEqual (mod2 .dc364 , 364 , 367 )
996+ self .assertRaises (OSError , inspect .getsource , mod2 .dc370 )
997+ self .assertRaises (OSError , inspect .getsource , mod2 .dc371 )
998+
953999class TestBlockComments (GetSourceBase ):
9541000 fodderModule = mod
9551001
@@ -1013,17 +1059,28 @@ def test_findsource_without_filename(self):
10131059 self .assertRaises (IOError , inspect .findsource , co )
10141060 self .assertRaises (IOError , inspect .getsource , co )
10151061
1016- def test_findsource_with_out_of_bounds_lineno (self ):
1062+ def test_findsource_on_func_with_out_of_bounds_lineno (self ):
10171063 mod_len = len (inspect .getsource (mod ))
10181064 src = '\n ' * 2 * mod_len + "def f(): pass"
10191065 co = compile (src , mod .__file__ , "exec" )
10201066 g , l = {}, {}
10211067 eval (co , g , l )
10221068 func = l ['f' ]
10231069 self .assertEqual (func .__code__ .co_firstlineno , 1 + 2 * mod_len )
1024- with self .assertRaisesRegex (IOError , "lineno is out of bounds" ):
1070+ with self .assertRaisesRegex (OSError , "lineno is out of bounds" ):
10251071 inspect .findsource (func )
10261072
1073+ def test_findsource_on_class_with_out_of_bounds_lineno (self ):
1074+ mod_len = len (inspect .getsource (mod ))
1075+ src = '\n ' * 2 * mod_len + "class A: pass"
1076+ co = compile (src , mod .__file__ , "exec" )
1077+ g , l = {'__name__' : mod .__name__ }, {}
1078+ eval (co , g , l )
1079+ cls = l ['A' ]
1080+ self .assertEqual (cls .__firstlineno__ , 1 + 2 * mod_len )
1081+ with self .assertRaisesRegex (OSError , "lineno is out of bounds" ):
1082+ inspect .findsource (cls )
1083+
10271084 def test_getsource_on_method (self ):
10281085 self .assertSourceEqual (mod2 .ClassWithMethod .method , 118 , 119 )
10291086
0 commit comments