Source code for pyrit.identifiers.class_name_utils
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
"""
Class name conversion utilities for PyRIT identifiers.
This module provides functions for converting between different naming conventions
(e.g., PascalCase class names to snake_case identifiers and vice versa).
"""
import re
[docs]
def class_name_to_snake_case(class_name: str, *, suffix: str = "") -> str:
"""
Convert a PascalCase class name to snake_case, optionally stripping a suffix.
Args:
class_name: The class name to convert (e.g., "SelfAskRefusalScorer").
suffix: Optional explicit suffix to strip before conversion (e.g., "Scorer").
Returns:
The snake_case name (e.g., "self_ask_refusal" if suffix="Scorer").
"""
# Strip explicit suffix if provided
if suffix and class_name.endswith(suffix):
class_name = class_name[: -len(suffix)]
# Handle transitions like "XMLParser" -> "XML_Parser"
name = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", class_name)
# Handle transitions like "getHTTPResponse" -> "get_HTTP_Response"
name = re.sub("([a-z0-9])([A-Z])", r"\1_\2", name).lower()
return name
[docs]
def snake_case_to_class_name(snake_case_name: str, *, suffix: str = "") -> str:
"""
Convert a snake_case name to a PascalCase class name.
Args:
snake_case_name: The snake_case name to convert (e.g., "my_custom").
suffix: Optional suffix to append to the class name
(e.g., "Scenario" would convert "my_custom" to "MyCustomScenario").
Returns:
The PascalCase class name (e.g., "MyCustomScenario").
"""
# Split on underscores and capitalize each part
parts = snake_case_name.split("_")
pascal_case = "".join(part.capitalize() for part in parts)
# Append suffix if provided
if suffix:
pascal_case += suffix
return pascal_case