Source code for cursus.validation.script_testing

"""
Simplified Script Testing Framework

This module provides a streamlined script testing framework that extends existing
cursus infrastructure instead of reimplementing it. The approach eliminates
over-engineering by directly reusing DAGConfigFactory, StepCatalog, and
UnifiedDependencyResolver components.

This simplified implementation reduces code from 4,200 lines across 17 modules
to 800-1,000 lines across 5 modules while maintaining all functionality and
addressing the 3 key user stories:

- US1: Individual Script Functionality Testing
- US2: Data Transfer and Compatibility Testing
- US3: DAG-Guided End-to-End Testing

Key Features:
- Maximum infrastructure reuse (95% of existing cursus components)
- Config-based phantom script elimination
- Package dependency management (the one valid complexity)
- Comprehensive result formatting
- Interactive input collection extending DAGConfigFactory patterns

Main API Functions:
    run_dag_scripts: Main entry point for DAG-guided script testing

Core Components:
    ScriptTestingInputCollector: Extends DAGConfigFactory for input collection
    ResultFormatter: Comprehensive result formatting (preserved from original)
    ScriptTestResult: Simple result model for script execution
"""

# Main API - Core script testing functionality
from .api import (
    run_dag_scripts,
    execute_single_script,
    install_script_dependencies,
    ScriptTestResult,
    collect_script_inputs_using_dag_factory,
    get_validated_scripts_from_config,
    execute_scripts_in_order,
    parse_script_imports,
    is_package_installed,
    install_package,
    import_and_execute_script,
)

# Input Collection - Extends DAGConfigFactory patterns
from .input_collector import ScriptTestingInputCollector

# Script Execution Registry - Central state coordinator for DAG execution
from .script_execution_registry import (
    ScriptExecutionRegistry,
    DAGStateConsistency,
    create_script_execution_registry,
)

# Dependency Resolution - Two-phase dependency resolution system
from .script_dependency_matcher import (
    resolve_script_dependencies,
    prepare_script_testing_inputs,
    collect_user_inputs_with_dependency_resolution,
    validate_dependency_resolution_result,
    get_dependency_resolution_summary,
)

# Script Input Resolution - Step builder pattern adaptation
from .script_input_resolver import (
    resolve_script_inputs_using_step_patterns,
    adapt_step_input_patterns_for_scripts,
    validate_script_input_resolution,
    get_script_input_resolution_summary,
    transform_logical_names_to_actual_paths,
)

# Result Formatting - Well-designed component (15% redundancy - preserved)
from .result_formatter import ResultFormatter

# Utilities - Supporting functions
from .utils import (
    validate_dag_and_config,
    create_test_workspace,
    load_json_config,
    save_execution_results,
    calculate_execution_summary,
    format_execution_time,
    get_script_info,
    check_has_main_function,
    create_default_paths,
    merge_script_configs,
    validate_script_inputs,
    get_testing_summary,
)

# Export main API components
__all__ = [
    # Main API function - Primary entry point
    "run_dag_scripts",
    # Core components
    "ScriptTestingInputCollector",
    "ResultFormatter",
    "ScriptTestResult",
    # Script Execution Registry - Central state coordinator
    "ScriptExecutionRegistry",
    "DAGStateConsistency",
    "create_script_execution_registry",
    # Dependency Resolution - Two-phase system
    "resolve_script_dependencies",
    "prepare_script_testing_inputs",
    "collect_user_inputs_with_dependency_resolution",
    "validate_dependency_resolution_result",
    "get_dependency_resolution_summary",
    # Script Input Resolution - Step builder patterns
    "resolve_script_inputs_using_step_patterns",
    "adapt_step_input_patterns_for_scripts",
    "validate_script_input_resolution",
    "get_script_input_resolution_summary",
    "transform_logical_names_to_actual_paths",
    # Individual script execution
    "execute_single_script",
    "install_script_dependencies",
    # Input collection functions
    "collect_script_inputs_using_dag_factory",
    "get_validated_scripts_from_config",
    # Execution functions
    "execute_scripts_in_order",
    # Package management (valid complexity)
    "parse_script_imports",
    "is_package_installed",
    "install_package",
    "import_and_execute_script",
    # Utility functions
    "validate_dag_and_config",
    "create_test_workspace",
    "load_json_config",
    "save_execution_results",
    "calculate_execution_summary",
    "format_execution_time",
    "get_script_info",
    "check_has_main_function",
    "create_default_paths",
    "merge_script_configs",
    "validate_script_inputs",
    "get_testing_summary",
]


[docs] def get_script_testing_info() -> dict: """ Get information about the simplified script testing framework. Returns: Dictionary with framework information """ return { "framework_name": "Simplified Script Testing Framework", "version": "1.0.0", "architecture": "Simplified (800-1,000 lines vs 4,200 lines original)", "redundancy": "15-20% (Excellent Efficiency vs 45% original)", "infrastructure_reuse": "95% of existing cursus components", "main_api": "run_dag_scripts", "core_components": [ "ScriptTestingInputCollector (extends DAGConfigFactory)", "ResultFormatter (preserved well-designed component)", "ScriptTestResult (simple result model)", ], "user_stories_supported": [ "US1: Individual Script Functionality Testing", "US2: Data Transfer and Compatibility Testing", "US3: DAG-Guided End-to-End Testing", ], "key_features": [ "Maximum infrastructure reuse", "Config-based phantom script elimination", "Package dependency management", "Interactive input collection", "Comprehensive result formatting", "DAG-guided execution with dependency resolution", ], "eliminated_over_engineering": [ "Complex compiler architecture (1,400 lines)", "Over-complex assembler (900 lines)", "Over-engineered base classes (800 lines)", "Reimplemented factory patterns (800 lines)", ], "preserved_components": [ "ResultFormatter (290 lines - 15% redundancy, well-designed)" ], }
# Convenience function for quick testing
[docs] def quick_test_dag( dag, config_path: str, workspace_dir: str = "test/integration/script_testing" ): """ Quick test function for DAG scripts with default settings. Args: dag: PipelineDAG instance config_path: Path to configuration file workspace_dir: Test workspace directory Returns: Dictionary with execution results Example: >>> from cursus.validation.script_testing import quick_test_dag >>> from cursus.api.dag.base_dag import PipelineDAG >>> >>> dag = PipelineDAG.from_json("configs/xgboost_training.json") >>> results = quick_test_dag(dag, "pipeline_config/config_NA_xgboost_AtoZ.json") >>> print(f"Success: {results['pipeline_success']}") """ return run_dag_scripts( dag=dag, config_path=config_path, test_workspace_dir=workspace_dir, collect_inputs=True, )