From 3dcebc65c811a10e3ad8b897dbc9d82819f4a2c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:27:20 +0000 Subject: [PATCH 1/4] Initial plan From d768a33050fd4259c5c8007c3806a6288eaef4b4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:29:33 +0000 Subject: [PATCH 2/4] Improve camelCase to snake_case conversion to handle acronyms correctly Co-authored-by: iimpulse <7397665+iimpulse@users.noreply.github.com> --- scripts/compare_models.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/scripts/compare_models.py b/scripts/compare_models.py index 19d5f5c..75ca9df 100644 --- a/scripts/compare_models.py +++ b/scripts/compare_models.py @@ -19,6 +19,7 @@ import ast import json import logging +import re from dataclasses import dataclass from pathlib import Path @@ -128,14 +129,25 @@ def extract_model_fields(model_path: Path, class_name: str) -> dict[str, str]: def normalize_field_name(name: str) -> str: - """Normalize field name for comparison (camelCase to snake_case).""" - # Simple camelCase to snake_case conversion - result = [] - for i, char in enumerate(name): - if char.isupper() and i > 0: - result.append("_") - result.append(char.lower()) - return "".join(result) + """Normalize field name for comparison (camelCase to snake_case). + + Handles consecutive capitals correctly: + - APIResponse -> api_response + - HTTPSConnection -> https_connection + - XMLHttpRequest -> xml_http_request + - camelCase -> camel_case + - IOError -> io_error + """ + # Insert underscore before uppercase letters that follow lowercase letters + # or before the last uppercase in a sequence of uppercase letters + # APIResponse: API(Response) -> api_(response) + # HTTPSConnection: HTTPS(Connection) -> https_(connection) + s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) + # Handle remaining uppercase sequences + # e.g., "API_Response" -> "API_Response" (no change needed) + # or "HTTPConnection" -> "HTTP_Connection" + s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1) + return s2.lower() def compare_model( From 5cb9ab5cd3720a9523706d83e1a174b0f6a51634 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:30:45 +0000 Subject: [PATCH 3/4] Improve inline comments for clarity based on code review feedback Co-authored-by: iimpulse <7397665+iimpulse@users.noreply.github.com> --- scripts/compare_models.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/scripts/compare_models.py b/scripts/compare_models.py index 75ca9df..b753345 100644 --- a/scripts/compare_models.py +++ b/scripts/compare_models.py @@ -140,12 +140,10 @@ def normalize_field_name(name: str) -> str: """ # Insert underscore before uppercase letters that follow lowercase letters # or before the last uppercase in a sequence of uppercase letters - # APIResponse: API(Response) -> api_(response) - # HTTPSConnection: HTTPS(Connection) -> https_(connection) + # Example: APIResponse -> API_Response (after first regex) s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) - # Handle remaining uppercase sequences - # e.g., "API_Response" -> "API_Response" (no change needed) - # or "HTTPConnection" -> "HTTP_Connection" + # Handle remaining uppercase sequences followed by lowercase + # Example: HTTPConnection -> HTTP_Connection (handles the sequence) s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1) return s2.lower() From f77b9d0198950fa089a81ffb7e880f2b11836d2a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:31:36 +0000 Subject: [PATCH 4/4] Fix regex comments to accurately reflect transformation steps Co-authored-by: iimpulse <7397665+iimpulse@users.noreply.github.com> --- scripts/compare_models.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/compare_models.py b/scripts/compare_models.py index b753345..967241e 100644 --- a/scripts/compare_models.py +++ b/scripts/compare_models.py @@ -136,14 +136,13 @@ def normalize_field_name(name: str) -> str: - HTTPSConnection -> https_connection - XMLHttpRequest -> xml_http_request - camelCase -> camel_case - - IOError -> io_error + - getUserID -> get_user_id """ - # Insert underscore before uppercase letters that follow lowercase letters - # or before the last uppercase in a sequence of uppercase letters - # Example: APIResponse -> API_Response (after first regex) + # First: Insert underscore before uppercase letter followed by lowercase + # (handles: APIResponse -> API_Response, camelCase -> camel_Case) s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) - # Handle remaining uppercase sequences followed by lowercase - # Example: HTTPConnection -> HTTP_Connection (handles the sequence) + # Second: Insert underscore between lowercase/digit and uppercase + # (handles: getUserID -> get_User_ID after first pass) s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1) return s2.lower()