Source code for cursus.core.compiler.name_generator

"""
Name generator utilities for pipeline naming.

This module provides utilities for generating pipeline names with consistent formats
that comply with SageMaker naming constraints.
"""

import random
import string
import logging
import re

logger = logging.getLogger(__name__)

# SageMaker pipeline name constraint pattern
# Must match: [a-zA-Z0-9](-*[a-zA-Z0-9]){0,255}
PIPELINE_NAME_PATTERN = r"^[a-zA-Z0-9](-*[a-zA-Z0-9]){0,255}$"


[docs] def generate_random_word(length: int = 4) -> str: """ Generate a random word of specified length. Args: length: Length of the random word Returns: Random string of specified length """ # Using uppercase letters for better readability in names return "".join(random.choices(string.ascii_uppercase, k=length))
[docs] def validate_pipeline_name(name: str) -> bool: """ Validate that a pipeline name conforms to SageMaker constraints. Args: name: The pipeline name to validate Returns: True if the name is valid, False otherwise """ # Check length constraint (SageMaker has a limit of 255 characters) if len(name) > 255 or len(name) == 0: return False # Check pattern constraint return bool(re.match(PIPELINE_NAME_PATTERN, name))
[docs] def sanitize_pipeline_name(name: str) -> str: """ Sanitize a pipeline name to conform to SageMaker constraints. This function: 1. Replaces dots with hyphens 2. Replaces underscores with hyphens 3. Removes any other special characters 4. Ensures the name starts with an alphanumeric character 5. Ensures the name ends with an alphanumeric character Args: name: The pipeline name to sanitize Returns: A sanitized version of the name that conforms to SageMaker constraints """ # Replace dots and underscores with hyphens sanitized = name.replace(".", "-").replace("_", "-") # Remove any other special characters sanitized = re.sub(r"[^a-zA-Z0-9-]", "", sanitized) # Ensure the name starts with an alphanumeric character if sanitized and not re.match(r"^[a-zA-Z0-9]", sanitized): sanitized = "p" + sanitized # Replace multiple consecutive hyphens with a single hyphen sanitized = re.sub(r"-+", "-", sanitized) # Truncate if the name is too long (SageMaker has a 255 character limit) if len(sanitized) > 255: sanitized = sanitized[:255] # Ensure the name ends with an alphanumeric character (remove trailing hyphens) sanitized = sanitized.rstrip("-") # If we removed all characters and the original wasn't empty, provide a default if not sanitized and name: sanitized = "pipeline" # Check if the sanitized name is different from the original if sanitized != name: logger.info( f"Pipeline name '{name}' sanitized to '{sanitized}' to conform to SageMaker constraints" ) return sanitized
[docs] def generate_pipeline_name(base_name: str, version: str = "1.0") -> str: """ Generate a valid pipeline name with the format: {base_name}-{random_word}-{version}-pipeline This function ensures the generated name conforms to SageMaker constraints by sanitizing it before returning. Args: base_name: Base name for the pipeline version: Version string to include in the name Returns: A string with the generated pipeline name that passes SageMaker validation """ # Generate random 4-letter word random_word = generate_random_word(4) # Combine all parts name = f"{base_name}-{version}-pipeline" # f"{base_name}-{random_word}-{version}-pipeline" # Sanitize the name to ensure it conforms to SageMaker constraints return sanitize_pipeline_name(name)