marcelotduarte/cx_Freeze

test_cli.py::test_import_tomli FAILS: "ImportError: No module named setuptools.extern"

brianrobt opened this issue · 4 comments

System information

Python version: 3.12.4
OS: EndeavourOS (Arch-based)
cx_Freeze version: 7.1.1

Problem

When trying to run the unit tests, all of the tests pass except for test_cli.py::test_import_tomli. It fails with the message, ImportError: import error in setuptools.extern: No module named 'setuptools.extern'. It looks like line 99 of that file is what's failing. Is this a known issue?

More info

I'm trying to package this lib for Arch Linux. Here is the PKGBUILD.

P.S. I need to step away. I'll come back later tonight to add some more details. Sorry if there is anything lacking, but I wanted to get this issue posted straight away.

I know that some Linux OS, like Gentoo, Arch does not pack setuptools with 3rd party tools (extern) #1863
The correct in this SO is xfail the test.
Can you show me the traceback?

I know that some Linux OS, like Gentoo, Arch does not pack setuptools with 3rd party tools (extern)

Thanks for the info. I'll dig into that more.

Here is the traceback:

========================================================================================================================== FAILURES ===========================================================================================================================
______________________________________________________________________________________________________________________ test_import_tomli ______________________________________________________________________________________________________________________

name = 'setuptools.extern.tomli'

    def resolve(name: str) -> object:
        # Simplified from zope.dottedname.
        parts = name.split(".")

        used = parts.pop(0)
        found: object = __import__(used)
        for part in parts:
            used += "." + part
            try:
                found = getattr(found, part)
            except AttributeError:
                pass
            else:
                continue
            # We use explicit un-nesting of the handling block in order
            # to avoid nested exceptions.
            try:
>               __import__(used)
E               ModuleNotFoundError: No module named 'setuptools.extern'

/usr/lib/python3.12/site-packages/_pytest/monkeypatch.py:79: ModuleNotFoundError

The above exception was the direct cause of the following exception:

monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f51cbb0da60>

    def test_import_tomli(monkeypatch) -> None:
        """Test using tomli as a last resort."""
        if sys.version_info >= (3, 11):
            monkeypatch.delattr("tomllib.loads")
        with contextlib.suppress(AttributeError, ModuleNotFoundError):
>           monkeypatch.delattr("setuptools.extern.tomli.loads")

tests/test_cli.py:97:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.12/site-packages/_pytest/monkeypatch.py:104: in derive_importpath
    target = resolve(module)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

name = 'setuptools.extern.tomli'

    def resolve(name: str) -> object:
        # Simplified from zope.dottedname.
        parts = name.split(".")

        used = parts.pop(0)
        found: object = __import__(used)
        for part in parts:
            used += "." + part
            try:
                found = getattr(found, part)
            except AttributeError:
                pass
            else:
                continue
            # We use explicit un-nesting of the handling block in order
            # to avoid nested exceptions.
            try:
                __import__(used)
            except ImportError as ex:
                expected = str(ex).split()[-1]
                if expected == used:
                    raise
                else:
>                   raise ImportError(f"import error in {used}: {ex}") from ex
E                   ImportError: import error in setuptools.extern: No module named 'setuptools.extern'

/usr/lib/python3.12/site-packages/_pytest/monkeypatch.py:85: ImportError

Can you test the PR?

That did the trick: tests/test_cli.py::test_import_tomli SKIPPED (Python >= 3.11)

Thank you, @marcelotduarte! I'll keep this issue open until the change is merged.