From dfac6a2131403a037f0823c932ca85b1f6bccb38 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Sat, 16 Jan 2016 09:50:18 -0600 Subject: [PATCH] Record registered plugins and format their versions --- flake8/options/manager.py | 41 +++++++++++++++++++++++++++++++++++++++ flake8/plugins/manager.py | 5 +++++ 2 files changed, 46 insertions(+) diff --git a/flake8/options/manager.py b/flake8/options/manager.py index d328a1f..c69dba2 100644 --- a/flake8/options/manager.py +++ b/flake8/options/manager.py @@ -155,6 +155,11 @@ class OptionManager(object): self.options = [] self.program_name = prog self.version = version + self.registered_plugins = set() + + @staticmethod + def format_plugin(plugin_tuple): + return dict(zip(["entry", "name", "version"], plugin_tuple)) def add_option(self, *args, **kwargs): """Create and register a new option. @@ -176,11 +181,47 @@ class OptionManager(object): self.config_options_dict[option.config_name] = option LOG.debug('Registered option "%s".', option) + def generate_versions(self, format_str='%(name)s: %(version)s'): + """Generate a comma-separated list of versions of plugins.""" + return ', '.join( + format_str % self.format_plugin(plugin) + for plugin in self.registered_plugins + ) + + def update_version_string(self): + """Update the flake8 version string.""" + self.parser.version = (self.version + ' (' + + self.generate_versions() + ')') + + def generate_epilog(self): + """Create an epilog with the version and name of each of plugin.""" + plugin_version_format = '%(name)s(%(entry)s): %(version)s' + self.parser.epilog = 'Installed plugins: ' + self.generate_versions( + plugin_version_format + ) + def parse_args(self, args=None, values=None): """Simple proxy to calling the OptionParser's parse_args method.""" + self.generate_epilog() + self.update_version_string() options, xargs = self.parser.parse_args(args, values) for option in self.options: old_value = getattr(options, option.dest) setattr(options, option.dest, option.normalize(old_value)) return options, xargs + + def register_plugin(self, entry_point_name, name, version): + """Register a plugin relying on the OptionManager. + + :param str entry_point_name: + The name of the entry-point loaded with pkg_resources. For + example, if the entry-point looks like: ``C90 = mccabe.Checker`` + then the ``entry_point_name`` would be ``C90``. + :param str name: + The name of the checker itself. This will be the ``name`` + attribute of the class or function loaded from the entry-point. + :param str version: + The version of the checker that we're using. + """ + self.registered_plugins.add((entry_point_name, name, version)) diff --git a/flake8/plugins/manager.py b/flake8/plugins/manager.py index 81abdc4..1afdaa9 100644 --- a/flake8/plugins/manager.py +++ b/flake8/plugins/manager.py @@ -98,6 +98,11 @@ class Plugin(object): self.name, optmanager ) add_options(optmanager) + optmanager.register_plugin( + entry_point_name=self.name, + name=self.plugin.name, + version=self.plugin.version + ) class PluginManager(object):