66from typing import cast
77from typing import Iterator
88from typing import overload
9- from typing import Protocol
109from typing import TYPE_CHECKING
1110
1211from . import _log
1716 from ._config import Configuration , ParseFunction
1817
1918
20- log = _log .log .getChild ("entrypoints" )
19+ from importlib .metadata import EntryPoint as EntryPoint
20+
21+
22+ if sys .version_info [:2 ] < (3 , 10 ):
23+ from importlib .metadata import entry_points as legacy_entry_points
24+
25+ class EntryPoints :
26+ _groupdata : list [EntryPoint ]
27+
28+ def __init__ (self , groupdata : list [EntryPoint ]) -> None :
29+ self ._groupdata = groupdata
30+
31+ def select (self , name : str ) -> EntryPoints :
32+ return EntryPoints ([x for x in self ._groupdata if x .name == name ])
2133
34+ def __iter__ (self ) -> Iterator [EntryPoint ]:
35+ return iter (self ._groupdata )
2236
23- class EntrypointProtocol (Protocol ):
24- name : str
25- value : str
37+ def entry_points (group : str ) -> EntryPoints :
38+ return EntryPoints (legacy_entry_points ()[group ])
2639
27- def load (self ) -> Any :
28- pass
40+ else :
41+ from importlib .metadata import entry_points , EntryPoints
42+
43+
44+ log = _log .log .getChild ("entrypoints" )
2945
3046
3147def version_from_entrypoint (
@@ -43,27 +59,11 @@ def version_from_entrypoint(
4359 return None
4460
4561
46- if sys .version_info [:2 ] < (3 , 10 ):
47- from importlib_metadata import entry_points
48- from importlib_metadata import EntryPoint
49- else :
50- from importlib .metadata import entry_points
51- from importlib .metadata import EntryPoint
52-
53-
54- def iter_entry_points (
55- group : str , name : str | None = None
56- ) -> Iterator [EntrypointProtocol ]:
57- eps = entry_points (group = group )
58- res = (
59- eps
60- if name is None
61- else eps .select ( # type: ignore [no-untyped-call]
62- name = name ,
63- )
64- )
62+ def iter_entry_points (group : str , name : str | None = None ) -> Iterator [EntryPoint ]:
63+ eps : EntryPoints = entry_points (group = group )
64+ res = eps if name is None else eps .select (name = name )
6565
66- return cast ( Iterator [ EntrypointProtocol ], iter (res ) )
66+ return iter (res )
6767
6868
6969def _get_ep (group : str , name : str ) -> Any | None :
@@ -76,7 +76,7 @@ def _get_ep(group: str, name: str) -> Any | None:
7676
7777def _get_from_object_reference_str (path : str , group : str ) -> Any | None :
7878 # todo: remove for importlib native spelling
79- ep : EntrypointProtocol = EntryPoint (path , path , group )
79+ ep = EntryPoint (path , path , group )
8080 try :
8181 return ep .load ()
8282 except (AttributeError , ModuleNotFoundError ):
0 commit comments