@@ -835,6 +835,47 @@ class C:
835
835
nonlocal __firstlineno__
836
836
self .assertRaises (OSError , inspect .getsource , C )
837
837
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
+
838
879
class TestGetsourceInteractive (unittest .TestCase ):
839
880
def test_getclasses_interactive (self ):
840
881
# bpo-44648: simulate a REPL session;
@@ -947,6 +988,11 @@ def test_typeddict(self):
947
988
self .assertSourceEqual (mod2 .td354 , 354 , 356 )
948
989
self .assertRaises (OSError , inspect .getsource , mod2 .td359 )
949
990
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
+
950
996
class TestBlockComments (GetSourceBase ):
951
997
fodderModule = mod
952
998
@@ -1010,17 +1056,28 @@ def test_findsource_without_filename(self):
1010
1056
self .assertRaises (IOError , inspect .findsource , co )
1011
1057
self .assertRaises (IOError , inspect .getsource , co )
1012
1058
1013
- def test_findsource_with_out_of_bounds_lineno (self ):
1059
+ def test_findsource_on_func_with_out_of_bounds_lineno (self ):
1014
1060
mod_len = len (inspect .getsource (mod ))
1015
1061
src = '\n ' * 2 * mod_len + "def f(): pass"
1016
1062
co = compile (src , mod .__file__ , "exec" )
1017
1063
g , l = {}, {}
1018
1064
eval (co , g , l )
1019
1065
func = l ['f' ]
1020
1066
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" ):
1022
1068
inspect .findsource (func )
1023
1069
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
+
1024
1081
def test_getsource_on_method (self ):
1025
1082
self .assertSourceEqual (mod2 .ClassWithMethod .method , 118 , 119 )
1026
1083
0 commit comments