Spaces:
Running
Running
File size: 2,282 Bytes
ffa9e8f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
import functools
import operator
import itertools
from .errors import OptionError
from .extern.jaraco.text import yield_lines
from .extern.jaraco.functools import pass_none
from ._importlib import metadata
from ._itertools import ensure_unique
from .extern.more_itertools import consume
def ensure_valid(ep):
"""
Exercise one of the dynamic properties to trigger
the pattern match.
"""
try:
ep.extras
except AttributeError as ex:
msg = (
f"Problems to parse {ep}.\nPlease ensure entry-point follows the spec: "
"https://packaging.python.org/en/latest/specifications/entry-points/"
)
raise OptionError(msg) from ex
def load_group(value, group):
"""
Given a value of an entry point or series of entry points,
return each as an EntryPoint.
"""
# normalize to a single sequence of lines
lines = yield_lines(value)
text = f'[{group}]\n' + '\n'.join(lines)
return metadata.EntryPoints._from_text(text)
def by_group_and_name(ep):
return ep.group, ep.name
def validate(eps: metadata.EntryPoints):
"""
Ensure entry points are unique by group and name and validate each.
"""
consume(map(ensure_valid, ensure_unique(eps, key=by_group_and_name)))
return eps
@functools.singledispatch
def load(eps):
"""
Given a Distribution.entry_points, produce EntryPoints.
"""
groups = itertools.chain.from_iterable(
load_group(value, group)
for group, value in eps.items())
return validate(metadata.EntryPoints(groups))
@load.register(str)
def _(eps):
r"""
>>> ep, = load('[console_scripts]\nfoo=bar')
>>> ep.group
'console_scripts'
>>> ep.name
'foo'
>>> ep.value
'bar'
"""
return validate(metadata.EntryPoints(metadata.EntryPoints._from_text(eps)))
load.register(type(None), lambda x: x)
@pass_none
def render(eps: metadata.EntryPoints):
by_group = operator.attrgetter('group')
groups = itertools.groupby(sorted(eps, key=by_group), by_group)
return '\n'.join(
f'[{group}]\n{render_items(items)}\n'
for group, items in groups
)
def render_items(eps):
return '\n'.join(
f'{ep.name} = {ep.value}'
for ep in sorted(eps)
)
|