11import re
22from ruamel .yaml import YAML
33
4- INDEX_PATTERN = re .compile (r"\[(\d+)\]" )
4+ ARRAY_KEY_SEGMENT_PATTERN = re .compile (r"\[(\d+)\]" )
55
66
77def yaml_load (doc ):
@@ -28,31 +28,29 @@ def update_yaml_file(file_path, key, value):
2828 with open (file_path , "r" ) as stream :
2929 content = yaml .load (stream )
3030
31- keys , item = key .split ("." ), content
32- leaf_idx = len (keys ) - 1
31+ key_segments = key .split ("." )
3332 current_key_segments = []
34- current_key = ""
35- for i , k in enumerate ( keys ) :
36- current_key_segments .append (k )
33+ parent_item = content
34+ for current_key_segment in key_segments :
35+ current_key_segments .append (current_key_segment )
3736 current_key = "." .join (current_key_segments )
38- is_array = INDEX_PATTERN .match (k )
37+ is_array = ARRAY_KEY_SEGMENT_PATTERN .match (current_key_segment )
3938 if is_array :
40- k = int (is_array .group (1 ))
41- if not isinstance (item , list ) or k >= len (item ):
39+ current_key_segment = int (is_array .group (1 ))
40+ if not isinstance (parent_item , list ) or current_key_segment >= len (parent_item ):
4241 raise KeyError (f"Key '{ current_key } ' not found in YAML!" )
4342 else :
44- if not isinstance (item , dict ) or k not in item :
43+ if not isinstance (parent_item , dict ) or current_key_segment not in parent_item :
4544 raise KeyError (f"Key '{ current_key } ' not found in YAML!" )
46- if i == leaf_idx :
47- if item [ k ] == value :
45+ if current_key == key :
46+ if parent_item [ current_key_segment ] == value :
4847 return False # nothing to update
49- item [k ] = value
50- break
51- item = item [k ]
52-
53- with open (file_path , "w+" ) as stream :
54- yaml .dump (content , stream )
55- return True
48+ parent_item [current_key_segment ] = value
49+ with open (file_path , "w+" ) as stream :
50+ yaml .dump (content , stream )
51+ return True
52+ parent_item = parent_item [current_key_segment ]
53+ raise KeyError (f"Empty key!" )
5654
5755
5856def merge_yaml_element (file_path , element_path , desired_value , delete_missing_key = False ):
0 commit comments