Source code for benchbox.utils.system_info

"""Core system information utilities without CLI dependencies.

Copyright 2026 Joe Harris / BenchBox Project

Licensed under the MIT License. See LICENSE file in the project root for details.
"""

import platform
from dataclasses import dataclass
from typing import Any

import psutil


[docs] @dataclass class SystemInfo: """Core system information dataclass.""" os_name: str os_version: str architecture: str cpu_model: str cpu_cores: int total_memory_gb: float available_memory_gb: float python_version: str hostname: str
[docs] def to_dict(self) -> dict[str, Any]: """Convert to dictionary for compatibility.""" return { "os_type": self.os_name, "os_version": self.os_version, "architecture": self.architecture, "cpu_model": self.cpu_model, "cpu_cores": self.cpu_cores, "total_memory_gb": self.total_memory_gb, "available_memory_gb": self.available_memory_gb, "python_version": self.python_version, "hostname": self.hostname, }
[docs] def get_system_info() -> SystemInfo: """Get current system information.""" # Get memory info memory_info = psutil.virtual_memory() total_memory_gb = memory_info.total / (1024**3) available_memory_gb = memory_info.available / (1024**3) # Get CPU info try: cpu_model = platform.processor() or "Unknown" if not cpu_model or cpu_model == "": # Fallback for some systems try: with open("/proc/cpuinfo") as f: for line in f: if "model name" in line: cpu_model = line.split(":")[1].strip() break except (FileNotFoundError, OSError): cpu_model = f"{platform.machine()} CPU" except Exception: cpu_model = f"{platform.machine()} CPU" return SystemInfo( os_name=platform.system(), os_version=platform.release(), architecture=platform.machine(), cpu_model=cpu_model, cpu_cores=psutil.cpu_count(), total_memory_gb=total_memory_gb, available_memory_gb=available_memory_gb, python_version=platform.python_version(), hostname=platform.node(), )
[docs] def get_memory_info() -> dict[str, float]: """Get current memory usage information.""" memory_info = psutil.virtual_memory() return { "total_gb": memory_info.total / (1024**3), "available_gb": memory_info.available / (1024**3), "used_gb": memory_info.used / (1024**3), "percent_used": memory_info.percent, }
[docs] def get_cpu_info() -> dict[str, Any]: """Get CPU information and current usage.""" return { "logical_cores": psutil.cpu_count(), "physical_cores": psutil.cpu_count(logical=False), "current_usage_percent": psutil.cpu_percent(interval=1), "per_core_usage": psutil.cpu_percent(interval=1, percpu=True), "model": platform.processor() or f"{platform.machine()} CPU", }