1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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)
- )
|