
    oi               
       j   d Z ddlZddlZdZej                  j                  ed      Zdededz  fdZded	ededz  fd
Z	dded	ede
dee   fdZddededefdZedk(  rSddlZddlZ eej&                        dkD  rej&                  d   ndZ ee      Z e ej.                  edd             yy)u   
duplicate_check.py - 보고서 중복 검증 verifier
최근 10개 보고서와 텍스트 유사도 비교 → 80% 이상 일치 시 WARN
    Nz/home/jay/workspace/memoryreportspathreturnc                     	 t        | d      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)u=   파일을 읽어 문자열로 반환. 실패 시 None 반환.zutf-8)encodingN)openreadOSError)r   fs     B/home/jay/workspace/teams/dev6/qc/verifiers.bak/duplicate_check.py
_read_filer      sB    $) 	Q668	 	 	 s#   5 )	5 25 5 	A Atask_idreports_dirc                    t         j                  j                  ||  d      }t         j                  j                  |      r|S 	 t        j                  |      }|D cg c](  }|j                  |       s|j                  d      s'|* }}|r#t         j                  j                  ||d         S y# t
        $ r Y yw xY wc c}w )uS   reports_dir에서 task_id에 해당하는 .md 파일 경로 반환. 없으면 None..mdNr   )osr   joinisfilelistdirr
   
startswithendswith)r   r   
exact_pathentriesematchess         r   _find_report_pathr      s     kgYc?;J	ww~~j!**[) "QQQ\\'%:qzz%?PqQGQww||K44   Rs$   B4 C6CC4	C ?C limitc                    	 t        j                  |      }g }|D ]  }|j                  d      s|j	                  |       r't         j
                  j                  ||      }t         j
                  j                  |      sg	 t         j
                  j                  |      }|j                  ||f        |j                  d d       |d| D 	cg c]  \  }}	|		 c}	}S # t        $ r g cY S w xY w# t        $ r Y w xY wc c}	}w )u   
    reports_dir에서 최근 limit개 .md 파일 경로를 mtime 기준으로 반환.
    현재 task_id의 보고서는 제외.
    r   c                     | d   S )Nr    )xs    r   <lambda>z%_get_recent_reports.<locals>.<lambda>E   s
    !     T)keyreverseN)r   r   r
   r   r   r   r   r   getmtimeappendsort)
r   r   r   r   md_filesentry	full_pathmtime_r   s
             r   _get_recent_reportsr.   *   s    
**[) H ,~~e$G$GGLLe4	ww~~i(	GG$$Y/E 		*+,  MMndM3 (% 01WQD11+  	  		 2s)   C# C4D#C10C14	D ?D  _reports_dirc                 h   |r|nt         }t        j                  j                  |      s	dd| gdS t	        | |      }|dd| d|  dgdS t        |      }|s	dd| gdS t        | |d	
      }|sddgdS g }g }|D ]  }t        |      }	|	st        j                  d||	      j                         }
t        j                  j                  |      }|
dk\  r-d|
dd| d}|j                  |       |j                  |       |j                  d|
dd|         |rd|dS d|r|dS dgdS )u1  
    현재 task_id의 보고서를 최근 10개 보고서와 텍스트 유사도 비교.

    Args:
        task_id: 검증할 task ID
        _reports_dir: (테스트용) reports 디렉토리 경로. 기본값은 REPORTS_DIR.

    Returns:
        {"status": "PASS"|"WARN"|"SKIP", "details": [...]}
    SKIPu   reports 디렉토리 없음: )statusdetailsNu   현재 task 보고서 없음: /r   u<   현재 task 보고서를 읽을 수 없거나 비어있음: 
   )r   PASSu5   비교 대상 보고서 없음 (중복 검사 생략)g?u   WARN: 유사도 z.1%u    — u1    와(과) 높은 유사도 감지 (복사 의심)u   OK: 유사도 WARNu   중복 보고서 없음)REPORTS_DIRr   r   isdirr   r   r.   difflibSequenceMatcherratiobasenamer'   )r   r0   r   current_pathcurrent_contentrecent_reportsr4   warnings
other_pathother_contentr=   
other_namewarn_msgs                r   verifyrG   I   s    #/,KK 77==%7}EF
 	
 %Wk:L8QwisST
 	

 !.OVWcVdef
 	
 )+RHNOP
 	
 GH$ J
":.''o}MSSUWW%%j1
D=)%E*EvwHOOH%NN8$NN^E#;eJ<HIJ  W55G]]B[A\]]r#   __main__   )r   F   )ensure_asciiindent)r6   )r/   )__doc__r;   r   MEMORY_BASEr   r   r9   strr   r   intlistr.   dictrG   __name__jsonsyslenargvtidresultprintdumpsr    r#   r   <module>r\      s   
  	*ggll;	2S S4Z s  t (2 23 2s 2DQTI 2>A^C A^s A^D A^H zSXX*#((1+CC F	*$**V%
:; r#   