Esempio n. 1
0
  def Parse(self, argument):
    """Parse string and set flag value.

    Args:
      argument: String, value to be parsed for flag.
    """
    if self.present and not self.allow_overwrite:
      raise exceptions.IllegalFlagValue(
          'flag --%s=%s: already defined as %s' % (
              self.name, argument, self.value))
    try:
      self.value = self.parser.Parse(argument)
    except ValueError, e:  # Recast ValueError as IllegalFlagValue.
      raise exceptions.IllegalFlagValue(
          'flag --%s=%s: %s' % (self.name, argument, e))
Esempio n. 2
0
 def __setitem__(self, name, flag):
     """Registers a new flag variable."""
     fl = self.FlagDict()
     if not isinstance(flag, _flag.Flag):
         raise exceptions.IllegalFlagValue(flag)
     if str is bytes and isinstance(name, unicode):
         # When using Python 2 with unicode_literals, allow it but encode it
         # into the bytes type we require.
         name = name.encode('utf-8')
     if not isinstance(name, type('')):
         raise exceptions.FlagsError('Flag name must be a string')
     if not name:
         raise exceptions.FlagsError('Flag name cannot be empty')
     if name in fl and not flag.allow_override and not fl[
             name].allow_override:
         module, module_name = _helpers.GetCallingModuleObjectAndName()
         if (self.FindModuleDefiningFlag(name) == module_name
                 and id(module) != self.FindModuleIdDefiningFlag(name)):
             # If the flag has already been defined by a module with the same name,
             # but a different ID, we can stop here because it indicates that the
             # module is simply being imported a subsequent time.
             return
         raise exceptions.DuplicateFlagError(name, self)
     short_name = flag.short_name
     if short_name is not None:
         if (short_name in fl and not flag.allow_override
                 and not fl[short_name].allow_override):
             raise exceptions.DuplicateFlagError(short_name, self)
         fl[short_name] = flag
     if (name not in fl  # new flag
             or fl[name].using_default_value
             or not flag.using_default_value):
         fl[name] = flag
Esempio n. 3
0
    def _AssertValidators(self, validators):
        """Assert if all validators in the list are satisfied.

    Asserts validators in the order they were created.
    Args:
      validators: Iterable(gflags_validators.Validator), validators to be
        verified
    Raises:
      AttributeError: if validators work with a non-existing flag.
      IllegalFlagValue: if validation fails for at least one validator
    """
        for validator in sorted(
                validators, key=lambda validator: validator.insertion_index):
            try:
                validator.Verify(self)
            except gflags_validators.Error as e:
                message = validator.PrintFlagsWithValues(self)
                raise exceptions.IllegalFlagValue('%s: %s' % (message, str(e)))
Esempio n. 4
0
    def ReadFlagsFromFiles(self, argv, force_gnu=True):
        """Processes command line args, but also allow args to be read from file.

    Args:
      argv: A list of strings, usually sys.argv[1:], which may contain one or
        more flagfile directives of the form --flagfile="./filename".
        Note that the name of the program (sys.argv[0]) should be omitted.
      force_gnu: If False, --flagfile parsing obeys normal flag semantics.
        If True, --flagfile parsing instead follows gnu_getopt semantics.
        *** WARNING *** force_gnu=False may become the future default!

    Returns:
      A new list which has the original list combined with what we read
      from any flagfile(s).

    Raises:
      IllegalFlagValue: when --flagfile provided with no argument.

    References: Global gflags.FLAG class instance.

    This function should be called before the normal FLAGS(argv) call.
    This function scans the input list for a flag that looks like:
    --flagfile=<somefile>. Then it opens <somefile>, reads all valid key
    and value pairs and inserts them into the input list in exactly the
    place where the --flagfile arg is found.

    Note that your application's flags are still defined the usual way
    using gflags DEFINE_flag() type functions.

    Notes (assuming we're getting a commandline of some sort as our input):
    --> For duplicate flags, the last one we hit should "win".
    --> Since flags that appear later win, a flagfile's settings can be "weak"
        if the --flagfile comes at the beginning of the argument sequence,
        and it can be "strong" if the --flagfile comes at the end.
    --> A further "--flagfile=<otherfile.cfg>" CAN be nested in a flagfile.
        It will be expanded in exactly the spot where it is found.
    --> In a flagfile, a line beginning with # or // is a comment.
    --> Entirely blank lines _should_ be ignored.
    """
        rest_of_args = argv
        new_argv = []
        while rest_of_args:
            current_arg = rest_of_args[0]
            rest_of_args = rest_of_args[1:]
            if self.__IsFlagFileDirective(current_arg):
                # This handles the case of -(-)flagfile foo.  In this case the
                # next arg really is part of this one.
                if current_arg == '--flagfile' or current_arg == '-flagfile':
                    if not rest_of_args:
                        raise exceptions.IllegalFlagValue(
                            '--flagfile with no argument')
                    flag_filename = os.path.expanduser(rest_of_args[0])
                    rest_of_args = rest_of_args[1:]
                else:
                    # This handles the case of (-)-flagfile=foo.
                    flag_filename = self.ExtractFilename(current_arg)
                new_argv.extend(self.__GetFlagFileLines(flag_filename))
            else:
                new_argv.append(current_arg)
                # Stop parsing after '--', like getopt and gnu_getopt.
                if current_arg == '--':
                    break
                # Stop parsing after a non-flag, like getopt.
                if not current_arg.startswith('-'):
                    if not force_gnu and not self.__dict__['__use_gnu_getopt']:
                        break
                else:
                    if ('=' not in current_arg and rest_of_args
                            and not rest_of_args[0].startswith('-')):
                        # If this is an occurence of a legitimate --x y, skip the value
                        # so that it won't be mistaken for a standalone arg.
                        fl = self.FlagDict()
                        name = current_arg.lstrip('-')
                        if name in fl and not fl[name].boolean:
                            current_arg = rest_of_args[0]
                            rest_of_args = rest_of_args[1:]
                            new_argv.append(current_arg)

        if rest_of_args:
            new_argv.extend(rest_of_args)

        return new_argv