Params.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import os
  9. import sys
  10. import re
  11. from util import ly_build_error
  12. class Params(object):
  13. def __init__(self):
  14. # Cache params
  15. self.__params = {}
  16. def get(self, param_name):
  17. param_value = self.__params.get(param_name)
  18. if param_value is not None:
  19. return param_value
  20. # Call __get_${param_name} function
  21. func = getattr(self, '_{}__get_{}'.format(self.__class__.__name__, param_name.lower()), None)
  22. if func is not None:
  23. param_value = func()
  24. # Replace all ${env} in value
  25. if isinstance(param_value, str):
  26. param_value = self.__process_string(param_name, param_value)
  27. elif isinstance(param_value, list):
  28. param_value = self.__process_list(param_name, param_value)
  29. elif isinstance(param_value, dict):
  30. param_value = self.__process_dict(param_name, param_value)
  31. # Cache param
  32. self.__params[param_name] = param_value
  33. return param_value
  34. ly_build_error('method __get_{} is not defined in class {}'.format(param_name.lower(), self.__class__.__name__))
  35. def set(self, param_name, param_value):
  36. self.__params[param_name] = param_value
  37. def exists(self, param_name):
  38. try:
  39. self.get(param_name)
  40. except LyBuildError:
  41. return False
  42. return True
  43. def __process_string(self, param_name, param_value):
  44. # Find all param with format ${param}
  45. params = re.findall('\${(\w+)}', param_value)
  46. # Avoid using the same param name in value, like 'WORKSPACE': '${WORKSPACE} some string'
  47. if param_name in params:
  48. ly_build_error('The use of same parameter name({}) in value is not allowed'.format(param_name))
  49. # Replace ${param} with actual value
  50. for param in params:
  51. param_value = param_value.replace('${' + param + '}', self.get(param))
  52. return param_value
  53. def __process_list(self, param_name, param_value):
  54. processed_list = []
  55. for entry in param_value:
  56. if isinstance(entry, str):
  57. entry = self.__process_string(param_name, entry)
  58. elif isinstance(entry, list):
  59. entry = self.__process_list(param_name, entry)
  60. elif isinstance(entry, dict):
  61. entry = self.__process_dict(param_name, entry)
  62. processed_list.append(entry)
  63. return processed_list
  64. def __process_dict(self, param_name, param_value):
  65. for key in param_value:
  66. if isinstance(param_value[key], str):
  67. param_value[key] = self.__process_string(param_name, param_value[key])
  68. elif isinstance(param_value[key], list):
  69. param_value[key] = self.__process_list(param_name, param_value[key])
  70. elif isinstance(param_value[key], dict):
  71. param_value[key] = self.__process_dict(param_name, param_value[key])
  72. return param_value