Remove EOL Python code, set 3.9 as base, add 3.14 stdlib module (#317)

* Remove redundant Python 2 code

* Use Python 3.2 as base version

* Use Python 3.3 as base version

* Use Python 3.4 as base version

* Use Python 3.5 as base version

* Use Python 3.6 as base version

* Use Python 3.7 as base version

* Use Python 3.8 as base version

* Use Python 3.9 as base version

* Add annotationlib for Python 3.14

* Fix syntax error
This commit is contained in:
Hugo van Kemenade
2025-04-24 23:29:21 +03:00
committed by GitHub
parent 5c01d17435
commit d5e8ad6406
8 changed files with 39 additions and 155 deletions

View File

@@ -31,14 +31,6 @@ class macOSPythonBuilder : NixPythonBuilder {
.SYNOPSIS .SYNOPSIS
Prepare system environment by installing dependencies and required packages. Prepare system environment by installing dependencies and required packages.
#> #>
if ($this.Version -eq "3.7.17") {
# We have preinstalled ncurses and readLine on the hoster runners. But we need to install bzip2 for
# setting up an environemnt
# If we get any issues realted to ncurses or readline we can try to run this command
# brew install ncurses readline
Execute-Command -Command "brew install bzip2"
}
} }
[void] Configure() { [void] Configure() {
@@ -58,46 +50,20 @@ class macOSPythonBuilder : NixPythonBuilder {
### will never be used itself by a Github Actions runner but using a universal2 Python is the only way to build ### will never be used itself by a Github Actions runner but using a universal2 Python is the only way to build
### universal2 C extensions and wheels. This is supported by Python >= 3.10 and was backported to Python >= ### universal2 C extensions and wheels. This is supported by Python >= 3.10 and was backported to Python >=
### 3.9.1 and >= 3.8.10. ### 3.9.1 and >= 3.8.10.
### Disabled, discussion: https://github.com/actions/python-versions/pull/114
# if ($this.Version -ge "3.8.10" -and $this.Version -ne "3.8.13" -and $this.Version -ne "3.9.0" ) {
# $configureString += " --enable-universalsdk --with-universal-archs=universal2"
# }
### OS X 10.11, Apple no longer provides header files for the deprecated system version of OpenSSL. ### OS X 10.11, Apple no longer provides header files for the deprecated system version of OpenSSL.
### Solution is to install these libraries from a third-party package manager, ### Solution is to install these libraries from a third-party package manager,
### and then add the appropriate paths for the header and library files to configure command. ### and then add the appropriate paths for the header and library files to configure command.
### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies) ### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies)
if ($this.Version -lt "3.7.0") {
$env:LDFLAGS = "-L/usr/local/opt/openssl@3/lib -L/usr/local/opt/zlib/lib"
$env:CFLAGS = "-I/usr/local/opt/openssl@3/include -I/usr/local/opt/zlib/include"
} else {
$configureString += " --with-openssl=/usr/local/opt/openssl@3" $configureString += " --with-openssl=/usr/local/opt/openssl@3"
# For Python 3.7.2 and 3.7.3 we need to provide PATH for zlib to pack it properly. Otherwise the build will fail
# with the error: zipimport.ZipImportError: can't decompress data; zlib not available
if ($this.Version -eq "3.7.2" -or $this.Version -eq "3.7.3" -or $this.Version -eq "3.7.17") {
$env:LDFLAGS = "-L/usr/local/opt/zlib/lib"
$env:CFLAGS = "-I/usr/local/opt/zlib/include"
}
# if ($this.Version -gt "3.7.12") {
$configureString += " --with-tcltk-includes='-I /usr/local/opt/tcl-tk/include/tcl-tk' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" $configureString += " --with-tcltk-includes='-I /usr/local/opt/tcl-tk/include/tcl-tk' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
# }
if ($this.Version -eq "3.7.17") { ### Compile with support of loadable sqlite extensions.
$env:LDFLAGS += " -L$(brew --prefix bzip2)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix ncurses)/lib"
$env:CFLAGS += " -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(brew --prefix ncurses)/include"
}
}
### Compile with support of loadable sqlite extensions. Unavailable for Python 2.*
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension) ### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
if ($this.Version -ge "3.2.0") {
$configureString += " --enable-loadable-sqlite-extensions" $configureString += " --enable-loadable-sqlite-extensions"
$env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib" $env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib"
$env:CFLAGS += " -I$(brew --prefix sqlite3)/include" $env:CFLAGS += " -I$(brew --prefix sqlite3)/include"
$env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include" $env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include"
}
Write-Host "The passed configure options are: " Write-Host "The passed configure options are: "
Write-Host $configureString Write-Host $configureString

View File

@@ -61,8 +61,7 @@ class NixPythonBuilder : PythonBuilder {
Return name of Python binary. Return name of Python binary.
#> #>
if ($this.Version.Major -eq 2) { $pythonBinary = "python" } else { $pythonBinary = "python3" } return "python3"
return $pythonBinary
} }
[string] Download() { [string] Download() {

View File

@@ -61,8 +61,8 @@ class UbuntuPythonBuilder : NixPythonBuilder {
Prepare system environment by installing dependencies and required packages. Prepare system environment by installing dependencies and required packages.
#> #>
if ($this.Version -lt "3.5.3") { if ($this.Version -lt "3.9.0") {
Write-Host "Python versions lower than 3.5.3 are not supported" Write-Host "Python versions lower than 3.9.0 are not supported"
exit 1 exit 1
} }

View File

@@ -42,9 +42,7 @@ class WinPythonBuilder : PythonBuilder {
Return extension for required version of Python executable. Return extension for required version of Python executable.
#> #>
$extension = if ($this.Version -lt "3.5" -and $this.Version -ge "2.5") { ".msi" } else { ".exe" } return ".exe"
return $extension
} }
[string] GetArchitectureExtension() { [string] GetArchitectureExtension() {
@@ -55,11 +53,7 @@ class WinPythonBuilder : PythonBuilder {
$ArchitectureExtension = "" $ArchitectureExtension = ""
if ($this.GetHardwareArchitecture() -eq "x64") { if ($this.GetHardwareArchitecture() -eq "x64") {
if ($this.Version -ge "3.5") {
$ArchitectureExtension = "-amd64" $ArchitectureExtension = "-amd64"
} else {
$ArchitectureExtension = ".amd64"
}
} elseif ($this.GetHardwareArchitecture() -eq "arm64") { } elseif ($this.GetHardwareArchitecture() -eq "arm64") {
$ArchitectureExtension = "-arm64" $ArchitectureExtension = "-arm64"
} }

View File

@@ -11,12 +11,7 @@ function Get-RegistryVersionFilter {
) )
$archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" } $archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" }
### Python 2.7 x86 have no architecture postfix
if (($Architecture -eq "x86") -and ($MajorVersion -eq 2)) {
"Python $MajorVersion.$MinorVersion.\d+$"
} else {
"Python $MajorVersion.$MinorVersion.*($archFilter)" "Python $MajorVersion.$MinorVersion.*($archFilter)"
}
} }
function Remove-RegistryEntries { function Remove-RegistryEntries {
@@ -143,9 +138,7 @@ if ($IsFreeThreaded) {
} }
Write-Host "Create `python3` symlink" Write-Host "Create `python3` symlink"
if ($MajorVersion -ne "2") { New-Item -Path "$PythonArchPath\python3.exe" -ItemType SymbolicLink -Value "$PythonArchPath\python.exe"
New-Item -Path "$PythonArchPath\python3.exe" -ItemType SymbolicLink -Value "$PythonArchPath\python.exe"
}
Write-Host "Install and upgrade Pip" Write-Host "Install and upgrade Pip"
$Env:PIP_ROOT_USER_ACTION = "ignore" $Env:PIP_ROOT_USER_ACTION = "ignore"

View File

@@ -60,7 +60,7 @@ Describe "Tests" {
# } # }
# } # }
if (($Version -ge "3.2.0") -and ($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($HardwareArchitecture -ne "arm64"))) { if (($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($HardwareArchitecture -ne "arm64"))) {
It "Check if sqlite3 module is installed" { It "Check if sqlite3 module is installed" {
"python ./sources/python-sqlite3.py" | Should -ReturnZeroExitCode "python ./sources/python-sqlite3.py" | Should -ReturnZeroExitCode
} }
@@ -92,16 +92,6 @@ Describe "Tests" {
} }
} }
# Pyinstaller 3.5 does not support Python 3.8.0. Check issue https://github.com/pyinstaller/pyinstaller/issues/4311
if ($Version -lt "3.8.0" -and $Version.Major -ne "2") {
It "Validate Pyinstaller" {
"pip install pyinstaller" | Should -ReturnZeroExitCode
"pyinstaller --onefile ./sources/simple-test.py" | Should -ReturnZeroExitCode
$distPath = [IO.Path]::Combine($pwd, "dist", "simple-test")
"$distPath" | Should -ReturnZeroExitCode
}
}
It "Check urlopen with HTTPS works" { It "Check urlopen with HTTPS works" {
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode "python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
} }

View File

@@ -3,12 +3,10 @@ Make sure all the optional modules are installed.
This is needed for Linux since we build from source. This is needed for Linux since we build from source.
""" """
from __future__ import print_function
import importlib import importlib
import sys import sys
# The Python standard library as of Python 3.0 # The Python standard library as of Python 3.9
standard_library = [ standard_library = [
'abc', 'abc',
'aifc', 'aifc',
@@ -17,6 +15,7 @@ standard_library = [
'ast', 'ast',
'asynchat', 'asynchat',
'asyncore', 'asyncore',
'asyncio',
'base64', 'base64',
'bdb', 'bdb',
'binhex', 'binhex',
@@ -34,14 +33,17 @@ standard_library = [
'collections', 'collections',
'colorsys', 'colorsys',
'compileall', 'compileall',
'concurrent',
'configparser', 'configparser',
'contextlib', 'contextlib',
'contextvars',
'copy', 'copy',
'copyreg', 'copyreg',
'crypt', 'crypt',
'csv', 'csv',
'ctypes', 'ctypes',
'curses', 'curses',
'dataclasses',
'datetime', 'datetime',
'dbm', 'dbm',
'decimal', 'decimal',
@@ -49,9 +51,11 @@ standard_library = [
'dis', 'dis',
'distutils', 'distutils',
'doctest', 'doctest',
'dummy_threading',
'email', 'email',
'encodings', 'encodings',
'ensurepip',
'enum',
'faulthandler',
'filecmp', 'filecmp',
'fileinput', 'fileinput',
'fnmatch', 'fnmatch',
@@ -77,13 +81,14 @@ standard_library = [
'importlib', 'importlib',
'inspect', 'inspect',
'io', 'io',
'ipaddress',
'json', 'json',
'keyword', 'keyword',
'lib2to3', 'lib2to3',
'linecache', 'linecache',
'locale', 'locale',
'logging', 'logging',
'macpath', 'lzma',
'mailbox', 'mailbox',
'mailcap', 'mailcap',
'mimetypes', 'mimetypes',
@@ -98,6 +103,7 @@ standard_library = [
'operator', 'operator',
'optparse', 'optparse',
'os', 'os',
'pathlib',
'pdb', 'pdb',
'pickle', 'pickle',
'pickletools', 'pickletools',
@@ -124,6 +130,8 @@ standard_library = [
'rlcompleter', 'rlcompleter',
'runpy', 'runpy',
'sched', 'sched',
'secrets',
'selectors',
'shelve', 'shelve',
'shlex', 'shlex',
'shutil', 'shutil',
@@ -141,6 +149,7 @@ standard_library = [
'ssl', 'ssl',
'_ssl', '_ssl',
'stat', 'stat',
'statistics',
'string', 'string',
'stringprep', 'stringprep',
'struct', 'struct',
@@ -163,14 +172,17 @@ standard_library = [
'tokenize', 'tokenize',
'trace', 'trace',
'traceback', 'traceback',
'tracemalloc',
'tty', 'tty',
'turtle', 'turtle',
'turtledemo', 'turtledemo',
'types', 'types',
'typing',
'unittest', 'unittest',
'urllib', 'urllib',
'uu', 'uu',
'uuid', 'uuid',
'venv',
'warnings', 'warnings',
'wave', 'wave',
'weakref', 'weakref',
@@ -179,83 +191,12 @@ standard_library = [
'xdrlib', 'xdrlib',
'xml', 'xml',
'xmlrpc', 'xmlrpc',
'zipapp',
'zipfile' 'zipfile'
] ]
# Modules that had different names in Python 2
if sys.version_info.major == 2:
def replace(lst, old, new):
lst[lst.index(old)] = new
# Keys are the Python 2 names
# Values are the Python 3 names
renames = {
'ConfigParser': 'configparser',
'copy_reg': 'copyreg',
'HTMLParser': 'html',
'httplib': 'http',
'Queue': 'queue',
'repr': 'reprlib',
'SocketServer': 'socketserver',
'xmlrpclib': 'xmlrpc',
'Tkinter': 'tkinter'
}
# All of the Python 3 names should be in the list
for python2name, python3name in renames.items():
replace(standard_library, python3name, python2name)
# Add new modules # Add new modules
# See https://docs.python.org/3/whatsnew/index.html # See https://docs.python.org/3/whatsnew/index.html
if sys.version_info >= (3, 2):
standard_library.extend([
'concurrent',
])
if sys.version_info >= (3, 3):
standard_library.extend([
'ipaddress',
'faulthandler',
'lzma',
'venv',
])
if sys.version_info >= (3, 4):
standard_library.extend([
'asyncio',
'ensurepip',
'enum',
'pathlib',
'selectors',
'statistics',
'tracemalloc',
])
if sys.version_info >= (3, 5):
standard_library.extend([
'typing',
'zipapp',
])
if sys.version_info >= (3, 6):
standard_library.extend([
'secrets',
])
if sys.version_info >= (3, 7):
standard_library.extend([
'contextvars',
'dataclasses',
])
# 'macpath' module has been removed from Python 3.8
if sys.version_info > (3, 7):
standard_library.remove('macpath')
# 'dummy_threading' module has been removed from Python 3.9
if sys.version_info > (3, 8):
standard_library.remove('dummy_threading')
# 'symbol' and 'formatter' modules have been removed from Python 3.10 # 'symbol' and 'formatter' modules have been removed from Python 3.10
if sys.version_info >= (3, 10): if sys.version_info >= (3, 10):
standard_library.remove('symbol') standard_library.remove('symbol')
@@ -295,6 +236,11 @@ if sys.version_info >= (3, 13):
standard_library.remove('uu') standard_library.remove('uu')
standard_library.remove('xdrlib') standard_library.remove('xdrlib')
if sys.version_info >= (3, 14):
standard_library.extend([
'annotationlib',
])
# Remove tkinter and Easter eggs # Remove tkinter and Easter eggs
excluded_modules = [ excluded_modules = [
'antigravity', 'antigravity',

View File

@@ -1,9 +1,5 @@
import sys import sys
from urllib.request import urlopen
if sys.version_info[0] == 2:
from urllib2 import urlopen
else:
from urllib.request import urlopen
response = urlopen("https://raw.githubusercontent.com/actions/python-versions/c641695f6a07526c18f10e374e503e649fef9427/.gitignore") response = urlopen("https://raw.githubusercontent.com/actions/python-versions/c641695f6a07526c18f10e374e503e649fef9427/.gitignore")
data = response.read() data = response.read()