Skip to content

Commit

Permalink
Ensure Python 3.12+ compatibility in check_console_script (#448)
Browse files Browse the repository at this point in the history
In f4d046c an assumption was made
(correct at the time), that only the importlib.metadata backport,
`importlib_metadata`, returns a tuple of entry points.

However, importlib.metadata in Python 3.12+ behaves the same.

This caused a KeyError exception to be thrown on Python 3.12,
as reported repeatedly be testers of Fedora Linux 39 in:

https://bugzilla.redhat.com/show_bug.cgi?id=2231593

This change adjusts the conditional used in check_console_script
to assume both the backport and Python 3.12+ return a tuple.

While not obvious from the test failures output,
this change also fixes the following TestBashGlobal tests failures:

 - test_console_script_module
 - test_console_script_module_wheel
 - test_console_script_package
 - test_console_script_package_wheel

For the reference, the failures looked like this:

    FAIL: test_console_script_module (__main__.TestBashGlobal.test_console_script_module)
    Test completing a console_script for a module.
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File ".../argcomplete/test/test.py", line 1376, in test_console_script_module
        self._test_console_script()
      File ".../argcomplete/test/test.py", line 1370, in _test_console_script
        self.assertEqual(self.sh.run_command(command), "arg\r\n")
    AssertionError: "usage: test-module [-h] {arg}\r\ntest-mo[66 chars]\r\n" != 'arg\r\n'
    + arg
    - usage: test-module [-h] {arg}
    - test-module: error: argument arg: invalid choice: 'a' (choose from 'arg')

Fixes #440
  • Loading branch information
hroncok authored Sep 16, 2023
1 parent a1d0615 commit 59f4f9d
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion argcomplete/_check_console_script.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ def main():

# The importlib_metadata backport returns a tuple of entry point objects
# whereas the official library returns a SelectableGroups object
if not use_entry_points_backport:
# Python 3.12+ behaves like the importlib_metadata backport
if not use_entry_points_backport and sys.version_info < (3, 12):
entry_points = entry_points["console_scripts"] # type:ignore

entry_points = [ep for ep in entry_points \
Expand Down

0 comments on commit 59f4f9d

Please sign in to comment.