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
|
import functools
import operator
import itertools
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.
"""
ep.extras
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)
)
|