6
6
import io
7
7
import operator
8
8
import os
9
+ import py_compile
9
10
import shutil
10
11
import stat
11
12
import sys
15
16
import argparse
16
17
import warnings
17
18
18
- from test .support import os_helper , captured_stderr
19
+ from test .support import captured_stderr
20
+ from test .support import import_helper
21
+ from test .support import os_helper
22
+ from test .support import script_helper
19
23
from unittest import mock
20
24
21
25
26
+ py = os .path .basename (sys .executable )
27
+
28
+
22
29
class StdIOBuffer (io .TextIOWrapper ):
23
30
'''Replacement for writable io.StringIO that behaves more like real file
24
31
@@ -2780,8 +2787,6 @@ def setUp(self):
2780
2787
group .add_argument ('-a' , action = 'store_true' )
2781
2788
group .add_argument ('-b' , action = 'store_true' )
2782
2789
2783
- self .main_program = os .path .basename (sys .argv [0 ])
2784
-
2785
2790
def test_single_parent (self ):
2786
2791
parser = ErrorRaisingArgumentParser (parents = [self .wxyz_parent ])
2787
2792
self .assertEqual (parser .parse_args ('-y 1 2 --w 3' .split ()),
@@ -2871,11 +2876,10 @@ def test_subparser_parents_mutex(self):
2871
2876
2872
2877
def test_parent_help (self ):
2873
2878
parents = [self .abcd_parent , self .wxyz_parent ]
2874
- parser = ErrorRaisingArgumentParser (parents = parents )
2879
+ parser = ErrorRaisingArgumentParser (prog = 'PROG' , parents = parents )
2875
2880
parser_help = parser .format_help ()
2876
- progname = self .main_program
2877
2881
self .assertEqual (parser_help , textwrap .dedent ('''\
2878
- usage: {}{} [-h] [-b B] [--d D] [--w W] [-y Y] a z
2882
+ usage: PROG [-h] [-b B] [--d D] [--w W] [-y Y] a z
2879
2883
2880
2884
positional arguments:
2881
2885
a
@@ -2891,7 +2895,7 @@ def test_parent_help(self):
2891
2895
2892
2896
x:
2893
2897
-y Y
2894
- ''' . format ( progname , ' ' if progname else '' ) ))
2898
+ ''' ))
2895
2899
2896
2900
def test_groups_parents (self ):
2897
2901
parent = ErrorRaisingArgumentParser (add_help = False )
@@ -2901,15 +2905,14 @@ def test_groups_parents(self):
2901
2905
m = parent .add_mutually_exclusive_group ()
2902
2906
m .add_argument ('-y' )
2903
2907
m .add_argument ('-z' )
2904
- parser = ErrorRaisingArgumentParser (parents = [parent ])
2908
+ parser = ErrorRaisingArgumentParser (prog = 'PROG' , parents = [parent ])
2905
2909
2906
2910
self .assertRaises (ArgumentParserError , parser .parse_args ,
2907
2911
['-y' , 'Y' , '-z' , 'Z' ])
2908
2912
2909
2913
parser_help = parser .format_help ()
2910
- progname = self .main_program
2911
2914
self .assertEqual (parser_help , textwrap .dedent ('''\
2912
- usage: {}{} [-h] [-w W] [-x X] [-y Y | -z Z]
2915
+ usage: PROG [-h] [-w W] [-x X] [-y Y | -z Z]
2913
2916
2914
2917
options:
2915
2918
-h, --help show this help message and exit
@@ -2921,7 +2924,7 @@ def test_groups_parents(self):
2921
2924
2922
2925
-w W
2923
2926
-x X
2924
- ''' . format ( progname , ' ' if progname else '' ) ))
2927
+ ''' ))
2925
2928
2926
2929
def test_wrong_type_parents (self ):
2927
2930
self .assertRaises (TypeError , ErrorRaisingArgumentParser , parents = [1 ])
@@ -6561,6 +6564,99 @@ def test_os_error(self):
6561
6564
self .parser .parse_args , ['@no-such-file' ])
6562
6565
6563
6566
6567
+ class TestProgName (TestCase ):
6568
+ source = textwrap .dedent ('''\
6569
+ import argparse
6570
+ parser = argparse.ArgumentParser()
6571
+ parser.parse_args()
6572
+ ''' )
6573
+
6574
+ def setUp (self ):
6575
+ self .dirname = 'package' + os_helper .FS_NONASCII
6576
+ self .addCleanup (os_helper .rmtree , self .dirname )
6577
+ os .mkdir (self .dirname )
6578
+
6579
+ def make_script (self , dirname , basename , * , compiled = False ):
6580
+ script_name = script_helper .make_script (dirname , basename , self .source )
6581
+ if not compiled :
6582
+ return script_name
6583
+ py_compile .compile (script_name , doraise = True )
6584
+ os .remove (script_name )
6585
+ pyc_file = import_helper .make_legacy_pyc (script_name )
6586
+ return pyc_file
6587
+
6588
+ def make_zip_script (self , script_name , name_in_zip = None ):
6589
+ zip_name , _ = script_helper .make_zip_script (self .dirname , 'test_zip' ,
6590
+ script_name , name_in_zip )
6591
+ return zip_name
6592
+
6593
+ def check_usage (self , expected , * args , ** kwargs ):
6594
+ res = script_helper .assert_python_ok ('-Xutf8' , * args , '-h' , ** kwargs )
6595
+ self .assertEqual (res .out .splitlines ()[0 ].decode (),
6596
+ f'usage: { expected } [-h]' )
6597
+
6598
+ def test_script (self , compiled = False ):
6599
+ basename = os_helper .TESTFN
6600
+ script_name = self .make_script (self .dirname , basename , compiled = compiled )
6601
+ self .check_usage (os .path .basename (script_name ), script_name , '-h' )
6602
+
6603
+ def test_script_compiled (self ):
6604
+ self .test_script (compiled = True )
6605
+
6606
+ def test_directory (self , compiled = False ):
6607
+ dirname = os .path .join (self .dirname , os_helper .TESTFN )
6608
+ os .mkdir (dirname )
6609
+ self .make_script (dirname , '__main__' , compiled = compiled )
6610
+ self .check_usage (f'{ py } { dirname } ' , dirname )
6611
+ dirname2 = os .path .join (os .curdir , dirname )
6612
+ self .check_usage (f'{ py } { dirname2 } ' , dirname2 )
6613
+
6614
+ def test_directory_compiled (self ):
6615
+ self .test_directory (compiled = True )
6616
+
6617
+ def test_module (self , compiled = False ):
6618
+ basename = 'module' + os_helper .FS_NONASCII
6619
+ modulename = f'{ self .dirname } .{ basename } '
6620
+ self .make_script (self .dirname , basename , compiled = compiled )
6621
+ self .check_usage (f'{ py } -m { modulename } ' ,
6622
+ '-m' , modulename , PYTHONPATH = os .curdir )
6623
+
6624
+ def test_module_compiled (self ):
6625
+ self .test_module (compiled = True )
6626
+
6627
+ def test_package (self , compiled = False ):
6628
+ basename = 'subpackage' + os_helper .FS_NONASCII
6629
+ packagename = f'{ self .dirname } .{ basename } '
6630
+ subdirname = os .path .join (self .dirname , basename )
6631
+ os .mkdir (subdirname )
6632
+ self .make_script (subdirname , '__main__' , compiled = compiled )
6633
+ self .check_usage (f'{ py } -m { packagename } ' ,
6634
+ '-m' , packagename , PYTHONPATH = os .curdir )
6635
+ self .check_usage (f'{ py } -m { packagename } ' ,
6636
+ '-m' , packagename + '.__main__' , PYTHONPATH = os .curdir )
6637
+
6638
+ def test_package_compiled (self ):
6639
+ self .test_package (compiled = True )
6640
+
6641
+ def test_zipfile (self , compiled = False ):
6642
+ script_name = self .make_script (self .dirname , '__main__' , compiled = compiled )
6643
+ zip_name = self .make_zip_script (script_name )
6644
+ self .check_usage (f'{ py } { zip_name } ' , zip_name )
6645
+
6646
+ def test_zipfile_compiled (self ):
6647
+ self .test_zipfile (compiled = True )
6648
+
6649
+ def test_directory_in_zipfile (self , compiled = False ):
6650
+ script_name = self .make_script (self .dirname , '__main__' , compiled = compiled )
6651
+ name_in_zip = 'package/subpackage/__main__' + ('.py' , '.pyc' )[compiled ]
6652
+ zip_name = self .make_zip_script (script_name , name_in_zip )
6653
+ dirname = os .path .join (zip_name , 'package' , 'subpackage' )
6654
+ self .check_usage (f'{ py } { dirname } ' , dirname )
6655
+
6656
+ def test_directory_in_zipfile_compiled (self ):
6657
+ self .test_directory_in_zipfile (compiled = True )
6658
+
6659
+
6564
6660
def tearDownModule ():
6565
6661
# Remove global references to avoid looking like we have refleaks.
6566
6662
RFile .seen = {}
0 commit comments