Skip to content

Commit 015607e

Browse files
committed
Update generate_openapi.py
1 parent 5fb265c commit 015607e

File tree

1 file changed

+60
-10
lines changed

1 file changed

+60
-10
lines changed

scripts/generate_openapi.py

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,34 @@ def parse_settings(settings_content: str) -> Dict[str, Any]:
211211
return settings
212212

213213

214+
def typescript_to_json(ts_str: str) -> str:
215+
"""Convert a TypeScript-style object/array string to valid JSON."""
216+
# Remove newlines and excessive spaces for easier regex
217+
s = ts_str.strip()
218+
# Remove trailing commas before closing brackets/braces
219+
s = re.sub(r",\s*([}\]])", r"\1", s)
220+
# Quote property names (unquoted keys)
221+
s = re.sub(r"([,{]\s*)([A-Za-z0-9_]+)\s*:", r'\1"\2":', s)
222+
# Quote string values (only those not already quoted)
223+
s = re.sub(r":\s*([A-Za-z0-9_\-/\.]+)", r': "\1"', s)
224+
# Replace single quotes with double quotes
225+
s = s.replace("'", '"')
226+
return s
227+
228+
214229
def extract_default_value(content: str) -> Any:
215230
"""Extract default value from setting content."""
216231

217232
# Debug output (only for competitors field)
218233
if "competitors" in content:
219234
print(f"DEBUG: extract_default_value called with content: {content}")
220235

236+
# Debug output for categories field
237+
if "categories" in content:
238+
print(
239+
f"DEBUG: extract_default_value called with content for categories: {content}"
240+
)
241+
221242
# Look for default: followed by various value types
222243
# Use a more robust pattern that handles arrays and objects
223244
default_match = re.search(r"default:\s*(.+?)(?:,|$)", content, re.DOTALL)
@@ -237,18 +258,24 @@ def extract_default_value(content: str) -> Any:
237258
# Find the position of the opening bracket in the original content
238259
default_start = content.find("default:")
239260
if default_start != -1:
240-
# Find the opening bracket after "default:"
241-
bracket_start = content.find("[", default_start)
261+
bracket_start = -1
262+
if value_str.startswith("["):
263+
bracket_start = content.find("[", default_start)
264+
elif value_str.startswith("{"):
265+
bracket_start = content.find("{", default_start)
266+
242267
if bracket_start != -1:
243268
# Find the matching closing bracket
244269
bracket_count = 0
245270
complete_value = ""
271+
open_char = content[bracket_start]
272+
close_char = "]" if open_char == "[" else "}"
246273

247274
for i, char in enumerate(content[bracket_start:], bracket_start):
248275
complete_value += char
249-
if char == "[":
276+
if char == open_char:
250277
bracket_count += 1
251-
elif char == "]":
278+
elif char == close_char:
252279
bracket_count -= 1
253280
if bracket_count == 0:
254281
break
@@ -259,13 +286,26 @@ def extract_default_value(content: str) -> Any:
259286
if "competitors" in content:
260287
print(f"DEBUG: Original value_str: {default_match.group(1).strip()}")
261288
print(f"DEBUG: Complete value_str: {value_str}")
289+
290+
# Debug output for categories field
291+
if "categories" in content:
292+
print(
293+
f"DEBUG: Original value_str for categories: {default_match.group(1).strip()}"
294+
)
295+
print(f"DEBUG: Complete value_str for categories: {value_str}")
262296
else:
263297
# Debug output (only for competitors field)
264298
if "competitors" in content:
265299
print(f"DEBUG: Not an array/object, value_str: {value_str}")
266300
print(f"DEBUG: value_str starts with '[': {value_str.startswith('[')}")
267301
print(f"DEBUG: value_str starts with '{{': {value_str.startswith('{')}")
268302

303+
# Debug output for categories field
304+
if "categories" in content:
305+
print(f"DEBUG: Not an array/object, value_str for categories: {value_str}")
306+
print(f"DEBUG: value_str starts with '[': {value_str.startswith('[')}")
307+
print(f"DEBUG: value_str starts with '{{': {value_str.startswith('{')}")
308+
269309
# Handle different value types
270310
if value_str.startswith('"') and value_str.endswith('"'):
271311
# String value
@@ -286,13 +326,23 @@ def extract_default_value(content: str) -> Any:
286326
try:
287327
return json.loads(value_str)
288328
except:
289-
return []
329+
# Try to convert TypeScript array to JSON
330+
try:
331+
json_str = typescript_to_json(value_str)
332+
return json.loads(json_str)
333+
except:
334+
return []
290335
elif value_str.startswith("{") and value_str.endswith("}"):
291336
# Object value - try to parse as JSON
292337
try:
293338
return json.loads(value_str)
294339
except:
295-
return {}
340+
# Try to convert TypeScript object to JSON
341+
try:
342+
json_str = typescript_to_json(value_str)
343+
return json.loads(json_str)
344+
except:
345+
return {}
296346
else:
297347
return value_str
298348

@@ -566,15 +616,15 @@ def generate_openapi_schema(evaluators: Dict[str, Any]) -> Dict[str, Any]:
566616
}
567617

568618
default_value = setting.get("default")
569-
if isinstance(default_value, str):
619+
if isinstance(default_value, bool):
620+
property_def["type"] = "boolean"
621+
property_def["default"] = default_value
622+
elif isinstance(default_value, str):
570623
property_def["type"] = "string"
571624
property_def["default"] = default_value
572625
elif isinstance(default_value, (int, float)):
573626
property_def["type"] = "number"
574627
property_def["default"] = default_value
575-
elif isinstance(default_value, bool):
576-
property_def["type"] = "boolean"
577-
property_def["default"] = default_value
578628
elif isinstance(default_value, list):
579629
property_def["type"] = "array"
580630
# Infer item type for arrays

0 commit comments

Comments
 (0)