# -*- coding: utf-8 -*- """ 헬퍼 함수 모듈 다양한 유틸리티 함수를 제공합니다. """ import os import sys from datetime import datetime, date, time from typing import Any, Optional from pathlib import Path from core.logger import get_logger logger = get_logger(__name__) def get_app_path() -> Path: """ 애플리케이션 경로 반환 PyInstaller로 패키징된 경우와 개발 환경을 모두 처리합니다. """ if getattr(sys, 'frozen', False): # PyInstaller 패키징된 경우 return Path(sys.executable).parent else: # 개발 환경 return Path(__file__).parent.parent def format_date(d: date, format_str: str = "%Y-%m-%d") -> str: """ 날짜 포맷팅 Args: d: date 객체 format_str: 포맷 문자열 Returns: 포맷된 문자열 """ if d is None: return "" if isinstance(d, str): return d[:10] return d.strftime(format_str) def format_time(t: time, format_str: str = "%H:%M") -> str: """ 시간 포맷팅 Args: t: time 객체 format_str: 포맷 문자열 Returns: 포맷된 문자열 """ if t is None: return "" if isinstance(t, str): return t[:5] return t.strftime(format_str) def format_datetime(dt: datetime, format_str: str = "%Y-%m-%d %H:%M") -> str: """ 날짜시간 포맷팅 Args: dt: datetime 객체 format_str: 포맷 문자열 Returns: 포맷된 문자열 """ if dt is None: return "" if isinstance(dt, str): return dt[:16] return dt.strftime(format_str) def parse_date(date_str: str) -> Optional[date]: """ 문자열을 date로 파싱 Args: date_str: 날짜 문자열 (YYYY-MM-DD) Returns: date 객체 또는 None """ if not date_str: return None try: return datetime.strptime(date_str[:10], "%Y-%m-%d").date() except ValueError: return None def parse_time(time_str: str) -> Optional[time]: """ 문자열을 time으로 파싱 Args: time_str: 시간 문자열 (HH:MM) Returns: time 객체 또는 None """ if not time_str: return None try: return datetime.strptime(time_str[:5], "%H:%M").time() except ValueError: return None def truncate_string(s: str, max_length: int = 50, suffix: str = "...") -> str: """ 문자열 자르기 Args: s: 원본 문자열 max_length: 최대 길이 suffix: 말줄임 접미사 Returns: 잘린 문자열 """ if not s: return "" if len(s) <= max_length: return s return s[:max_length - len(suffix)] + suffix def get_weekday_name(d: date) -> str: """ 요일 이름 반환 (한국어) Args: d: date 객체 Returns: 요일 이름 """ weekdays = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"] return weekdays[d.weekday()] def ensure_dir(path: Path) -> bool: """ 디렉토리 생성 확인 Args: path: 디렉토리 경로 Returns: 성공 여부 """ try: path.mkdir(parents=True, exist_ok=True) return True except Exception as e: logger.error(f"디렉토리 생성 실패: {path} - {e}") return False def safe_int(value: Any, default: int = 0) -> int: """ 안전한 int 변환 Args: value: 변환할 값 default: 기본값 Returns: 정수 """ try: return int(value) except (ValueError, TypeError): return default def safe_float(value: Any, default: float = 0.0) -> float: """ 안전한 float 변환 Args: value: 변환할 값 default: 기본값 Returns: 실수 """ try: return float(value) except (ValueError, TypeError): return default