207 lines
4.0 KiB
Python
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
|
|
|
|
|