• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2017 The Abseil Authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Exception classes in ABSL flags library.
16
17Do NOT import this module directly. Import the flags package and use the
18aliases defined at the package level instead.
19"""
20
21import sys
22
23from absl.flags import _helpers
24
25
26_helpers.disclaim_module_ids.add(id(sys.modules[__name__]))
27
28
29class Error(Exception):
30  """The base class for all flags errors."""
31
32
33class CantOpenFlagFileError(Error):
34  """Raised when flagfile fails to open.
35
36  E.g. the file doesn't exist, or has wrong permissions.
37  """
38
39
40class DuplicateFlagError(Error):
41  """Raised if there is a flag naming conflict."""
42
43  @classmethod
44  def from_flag(cls, flagname, flag_values, other_flag_values=None):
45    """Creates a DuplicateFlagError by providing flag name and values.
46
47    Args:
48      flagname: str, the name of the flag being redefined.
49      flag_values: :class:`FlagValues`, the FlagValues instance containing the
50        first definition of flagname.
51      other_flag_values: :class:`FlagValues`, if it is not None, it should be
52        the FlagValues object where the second definition of flagname occurs.
53        If it is None, we assume that we're being called when attempting to
54        create the flag a second time, and we use the module calling this one
55        as the source of the second definition.
56
57    Returns:
58      An instance of DuplicateFlagError.
59    """
60    first_module = flag_values.find_module_defining_flag(
61        flagname, default='<unknown>')
62    if other_flag_values is None:
63      second_module = _helpers.get_calling_module()
64    else:
65      second_module = other_flag_values.find_module_defining_flag(
66          flagname, default='<unknown>')
67    flag_summary = flag_values[flagname].help
68    msg = ("The flag '%s' is defined twice. First from %s, Second from %s.  "
69           "Description from first occurrence: %s") % (
70               flagname, first_module, second_module, flag_summary)
71    return cls(msg)
72
73
74class IllegalFlagValueError(Error):
75  """Raised when the flag command line argument is illegal."""
76
77
78class UnrecognizedFlagError(Error):
79  """Raised when a flag is unrecognized.
80
81  Attributes:
82    flagname: str, the name of the unrecognized flag.
83    flagvalue: The value of the flag, empty if the flag is not defined.
84  """
85
86  def __init__(self, flagname, flagvalue='', suggestions=None):
87    self.flagname = flagname
88    self.flagvalue = flagvalue
89    if suggestions:
90      # Space before the question mark is intentional to not include it in the
91      # selection when copy-pasting the suggestion from (some) terminals.
92      tip = '. Did you mean: %s ?' % ', '.join(suggestions)
93    else:
94      tip = ''
95    super(UnrecognizedFlagError, self).__init__(
96        'Unknown command line flag \'%s\'%s' % (flagname, tip))
97
98
99class UnparsedFlagAccessError(Error):
100  """Raised when accessing the flag value from unparsed :class:`FlagValues`."""
101
102
103class ValidationError(Error):
104  """Raised when flag validator constraint is not satisfied."""
105
106
107class FlagNameConflictsWithMethodError(Error):
108  """Raised when a flag name conflicts with :class:`FlagValues` methods."""
109