Convert name to snake_case. Handles acronyms properly: - DeviceTier -> device_tier - HTTPStatus -> http_status - XMLParser -> xml_parser - HTMLToText -> html_to_text
(self, name: str)
| 143 | return pascal[0].lower() + pascal[1:] |
| 144 | |
| 145 | def to_snake_case(self, name: str) -> str: |
| 146 | """Convert name to snake_case. |
| 147 | |
| 148 | Handles acronyms properly: |
| 149 | - DeviceTier -> device_tier |
| 150 | - HTTPStatus -> http_status |
| 151 | - XMLParser -> xml_parser |
| 152 | - HTMLToText -> html_to_text |
| 153 | """ |
| 154 | if not name: |
| 155 | return name |
| 156 | result = [] |
| 157 | for i, char in enumerate(name): |
| 158 | if char.isupper(): |
| 159 | # Add underscore before uppercase if: |
| 160 | # 1. Not at the start |
| 161 | # 2. Previous char is lowercase, OR |
| 162 | # 3. Next char exists and is lowercase (handles acronyms like HTTP->Status) |
| 163 | if i > 0: |
| 164 | prev_lower = name[i - 1].islower() |
| 165 | next_lower = (i + 1 < len(name)) and name[i + 1].islower() |
| 166 | if prev_lower or next_lower: |
| 167 | result.append("_") |
| 168 | result.append(char.lower()) |
| 169 | else: |
| 170 | result.append(char) |
| 171 | return "".join(result) |
| 172 | |
| 173 | def to_upper_snake_case(self, name: str) -> str: |
| 174 | """Convert name to UPPER_SNAKE_CASE.""" |
no test coverage detected