You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.2 KiB
Python
80 lines
3.2 KiB
Python
#
|
|
# Copyright (c) Contributors to the Open 3D Engine Project.
|
|
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
#
|
|
#
|
|
import os
|
|
import sys
|
|
import re
|
|
from util import ly_build_error
|
|
|
|
|
|
class Params(object):
|
|
def __init__(self):
|
|
# Cache params
|
|
self.__params = {}
|
|
|
|
def get(self, param_name):
|
|
param_value = self.__params.get(param_name)
|
|
if param_value is not None:
|
|
return param_value
|
|
# Call __get_${param_name} function
|
|
func = getattr(self, '_{}__get_{}'.format(self.__class__.__name__, param_name.lower()), None)
|
|
if func is not None:
|
|
param_value = func()
|
|
# Replace all ${env} in value
|
|
if isinstance(param_value, str):
|
|
param_value = self.__process_string(param_name, param_value)
|
|
elif isinstance(param_value, list):
|
|
param_value = self.__process_list(param_name, param_value)
|
|
elif isinstance(param_value, dict):
|
|
param_value = self.__process_dict(param_name, param_value)
|
|
# Cache param
|
|
self.__params[param_name] = param_value
|
|
return param_value
|
|
ly_build_error('method __get_{} is not defined in class {}'.format(param_name.lower(), self.__class__.__name__))
|
|
|
|
def set(self, param_name, param_value):
|
|
self.__params[param_name] = param_value
|
|
|
|
def exists(self, param_name):
|
|
try:
|
|
self.get(param_name)
|
|
except LyBuildError:
|
|
return False
|
|
return True
|
|
|
|
def __process_string(self, param_name, param_value):
|
|
# Find all param with format ${param}
|
|
params = re.findall('\${(\w+)}', param_value)
|
|
# Avoid using the same param name in value, like 'WORKSPACE': '${WORKSPACE} some string'
|
|
if param_name in params:
|
|
ly_build_error('The use of same parameter name({}) in value is not allowed'.format(param_name))
|
|
# Replace ${param} with actual value
|
|
for param in params:
|
|
param_value = param_value.replace('${' + param + '}', self.get(param))
|
|
return param_value
|
|
|
|
def __process_list(self, param_name, param_value):
|
|
processed_list = []
|
|
for entry in param_value:
|
|
if isinstance(entry, str):
|
|
entry = self.__process_string(param_name, entry)
|
|
elif isinstance(entry, list):
|
|
entry = self.__process_list(param_name, entry)
|
|
elif isinstance(entry, dict):
|
|
entry = self.__process_dict(param_name, entry)
|
|
processed_list.append(entry)
|
|
return processed_list
|
|
|
|
def __process_dict(self, param_name, param_value):
|
|
for key in param_value:
|
|
if isinstance(param_value[key], str):
|
|
param_value[key] = self.__process_string(param_name, param_value[key])
|
|
elif isinstance(param_value[key], list):
|
|
param_value[key] = self.__process_list(param_name, param_value[key])
|
|
elif isinstance(param_value[key], dict):
|
|
param_value[key] = self.__process_dict(param_name, param_value[key])
|
|
return param_value |