Skip to content

Commit 9a84152

Browse files
committed
🐛 fix(metadata): Enhance YAML parsing error handling
1 parent d99d52e commit 9a84152

File tree

1 file changed

+55
-38
lines changed

1 file changed

+55
-38
lines changed

.github/scripts/generate_metadata.py

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,30 @@ def generate_metadata(prompt_content):
5959

6060
# Extract the YAML content from the AI response
6161
content = message.content[0].text if isinstance(message.content, list) else message.content
62-
logger.info(f"Extracted content: {content[:100]}...") # Log first 100 characters
62+
logger.info(f"Extracted content: {content[:100]}...")
6363

6464
output_start = content.find("<output>")
6565
output_end = content.find("</output>")
6666
if output_start != -1 and output_end != -1:
6767
yaml_content = content[output_start + 8:output_end].strip()
68-
logger.info(f"Extracted YAML content: {yaml_content[:100]}...") # Log first 100 characters
69-
metadata = yaml.safe_load(yaml_content)
70-
logger.info("YAML content parsed successfully")
68+
logger.info(f"Extracted YAML content: {yaml_content[:100]}...")
69+
70+
class SafeLoaderIgnoreUnknown(yaml.SafeLoader):
71+
def ignore_unknown(self, node):
72+
return None
73+
74+
SafeLoaderIgnoreUnknown.add_constructor(None, SafeLoaderIgnoreUnknown.ignore_unknown)
75+
76+
try:
77+
metadata = yaml.load(yaml_content, Loader=SafeLoaderIgnoreUnknown)
78+
logger.info("YAML content parsed successfully")
79+
except yaml.YAMLError as e:
80+
logger.error(f"YAML parsing error: {e}")
81+
metadata = {}
7182
else:
7283
logger.error("Could not find metadata output in AI response")
73-
raise ValueError("Could not find metadata output in AI response")
84+
metadata = {}
7485

75-
logger.info("Metadata generation completed successfully")
7686
return metadata
7787

7888
def should_update_metadata(prompt_file, metadata_file):
@@ -189,39 +199,46 @@ def update_prompt_metadata():
189199
with open(prompt_file, 'r') as f:
190200
prompt_content = f.read()
191201

192-
metadata = generate_metadata(prompt_content)
193-
new_dir_name = metadata['directory']
202+
try:
203+
metadata = generate_metadata(prompt_content)
204+
if not metadata:
205+
logger.warning(f"Failed to generate metadata for {item}. Skipping.")
206+
continue
207+
new_dir_name = metadata['directory']
194208

195-
# Rename directory if necessary
196-
if new_dir_name != item:
197-
new_dir_path = os.path.join(prompts_dir, new_dir_name)
198-
logger.info(f"Renaming directory from {item} to {new_dir_name}")
199-
if os.path.exists(new_dir_path):
200-
logger.warning(f"Directory {new_dir_name} already exists. Updating contents.")
201-
for file in os.listdir(item_path):
202-
src = os.path.join(item_path, file)
203-
dst = os.path.join(new_dir_path, file)
204-
if os.path.isfile(src):
205-
shutil.copy2(src, dst)
206-
shutil.rmtree(item_path)
207-
else:
208-
os.rename(item_path, new_dir_path)
209-
item_path = new_dir_path
210-
211-
# Save updated metadata
212-
metadata_path = os.path.join(item_path, 'metadata.yml')
213-
logger.info(f"Saving updated metadata to {metadata_path}")
214-
with open(metadata_path, 'w') as f:
215-
yaml.dump(metadata, f, sort_keys=False)
216-
217-
# Ensure we have a valid hash
218-
if new_hash is None:
219-
with open(prompt_file, 'rb') as f:
220-
prompt_content = f.read()
221-
new_hash = hashlib.md5(prompt_content).hexdigest()
222-
223-
# Update content hash
224-
update_metadata_hash(metadata_path, new_hash)
209+
# Rename directory if necessary
210+
if new_dir_name != item:
211+
new_dir_path = os.path.join(prompts_dir, new_dir_name)
212+
logger.info(f"Renaming directory from {item} to {new_dir_name}")
213+
if os.path.exists(new_dir_path):
214+
logger.warning(f"Directory {new_dir_name} already exists. Updating contents.")
215+
for file in os.listdir(item_path):
216+
src = os.path.join(item_path, file)
217+
dst = os.path.join(new_dir_path, file)
218+
if os.path.isfile(src):
219+
shutil.copy2(src, dst)
220+
shutil.rmtree(item_path)
221+
else:
222+
os.rename(item_path, new_dir_path)
223+
item_path = new_dir_path
224+
225+
# Save updated metadata
226+
metadata_path = os.path.join(item_path, 'metadata.yml')
227+
logger.info(f"Saving updated metadata to {metadata_path}")
228+
with open(metadata_path, 'w') as f:
229+
yaml.dump(metadata, f, sort_keys=False)
230+
231+
# Ensure we have a valid hash
232+
if new_hash is None:
233+
with open(prompt_file, 'rb') as f:
234+
prompt_content = f.read()
235+
new_hash = hashlib.md5(prompt_content).hexdigest()
236+
237+
# Update content hash
238+
update_metadata_hash(metadata_path, new_hash)
239+
except Exception as e:
240+
logger.error(f"Error processing {item}: {str(e)}")
241+
continue
225242
else:
226243
logger.info(f"Metadata for {item} is up to date")
227244
else:

0 commit comments

Comments
 (0)