151 lines
3.9 KiB
Python
Executable File
151 lines
3.9 KiB
Python
Executable File
#!/usr/bin/python
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you 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.
|
|
#
|
|
|
|
"""This module transform properties into different format"""
|
|
def render_yaml(yaml_root, prefix=""):
|
|
"""render yaml"""
|
|
result = ""
|
|
if isinstance(yaml_root, dict):
|
|
if prefix:
|
|
result += "\n"
|
|
for key in yaml_root:
|
|
result += "{}{}: {}".format(prefix, key, render_yaml(
|
|
yaml_root[key], prefix + " "))
|
|
elif isinstance(yaml_root, list):
|
|
result += "\n"
|
|
for item in yaml_root:
|
|
result += prefix + " - " + render_yaml(item, prefix + " ")
|
|
else:
|
|
result += "{}\n".format(yaml_root)
|
|
return result
|
|
|
|
|
|
def to_yaml(content):
|
|
"""transform to yaml"""
|
|
props = process_properties(content)
|
|
|
|
keys = props.keys()
|
|
yaml_props = {}
|
|
for key in keys:
|
|
parts = key.split(".")
|
|
node = yaml_props
|
|
prev_part = None
|
|
parent_node = {}
|
|
for part in parts[:-1]:
|
|
if part.isdigit():
|
|
if isinstance(node, dict):
|
|
parent_node[prev_part] = []
|
|
node = parent_node[prev_part]
|
|
while len(node) <= int(part):
|
|
node.append({})
|
|
parent_node = node
|
|
node = node[int(node)]
|
|
else:
|
|
if part not in node:
|
|
node[part] = {}
|
|
parent_node = node
|
|
node = node[part]
|
|
prev_part = part
|
|
if parts[-1].isdigit():
|
|
if isinstance(node, dict):
|
|
parent_node[prev_part] = []
|
|
node = parent_node[prev_part]
|
|
node.append(props[key])
|
|
else:
|
|
node[parts[-1]] = props[key]
|
|
|
|
return render_yaml(yaml_props)
|
|
|
|
|
|
def to_yml(content):
|
|
"""transform to yml"""
|
|
return to_yaml(content)
|
|
|
|
|
|
def to_properties(content):
|
|
"""transform to properties"""
|
|
result = ""
|
|
props = process_properties(content)
|
|
for key, val in props.items():
|
|
result += "{}: {}\n".format(key, val)
|
|
return result
|
|
|
|
|
|
def to_env(content):
|
|
"""transform to environment variables"""
|
|
result = ""
|
|
props = process_properties(content)
|
|
for key, val in props:
|
|
result += "{}={}\n".format(key, val)
|
|
return result
|
|
|
|
|
|
def to_sh(content):
|
|
"""transform to shell"""
|
|
result = ""
|
|
props = process_properties(content)
|
|
for key, val in props:
|
|
result += "export {}=\"{}\"\n".format(key, val)
|
|
return result
|
|
|
|
|
|
def to_cfg(content):
|
|
"""transform to config"""
|
|
result = ""
|
|
props = process_properties(content)
|
|
for key, val in props:
|
|
result += "{}={}\n".format(key, val)
|
|
return result
|
|
|
|
|
|
def to_conf(content):
|
|
"""transform to configuration"""
|
|
result = ""
|
|
props = process_properties(content)
|
|
for key, val in props:
|
|
result += "export {}={}\n".format(key, val)
|
|
return result
|
|
|
|
|
|
def to_xml(content):
|
|
"""transform to xml"""
|
|
result = "<configuration>\n"
|
|
props = process_properties(content)
|
|
for key in props:
|
|
result += "<property><name>{0}</name><value>{1}</value></property>\n". \
|
|
format(key, props[key])
|
|
result += "</configuration>"
|
|
return result
|
|
|
|
|
|
def process_properties(content, sep=': ', comment_char='#'):
|
|
"""
|
|
Read the file passed as parameter as a properties file.
|
|
"""
|
|
props = {}
|
|
for line in content.split("\n"):
|
|
sline = line.strip()
|
|
if sline and not sline.startswith(comment_char):
|
|
key_value = sline.split(sep)
|
|
key = key_value[0].strip()
|
|
value = sep.join(key_value[1:]).strip().strip('"')
|
|
props[key] = value
|
|
|
|
return props
|