aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--absl/flags/_flagvalues.py10
-rw-r--r--absl/flags/tests/_flagvalues_test.py28
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.