Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/absl_py-2.0.0-py3.8.egg/absl/flags/_validators_classes.py: 44%
43 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:13 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:13 +0000
1# Copyright 2021 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.
15"""Defines *private* classes used for flag validators.
17Do NOT import this module. DO NOT use anything from this module. They are
18private APIs.
19"""
21from absl.flags import _exceptions
24class Validator(object):
25 """Base class for flags validators.
27 Users should NOT overload these classes, and use flags.Register...
28 methods instead.
29 """
31 # Used to assign each validator an unique insertion_index
32 validators_count = 0
34 def __init__(self, checker, message):
35 """Constructor to create all validators.
37 Args:
38 checker: function to verify the constraint.
39 Input of this method varies, see SingleFlagValidator and
40 multi_flags_validator for a detailed description.
41 message: str, error message to be shown to the user.
42 """
43 self.checker = checker
44 self.message = message
45 Validator.validators_count += 1
46 # Used to assert validators in the order they were registered.
47 self.insertion_index = Validator.validators_count
49 def verify(self, flag_values):
50 """Verifies that constraint is satisfied.
52 flags library calls this method to verify Validator's constraint.
54 Args:
55 flag_values: flags.FlagValues, the FlagValues instance to get flags from.
56 Raises:
57 Error: Raised if constraint is not satisfied.
58 """
59 param = self._get_input_to_checker_function(flag_values)
60 if not self.checker(param):
61 raise _exceptions.ValidationError(self.message)
63 def get_flags_names(self):
64 """Returns the names of the flags checked by this validator.
66 Returns:
67 [string], names of the flags.
68 """
69 raise NotImplementedError('This method should be overloaded')
71 def print_flags_with_values(self, flag_values):
72 raise NotImplementedError('This method should be overloaded')
74 def _get_input_to_checker_function(self, flag_values):
75 """Given flag values, returns the input to be given to checker.
77 Args:
78 flag_values: flags.FlagValues, containing all flags.
79 Returns:
80 The input to be given to checker. The return type depends on the specific
81 validator.
82 """
83 raise NotImplementedError('This method should be overloaded')
86class SingleFlagValidator(Validator):
87 """Validator behind register_validator() method.
89 Validates that a single flag passes its checker function. The checker function
90 takes the flag value and returns True (if value looks fine) or, if flag value
91 is not valid, either returns False or raises an Exception.
92 """
94 def __init__(self, flag_name, checker, message):
95 """Constructor.
97 Args:
98 flag_name: string, name of the flag.
99 checker: function to verify the validator.
100 input - value of the corresponding flag (string, boolean, etc).
101 output - bool, True if validator constraint is satisfied.
102 If constraint is not satisfied, it should either return False or
103 raise flags.ValidationError(desired_error_message).
104 message: str, error message to be shown to the user if validator's
105 condition is not satisfied.
106 """
107 super(SingleFlagValidator, self).__init__(checker, message)
108 self.flag_name = flag_name
110 def get_flags_names(self):
111 return [self.flag_name]
113 def print_flags_with_values(self, flag_values):
114 return 'flag --%s=%s' % (self.flag_name, flag_values[self.flag_name].value)
116 def _get_input_to_checker_function(self, flag_values):
117 """Given flag values, returns the input to be given to checker.
119 Args:
120 flag_values: flags.FlagValues, the FlagValues instance to get flags from.
121 Returns:
122 object, the input to be given to checker.
123 """
124 return flag_values[self.flag_name].value
127class MultiFlagsValidator(Validator):
128 """Validator behind register_multi_flags_validator method.
130 Validates that flag values pass their common checker function. The checker
131 function takes flag values and returns True (if values look fine) or,
132 if values are not valid, either returns False or raises an Exception.
133 """
135 def __init__(self, flag_names, checker, message):
136 """Constructor.
138 Args:
139 flag_names: [str], containing names of the flags used by checker.
140 checker: function to verify the validator.
141 input - dict, with keys() being flag_names, and value for each
142 key being the value of the corresponding flag (string, boolean,
143 etc).
144 output - bool, True if validator constraint is satisfied.
145 If constraint is not satisfied, it should either return False or
146 raise flags.ValidationError(desired_error_message).
147 message: str, error message to be shown to the user if validator's
148 condition is not satisfied
149 """
150 super(MultiFlagsValidator, self).__init__(checker, message)
151 self.flag_names = flag_names
153 def _get_input_to_checker_function(self, flag_values):
154 """Given flag values, returns the input to be given to checker.
156 Args:
157 flag_values: flags.FlagValues, the FlagValues instance to get flags from.
158 Returns:
159 dict, with keys() being self.flag_names, and value for each key
160 being the value of the corresponding flag (string, boolean, etc).
161 """
162 return dict([key, flag_values[key].value] for key in self.flag_names)
164 def print_flags_with_values(self, flag_values):
165 prefix = 'flags '
166 flags_with_values = []
167 for key in self.flag_names:
168 flags_with_values.append('%s=%s' % (key, flag_values[key].value))
169 return prefix + ', '.join(flags_with_values)
171 def get_flags_names(self):
172 return self.flag_names