def _register_bounds_validator_if_needed(parser, name, flag_values):
  """Enforces lower and upper bounds for numeric flags.

  Args:
    parser: NumericParser (either FloatParser or IntegerParser), provides lower
        and upper bounds, and help text to display.
    name: str, name of the flag
    flag_values: FlagValues.
  """
  if parser.lower_bound is not None or parser.upper_bound is not None:

    def checker(value):
      if value is not None and parser.is_outside_bounds(value):
        message = '%s is not %s' % (value, parser.syntactic_help)
        raise _exceptions.ValidationError(message)
      return True

    _validators.register_validator(name, checker, flag_values=flag_values)
Example #2
0
    def test_error_message_when_checker_raises_exception_on_start(self):
        def checker(x):
            self.call_args.append(x)
            raise _exceptions.ValidationError('Specific message')

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values(argv)
        self.assertEqual('flag --test_flag=1: Specific message',
                         str(cm.exception))
        self.assertEqual([1], self.call_args)
Example #3
0
    def test_success(self):
        def checker(x):
            self.call_args.append(x)
            return True

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', )
        self.flag_values(argv)
        self.assertEqual(None, self.flag_values.test_flag)
        self.flag_values.test_flag = 2
        self.assertEqual(2, self.flag_values.test_flag)
        self.assertEqual([None, 2], self.call_args)
Example #4
0
    def test_exception_raised_if_checker_fails(self):
        def checker(x):
            self.call_args.append(x)
            return x == 1

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        self.flag_values(argv)
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values.test_flag = 2
        self.assertEqual('flag --test_flag=2: Errors happen',
                         str(cm.exception))
        self.assertEqual([1, 2], self.call_args)
Example #5
0
    def test_error_message_when_checker_returns_false_on_start(self):
        def checker(x):
            self.call_args.append(x)
            return False

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        try:
            self.flag_values(argv)
            raise AssertionError('IllegalFlagValueError expected')
        except _exceptions.IllegalFlagValueError as e:
            self.assertEqual('flag --test_flag=1: Errors happen', str(e))
        self.assertEqual([1], self.call_args)
Example #6
0
    def test_validator_not_called_when_other_flag_is_changed(self):
        def checker(x):
            self.call_args.append(x)
            return True

        _defines.DEFINE_integer('test_flag',
                                1,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _defines.DEFINE_integer('other_flag',
                                2,
                                'Other integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', )
        self.flag_values(argv)
        self.assertEqual(1, self.flag_values.test_flag)
        self.flag_values.other_flag = 3
        self.assertEqual([1], self.call_args)
Example #7
0
    def test_fail_fast_multi_flag_and_skip_remaining_validators(self):
        def raise_expected_error(x):
            del x
            raise _exceptions.ValidationError('Expected error.')

        def raise_unexpected_error(x):
            del x
            raise _exceptions.ValidationError('Got unexpected error.')

        _defines.DEFINE_float('flag_1',
                              5.1,
                              'flag 1',
                              flag_values=self.flag_values)
        _defines.DEFINE_float('flag_2',
                              10.0,
                              'flag 2',
                              flag_values=self.flag_values)
        _validators.register_multi_flags_validator(
            ['flag_1', 'flag_2'],
            raise_expected_error,
            flag_values=self.flag_values)
        _validators.register_multi_flags_validator(
            ['flag_2', 'flag_1'],
            raise_unexpected_error,
            flag_values=self.flag_values)
        _validators.register_validator('flag_1',
                                       raise_unexpected_error,
                                       flag_values=self.flag_values)
        _validators.register_validator('flag_2',
                                       raise_unexpected_error,
                                       flag_values=self.flag_values)
        argv = ('./program', '')
        expected = ('flags flag_1=5.1, flag_2=10.0: Expected error.')
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values(argv)
        self.assertEqual(expected, str(cm.exception))
Example #8
0
    def test_exception_raised_if_checker_raises_exception(self):
        def checker(x):
            self.call_args.append(x)
            if x == 1:
                return True
            raise _exceptions.ValidationError('Specific message')

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        self.flag_values(argv)
        try:
            self.flag_values.test_flag = 2
            raise AssertionError('IllegalFlagValueError expected')
        except _exceptions.IllegalFlagValueError as e:
            self.assertEqual('flag --test_flag=2: Specific message', str(e))
        self.assertEqual([1, 2], self.call_args)