jisujang's picture
first
a005c19
from typing import Dict, Tuple
import logging
import gspread
from sheet_manager.sheet_crud.sheet_crud import SheetManager
class SheetChecker:
def __init__(self, sheet_manager: SheetManager):
"""SheetChecker 초기화"""
self.sheet_manager = sheet_manager
self.bench_sheet_manager = None
self.logger = logging.getLogger(__name__)
self._init_bench_sheet()
def _init_bench_sheet(self):
"""model 시트용 시트 매니저 초기화"""
self.bench_sheet_manager = type(self.sheet_manager)(
spreadsheet_url=self.sheet_manager.spreadsheet_url,
worksheet_name="model",
column_name="Model name"
)
def add_benchmark_column(self, column_name: str):
"""새로운 벤치마크 컬럼 추가"""
try:
headers = self.bench_sheet_manager.get_available_columns()
if column_name in headers:
return
new_col_index = len(headers) + 1
cell = gspread.utils.rowcol_to_a1(1, new_col_index)
self.bench_sheet_manager.sheet.update(cell, [[column_name]])
# 관련 컬럼 추가 (벤치마크이름*100)
next_col_index = new_col_index + 1
next_cell = gspread.utils.rowcol_to_a1(1, next_col_index)
self.bench_sheet_manager.sheet.update(next_cell, [[f"{column_name}*100"]])
self.logger.info(f"새로운 벤치마크 컬럼들 추가됨: {column_name}, {column_name}*100")
# 컬럼 추가 후 시트 매니저 재연결
self.bench_sheet_manager._connect_to_sheet(validate_column=False)
except Exception as e:
self.logger.error(f"벤치마크 컬럼 {column_name} 추가 중 오류 발생: {str(e)}")
raise
def check_model_and_benchmark(self, model_name: str, benchmark_name: str) -> Tuple[bool, bool]:
"""
모델 존재 여부와 벤치마크 상태를 확인하고, 필요한 경우 모델 정보를 추가
Args:
model_name: 확인할 모델 이름
benchmark_name: 확인할 벤치마크 이름
Returns:
Tuple[bool, bool]: (모델이 새로 추가되었는지 여부, 벤치마크가 이미 존재하는지 여부)
"""
try:
# 모델 존재 여부 확인
model_exists = self._check_model_exists(model_name)
model_added = False
# 모델이 없으면 추가
if not model_exists:
self._add_new_model(model_name)
model_added = True
self.logger.info(f"새로운 모델 추가됨: {model_name}")
# 벤치마크 컬럼이 없으면 추가
available_columns = self.bench_sheet_manager.get_available_columns()
if benchmark_name not in available_columns:
self.add_benchmark_column(benchmark_name)
self.logger.info(f"새로운 벤치마크 컬럼 추가됨: {benchmark_name}")
# 벤치마크 상태 확인
benchmark_exists = self._check_benchmark_exists(model_name, benchmark_name)
return model_added, benchmark_exists
except Exception as e:
self.logger.error(f"모델/벤치마크 확인 중 오류 발생: {str(e)}")
raise
def _check_model_exists(self, model_name: str) -> bool:
"""모델 존재 여부 확인"""
try:
self.bench_sheet_manager.change_column("Model name")
values = self.bench_sheet_manager.get_all_values()
return model_name in values
except Exception as e:
self.logger.error(f"모델 존재 여부 확인 중 오류 발생: {str(e)}")
raise
def _add_new_model(self, model_name: str):
"""새로운 모델 정보 추가"""
try:
model_info = {
"Model name": model_name,
"Model link": f"https://huggingface.co/PIA-SPACE-LAB/{model_name}",
"Model": f'<a target="_blank" href="https://huggingface.co/PIA-SPACE-LAB/{model_name}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
}
for column_name, value in model_info.items():
self.bench_sheet_manager.change_column(column_name)
self.bench_sheet_manager.push(value)
except Exception as e:
self.logger.error(f"모델 정보 추가 중 오류 발생: {str(e)}")
raise
def _check_benchmark_exists(self, model_name: str, benchmark_name: str) -> bool:
"""벤치마크 값 존재 여부 확인"""
try:
# 해당 모델의 벤치마크 값 확인
self.bench_sheet_manager.change_column("Model name")
all_values = self.bench_sheet_manager.get_all_values()
row_index = all_values.index(model_name) + 2
self.bench_sheet_manager.change_column(benchmark_name)
value = self.bench_sheet_manager.sheet.cell(row_index, self.bench_sheet_manager.col_index).value
return bool(value and value.strip())
except Exception as e:
self.logger.error(f"벤치마크 존재 여부 확인 중 오류 발생: {str(e)}")
raise
# 사용 예시
if __name__ == "__main__":
sheet_manager = SheetManager()
checker = SheetChecker(sheet_manager)
model_added, benchmark_exists = checker.check_model_and_benchmark(
model_name="test-model",
benchmark_name="COCO"
)
print(f"Model added: {model_added}")
print(f"Benchmark exists: {benchmark_exists}")