From ee678cb96082fec9c7a4a28673dbc637095a8f3b Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Sun, 3 May 2020 13:45:59 +0200 Subject: [PATCH] Creating a file for OptionProviderMixin and helper functions --- pylint/config/__init__.py | 110 +---------------------- pylint/config/options_provider_mixin.py | 111 ++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 109 deletions(-) create mode 100644 pylint/config/options_provider_mixin.py diff --git a/pylint/config/__init__.py b/pylint/config/__init__.py index 54cf8e780..3fe8c573b 100644 --- a/pylint/config/__init__.py +++ b/pylint/config/__init__.py @@ -33,16 +33,9 @@ # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/master/COPYING -"""utilities for Pylint configuration : - -* pylintrc -* pylint.d (PYLINTHOME) -""" -import optparse import os import pickle import sys -from typing import Any, Dict, Tuple from pylint.config.find_default_config_files import find_default_config_files from pylint.config.man_help_formatter import _ManHelpFormatter @@ -55,6 +48,7 @@ from pylint.config.option import ( ) from pylint.config.option_manager_mixin import OptionsManagerMixIn from pylint.config.option_parser import OptionParser +from pylint.config.options_provider_mixin import OptionsProviderMixIn __all__ = [ "_csv_validator", @@ -129,108 +123,6 @@ to search for configuration file. ) -class UnsupportedAction(Exception): - """raised by set_option when it doesn't know what to do for an action""" - -class OptionsProviderMixIn: - """Mixin to provide options to an OptionsManager""" - - # those attributes should be overridden - priority = -1 - name = "default" - options = () # type: Tuple[Tuple[str, Dict[str, Any]], ...] - level = 0 - - def __init__(self): - self.config = optparse.Values() - self.load_defaults() - - def load_defaults(self): - """initialize the provider using default values""" - for opt, optdict in self.options: - action = optdict.get("action") - if action != "callback": - # callback action have no default - if optdict is None: - optdict = self.get_option_def(opt) - default = optdict.get("default") - self.set_option(opt, default, action, optdict) - - def option_attrname(self, opt, optdict=None): - """get the config attribute corresponding to opt""" - if optdict is None: - optdict = self.get_option_def(opt) - return optdict.get("dest", opt.replace("-", "_")) - - def option_value(self, opt): - """get the current value for the given option""" - return getattr(self.config, self.option_attrname(opt), None) - - def set_option(self, optname, value, action=None, optdict=None): - """method called to set an option (registered in the options list)""" - if optdict is None: - optdict = self.get_option_def(optname) - if value is not None: - value = _validate(value, optdict, optname) - if action is None: - action = optdict.get("action", "store") - if action == "store": - setattr(self.config, self.option_attrname(optname, optdict), value) - elif action in ("store_true", "count"): - setattr(self.config, self.option_attrname(optname, optdict), 0) - elif action == "store_false": - setattr(self.config, self.option_attrname(optname, optdict), 1) - elif action == "append": - optname = self.option_attrname(optname, optdict) - _list = getattr(self.config, optname, None) - if _list is None: - if isinstance(value, (list, tuple)): - _list = value - elif value is not None: - _list = [] - _list.append(value) - setattr(self.config, optname, _list) - elif isinstance(_list, tuple): - setattr(self.config, optname, _list + (value,)) - else: - _list.append(value) - elif action == "callback": - optdict["callback"](None, optname, value, None) - else: - raise UnsupportedAction(action) - - def get_option_def(self, opt): - """return the dictionary defining an option given its name""" - assert self.options - for option in self.options: - if option[0] == opt: - return option[1] - raise optparse.OptionError( - "no such option %s in section %r" % (opt, self.name), opt - ) - - def options_by_section(self): - """return an iterator on options grouped by section - - (section, [list of (optname, optdict, optvalue)]) - """ - sections = {} - for optname, optdict in self.options: - sections.setdefault(optdict.get("group"), []).append( - (optname, optdict, self.option_value(optname)) - ) - if None in sections: - yield None, sections.pop(None) - for section, options in sorted(sections.items()): - yield section.upper(), options - - def options_and_values(self, options=None): - if options is None: - options = self.options - for optname, optdict in options: - yield (optname, optdict, self.option_value(optname)) - - class ConfigurationMixIn(OptionsManagerMixIn, OptionsProviderMixIn): """basic mixin for simple configurations which don't need the manager / providers model diff --git a/pylint/config/options_provider_mixin.py b/pylint/config/options_provider_mixin.py new file mode 100644 index 000000000..cae6d5865 --- /dev/null +++ b/pylint/config/options_provider_mixin.py @@ -0,0 +1,111 @@ +# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# For details: https://github.com/PyCQA/pylint/blob/master/COPYING + + +import optparse +from typing import Any, Dict, Tuple + +from pylint.config.option import _validate + + +class UnsupportedAction(Exception): + """raised by set_option when it doesn't know what to do for an action""" + + +class OptionsProviderMixIn: + """Mixin to provide options to an OptionsManager""" + + # those attributes should be overridden + priority = -1 + name = "default" + options = () # type: Tuple[Tuple[str, Dict[str, Any]], ...] + level = 0 + + def __init__(self): + self.config = optparse.Values() + self.load_defaults() + + def load_defaults(self): + """initialize the provider using default values""" + for opt, optdict in self.options: + action = optdict.get("action") + if action != "callback": + # callback action have no default + if optdict is None: + optdict = self.get_option_def(opt) + default = optdict.get("default") + self.set_option(opt, default, action, optdict) + + def option_attrname(self, opt, optdict=None): + """get the config attribute corresponding to opt""" + if optdict is None: + optdict = self.get_option_def(opt) + return optdict.get("dest", opt.replace("-", "_")) + + def option_value(self, opt): + """get the current value for the given option""" + return getattr(self.config, self.option_attrname(opt), None) + + def set_option(self, optname, value, action=None, optdict=None): + """method called to set an option (registered in the options list)""" + if optdict is None: + optdict = self.get_option_def(optname) + if value is not None: + value = _validate(value, optdict, optname) + if action is None: + action = optdict.get("action", "store") + if action == "store": + setattr(self.config, self.option_attrname(optname, optdict), value) + elif action in ("store_true", "count"): + setattr(self.config, self.option_attrname(optname, optdict), 0) + elif action == "store_false": + setattr(self.config, self.option_attrname(optname, optdict), 1) + elif action == "append": + optname = self.option_attrname(optname, optdict) + _list = getattr(self.config, optname, None) + if _list is None: + if isinstance(value, (list, tuple)): + _list = value + elif value is not None: + _list = [] + _list.append(value) + setattr(self.config, optname, _list) + elif isinstance(_list, tuple): + setattr(self.config, optname, _list + (value,)) + else: + _list.append(value) + elif action == "callback": + optdict["callback"](None, optname, value, None) + else: + raise UnsupportedAction(action) + + def get_option_def(self, opt): + """return the dictionary defining an option given its name""" + assert self.options + for option in self.options: + if option[0] == opt: + return option[1] + raise optparse.OptionError( + "no such option %s in section %r" % (opt, self.name), opt + ) + + def options_by_section(self): + """return an iterator on options grouped by section + + (section, [list of (optname, optdict, optvalue)]) + """ + sections = {} + for optname, optdict in self.options: + sections.setdefault(optdict.get("group"), []).append( + (optname, optdict, self.option_value(optname)) + ) + if None in sections: + yield None, sections.pop(None) + for section, options in sorted(sections.items()): + yield section.upper(), options + + def options_and_values(self, options=None): + if options is None: + options = self.options + for optname, optdict in options: + yield (optname, optdict, self.option_value(optname))