Esempio n. 1
0
    def test_fail_fast_single_flag_and_skip_remaining_validators(self):
        def raise_unexpected_error(x):
            del x
            raise _exceptions.ValidationError('Should not be raised.')

        _defines.DEFINE_float('flag_1',
                              None,
                              'flag 1',
                              flag_values=self.flag_values)
        _defines.DEFINE_float('flag_2',
                              4.2,
                              'flag 2',
                              flag_values=self.flag_values)
        _validators.mark_flag_as_required('flag_1',
                                          flag_values=self.flag_values)
        _validators.register_validator('flag_1',
                                       raise_unexpected_error,
                                       flag_values=self.flag_values)
        _validators.register_multi_flags_validator(
            ['flag_2', 'flag_1'],
            raise_unexpected_error,
            flag_values=self.flag_values)
        argv = ('./program', '')
        expected = (
            'flag --flag_1=None: Flag --flag_1 must have a value other than None.'
        )
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values(argv)
        self.assertEqual(expected, str(cm.exception))
Esempio n. 2
0
 def test_validate_all_flags(self):
     fv = _flagvalues.FlagValues()
     _defines.DEFINE_string('name', None, '', flag_values=fv)
     _validators.mark_flag_as_required('name', flag_values=fv)
     with self.assertRaises(_exceptions.IllegalFlagValueError):
         fv.validate_all_flags()
     fv.name = 'test'
     fv.validate_all_flags()
Esempio n. 3
0
 def test_success(self):
     _defines.DEFINE_string('string_flag',
                            None,
                            'string flag',
                            flag_values=self.flag_values)
     _validators.mark_flag_as_required('string_flag',
                                       flag_values=self.flag_values)
     argv = ('./program', '--string_flag=value')
     self.flag_values(argv)
     self.assertEqual('value', self.flag_values.string_flag)
Esempio n. 4
0
 def test_catch_none_as_default(self):
     _defines.DEFINE_string('string_flag',
                            None,
                            'string flag',
                            flag_values=self.flag_values)
     _validators.mark_flag_as_required('string_flag',
                                       flag_values=self.flag_values)
     argv = ('./program', )
     expected = (
         r'flag --string_flag=None: Flag --string_flag must be specified\.')
     self.assertRaisesRegexp(_exceptions.IllegalFlagValueError, expected,
                             self.flag_values, argv)
Esempio n. 5
0
 def test_flag_default_not_none_warning(self):
     _defines.DEFINE_string('flag_not_none',
                            '',
                            'empty default',
                            flag_values=self.flag_values)
     with warnings.catch_warnings(record=True) as w:
         warnings.simplefilter('always')
         _validators.mark_flag_as_required('flag_not_none',
                                           flag_values=self.flag_values)
         self.assertLen(w, 1)
         self.assertIn('--flag_not_none has a non-None default value',
                       str(w[0].message))
Esempio n. 6
0
 def test_catch_none_as_default(self):
     _defines.DEFINE_string('string_flag',
                            None,
                            'string flag',
                            flag_values=self.flag_values)
     _validators.mark_flag_as_required('string_flag',
                                       flag_values=self.flag_values)
     argv = ('./program', )
     expected = (
         r'flag --string_flag=None: Flag --string_flag must have a value other '
         r'than None\.')
     with self.assertRaisesRegex(_exceptions.IllegalFlagValueError,
                                 expected):
         self.flag_values(argv)
Esempio n. 7
0
 def test_catch_setting_none_after_program_start(self):
     _defines.DEFINE_string('string_flag',
                            'value',
                            'string flag',
                            flag_values=self.flag_values)
     _validators.mark_flag_as_required('string_flag',
                                       flag_values=self.flag_values)
     argv = ('./program', )
     self.flag_values(argv)
     self.assertEqual('value', self.flag_values.string_flag)
     expected = (
         'flag --string_flag=None: Flag --string_flag must have a value '
         'other than None.')
     with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
         self.flag_values.string_flag = None
     self.assertEqual(expected, str(cm.exception))
Esempio n. 8
0
 def test_catch_setting_none_after_program_start(self):
     _defines.DEFINE_string('string_flag',
                            'value',
                            'string flag',
                            flag_values=self.flag_values)
     _validators.mark_flag_as_required('string_flag',
                                       flag_values=self.flag_values)
     argv = ('./program', )
     self.flag_values(argv)
     self.assertEqual('value', self.flag_values.string_flag)
     expected = 'flag --string_flag=None: Flag --string_flag must be specified.'
     try:
         self.flag_values.string_flag = None
         raise AssertionError('Failed to detect non-set required flag.')
     except _exceptions.IllegalFlagValueError as e:
         self.assertEqual(expected, str(e))
def DEFINE_flag(  # pylint: disable=invalid-name
        flag,
        flag_values=_flagvalues.FLAGS,
        module_name=None,
        required=False):
    """Registers a 'Flag' object with a 'FlagValues' object.

  By default, the global FLAGS 'FlagValue' object is used.

  Typical users will use one of the more specialized DEFINE_xxx
  functions, such as DEFINE_string or DEFINE_integer.  But developers
  who need to create Flag objects themselves should use this function
  to register their flags.

  Args:
    flag: Flag, a flag that is key to the module.
    flag_values: FlagValues, the FlagValues instance with which the flag will be
      registered. This should almost never need to be overridden.
    module_name: str, the name of the Python module declaring this flag. If not
      provided, it will be computed using the stack trace of this call.
    required: bool, is this a required flag. This must be used as a keyword
      argument.

  Returns:
    a handle to defined flag.
  """
    if required and flag.default is not None:
        raise ValueError('Required flag --%s cannot have a non-None default' %
                         flag.name)
    # Copying the reference to flag_values prevents pychecker warnings.
    fv = flag_values
    fv[flag.name] = flag
    # Tell flag_values who's defining the flag.
    if module_name:
        module = sys.modules.get(module_name)
    else:
        module, module_name = _helpers.get_calling_module_object_and_name()
    flag_values.register_flag_by_module(module_name, flag)
    flag_values.register_flag_by_module_id(id(module), flag)
    if required:
        _validators.mark_flag_as_required(flag.name, fv)
    ensure_non_none_value = (flag.default is not None) or required
    return _flagvalues.FlagHolder(fv,
                                  flag,
                                  ensure_non_none_value=ensure_non_none_value)