diff --git a/doc/source/api/dictutils.rst b/doc/source/api/dictutils.rst new file mode 100644 index 00000000..00fb39d2 --- /dev/null +++ b/doc/source/api/dictutils.rst @@ -0,0 +1,6 @@ +=========== + dictutils +=========== + +.. automodule:: oslo_utils.dictutils + :members: diff --git a/doc/source/index.rst b/doc/source/index.rst index c3ac36c2..684f9332 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -18,6 +18,7 @@ API Documentation .. toctree:: :maxdepth: 2 + api/dictutils api/encodeutils api/eventletutils api/excutils diff --git a/oslo_utils/dictutils.py b/oslo_utils/dictutils.py new file mode 100644 index 00000000..44affb71 --- /dev/null +++ b/oslo_utils/dictutils.py @@ -0,0 +1,31 @@ +# Copyright (c) 2016 EasyStack Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import six + + +def flatten_dict_to_keypairs(d, separator=':'): + """Generator that produces sequence of keypairs for nested dictionaries. + + :param d: dictionaries which may be nested + :param separator: symbol between names + """ + for name, value in sorted(six.iteritems(d)): + if isinstance(value, dict): + for subname, subvalue in flatten_dict_to_keypairs(value, + separator): + yield ('%s%s%s' % (name, separator, subname), subvalue) + else: + yield name, value diff --git a/oslo_utils/tests/test_dictutils.py b/oslo_utils/tests/test_dictutils.py new file mode 100644 index 00000000..4cc4fcee --- /dev/null +++ b/oslo_utils/tests/test_dictutils.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2016 EasyStack Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from oslotest import base as test_base + +from oslo_utils import dictutils as du + + +class DictUtilsTestCase(test_base.BaseTestCase): + + def test_flatten_dict_to_keypairs(self): + data = {'a': 'A', 'b': 'B', + 'nested': {'a': 'A', 'b': 'B'}} + pairs = list(du.flatten_dict_to_keypairs(data)) + self.assertEqual([('a', 'A'), ('b', 'B'), + ('nested:a', 'A'), ('nested:b', 'B')], + pairs) + + def test_flatten_dict_to_keypairs_with_separator(self): + data = {'a': 'A', 'b': 'B', + 'nested': {'a': 'A', 'b': 'B'}} + pairs = list(du.flatten_dict_to_keypairs(data, separator='.')) + self.assertEqual([('a', 'A'), ('b', 'B'), + ('nested.a', 'A'), ('nested.b', 'B')], + pairs)