# Copyright (C) 2020-2021 Intel Corporation
#
# SPDX-License-Identifier: MIT
from typing import List, Type
import argparse
import logging as log
from datumaro.cli.util import MultilineFormatter
from datumaro.util import to_snake_case
_plugin_types = None
[docs]def plugin_types() -> List[Type['CliPlugin']]:
global _plugin_types
if _plugin_types is None:
from datumaro.components.converter import Converter
from datumaro.components.extractor import Extractor, Importer, Transform
from datumaro.components.launcher import Launcher
from datumaro.components.validator import Validator
_plugin_types = [Launcher, Extractor, Transform, Importer,
Converter, Validator]
return _plugin_types
[docs]def remove_plugin_type(s):
for t in {'transform', 'extractor', 'converter', 'launcher', 'importer',
'validator'}:
s = s.replace('_' + t, '')
return s
class _PluginNameDescriptor:
def __get__(self, obj, objtype=None):
if not objtype:
objtype = type(obj)
return remove_plugin_type(to_snake_case(objtype.__name__))
[docs]class CliPlugin:
NAME = _PluginNameDescriptor()
@staticmethod
def _get_doc(cls):
doc = getattr(cls, '__doc__', "")
if doc:
if any(getattr(t, '__doc__', '') == doc for t in plugin_types()):
doc = ''
return doc
[docs] @classmethod
def build_cmdline_parser(cls, **kwargs):
args = {
'prog': cls.NAME,
'description': cls._get_doc(cls),
'formatter_class': MultilineFormatter,
}
args.update(kwargs)
return argparse.ArgumentParser(**args)
[docs] @classmethod
def parse_cmdline(cls, args=None):
if args and args[0] == '--':
args = args[1:]
parser = cls.build_cmdline_parser()
args = parser.parse_args(args)
args = vars(args)
log.debug("Parsed parameters: \n\t%s",
'\n\t'.join('%s: %s' % (k, v) for k, v in args.items()))
return args