63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
# Copyright 2017 AT&T Intellectual Property. All other 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 re
|
|
import string
|
|
|
|
|
|
def to_camel_case(s):
|
|
"""Convert string to camel case."""
|
|
return (s[0].lower() + string.capwords(s, sep='_')
|
|
.replace('_', '')[1:] if s else s)
|
|
|
|
|
|
def to_snake_case(name):
|
|
"""Convert string to snake case."""
|
|
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
|
|
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
|
|
|
|
|
|
def multi_getattr(multi_key, dict_data):
|
|
"""Iteratively check for nested attributes in the YAML data.
|
|
|
|
Check for nested attributes included in "dest" attributes in the data
|
|
section of the YAML file. For example, a "dest" attribute of
|
|
".foo.bar.baz" should mean that the YAML data adheres to:
|
|
|
|
.. code-block:: yaml
|
|
|
|
---
|
|
foo:
|
|
bar:
|
|
baz: <data_to_be_substituted_here>
|
|
|
|
:param multi_key: A multi-part key that references nested data in the
|
|
substitutable part of the YAML data, e.g. ".foo.bar.baz".
|
|
:param substitutable_data: The section of data in the YAML data that
|
|
is intended to be substituted with secrets.
|
|
:returns: nested entry in ``dict_data`` if present; else None.
|
|
"""
|
|
attrs = multi_key.split('.')
|
|
# Ignore the first attribute if it is "." as that is a self-reference.
|
|
if attrs[0] == '':
|
|
attrs = attrs[1:]
|
|
|
|
data = dict_data
|
|
for attr in attrs:
|
|
if attr not in data:
|
|
return None
|
|
data = data.get(attr)
|
|
|
|
return data
|