@@ -28,8 +28,10 @@ def _fake_install(v, **kwargs):
2828 }
2929
3030INSTALLS = [
31- _fake_install ("1.0" , alias = [{"name" : "test1.0.exe" , "target" : "./test-binary-1.0.exe" }]),
32- _fake_install ("1.1" , alias = [{"name" : "test1.1.exe" , "target" : "./test-binary-1.1.exe" }]),
31+ _fake_install ("1.0" , alias = [{"name" : "test1.0.exe" , "target" : "./test-binary-1.0.exe" },
32+ {"name" : "testw1.0.exe" , "target" : "./test-binary-w-1.0.exe" , "windowed" : 1 }]),
33+ _fake_install ("1.1" , alias = [{"name" : "test1.1.exe" , "target" : "./test-binary-1.1.exe" },
34+ {"name" : "testw1.1.exe" , "target" : "./test-binary-w-1.1.exe" , "windowed" : 1 }]),
3335 _fake_install ("1.3.1" , company = "PythonCore" ),
3436 _fake_install ("1.3.2" , company = "PythonOther" ),
3537 _fake_install ("2.0" , alias = [{"name" : "test2.0.exe" , "target" : "./test-binary-2.0.exe" }]),
@@ -64,12 +66,52 @@ def test_read_shebang(fake_config, tmp_path, script, expect):
6466 script = script .encode ()
6567 script_py .write_bytes (script )
6668 try :
67- actual = find_install_from_script (fake_config , script_py )
69+ actual = find_install_from_script (fake_config , script_py , windowed = False )
6870 assert expect == actual
6971 except LookupError :
7072 assert not expect
7173
7274
75+ @pytest .mark .parametrize ("script, expect, windowed" , [
76+ ("#! /usr/bin/test1.0\n " , "test-binary-1.0.exe" , False ),
77+ ("#! /usr/bin/test1.0\n " , "test-binary-w-1.0.exe" , True ),
78+ ("#! /usr/bin/testw1.0\n " , "test-binary-w-1.0.exe" , False ),
79+ ("#! /usr/bin/testw1.0\n " , "test-binary-w-1.0.exe" , True ),
80+ # No windowed option for 2.0, so picks the regular executable
81+ ("#! /usr/bin/test2.0\n " , "test-binary-2.0.exe" , False ),
82+ ("#! /usr/bin/test2.0\n " , "test-binary-2.0.exe" , True ),
83+ ("#! /usr/bin/testw2.0\n " , None , False ),
84+ ("#! /usr/bin/testw2.0\n " , None , True ),
85+ ("#!test1.0.exe\n " , "test-binary-1.0.exe" , False ),
86+ ("#!test1.0.exe\n " , "test-binary-w-1.0.exe" , True ),
87+ ("#!testw1.0.exe\n " , "test-binary-w-1.0.exe" , False ),
88+ ("#!testw1.0.exe\n " , "test-binary-w-1.0.exe" , True ),
89+ ("#!test1.1.exe\n " , "test-binary-1.1.exe" , False ),
90+ ("#!test1.1.exe\n " , "test-binary-w-1.1.exe" , True ),
91+ ("#!testw1.1.exe\n " , "test-binary-w-1.1.exe" , False ),
92+ ("#!testw1.1.exe\n " , "test-binary-w-1.1.exe" , True ),
93+ # Matching executable name won't be overridden by windowed setting
94+ ("#!test-binary-1.1.exe\n " , "test-binary-1.1.exe" , False ),
95+ ("#!test-binary-1.1.exe\n " , "test-binary-1.1.exe" , True ),
96+ ("#! /usr/bin/env test1.0\n " , "test-binary-1.0.exe" , False ),
97+ ("#! /usr/bin/env test1.0\n " , "test-binary-w-1.0.exe" , True ),
98+ ("#! /usr/bin/env testw1.0\n " , "test-binary-w-1.0.exe" , False ),
99+ ("#! /usr/bin/env testw1.0\n " , "test-binary-w-1.0.exe" , True ),
100+ ])
101+ def test_read_shebang_windowed (fake_config , tmp_path , script , expect , windowed ):
102+ fake_config .installs .extend (INSTALLS )
103+
104+ script_py = tmp_path / "test-script.py"
105+ if isinstance (script , str ):
106+ script = script .encode ()
107+ script_py .write_bytes (script )
108+ try :
109+ actual = find_install_from_script (fake_config , script_py , windowed = windowed )
110+ assert actual ["executable" ].match (expect )
111+ except LookupError :
112+ assert not expect
113+
114+
73115def test_default_py_shebang (fake_config , tmp_path ):
74116 inst = _fake_install ("1.0" , company = "PythonCore" , prefix = PurePath ("C:\\ TestRoot" ), default = True )
75117 inst ["run-for" ] = [
@@ -78,14 +120,17 @@ def test_default_py_shebang(fake_config, tmp_path):
78120 ]
79121 fake_config .installs [:] = [inst ]
80122
123+ def t (n ):
124+ return _find_shebang_command (fake_config , n , windowed = False )
125+
81126 # Finds the install's default executable
82- assert _find_shebang_command ( fake_config , "python" )["executable" ].match ("test-binary-1.0.exe" )
83- assert _find_shebang_command ( fake_config , "py" )["executable" ].match ("test-binary-1.0.exe" )
84- assert _find_shebang_command ( fake_config , "python1.0" )["executable" ].match ("test-binary-1.0.exe" )
127+ assert t ( "python" )["executable" ].match ("test-binary-1.0.exe" )
128+ assert t ( "py" )["executable" ].match ("test-binary-1.0.exe" )
129+ assert t ( "python1.0" )["executable" ].match ("test-binary-1.0.exe" )
85130 # Finds the install's run-for executable with windowed=1
86- assert _find_shebang_command ( fake_config , "pythonw" )["executable" ].match ("pythonw.exe" )
87- assert _find_shebang_command ( fake_config , "pyw" )["executable" ].match ("pythonw.exe" )
88- assert _find_shebang_command ( fake_config , "pythonw1.0" )["executable" ].match ("pythonw.exe" )
131+ assert t ( "pythonw" )["executable" ].match ("pythonw.exe" )
132+ assert t ( "pyw" )["executable" ].match ("pythonw.exe" )
133+ assert t ( "pythonw1.0" )["executable" ].match ("pythonw.exe" )
89134
90135
91136
@@ -104,7 +149,7 @@ def test_read_coding_comment(fake_config, tmp_path, script, expect):
104149 script = script .encode ()
105150 script_py .write_bytes (script )
106151 try :
107- _read_script (fake_config , script_py , "utf-8-sig" )
152+ _read_script (fake_config , script_py , "utf-8-sig" , windowed = False )
108153 except NewEncoding as enc :
109154 assert enc .args [0 ] == expect
110155 except LookupError :
0 commit comments