aboutsummaryrefslogtreecommitdiff
path: root/absl/tests/app_test.py
diff options
context:
space:
mode:
authorPetros Maniatis <maniatis@google.com>2018-12-06 14:12:52 -0800
committerCopybara-Service <copybara-piper@google.com>2018-12-06 14:13:05 -0800
commit4cf8859c18ef9bc68ff5fe7216bda6fd16a1e939 (patch)
tree0e7c3a9caf20ad6cbe953e4bbbe8dc2301b14863 /absl/tests/app_test.py
parentf24641ca72815e2643659cb7c8a966e5faa6e580 (diff)
downloadabsl-py-4cf8859c18ef9bc68ff5fe7216bda6fd16a1e939.tar.gz
Add multi enum class flag to absl.flags.
This change enables the use of enum.Enum objects in multi_* style labels. Previously the multi_enum flag in absl.flags only accepted strings. The new multi_enum_class flag accepts (lists of) Enum class members. The text format of lists of enums when serializing into XML differs from the list format in other multi_* types of flags. This is because all other multi_* types rely on repr() to turn a list into a string (since all other multi_* types have primitive contents). With multi_enum_class, repr() prints out a list of the repr()'s of Enum objects, which are rather unsightly for public consumption (e.g., they contain the integer value of the enum flags). This change does some acrobatics to ensure XML representation of flag usage looks reasonable for lists, but those rendered lists look a little different from repr()'ed lists. This change fixes the way multi_* flags are serialized when saved for future re-ingestion via a command line. It makes each flag value appear on a separate line, by modifying the list separator of all MultiFlag and subclasses to be '\n'. PiperOrigin-RevId: 224405076
Diffstat (limited to 'absl/tests/app_test.py')
-rw-r--r--absl/tests/app_test.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/absl/tests/app_test.py b/absl/tests/app_test.py
index 261c665..ef39c3a 100644
--- a/absl/tests/app_test.py
+++ b/absl/tests/app_test.py
@@ -29,6 +29,7 @@ import unittest
from absl import app
from absl import flags
+from absl._enum_module import enum
from absl.testing import _bazelize_command
from absl.testing import absltest
from absl.testing import flagsaver
@@ -326,16 +327,42 @@ class FlagValuesExternalizationTest(absltest.TestCase):
# flags will go through the round trip process.
flags.DEFINE_string('testflag', 'testval', 'help', flag_values=FLAGS)
+ flags.DEFINE_multi_enum('test_multi_enum_flag',
+ ['x', 'y'], ['x', 'y', 'z'],
+ 'Multi enum help.',
+ flag_values=FLAGS)
+
+ class Fruit(enum.Enum):
+ APPLE = 1
+ ORANGE = 2
+ TOMATO = 3
+ flags.DEFINE_multi_enum_class('test_multi_enum_class_flag',
+ ['APPLE', 'TOMATO'], Fruit,
+ 'Fruit help.',
+ flag_values=FLAGS)
+
new_flag_values = flags.FlagValues()
new_flag_values.append_flag_values(FLAGS)
FLAGS.testflag = 'roundtrip_me'
+ FLAGS.test_multi_enum_flag = ['y', 'z']
+ FLAGS.test_multi_enum_class_flag = [Fruit.ORANGE, Fruit.APPLE]
argv = ['binary_name'] + FLAGS.flags_into_string().splitlines()
self.assertNotEqual(new_flag_values['testflag'], FLAGS.testflag)
+ self.assertNotEqual(new_flag_values['test_multi_enum_flag'],
+ FLAGS.test_multi_enum_flag)
+ self.assertNotEqual(new_flag_values['test_multi_enum_class_flag'],
+ FLAGS.test_multi_enum_class_flag)
new_flag_values(argv)
self.assertEqual(new_flag_values.testflag, FLAGS.testflag)
+ self.assertEqual(new_flag_values.test_multi_enum_flag,
+ FLAGS.test_multi_enum_flag)
+ self.assertEqual(new_flag_values.test_multi_enum_class_flag,
+ FLAGS.test_multi_enum_class_flag)
del FLAGS.testflag
+ del FLAGS.test_multi_enum_flag
+ del FLAGS.test_multi_enum_class_flag
if __name__ == '__main__':