Spaces:
Sleeping
Sleeping
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}") |