@@ -2618,13 +2618,29 @@ def _run_pdb(self, pdb_args, commands,
2618
2618
2619
2619
def run_pdb_script (self , script , commands ,
2620
2620
expected_returncode = 0 ,
2621
- extra_env = None ):
2621
+ extra_env = None ,
2622
+ pdbrc = None ,
2623
+ remove_home = False ):
2622
2624
"""Run 'script' lines with pdb and the pdb 'commands'."""
2623
2625
filename = 'main.py'
2624
2626
with open (filename , 'w' ) as f :
2625
2627
f .write (textwrap .dedent (script ))
2628
+
2629
+ if pdbrc is not None :
2630
+ with open ('.pdbrc' , 'w' ) as f :
2631
+ f .write (textwrap .dedent (pdbrc ))
2632
+ self .addCleanup (os_helper .unlink , '.pdbrc' )
2626
2633
self .addCleanup (os_helper .unlink , filename )
2627
- return self ._run_pdb ([filename ], commands , expected_returncode , extra_env )
2634
+
2635
+ homesave = None
2636
+ if remove_home :
2637
+ homesave = os .environ .pop ('HOME' , None )
2638
+ try :
2639
+ stdout , stderr = self ._run_pdb ([filename ], commands , expected_returncode , extra_env )
2640
+ finally :
2641
+ if homesave is not None :
2642
+ os .environ ['HOME' ] = homesave
2643
+ return stdout , stderr
2628
2644
2629
2645
def run_pdb_module (self , script , commands ):
2630
2646
"""Runs the script code as part of a module"""
@@ -2904,37 +2920,80 @@ def test_issue26053(self):
2904
2920
self .assertRegex (res , "Restarting .* with arguments:\n a b c" )
2905
2921
self .assertRegex (res , "Restarting .* with arguments:\n d e f" )
2906
2922
2907
- def test_readrc_kwarg (self ):
2923
+ def test_pdbrc_basic (self ):
2908
2924
script = textwrap .dedent ("""
2909
- import pdb; pdb.Pdb(readrc=False).set_trace()
2925
+ a = 1
2926
+ b = 2
2927
+ """ )
2910
2928
2911
- print('hello')
2929
+ pdbrc = textwrap .dedent ("""
2930
+ # Comments should be fine
2931
+ n
2932
+ p f"{a+8=}"
2912
2933
""" )
2913
2934
2914
- save_home = os .environ .pop ('HOME' , None )
2915
- try :
2916
- with os_helper .temp_cwd ():
2917
- with open ('.pdbrc' , 'w' ) as f :
2918
- f .write ("invalid\n " )
2919
-
2920
- with open ('main.py' , 'w' ) as f :
2921
- f .write (script )
2922
-
2923
- cmd = [sys .executable , 'main.py' ]
2924
- proc = subprocess .Popen (
2925
- cmd ,
2926
- stdout = subprocess .PIPE ,
2927
- stdin = subprocess .PIPE ,
2928
- stderr = subprocess .PIPE ,
2929
- )
2930
- with proc :
2931
- stdout , stderr = proc .communicate (b'q\n ' )
2932
- self .assertNotIn (b"NameError: name 'invalid' is not defined" ,
2933
- stdout )
2935
+ stdout , stderr = self .run_pdb_script (script , 'q\n ' , pdbrc = pdbrc , remove_home = True )
2936
+ self .assertIn ("a+8=9" , stdout )
2934
2937
2935
- finally :
2936
- if save_home is not None :
2937
- os .environ ['HOME' ] = save_home
2938
+ def test_pdbrc_alias (self ):
2939
+ script = textwrap .dedent ("""
2940
+ class A:
2941
+ def __init__(self):
2942
+ self.attr = 1
2943
+ a = A()
2944
+ b = 2
2945
+ """ )
2946
+
2947
+ pdbrc = textwrap .dedent ("""
2948
+ alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")
2949
+ until 6
2950
+ pi a
2951
+ """ )
2952
+
2953
+ stdout , stderr = self .run_pdb_script (script , 'q\n ' , pdbrc = pdbrc , remove_home = True )
2954
+ self .assertIn ("a.attr = 1" , stdout )
2955
+
2956
+ def test_pdbrc_semicolon (self ):
2957
+ script = textwrap .dedent ("""
2958
+ class A:
2959
+ def __init__(self):
2960
+ self.attr = 1
2961
+ a = A()
2962
+ b = 2
2963
+ """ )
2964
+
2965
+ pdbrc = textwrap .dedent ("""
2966
+ b 5;;c;;n
2967
+ """ )
2968
+
2969
+ stdout , stderr = self .run_pdb_script (script , 'q\n ' , pdbrc = pdbrc , remove_home = True )
2970
+ self .assertIn ("-> b = 2" , stdout )
2971
+
2972
+ def test_pdbrc_commands (self ):
2973
+ script = textwrap .dedent ("""
2974
+ class A:
2975
+ def __init__(self):
2976
+ self.attr = 1
2977
+ a = A()
2978
+ b = 2
2979
+ """ )
2980
+
2981
+ pdbrc = textwrap .dedent ("""
2982
+ b 6
2983
+ commands 1 ;; p a;; end
2984
+ c
2985
+ """ )
2986
+
2987
+ stdout , stderr = self .run_pdb_script (script , 'q\n ' , pdbrc = pdbrc , remove_home = True )
2988
+ self .assertIn ("<__main__.A object at" , stdout )
2989
+
2990
+ def test_readrc_kwarg (self ):
2991
+ script = textwrap .dedent ("""
2992
+ print('hello')
2993
+ """ )
2994
+
2995
+ stdout , stderr = self .run_pdb_script (script , 'q\n ' , pdbrc = 'invalid' , remove_home = True )
2996
+ self .assertIn ("NameError: name 'invalid' is not defined" , stdout )
2938
2997
2939
2998
def test_readrc_homedir (self ):
2940
2999
save_home = os .environ .pop ("HOME" , None )
@@ -2949,40 +3008,6 @@ def test_readrc_homedir(self):
2949
3008
if save_home is not None :
2950
3009
os .environ ["HOME" ] = save_home
2951
3010
2952
- def test_read_pdbrc_with_ascii_encoding (self ):
2953
- script = textwrap .dedent ("""
2954
- import pdb; pdb.Pdb().set_trace()
2955
- print('hello')
2956
- """ )
2957
- save_home = os .environ .pop ('HOME' , None )
2958
- try :
2959
- with os_helper .temp_cwd ():
2960
- with open ('.pdbrc' , 'w' , encoding = 'utf-8' ) as f :
2961
- f .write ("Fran\u00E7 ais" )
2962
-
2963
- with open ('main.py' , 'w' , encoding = 'utf-8' ) as f :
2964
- f .write (script )
2965
-
2966
- cmd = [sys .executable , 'main.py' ]
2967
- env = {'PYTHONIOENCODING' : 'ascii' }
2968
- if sys .platform == 'win32' :
2969
- env ['PYTHONLEGACYWINDOWSSTDIO' ] = 'non-empty-string'
2970
- proc = subprocess .Popen (
2971
- cmd ,
2972
- stdout = subprocess .PIPE ,
2973
- stdin = subprocess .PIPE ,
2974
- stderr = subprocess .PIPE ,
2975
- env = {** os .environ , ** env }
2976
- )
2977
- with proc :
2978
- stdout , stderr = proc .communicate (b'c\n ' )
2979
- self .assertIn (b"UnicodeEncodeError: \' ascii\' codec can\' t encode character "
2980
- b"\' \\ xe7\' in position 21: ordinal not in range(128)" , stderr )
2981
-
2982
- finally :
2983
- if save_home is not None :
2984
- os .environ ['HOME' ] = save_home
2985
-
2986
3011
def test_header (self ):
2987
3012
stdout = StringIO ()
2988
3013
header = 'Nobody expects... blah, blah, blah'
0 commit comments