Source code for kabbes_config.value.Base

import py_starter as ps
from parent_class import ParentClass
import kabbes_config

[docs]class Base( ParentClass ): _ABS_REF_TRIGGER_BEG = '{{' _ABS_REF_TRIGGER_END = '}}' _LOCAL_REF_TRIGGER_BEG = '{R{' _LOCAL_REF_TRIGGER_END = '}R}' _ONE_LINE_ATTS = ['value'] _IMP_ATTS = ['value'] def __init__( self, Node, value ): ParentClass.__init__( self ) self.Node = Node self.value = value
[docs] def get_raw( self ): return self.value
[docs] def set( self, value ): self.value = value
[docs] def merge_ref( self, og_parents=[], new_parents=[] ): """when merging two Nodes, make sure the references point are remapped to the appropriate path""" if type(self.get_raw()) == str: formatted_nodes, ref_node_keys = self._get_ref_node_keys( abs=False,local=True ) og_keys = [ node.Key.key for node in og_parents ] new_keys = [ node.Key.key for node in new_parents ] value = self.get_raw() for i in range(len(ref_node_keys)): node_keys = ref_node_keys[i].split( kabbes_config.key.Key._ATT_SPLIT ) assert node_keys[:len(og_keys)] == og_keys rel_node_keys = node_keys[ len(og_keys): ] full_node_keys = new_keys + rel_node_keys new_key = self._LOCAL_REF_TRIGGER_BEG + kabbes_config.key.Key._ATT_SPLIT.join(full_node_keys) + self._LOCAL_REF_TRIGGER_END value = value.replace( formatted_nodes[i], new_key ) self.set( value )
def _get_ref_node_keys( self, abs:bool=True, local:bool=True ): formatted_nodes = [] ref_node_keys = [] if abs: new_formatted_nodes = ps.find_string_formatting( self.get_raw(), self._ABS_REF_TRIGGER_BEG, self._ABS_REF_TRIGGER_END ) ref_node_keys.extend( [ ps.strip_trigger( formatted_node, self._ABS_REF_TRIGGER_BEG, self._ABS_REF_TRIGGER_END ) for formatted_node in new_formatted_nodes ] ) formatted_nodes.extend( new_formatted_nodes ) if local: new_formatted_nodes = ps.find_string_formatting( self.get_raw(), self._LOCAL_REF_TRIGGER_BEG, self._LOCAL_REF_TRIGGER_END ) ref_node_keys.extend( [ ps.strip_trigger( formatted_node, self._LOCAL_REF_TRIGGER_BEG, self._LOCAL_REF_TRIGGER_END ) for formatted_node in new_formatted_nodes ] ) formatted_nodes.extend( new_formatted_nodes ) return formatted_nodes, ref_node_keys
[docs] def get_ref( self ): # "{{repo.name}} {{repo.dir}}" if type(self.get_raw()) == str: formatted_nodes, ref_node_keys = self._get_ref_node_keys( abs=True,local=True ) # ["repo.name", "repo.dir"] ref_node_values = {} for node_key in ref_node_keys: ref_node = self.Node.get_root().get_node( node_key ) try: #recursively find what string or object this {{value}} is referencing ref_node_value = ref_node.get_ref_value() except: print ('ERROR: could not find value for ref_obj') print ('Node key: ' + str(node_key)) print ('Node: ' + str(ref_node)) assert False ref_node_values[ node_key ] = ref_node_value object_only=True if len(ref_node_keys) != 1: object_only = False else: if len(formatted_nodes[0]) != len(self.get_raw()): object_only = False # can return an Object if object_only: return ref_node.get_ref_value() # with multiple Objects, we must turn them into string representations else: for node_key in ref_node_values: ref_node_values[node_key] = str(ref_node_values[node_key]) string = ps.smart_format( self.get_raw(), formatting_dict=ref_node_values, trigger_beg=self._ABS_REF_TRIGGER_BEG, trigger_end=self._ABS_REF_TRIGGER_END ) string = ps.smart_format( string, formatting_dict=ref_node_values, trigger_beg=self._LOCAL_REF_TRIGGER_BEG, trigger_end=self._LOCAL_REF_TRIGGER_END ) return string else: return self.get_raw()