| | 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. |
| | """ |
| | |
| | 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) |
| | ) |
| |
|