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))
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
_distutils | Folder | 0755 |
|
|
_vendor | Folder | 0755 |
|
|
command | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
extern | Folder | 0755 |
|
|
__init__.py | File | 9 KB | 0644 |
|
_core_metadata.py | File | 8.71 KB | 0644 |
|
_entry_points.py | File | 2.18 KB | 0644 |
|
_imp.py | File | 2.38 KB | 0644 |
|
_importlib.py | File | 1.43 KB | 0644 |
|
_itertools.py | File | 675 B | 0644 |
|
_normalization.py | File | 4.12 KB | 0644 |
|
_path.py | File | 1.03 KB | 0644 |
|
_reqs.py | File | 1.09 KB | 0644 |
|
archive_util.py | File | 7.16 KB | 0644 |
|
build_meta.py | File | 18.23 KB | 0644 |
|
cli-32.exe | File | 11.5 KB | 0644 |
|
cli-64.exe | File | 14 KB | 0644 |
|
cli-arm64.exe | File | 13.5 KB | 0644 |
|
cli.exe | File | 11.5 KB | 0644 |
|
dep_util.py | File | 659 B | 0644 |
|
depends.py | File | 5.45 KB | 0644 |
|
discovery.py | File | 20.65 KB | 0644 |
|
dist.py | File | 36.33 KB | 0644 |
|
errors.py | File | 2.61 KB | 0644 |
|
extension.py | File | 5.46 KB | 0644 |
|
glob.py | File | 4.75 KB | 0644 |
|
gui-32.exe | File | 11.5 KB | 0644 |
|
gui-64.exe | File | 14 KB | 0644 |
|
gui-arm64.exe | File | 13.5 KB | 0644 |
|
gui.exe | File | 11.5 KB | 0644 |
|
installer.py | File | 4.87 KB | 0644 |
|
launch.py | File | 812 B | 0644 |
|
logging.py | File | 1.21 KB | 0644 |
|
modified.py | File | 190 B | 0644 |
|
monkey.py | File | 4.67 KB | 0644 |
|
msvc.py | File | 46.31 KB | 0644 |
|
namespaces.py | File | 3 KB | 0644 |
|
package_index.py | File | 37.45 KB | 0644 |
|
py312compat.py | File | 330 B | 0644 |
|
sandbox.py | File | 14.01 KB | 0644 |
|
script (dev).tmpl | File | 218 B | 0644 |
|
script.tmpl | File | 138 B | 0644 |
|
unicode_utils.py | File | 941 B | 0644 |
|
version.py | File | 161 B | 0644 |
|
warnings.py | File | 3.61 KB | 0644 |
|
wheel.py | File | 8.43 KB | 0644 |
|
windows_support.py | File | 720 B | 0644 |
|