diff --git a/src/installer/utils.py b/src/installer/utils.py index 7df3e05..606125d 100644 --- a/src/installer/utils.py +++ b/src/installer/utils.py @@ -65,16 +65,6 @@ "WheelFilename", ["distribution", "version", "build_tag", "tag"] ) -# Adapted from https://github.com/python/importlib_metadata/blob/v3.4.0/importlib_metadata/__init__.py#L90 -_ENTRYPOINT_REGEX = re.compile( - r""" - (?P[\w.]+)\s* - (:\s*(?P[\w.]+))\s* - (?P\[.*\])?\s*$ - """, - re.VERBOSE | re.UNICODE, -) - # According to https://www.python.org/dev/peps/pep-0427/#id7 SCHEME_NAMES = cast(AllSchemes, ("purelib", "platlib", "headers", "scripts", "data")) @@ -244,16 +234,16 @@ def parse_entrypoints(text: str) -> Iterable[tuple[str, str, str, "ScriptSection for name, value in config.items(section): assert isinstance(name, str) - match = _ENTRYPOINT_REGEX.match(value) - assert match + assert ":" in value - module = match.group("module") - assert isinstance(module, str) + module, attrs = [x.strip() for x in value.split(":", 1)] + assert all( + x.isidentifier() for x in module.split(".") + ), f"{module} are not all valid identifiers" - attrs = match.group("attrs") # TODO: make this a proper error, which can be caught. - assert attrs is not None - assert isinstance(attrs, str) + assert len(attrs), "Attributes are empty" + assert attrs.isidentifier(), f"{attrs} is not a valid identifier" script_section = cast("ScriptSection", section[: -len("_scripts")]) diff --git a/tests/test_utils.py b/tests/test_utils.py index 22c262d..f61fb49 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -259,6 +259,16 @@ class TestParseEntryPoints: ], id="cli-and-gui", ), + pytest.param( + """ + [console_scripts] + நான் = ஓர்.ஒருங்குறி:கட்டளை + """, + [ + ("நான்", "ஓர்.ஒருங்குறி", "கட்டளை", "console"), + ], + id="unicode", + ), ], ) def test_valid(self, script, expected):