#!/usr/bin/env python3 """ Silique (https://www.silique.fr) Copyright (C) 2024 distribued with GPL-2 or later license This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ from .helper import get_rougail_environment_var, get_rougail_environment_dict from rougail.object_model import CONVERT_OPTION from rougail.config import RougailConfig from tiramisu.error import ValueOptionError class RougailUserDataEnvironment: def __init__(self, config: 'Config', *, rougailconfig: RougailConfig=None, user_datas=None, ): self.config = config if rougailconfig is None: rougailconfig = RougailConfig user_data = rougailconfig['step.user_data'] if 'environment' not in user_data: user_data.append('environment') rougailconfig['step.user_data'] = user_data user_data = rougailconfig['step.user_data'] if 'environment' not in user_data: raise Exception('environment is not set in step.user_data') self.rougailconfig = rougailconfig if user_datas: self.errors = user_datas['errors'] self.warnings = user_datas['warnings'] else: self.errors = [] self.warnings = [] # this variable will be used for generating warnings # about unused ROUGAIL_ environment variables self.unused_environment_var = get_rougail_environment_var() def run(self): self.config.property.read_write() if self.rougailconfig['environment.mandatory']: current_titles = [] while True: mandatories = self.config.value.mandatory() if not mandatories: break mandatory = mandatories[0] path = mandatory.path() if '.' in path: current_config = self.config for idx, p in enumerate(path.split('.')[0:-1]): current_config = current_config.option(p) if idx < len(current_titles): if current_titles[idx] == p: continue current_titles = current_titles[0:idx] current_titles.append(p) self.print(current_config.description(), idx) self.display_environment(mandatory) else: self.parse(self.config) self.config.property.read_only() # if there are unused environment variables if len(self.unused_environment_var): unused_environment_var_str = " ".join(self.unused_environment_var) self.warnings.append("the rougail environment variables were not used : " + unused_environment_var_str) def parse(self, config, title_level=0): for option in config: if option.isoptiondescription(): self.print(option.description(), title_level) self.parse(option, title_level + 1) else: self.display_environment(option) def print(self, title, title_level): print(' ' * title_level + '📂 ' + title, 'bold') def display_environment(self, option): kwargs = {} option_type = option.information.get('type') default = option.value.get() ismulti = option.ismulti() # here we retrieve the conversion func of the considered type # carefull, it could be None -> in this case, do nothing type_obj = CONVERT_OPTION.get(option_type, {}).get("func") # rougail_environment_var = get_rougail_environment_var() option_name = option.path() # this is used only for warning purposes self.unused_environment_var.remove(option_name) # let's parse the environment variables values if option_name in rougail_environment_var: if ismulti: option_bash_value = get_rougail_environment_dict()[option_name] # here we expect the bash option value of a multi to be coma separated: option_value = option_bash_value.split(",") if type_obj is not None: option_value_typed = [type_obj(opt) for opt in option_value] option.value.set(option_value_typed) else: option.value.set(option_value) else: option_bash_value = get_rougail_environment_dict()[option_name] if type_obj is not None: option.value.set(type_obj(option_bash_value)) else: option.value.set(option_bash_value)