diff --git a/flake8/options/manager.py b/flake8/options/manager.py index baccd95..a471960 100644 --- a/flake8/options/manager.py +++ b/flake8/options/manager.py @@ -105,8 +105,10 @@ class Option(object): def to_optparse(self): """Convert a Flake8 Option to an optparse Option.""" - return optparse.Option(*self.option_args, - **self.option_kwargs) + if not hasattr(self, '_opt'): + self._opt = optparse.Option(*self.option_args, + **self.option_kwargs) + return self._opt class OptionManager(object): @@ -130,6 +132,8 @@ class OptionManager(object): ``short_option_name`` and ``long_option_name`` may be specified positionally as they are with optparse normally. """ + if len(args) == 1 and args[0].startswith('--'): + args = (None, args[0]) option = Option(*args, **kwargs) self.parser.add_option(option.to_optparse()) self.options.append(option) diff --git a/tests/unit/test_option_manager.py b/tests/unit/test_option_manager.py new file mode 100644 index 0000000..27c47d6 --- /dev/null +++ b/tests/unit/test_option_manager.py @@ -0,0 +1,46 @@ +"""Unit tests for flake.options.manager.OptionManager.""" +import optparse + +import pytest + +from flake8.options import manager + + +@pytest.fixture +def optmanager(): + return manager.OptionManager(prog='flake8', version='3.0.0b1') + + +def test_option_manager_creates_option_parser(optmanager): + """Verify that a new manager creates a new parser.""" + assert optmanager.parser is not None + assert isinstance(optmanager.parser, optparse.OptionParser) is True + + +def test_add_option_short_option_only(optmanager): + """Verify the behaviour of adding a short-option only.""" + assert optmanager.options == [] + assert optmanager.config_options_dict == {} + + optmanager.add_option('-s', help='Test short opt') + assert optmanager.options[0].short_option_name == '-s' + + +def test_add_option_long_option_only(optmanager): + """Verify the behaviour of adding a long-option only.""" + assert optmanager.options == [] + assert optmanager.config_options_dict == {} + + optmanager.add_option('--long', help='Test long opt') + assert optmanager.options[0].short_option_name is None + assert optmanager.options[0].long_option_name == '--long' + + +def test_add_short_and_long_option_names(optmanager): + """Verify the behaviour of using both short and long option names.""" + assert optmanager.options == [] + assert optmanager.config_options_dict == {} + + optmanager.add_option('-b', '--both', help='Test both opts') + assert optmanager.options[0].short_option_name == '-b' + assert optmanager.options[0].long_option_name == '--both'