
    +i>                         d Z ddlZddlZddlZ ej                  d      Z ej                  d      Zdededee   fdZ	dedefd	Z
dd
ededefdZdd
ededefdZy)u   
signature_check.py - task 파일의 완료 시그니처 grep/pytest 검증 verifier
task 파일의 ## 완료 시그니처 섹션을 파싱하여 grep/pytest로 자동 검증.
시그니처 섹션 없으면 SKIP (하위 호환).
    Nz$\[grep\]\s*`([^`]+)`\s*@\s*`([^`]+)`z\[pytest\]\s*`([^`]+)`contentheaderreturnc                     | j                         }d}g }|D ]C  }|j                         d| k(  rd}|s|j                  d      r |S |j                  |       E |S )u>   ## header 이후 다음 ## 헤더 전까지 줄 목록 반환.Fz## T)
splitlinesstrip
startswithappend)r   r   lines
in_sectionresultlines         =/home/jay/workspace/teams/shared/verifiers/signature_check.py_parse_sectionr      sq     EJF  ::<S>)Ju%M MM$  M    c                     t        | d      }|D ]6  }|j                         j                         }|s$d|v r yd|v r yd|v r y y y)uA   ## 레벨 섹션에서 normal/critical/security 키워드 판별.u   레벨securitycriticalnormal)r   r   lower)r   level_linesr   texts       r   _detect_levelr      sc     (3K zz|!!#t r   task_idworkspace_rootc                 
   t         j                  j                  |dd|  d      }t         j                  j                  |      s	dd| gdS t	        |dd	      5 }|j                         }d
d
d
       t        d      }|sddgdS t        |      }|dv }g }g }	|D ]>  }
|
j                         }|st        j                  |      }|r|j                  d      }|j                  d      }t         j                  j                  ||      }d| d| d}t         j                  j                  |      s+d| d| }|j                  |       |	j                  |       	 t        j                  dd||gddd      }|j                   dk(  r|j                  d|        n&|j                  d| d       |	j                  |       -t$        j                  |      }|sF|j                  d      }d| d}|s|j                  d| d        vd!|v r<|j'                  d!      \  }}}t         j                  j                  ||      d!z   |z   }n t         j                  j                  ||      }	 t        j                  d"d#d$|d%gddd&      }|j                   dk(  r|j                  d|        n&|j                  d| d'       |	j                  |       A |sdd(gdS |	rd)||	d*S d+|dS # 1 sw Y   xY w# t        j"                  $ r, d| d}|j                  |       |	j                  |       Y ww xY w# t        j"                  $ r+ d| d}|j                  |       |	j                  |       Y w xY w),u   
    task 파일의 ## 완료 시그니처 섹션을 파싱하여 grep/pytest로 검증.

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP", "details": [...]}
        FAIL 시 추가: "failed_signatures": [...]
    memorytasksz.mdSKIPu   task 파일 없음: )statusdetailsrzutf-8)encodingNu   완료 시그니처u*   시그니처 섹션 없음 (하위 호환))r   r         z[grep] `z` @ ``zFAIL u    — 경로 없음: grepz-rnT   )capture_outputr   timeoutr   zPASS u    — 패턴 미발견u    — timeoutz
[pytest] `zSKIP u!    — normal 레벨, pytest 생략z::python3z-mpytestz-xx   u    — pytest 실패u   파싱된 시그니처 없음FAIL)r    r!   failed_signaturesPASS)ospathjoinisfileopenreadr   r   r   GREP_REsearchgroupexistsr
   
subprocessrun
returncodeTimeoutExpired	PYTEST_RE	partition)r   r   	task_pathfr   	sig_lineslevel
run_pytestr!   r/   r   line_stripped
grep_matchpatternrel_pathabs_path	sig_labelmsgr   pytest_matchtest_path_rawrel_file_	test_nameabs_test_paths                            r   verifyrS   1   s    ^Xw7)3PI77>>)$ 0DYK.P-QRR	iw	/ 1&&( w(=>I .Z-[\\'"E22JG E

^^M2
 &&q)G!''*Hww||NH=H"7)5
!<I77>>(+i[(<XJGs#!((34#UGX6#'	 $$)NNU9+#67NNU9+5J#KL%,,Y7
  ''6(..q1M$]O15Iyk1RST }$)6)@)@)F&!Y "^X F MPY Y "^] K4#htD#'	 $$)NNU9+#67NNU9+5G#HI%,,Y7
 KEN  .M-NOO!2
 	
 11} X ,, 4i[5s#!((34D ,, 4i[5s#!((34s2   K5"A'L5A(M5K?;M M;NNc                     t        | |      S )uZ   verify()의 alias — 완료 시그니처 자동 검증에서 심볼 존재 확인 대상.)rS   )r   r   s     r   signature_checkrU      s    '>**r   )z/home/jay/workspace)__doc__r1   rer;   compiler7   r?   strlistr   r   dictrS   rU    r   r   <module>r]      s    
 	 
"**<
=BJJ01	C  c  3 3 $k2C k2 k2 k2^+S +# +RV +r   