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))
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()
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)
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)
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))
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)
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))
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)