From 4cf8859c18ef9bc68ff5fe7216bda6fd16a1e939 Mon Sep 17 00:00:00 2001 From: Petros Maniatis Date: Thu, 6 Dec 2018 14:12:52 -0800 Subject: 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 --- absl/tests/app_test.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'absl/tests') 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__': -- cgit v1.2.3