Source code for cursus.step_catalog
"""
Unified Step Catalog System
This module provides a unified interface for discovering and retrieving step-related
components (scripts, contracts, specifications, builders, configs) across multiple workspaces.
The system consolidates 16+ fragmented discovery mechanisms into a single, efficient
StepCatalog class that provides O(1) lookups and intelligent component discovery.
"""
import os
from pathlib import Path
from typing import Any, Optional
from .step_catalog import StepCatalog
from .models import StepInfo, FileMetadata, StepSearchResult
from .config_discovery import ConfigAutoDiscovery
from .adapters import (
ContractDiscoveryEngineAdapter,
ContractDiscoveryManagerAdapter,
ContractDiscoveryResult,
FlexibleFileResolverAdapter,
DeveloperWorkspaceFileResolverAdapter,
WorkspaceDiscoveryManagerAdapter,
HybridFileResolverAdapter,
LegacyDiscoveryWrapper,
)
__all__ = [
"StepCatalog",
"StepInfo",
"FileMetadata",
"StepSearchResult",
"ConfigAutoDiscovery",
"create_step_catalog",
# Legacy adapters
"ContractDiscoveryEngineAdapter",
"ContractDiscoveryManagerAdapter",
"ContractDiscoveryResult",
"FlexibleFileResolverAdapter",
"DeveloperWorkspaceFileResolverAdapter",
"WorkspaceDiscoveryManagerAdapter",
"HybridFileResolverAdapter",
"LegacyDiscoveryWrapper",
]
[docs]
def create_step_catalog(
workspace_root: Path, use_unified: Optional[bool] = None
) -> Any:
"""
Factory function for step catalog with feature flag support.
Args:
workspace_root: Root directory of the workspace
use_unified: Whether to use unified catalog (None = check environment)
Returns:
StepCatalog instance or legacy wrapper based on feature flag
"""
if use_unified is None:
use_unified = os.getenv("USE_UNIFIED_CATALOG", "false").lower() == "true"
if use_unified:
return StepCatalog(workspace_root)
else:
# Return legacy wrapper with backward compatibility adapters
return LegacyDiscoveryWrapper(workspace_root)
def get_rollout_percentage() -> int:
"""Get current rollout percentage from environment."""
return int(os.getenv("UNIFIED_CATALOG_ROLLOUT", "0"))
def should_use_unified_catalog() -> bool:
"""Determine if request should use unified catalog based on rollout percentage."""
import random
rollout_percentage = get_rollout_percentage()
return random.random() < (rollout_percentage / 100.0)
def create_step_catalog_with_rollout(workspace_root: Path) -> Any:
"""
Factory function with gradual rollout support.
Args:
workspace_root: Root directory of the workspace
Returns:
StepCatalog or LegacyDiscoveryWrapper based on rollout percentage
"""
# Check explicit feature flag first
explicit_flag = os.getenv("USE_UNIFIED_CATALOG")
if explicit_flag is not None:
use_unified = explicit_flag.lower() == "true"
return create_step_catalog(workspace_root, use_unified)
# Use rollout percentage for gradual deployment
use_unified = should_use_unified_catalog()
return create_step_catalog(workspace_root, use_unified)