def _describe_extensions(): infos = {} from datalad.support.entrypoints import iter_entrypoints from importlib import import_module for ename, emod, eload in iter_entrypoints('datalad.extensions'): info = {} infos[ename] = info try: ext = eload() info['load_error'] = None info['description'] = ext[0] info['module'] = emod mod = import_module(emod, package='datalad') info['version'] = getattr(mod, '__version__', None) except Exception as e: ce = CapturedException(e) info['load_error'] = ce.format_short() continue info['entrypoints'] = entry_points = {} for ep in ext[1]: ep_info = { 'module': ep[0], 'class': ep[1], 'names': ep[2:], } entry_points['{}.{}'.format(*ep[:2])] = ep_info try: import_module(ep[0], package='datalad') ep_info['load_error'] = None except Exception as e: ce = CapturedException(e) ep_info['load_error'] = ce.format_short() continue return infos
def _describe_annex(): from datalad.cmd import ( GitWitlessRunner, StdOutErrCapture, ) runner = GitWitlessRunner() try: out = runner.run(['git', 'annex', 'version'], protocol=StdOutErrCapture) except CommandError as e: ce = CapturedException(e) return dict( version='not available', message=ce.format_short(), ) info = {} for line in out['stdout'].split(os.linesep): key = line.split(':')[0] if not key: continue value = line[len(key) + 2:].strip() key = key.replace('git-annex ', '') if key.endswith('s'): value = value.split() info[key] = value return info
def _describe_metadata_elements(group): infos = {} from datalad.support.entrypoints import iter_entrypoints from importlib import import_module if sys.version_info < (3, 10): # 3.10 is when it was no longer provisional from importlib_metadata import distribution else: from importlib.metadata import distribution for ename, emod, eload in iter_entrypoints(group): info = {} infos[f'{ename}'] = info try: info['module'] = emod dist = distribution(emod.split('.', maxsplit=1)[0]) info['distribution'] = f'{dist.name} {dist.version}' mod = import_module(emod, package='datalad') version = getattr(mod, '__version__', None) if version: # no not clutter the report with no version info['version'] = version eload() info['load_error'] = None except Exception as e: ce = CapturedException(e) info['load_error'] = ce.format_short() continue return infos