handOver2/utils/helpers.py

207 lines
4.0 KiB
Python

# -*- 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