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

[Backport maintenance/3.3.x] Another attempt at fixing the collections.abc issue for Python 3.13 (#2665) #2666

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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/checkout@v4.1.7
- name: Set up Python 3.12
- name: Set up Python 3.13
id: python
uses: actions/setup-python@v5.1.1
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
Loading