# -*- coding: utf-8 -*- """ 데이터 검증 모듈 """ import logging from typing import Dict, List logger = logging.getLogger(__name__) def validate_stalker_data(stalker_name: str, stalker_data: Dict) -> bool: """ 스토커 데이터 검증 Args: stalker_name: 스토커 이름 stalker_data: 스토커 데이터 Returns: 검증 성공 여부 """ warnings = [] errors = [] # 기본 정보 검증 basic_info = stalker_data.get('basic_info', {}) if not basic_info.get('name'): warnings.append(f"[{stalker_name}] 이름 정보 누락") # 스탯 검증 stats = stalker_data.get('stats', {}) if not stats: errors.append(f"[{stalker_name}] 스탯 정보 누락") else: # 스탯 합계 확인 (75여야 함) stat_sum = ( stats.get('str', 0) + stats.get('dex', 0) + stats.get('int', 0) + stats.get('con', 0) + stats.get('wis', 0) ) if stat_sum != 75: warnings.append(f"[{stalker_name}] 스탯 합계가 75가 아님: {stat_sum}") # 스킬 검증 skills = stalker_data.get('skills', {}) default_skills = skills.get('default', []) if not default_skills: warnings.append(f"[{stalker_name}] 기본 스킬 정보 누락") sub_skill = skills.get('sub', '') if not sub_skill: warnings.append(f"[{stalker_name}] 서브 스킬 정보 누락") ultimate_skill = skills.get('ultimate', '') if not ultimate_skill: warnings.append(f"[{stalker_name}] 궁극기 정보 누락") # 스킬 상세 정보 검증 skill_details = stalker_data.get('skill_details', {}) all_skill_ids = default_skills + [sub_skill, ultimate_skill] for skill_id in all_skill_ids: if skill_id and skill_id not in skill_details: warnings.append(f"[{stalker_name}] 스킬 상세 정보 누락: {skill_id}") # 기본 공격 검증 basic_attacks = stalker_data.get('basic_attacks', {}) if not basic_attacks: warnings.append(f"[{stalker_name}] 기본 공격 몽타주 정보 누락") # 경고 및 에러 출력 for warning in warnings: logger.warning(warning) for error in errors: logger.error(error) return len(errors) == 0 def validate_collection_result(collection_data: Dict) -> bool: """ 전체 수집 결과 검증 Args: collection_data: 전체 수집 데이터 Returns: 검증 성공 여부 """ stalkers = collection_data.get('stalkers', {}) if not stalkers: logger.error("수집된 스토커 데이터가 없습니다") return False total_stalkers = len(stalkers) logger.info(f"총 {total_stalkers}명의 스토커 데이터 수집 완료") # 각 스토커별 검증 all_valid = True for stalker_name, stalker_data in stalkers.items(): if not validate_stalker_data(stalker_name, stalker_data): all_valid = False return all_valid def log_collection_summary(collection_data: Dict, log_file_path: str): """ 수집 결과 요약 로그 생성 Args: collection_data: 전체 수집 데이터 log_file_path: 로그 파일 경로 """ stalkers = collection_data.get('stalkers', {}) with open(log_file_path, 'w', encoding='utf-8') as f: f.write("=" * 80 + "\n") f.write("DS 전투 데이터 수집 결과 요약\n") f.write("=" * 80 + "\n\n") metadata = collection_data.get('collection_metadata', {}) f.write(f"수집 시각: {metadata.get('collected_at', '')}\n") f.write(f"총 스토커 수: {len(stalkers)}\n\n") for stalker_name, stalker_data in stalkers.items(): f.write("-" * 80 + "\n") f.write(f"스토커: {stalker_name}\n") f.write("-" * 80 + "\n") basic_info = stalker_data.get('basic_info', {}) f.write(f" 이름: {basic_info.get('name', '')}\n") f.write(f" 직업: {basic_info.get('jobName', '')}\n") stats = stalker_data.get('stats', {}) stat_sum = ( stats.get('str', 0) + stats.get('dex', 0) + stats.get('int', 0) + stats.get('con', 0) + stats.get('wis', 0) ) f.write(f" 스탯 합계: {stat_sum}\n") skills = stalker_data.get('skills', {}) default_skills = skills.get('default', []) f.write(f" 기본 스킬 수: {len(default_skills)}\n") f.write(f" 서브 스킬: {skills.get('sub', '')}\n") f.write(f" 궁극기: {skills.get('ultimate', '')}\n") skill_details = stalker_data.get('skill_details', {}) f.write(f" 수집된 스킬 상세 정보 수: {len(skill_details)}\n") # 각 스킬별 몽타주 수 집계 total_skill_montages = 0 for skill_id, skill_data in skill_details.items(): montages = skill_data.get('montages', []) total_skill_montages += len(montages) f.write(f" 스킬 몽타주 총 수: {total_skill_montages}\n") basic_attacks = stalker_data.get('basic_attacks', {}) total_basic_montages = sum(len(montages) for montages in basic_attacks.values()) f.write(f" 기본 공격 몽타주 총 수: {total_basic_montages}\n") f.write("\n") f.write("=" * 80 + "\n") f.write("수집 완료\n") f.write("=" * 80 + "\n") logger.info(f"수집 요약 로그 생성 완료: {log_file_path}")