From c17dc22367c24d0998c0c1dbbcbc12ec696cad7e Mon Sep 17 00:00:00 2001 From: pdelboca Date: Thu, 27 Jun 2019 17:44:56 -0300 Subject: [PATCH 1/6] [4639] Migrate command to cli folder. --- ckan/cli/cli.py | 2 + ckan/cli/plugin_info.py | 81 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 ckan/cli/plugin_info.py diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index 61a63f6aa18..c85a3ecb313 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -11,6 +11,7 @@ datastore, translation, dataset, + plugin_info, ) from ckan.config.middleware import make_app @@ -44,3 +45,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(datastore.datastore) ckan.add_command(translation.translation) ckan.add_command(dataset.dataset) +ckan.add_command(plugin_info.plugin_info) \ No newline at end of file diff --git a/ckan/cli/plugin_info.py b/ckan/cli/plugin_info.py new file mode 100644 index 00000000000..c5555f24150 --- /dev/null +++ b/ckan/cli/plugin_info.py @@ -0,0 +1,81 @@ +import click + +@click.command(name=u'plugin-info', short_help='Provide info on installed plugins.') +def plugin_info(): + ''' print info about current plugins from the .ini file''' + import ckan.plugins as p + interfaces = {} + plugins = {} + for name in dir(p): + item = getattr(p, name) + try: + if issubclass(item, p.Interface): + interfaces[item] = {'class': item} + except TypeError: + pass + + for interface in interfaces: + for plugin in p.PluginImplementations(interface): + name = plugin.name + if name not in plugins: + plugins[name] = {'doc': plugin.__doc__, + 'class': plugin, + 'implements': []} + plugins[name]['implements'].append(interface.__name__) + + for plugin in plugins: + p = plugins[plugin] + click.echo(plugin + ':') + click.echo('-' * (len(plugin) + 1)) + if p['doc']: + click.echo(p['doc']) + click.echo('Implements:') + for i in p['implements']: + extra = None + if i == 'ITemplateHelpers': + extra = _template_helpers(p['class']) + if i == 'IActions': + extra = _actions(p['class']) + click.echo(' %s' % i) + if extra: + click.echo(extra) + click.echo() + +def _template_helpers(cls): + ''' Return readable helper function info. ''' + helpers = cls.get_helpers() + return _function_info(helpers) + +def _actions(self, cls): + ''' Return readable action function info. ''' + actions = cls.get_actions() + return _function_info(actions) + +def _function_info(functions): + ''' Take a dict of functions and output readable info ''' + import inspect + output = [] + for function_name in functions: + fn = functions[function_name] + args_info = inspect.getargspec(fn) + params = args_info.args + num_params = len(params) + if args_info.varargs: + params.append('*' + args_info.varargs) + if args_info.keywords: + params.append('**' + args_info.keywords) + if args_info.defaults: + offset = num_params - len(args_info.defaults) + for i, v in enumerate(args_info.defaults): + params[i + offset] = params[i + offset] + '=' + repr(v) + # is this a classmethod if so remove the first parameter + if inspect.ismethod(fn) and inspect.isclass(fn.__self__): + params = params[1:] + params = ', '.join(params) + output.append(' %s(%s)' % (function_name, params)) + # doc string + if fn.__doc__: + bits = fn.__doc__.split('\n') + for bit in bits: + output.append(' %s' % bit) + return ('\n').join(output) From 1b3cf60562e42536e4a46ce9262e53bad0b89e61 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Thu, 27 Jun 2019 17:52:47 -0300 Subject: [PATCH 2/6] [4639] Apply string formatting standard --- ckan/cli/plugin_info.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ckan/cli/plugin_info.py b/ckan/cli/plugin_info.py index c5555f24150..86e749405eb 100644 --- a/ckan/cli/plugin_info.py +++ b/ckan/cli/plugin_info.py @@ -36,7 +36,7 @@ def plugin_info(): extra = _template_helpers(p['class']) if i == 'IActions': extra = _actions(p['class']) - click.echo(' %s' % i) + click.echo(' {i}'.format(i=i)) if extra: click.echo(extra) click.echo() @@ -72,10 +72,11 @@ def _function_info(functions): if inspect.ismethod(fn) and inspect.isclass(fn.__self__): params = params[1:] params = ', '.join(params) - output.append(' %s(%s)' % (function_name, params)) + output.append(' {function_name}({params})'.format( + function_name=function_name, params=params)) # doc string if fn.__doc__: bits = fn.__doc__.split('\n') for bit in bits: - output.append(' %s' % bit) + output.append(' {bit}'.format(bit=bit)) return ('\n').join(output) From b69d306103f0344f3d7e392417e0f8f5e3be817f Mon Sep 17 00:00:00 2001 From: pdelboca Date: Thu, 27 Jun 2019 17:58:19 -0300 Subject: [PATCH 3/6] [4639] Avoid using cls as parameter name --- ckan/cli/plugin_info.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ckan/cli/plugin_info.py b/ckan/cli/plugin_info.py index 86e749405eb..84824fd9396 100644 --- a/ckan/cli/plugin_info.py +++ b/ckan/cli/plugin_info.py @@ -41,14 +41,14 @@ def plugin_info(): click.echo(extra) click.echo() -def _template_helpers(cls): +def _template_helpers(plugin_class): ''' Return readable helper function info. ''' - helpers = cls.get_helpers() + helpers = plugin_class.get_helpers() return _function_info(helpers) -def _actions(self, cls): +def _actions(plugin_class): ''' Return readable action function info. ''' - actions = cls.get_actions() + actions = plugin_class.get_actions() return _function_info(actions) def _function_info(functions): From fe28292ec3b857d0f8fe27635c3b7f8e54dfd817 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Thu, 27 Jun 2019 18:06:12 -0300 Subject: [PATCH 4/6] [4639] Add newline at EOF --- ckan/cli/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index c85a3ecb313..f3989d76938 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -45,4 +45,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(datastore.datastore) ckan.add_command(translation.translation) ckan.add_command(dataset.dataset) -ckan.add_command(plugin_info.plugin_info) \ No newline at end of file +ckan.add_command(plugin_info.plugin_info) From 967a3205d9043fe984d953cba7e59f53bf97aee2 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Mon, 1 Jul 2019 18:36:57 -0300 Subject: [PATCH 5/6] [#4639] prefix strings and pep8 --- ckan/cli/plugin_info.py | 67 ++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/ckan/cli/plugin_info.py b/ckan/cli/plugin_info.py index 84824fd9396..35a00807815 100644 --- a/ckan/cli/plugin_info.py +++ b/ckan/cli/plugin_info.py @@ -1,8 +1,14 @@ +# encoding: utf-8 + import click -@click.command(name=u'plugin-info', short_help='Provide info on installed plugins.') + +@click.command( + name=u'plugin-info', + short_help=u'Provide info on installed plugins.' +) def plugin_info(): - ''' print info about current plugins from the .ini file''' + u''' print info about current plugins from the .ini file''' import ckan.plugins as p interfaces = {} plugins = {} @@ -10,7 +16,7 @@ def plugin_info(): item = getattr(p, name) try: if issubclass(item, p.Interface): - interfaces[item] = {'class': item} + interfaces[item] = {u'class': item} except TypeError: pass @@ -18,41 +24,46 @@ def plugin_info(): for plugin in p.PluginImplementations(interface): name = plugin.name if name not in plugins: - plugins[name] = {'doc': plugin.__doc__, - 'class': plugin, - 'implements': []} - plugins[name]['implements'].append(interface.__name__) + plugins[name] = { + u'doc': plugin.__doc__, + u'class': plugin, + u'implements': [] + } + plugins[name][u'implements'].append(interface.__name__) for plugin in plugins: p = plugins[plugin] click.echo(plugin + ':') - click.echo('-' * (len(plugin) + 1)) - if p['doc']: - click.echo(p['doc']) - click.echo('Implements:') - for i in p['implements']: + click.echo(u'-' * (len(plugin) + 1)) + if p[u'doc']: + click.echo(p[u'doc']) + click.echo(u'Implements:') + for i in p[u'implements']: extra = None - if i == 'ITemplateHelpers': - extra = _template_helpers(p['class']) - if i == 'IActions': - extra = _actions(p['class']) - click.echo(' {i}'.format(i=i)) + if i == u'ITemplateHelpers': + extra = _template_helpers(p[u'class']) + if i == u'IActions': + extra = _actions(p[u'class']) + click.echo(u' {i}'.format(i=i)) if extra: click.echo(extra) click.echo() + def _template_helpers(plugin_class): - ''' Return readable helper function info. ''' + u''' Return readable helper function info. ''' helpers = plugin_class.get_helpers() return _function_info(helpers) + def _actions(plugin_class): - ''' Return readable action function info. ''' + u''' Return readable action function info. ''' actions = plugin_class.get_actions() return _function_info(actions) + def _function_info(functions): - ''' Take a dict of functions and output readable info ''' + u''' Take a dict of functions and output readable info ''' import inspect output = [] for function_name in functions: @@ -61,22 +72,22 @@ def _function_info(functions): params = args_info.args num_params = len(params) if args_info.varargs: - params.append('*' + args_info.varargs) + params.append(u'*' + args_info.varargs) if args_info.keywords: - params.append('**' + args_info.keywords) + params.append(u'**' + args_info.keywords) if args_info.defaults: offset = num_params - len(args_info.defaults) for i, v in enumerate(args_info.defaults): - params[i + offset] = params[i + offset] + '=' + repr(v) + params[i + offset] = params[i + offset] + u'=' + repr(v) # is this a classmethod if so remove the first parameter if inspect.ismethod(fn) and inspect.isclass(fn.__self__): params = params[1:] - params = ', '.join(params) - output.append(' {function_name}({params})'.format( + params = u', '.join(params) + output.append(u' {function_name}({params})'.format( function_name=function_name, params=params)) # doc string if fn.__doc__: - bits = fn.__doc__.split('\n') + bits = fn.__doc__.split(u'\n') for bit in bits: - output.append(' {bit}'.format(bit=bit)) - return ('\n').join(output) + output.append(u' {bit}'.format(bit=bit)) + return (u'\n').join(output) From faa95752e53da43f849936453bcdf47ed8c846b1 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Mon, 1 Jul 2019 18:45:27 -0300 Subject: [PATCH 6/6] [#4639] Missing string prefix --- ckan/cli/plugin_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckan/cli/plugin_info.py b/ckan/cli/plugin_info.py index 35a00807815..9f6a8ac47d2 100644 --- a/ckan/cli/plugin_info.py +++ b/ckan/cli/plugin_info.py @@ -33,7 +33,7 @@ def plugin_info(): for plugin in plugins: p = plugins[plugin] - click.echo(plugin + ':') + click.echo(plugin + u':') click.echo(u'-' * (len(plugin) + 1)) if p[u'doc']: click.echo(p[u'doc'])