Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
49 changes: 6 additions & 43 deletions builders/macos-python-builder.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,6 @@ class macOSPythonBuilder : NixPythonBuilder {
.SYNOPSIS
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() {
Expand All @@ -58,46 +50,17 @@ class macOSPythonBuilder : NixPythonBuilder {
### 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 >=
### 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.
### 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.
### 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@1.1/lib -L/usr/local/opt/zlib/lib"
$env:CFLAGS = "-I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/zlib/include"
} else {
$configureString += " --with-openssl=/usr/local/opt/openssl@1.1"

# 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' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
}

if ($this.Version -eq "3.7.17") {
$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)
if ($this.Version -ge "3.2.0") {
$configureString += " --enable-loadable-sqlite-extensions"
$env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib"
$env:CFLAGS += " -I$(brew --prefix sqlite3)/include"
$env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include"
}
$configureString += " --with-openssl=/usr/local/opt/openssl@1.1"
$configureString += " --with-tcltk-includes='-I /usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
$configureString += " --enable-loadable-sqlite-extensions"
$env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib"
$env:CFLAGS += " -I$(brew --prefix sqlite3)/include"
$env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include"

Write-Host "The passed configure options are: "
Write-Host $configureString
Expand Down
3 changes: 1 addition & 2 deletions builders/nix-python-builder.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ class NixPythonBuilder : PythonBuilder {
Return name of Python binary.
#>

if ($this.Version.Major -eq 2) { $pythonBinary = "python" } else { $pythonBinary = "python3" }
return $pythonBinary
return "python3"
}

[string] Download() {
Expand Down
4 changes: 2 additions & 2 deletions builders/ubuntu-python-builder.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ class UbuntuPythonBuilder : NixPythonBuilder {
Prepare system environment by installing dependencies and required packages.
#>

if ($this.Version -lt "3.5.3") {
Write-Host "Python versions lower than 3.5.3 are not supported"
if ($this.Version -lt "3.9.0") {
Write-Host "Python versions lower than 3.9.0 are not supported"
exit 1
}

Expand Down
10 changes: 2 additions & 8 deletions builders/win-python-builder.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,7 @@ class WinPythonBuilder : PythonBuilder {
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 $extension
return ".exe"
}

[string] GetArchitectureExtension() {
Expand All @@ -55,11 +53,7 @@ class WinPythonBuilder : PythonBuilder {

$ArchitectureExtension = ""
if ($this.Architecture -eq "x64") {
if ($this.Version -ge "3.5") {
$ArchitectureExtension = "-amd64"
} else {
$ArchitectureExtension = ".amd64"
}
$ArchitectureExtension = "-amd64"
}elseif ($this.Architecture -eq "arm64") {
$ArchitectureExtension = "-arm64"
}
Expand Down
11 changes: 2 additions & 9 deletions installers/win-setup-template.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@ function Get-RegistryVersionFilter {
)

$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 {
Expand Down Expand Up @@ -128,9 +123,7 @@ if ($LASTEXITCODE -ne 0) {
}

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"
$Env:PIP_ROOT_USER_ACTION = "ignore"
Expand Down
12 changes: 1 addition & 11 deletions tests/python-tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Describe "Tests" {
# }
# }

if (($Version -ge "3.2.0") -and ($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($Architecture -ne "arm64"))) {
if ($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($Architecture -ne "arm64"))) {
It "Check if sqlite3 module is installed" {
"python ./sources/python-sqlite3.py" | Should -ReturnZeroExitCode
}
Expand Down Expand Up @@ -90,16 +90,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" {
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
}
Expand Down
100 changes: 23 additions & 77 deletions tests/sources/python-modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
This is needed for Linux since we build from source.
"""

from __future__ import print_function

import importlib
import sys

# The Python standard library as of Python 3.0
# The Python standard library as of Python 3.9
standard_library = [
'abc',
'aifc',
Expand All @@ -17,6 +15,7 @@
'ast',
'asynchat',
'asyncore',
'asyncio',
'base64',
'bdb',
'binhex',
Expand All @@ -34,24 +33,29 @@
'collections',
'colorsys',
'compileall',
'concurrent',
'configparser',
'contextlib',
'contextvars',
'copy',
'copyreg',
'crypt',
'csv',
'ctypes',
'curses',
'dataclasses',
'datetime',
'dbm',
'decimal',
'difflib',
'dis',
'distutils',
'doctest',
'dummy_threading',
'email',
'encodings',
'ensurepip',
'enum',
'faulthandler',
'filecmp',
'fileinput',
'fnmatch',
Expand All @@ -77,13 +81,14 @@
'importlib',
'inspect',
'io',
'ipaddress',
'json',
'keyword',
'lib2to3',
'linecache',
'locale',
'logging',
'macpath',
'lzma',
'mailbox',
'mailcap',
'mimetypes',
Expand All @@ -98,6 +103,7 @@
'operator',
'optparse',
'os',
'pathlib',
'pdb',
'pickle',
'pickletools',
Expand All @@ -124,6 +130,8 @@
'rlcompleter',
'runpy',
'sched',
'secrets',
'selectors',
'shelve',
'shlex',
'shutil',
Expand All @@ -141,6 +149,7 @@
'ssl',
'_ssl',
'stat',
'statistics',
'string',
'stringprep',
'struct',
Expand All @@ -163,14 +172,17 @@
'tokenize',
'trace',
'traceback',
'tracemalloc',
'tty',
'turtle',
'turtledemo',
'types',
'typing',
'unittest',
'urllib',
'uu',
'uuid',
'venv',
'warnings',
'wave',
'weakref',
Expand All @@ -179,83 +191,12 @@
'xdrlib',
'xml',
'xmlrpc',
'zipapp',
'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
# 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
if sys.version_info >= (3, 10):
standard_library.remove('symbol')
Expand Down Expand Up @@ -295,6 +236,11 @@ def replace(lst, old, new):
standard_library.remove('uu')
standard_library.remove('xdrlib')

if sys.version_info >= (3, 14):
standard_library.extend([
'annotationlib',
])

# Remove tkinter and Easter eggs
excluded_modules = [
'antigravity',
Expand Down
6 changes: 1 addition & 5 deletions tests/sources/python-urlopen-https.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import sys

if sys.version_info[0] == 2:
from urllib2 import urlopen
else:
from urllib.request import urlopen
from urllib.request import urlopen

response = urlopen("https://raw.githubusercontent.com/actions/python-versions/c641695f6a07526c18f10e374e503e649fef9427/.gitignore")
data = response.read()
Expand Down