Skip to content

Commit

Permalink
[Backport maintenance/3.3.x] Another attempt at fixing the `collectio…
Browse files Browse the repository at this point in the history
…ns.abc` issue for Python 3.13 (#2665) (#2666)

* Fix issue with importing of frozen submodules

(cherry picked from commit f94e855)

* Test on Python 3.13 final

* Bump CI jobs to python 3.13

---------

Co-authored-by: Daniël van Noord <[email protected]>
  • Loading branch information
jacobtylerwalls and DanielNoord authored Dec 24, 2024
1 parent 7cfbad1 commit 68714df
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 32 deletions.
10 changes: 5 additions & 5 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
env:
CACHE_VERSION: 3
KEY_PREFIX: venv
DEFAULT_PYTHON: "3.12"
DEFAULT_PYTHON: "3.13"
PRE_COMMIT_CACHE: ~/.cache/pre-commit

concurrency:
Expand Down Expand Up @@ -81,7 +81,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [3.9, "3.10", "3.11", "3.12", "3.13-dev"]
python-version: [3.9, "3.10", "3.11", "3.12", "3.13"]
outputs:
python-key: ${{ steps.generate-python-key.outputs.key }}
steps:
Expand Down Expand Up @@ -138,7 +138,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [3.9, "3.10", "3.11", "3.12", "3.13-dev"]
python-version: [3.9, "3.10", "3.11", "3.12", "3.13"]
steps:
- name: Set temp directory
run: echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
Expand Down Expand Up @@ -242,11 +242,11 @@ jobs:
steps:
- name: Check out code from GitHub
uses: actions/[email protected]
- name: Set up Python 3.12
- name: Set up Python 3.13
id: python
uses: actions/[email protected]
with:
python-version: "3.12"
python-version: "3.13"
check-latest: true
- name: Install dependencies
run: pip install -U -r requirements_minimal.txt
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
- published

env:
DEFAULT_PYTHON: "3.12"
DEFAULT_PYTHON: "3.13"

permissions:
contents: read
Expand Down
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,18 @@ What's New in astroid 3.3.8?
============================
Release date: TBA

* Fix inability to import `collections.abc` in python 3.13.1. The reported fixes in astroid 3.3.6
and 3.3.7 did not actually fix this issue.

Closes pylint-dev/pylint#10112


What's New in astroid 3.3.7?
============================
Release date: 2024-12-20

This release was yanked.

* Fix inability to import `collections.abc` in python 3.13.1. The reported fix in astroid 3.3.6
did not actually fix this issue.

Expand Down
60 changes: 34 additions & 26 deletions astroid/interpreter/_import/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,15 +142,45 @@ def find_module(
type=ModuleType.C_BUILTIN,
)

if submodule_path is not None:
search_paths = list(submodule_path)
else:
search_paths = sys.path

suffixes = (".py", ".pyi", importlib.machinery.BYTECODE_SUFFIXES[0])
for entry in search_paths:
package_directory = os.path.join(entry, modname)
for suffix in suffixes:
package_file_name = "__init__" + suffix
file_path = os.path.join(package_directory, package_file_name)
if os.path.isfile(file_path):
return ModuleSpec(
name=modname,
location=package_directory,
type=ModuleType.PKG_DIRECTORY,
)
for suffix, type_ in ImportlibFinder._SUFFIXES:
file_name = modname + suffix
file_path = os.path.join(entry, file_name)
if os.path.isfile(file_path):
return ModuleSpec(name=modname, location=file_path, type=type_)

# sys.stdlib_module_names was added in Python 3.10
if PY310_PLUS:
# If the module is a stdlib module, check whether this is a frozen module. Note that
# `find_spec` actually imports the module, so we want to make sure we only run this code
# for stuff that can be expected to be frozen. For now this is only stdlib.
# If the module name matches a stdlib module name, check whether this is a frozen
# module. Note that `find_spec` actually imports parent modules, so we want to make
# sure we only run this code for stuff that can be expected to be frozen. For now
# this is only stdlib.
if modname in sys.stdlib_module_names or (
processed and processed[0] in sys.stdlib_module_names
):
spec = importlib.util.find_spec(".".join((*processed, modname)))
try:
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=Warning)
spec = importlib.util.find_spec(".".join((*processed, modname)))
except ValueError:
spec = None

if (
spec
and spec.loader # type: ignore[comparison-overlap] # noqa: E501
Expand Down Expand Up @@ -186,28 +216,6 @@ def find_module(
except ValueError:
pass

if submodule_path is not None:
search_paths = list(submodule_path)
else:
search_paths = sys.path

suffixes = (".py", ".pyi", importlib.machinery.BYTECODE_SUFFIXES[0])
for entry in search_paths:
package_directory = os.path.join(entry, modname)
for suffix in suffixes:
package_file_name = "__init__" + suffix
file_path = os.path.join(package_directory, package_file_name)
if os.path.isfile(file_path):
return ModuleSpec(
name=modname,
location=package_directory,
type=ModuleType.PKG_DIRECTORY,
)
for suffix, type_ in ImportlibFinder._SUFFIXES:
file_name = modname + suffix
file_path = os.path.join(entry, file_name)
if os.path.isfile(file_path):
return ModuleSpec(name=modname, location=file_path, type=type_)
return None

def contribute_to_path(
Expand Down

0 comments on commit 68714df

Please sign in to comment.