diff options
author | Richard Levasseur <rlevasseur@google.com> | 2018-11-26 14:13:26 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-11-26 14:13:42 -0800 |
commit | 910aa920c21a4e6144192cd372c756f55e8487fd (patch) | |
tree | 59a91ecd605d6455f8482e7fa01fbd1fc3f10bc0 /absl/flags | |
parent | 1193ccf0c81e722723be5376e6ed1d198ea506bb (diff) | |
download | absl-py-910aa920c21a4e6144192cd372c756f55e8487fd.tar.gz |
Make flags_into_string deterministic.
This is (1) to match the c++ behavior and (2) so that build based upon the flag
values are also deterministic.
PiperOrigin-RevId: 222884822
Diffstat (limited to 'absl/flags')
-rw-r--r-- | absl/flags/_flagvalues.py | 10 | ||||
-rw-r--r-- | absl/flags/tests/_flagvalues_test.py | 28 |
2 files changed, 35 insertions, 3 deletions
diff --git a/absl/flags/_flagvalues.py b/absl/flags/_flagvalues.py index 559bfaf..101c52e 100644 --- a/absl/flags/_flagvalues.py +++ b/absl/flags/_flagvalues.py @@ -1178,11 +1178,15 @@ class FlagValues(object): Returns: str, the string with the flags assignments from this FlagValues object. + The flags are ordered by (module_name, flag_name). """ + module_flags = sorted(self.flags_by_module_dict().items()) s = '' - for flag in self._flags().values(): - if flag.value is not None: - s += flag.serialize() + '\n' + for unused_module_name, flags in module_flags: + flags = sorted(flags, key=lambda f: f.name) + for flag in flags: + if flag.value is not None: + s += flag.serialize() + '\n' return s def append_flags_into_file(self, filename): diff --git a/absl/flags/tests/_flagvalues_test.py b/absl/flags/tests/_flagvalues_test.py index 72fb4d4..f7f317a 100644 --- a/absl/flags/tests/_flagvalues_test.py +++ b/absl/flags/tests/_flagvalues_test.py @@ -18,6 +18,7 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import collections import copy import pickle import types @@ -526,6 +527,33 @@ absl.flags.tests.module_foo: self.assertEqual( sorted([flag_name1, flag_name2, flag_name3]), dir(flag_values)) + def test_flags_into_string_deterministic(self): + flag_values = _flagvalues.FlagValues() + _defines.DEFINE_string( + 'fa', 'x', '', flag_values=flag_values, module_name='mb') + _defines.DEFINE_string( + 'fb', 'x', '', flag_values=flag_values, module_name='mb') + _defines.DEFINE_string( + 'fc', 'x', '', flag_values=flag_values, module_name='ma') + _defines.DEFINE_string( + 'fd', 'x', '', flag_values=flag_values, module_name='ma') + + expected = ('--fc=x\n' + '--fd=x\n' + '--fa=x\n' + '--fb=x\n') + + flags_by_module_items = sorted( + flag_values.flags_by_module_dict().items(), reverse=True) + for _, module_flags in flags_by_module_items: + module_flags.sort(reverse=True) + + flag_values.__dict__['__flags_by_module'] = collections.OrderedDict( + flags_by_module_items) + + actual = flag_values.flags_into_string() + self.assertEqual(expected, actual) + class FlagValuesLoggingTest(absltest.TestCase): """Test to make sure logging.* functions won't recurse. |