[3.11] gh-96883: browser: include concurrent.futures (GH-96886) (GH-96888)

This commit is contained in:
Christian Heimes 2022-09-17 16:40:24 +02:00 committed by GitHub
parent d39fce0f03
commit 876606fc65
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 17 deletions

View file

@ -0,0 +1,2 @@
``wasm32-emscripten`` builds for browsers now include
:mod:`concurrent.futures` for :mod:`asyncio` and :mod:`unittest.mock`.

View file

@ -58,6 +58,8 @@ OMIT_FILES = (
# Pure Python implementations of C extensions # Pure Python implementations of C extensions
"_pydecimal.py", "_pydecimal.py",
"_pyio.py", "_pyio.py",
# concurrent threading
"concurrent/futures/thread.py",
# Misc unused or large files # Misc unused or large files
"pydoc_data/", "pydoc_data/",
"msilib/", "msilib/",
@ -99,13 +101,12 @@ OMIT_MODULE_FILES = {
"_dbm": ["dbm/ndbm.py"], "_dbm": ["dbm/ndbm.py"],
"_gdbm": ["dbm/gnu.py"], "_gdbm": ["dbm/gnu.py"],
"_json": ["json/"], "_json": ["json/"],
"_multiprocessing": ["concurrent/", "multiprocessing/"], "_multiprocessing": ["concurrent/futures/process.py", "multiprocessing/"],
"pyexpat": ["xml/", "xmlrpc/"], "pyexpat": ["xml/", "xmlrpc/"],
"readline": ["rlcompleter.py"], "readline": ["rlcompleter.py"],
"_sqlite3": ["sqlite3/"], "_sqlite3": ["sqlite3/"],
"_ssl": ["ssl.py"], "_ssl": ["ssl.py"],
"_tkinter": ["idlelib/", "tkinter/", "turtle.py", "turtledemo/"], "_tkinter": ["idlelib/", "tkinter/", "turtle.py", "turtledemo/"],
"_zoneinfo": ["zoneinfo/"], "_zoneinfo": ["zoneinfo/"],
} }
@ -125,21 +126,18 @@ SYSCONFIG_NAMES = (
def get_builddir(args: argparse.Namespace) -> pathlib.Path: def get_builddir(args: argparse.Namespace) -> pathlib.Path:
"""Get builddir path from pybuilddir.txt """Get builddir path from pybuilddir.txt"""
"""
with open("pybuilddir.txt", encoding="utf-8") as f: with open("pybuilddir.txt", encoding="utf-8") as f:
builddir = f.read() builddir = f.read()
return pathlib.Path(builddir) return pathlib.Path(builddir)
def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path: def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path:
"""Get path to sysconfigdata relative to build root """Get path to sysconfigdata relative to build root"""
"""
data_name = sysconfig._get_sysconfigdata_name() data_name = sysconfig._get_sysconfigdata_name()
if not data_name.startswith(SYSCONFIG_NAMES): if not data_name.startswith(SYSCONFIG_NAMES):
raise ValueError( raise ValueError(
f"Invalid sysconfig data name '{data_name}'.", f"Invalid sysconfig data name '{data_name}'.", SYSCONFIG_NAMES
SYSCONFIG_NAMES
) )
filename = data_name + ".py" filename = data_name + ".py"
return args.builddir / filename return args.builddir / filename
@ -150,20 +148,23 @@ def create_stdlib_zip(
*, *,
optimize: int = 0, optimize: int = 0,
) -> None: ) -> None:
def filterfunc(name: str) -> bool: def filterfunc(filename: str) -> bool:
return not name.startswith(args.omit_subdirs_absolute) pathname = pathlib.Path(filename).resolve()
return pathname not in args.omit_files_absolute
with zipfile.PyZipFile( with zipfile.PyZipFile(
args.wasm_stdlib_zip, mode="w", compression=args.compression, optimize=optimize args.wasm_stdlib_zip,
mode="w",
compression=args.compression,
optimize=optimize,
) as pzf: ) as pzf:
if args.compresslevel is not None: if args.compresslevel is not None:
pzf.compresslevel = args.compresslevel pzf.compresslevel = args.compresslevel
pzf.writepy(args.sysconfig_data) pzf.writepy(args.sysconfig_data)
for entry in sorted(args.srcdir_lib.iterdir()): for entry in sorted(args.srcdir_lib.iterdir()):
entry = entry.resolve()
if entry.name == "__pycache__": if entry.name == "__pycache__":
continue continue
if entry in args.omit_files_absolute:
continue
if entry.name.endswith(".py") or entry.is_dir(): if entry.name.endswith(".py") or entry.is_dir():
# writepy() writes .pyc files (bytecode). # writepy() writes .pyc files (bytecode).
pzf.writepy(entry, filterfunc=filterfunc) pzf.writepy(entry, filterfunc=filterfunc)
@ -247,10 +248,9 @@ def main():
if not extmods.get(modname): if not extmods.get(modname):
omit_files.extend(modfiles) omit_files.extend(modfiles)
args.omit_files_absolute = {args.srcdir_lib / name for name in omit_files} args.omit_files_absolute = {
args.omit_subdirs_absolute = tuple( (args.srcdir_lib / name).resolve() for name in omit_files
str(args.srcdir_lib / name) for name in OMIT_SUBDIRS }
)
# Empty, unused directory for dynamic libs, but required for site initialization. # Empty, unused directory for dynamic libs, but required for site initialization.
args.wasm_dynload.mkdir(parents=True, exist_ok=True) args.wasm_dynload.mkdir(parents=True, exist_ok=True)