
    iw(                       d Z ddlmZ ddlZddlZddlZddlmZ  ee	      j                         j                  d   Zedz  ZddZ edd	      Zg d
Zg dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z y)u  tests/regression/test_scripts_hardening_2487.py — task-2487 회귀 테스트 (Group B).

scripts/ 영역의 각 파일이 V2 task ID 패턴을 인식하는지 검증한다.

직접 import 가능한 모듈: done-watcher, report_utils
직접 import 어려운 (side-effect / argparse main) 스크립트: 메타 grep 테스트 적용.

헤임달(개발2팀 테스터) 작성 / task-2487.
    )annotationsN)Path   scriptsc                <   t         |z  }t        j                  j                  | t	        |            }||j
                  t        d|       t        j                  j                  |      }|t        j                  | <   |j
                  j                  |       |S )Nzcannot load spec for )	WORKSPACE	importlibutilspec_from_file_locationstrloaderImportErrormodule_from_specsysmodulesexec_module)mod_namefile_rel	file_pathspecmodules        ]/home/jay/workspace/.worktrees/task-2487-dev2/tests/regression/test_scripts_hardening_2487.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    tip_2487_scriptszutils/task_id_parser.py)z	task-1234ztask-1234+1ztask-1234_1.2ztask-1234_1.2_a+3ztask-9999+99ztask-0001_3.14ztask-2487_2.1_b+5)1234ztask-abcz
not-a-task ztask-z	TASK-1234c                 L    t         dz  j                  d      } d| v sJ d       y)uB   done-watcher.py 소스에 is_valid_task_id import가 존재한다.done-watcher.pyutf-8encodingis_valid_task_idu1   done-watcher.py에 is_valid_task_id 사용 없음NSCRIPTS_DIR	read_textsrcs    r   'test_done_watcher_uses_is_valid_task_idr)   <   s/    **
5
5w
5
GC$Y&YY$r   c                 ^    t         D ]$  } t        j                  |       du rJ d| d        y)uU   done-watcher가 의존하는 is_valid_task_id가 V2 패턴을 모두 통과시킨다.Tis_valid_task_id(z) should be TrueN)V2_VALID_CASEStipr#   tids    r    test_done_watcher_v2_valid_casesr0   B   s<     ^##C(D0]4EcWL\2]]0^r   c                 ^    t         D ]$  } t        j                  |       du rJ d| d        y)uR   done-watcher가 의존하는 is_valid_task_id가 잘못된 패턴을 거부한다.Fr+   z) should be FalseN)V2_INVALID_CASESr-   r#   r.   s    r   %test_done_watcher_v2_invalid_rejectedr3   H   s<     `##C(E1_5FsgM^3__1`r   c                     t         dz  j                  d      } t        j                  d|       s(t        j                  d|       sd| v sd| v sJ d       y	y	y	y	)
uW   done-watcher.py 내 .done 파일명 정규식이 V2 suffix(_/+) 토큰을 포함한다.r   r    r!   
_\\d\+\\\\z_\\\\d\+\\\\z_\d+\.	_\d+\.\d+uM   done-watcher.py 파일명 패턴에 V2 언더스코어 phase 토큰이 없음N)r%   r&   researchr'   s    r   (test_done_watcher_file_pattern_covers_v2r9   N   sc    **
5
5w
5
GC99]C(BIIos,Ky\_O_cosvcv WvcvO_,K(r   c                 |    t         dz  j                  d      } d| v sd| v sd| j                         v sJ d       yyy)	uQ   notify-completion.py에 _RE_TASK_ID 또는 TASK_ID 관련 패턴이 존재한다.notify-completion.pyr    r!   _RE_TASK_IDTASK_IDtask_idu7   notify-completion.py에 task ID 관련 심볼이 없음N)r%   r&   lowerr'   s    r   .test_notify_completion_task_id_pattern_presentr@   ^   sP    //
:
:G
:
LCC9#3yCIIK7O AO7O#3r   c                     t         dz  j                  d      } t        t        j                  d|       xs d| v xs d| v xs
 d| v xs d| v       }|sJ d	       y
)u   notify-completion.py가 V2 패턴(_\d+\.\d+ 또는 +\d+)을 소스에 포함하거나
    utils.task_id_parser를 사용한다 — 미지원이면 FAIL(코드 수정 필요 신호).r;   r    r!   r5   r6   z\+\d+task_id_parserr#   u   notify-completion.py: V2 패턴(_\d+\.\d+ / +\d+) 미포함 및 task_id_parser 미사용 — _RE_TASK_ID가 V1 dot-phase 전용일 가능성N)r%   r&   boolr7   r8   )r(   has_v2_patterns     r   *test_notify_completion_v2_meta_or_explicitrE   f   s     //
:
:G
:
LC
		-% 	%3	%s?	% s"	% $N  	W>r   c                 L    t         dz  j                  d      } d| v sJ d       y)uZ   auto_merge.py가 report_parser를 import하는지 확인 (V2 branch 패턴 간접 검증).zauto_merge.pyr    r!   report_parseru5   auto_merge.py가 report_parser를 import하지 않음Nr$   r'   s    r   %test_auto_merge_imports_report_parserrH   |   s.    (
3
3W
3
ECc!Z#ZZ!r   c                 z    t         dz  j                  d      } t        j                  d|       sd| v sJ d       yy)uJ   report_parser.py의 merge_branch 패턴이 V2 suffix(_/+)를 포함한다.zreport_parser.pyr    r!   z&_\\?\\d\+\\.\\d\+|_\d\+\\\.\d\+|_\\d\+r6   uG   report_parser.py merge_branch 패턴에 V2 언더스코어 phase 없음N)r   r&   r7   r8   r'   s    r   'test_auto_merge_report_parser_branch_v2rJ      sH    ))
4
4g
4
FC99>DX[H[ Q[H[Dr   c                 L    t         dz  j                  d      } d| v sJ d       y)u=   token-tracker.py에 TASK_RE 컴파일 패턴이 존재한다.token-tracker.pyr    r!   TASK_REu)   token-tracker.py에 TASK_RE 정의 없음Nr$   r'   s    r   "test_token_tracker_task_re_presentrN      s/    ++
6
6
6
HCHHHr   c                 t    t         dz  j                  d      } d| v xs d| v xs
 d| v xs d| v }|sJ d       y	)
u   token-tracker.py TASK_RE가 V2 패턴(_/+)을 포함하거나 task_id_parser를 사용한다.
    TASK_RE = re.compile(r'task-\d+(?:\.\d+)?') 처럼 dot-phase 전용이면 FAIL.rL   r    r!   r6   z_\\d\+rB   r#   u   token-tracker.py TASK_RE가 V2 언더스코어 phase 미지원 — task-1234_1.2 같은 ID를 task-1234 로 잘못 파싱할 수 있음Nr$   r(   has_v2s     r   &test_token_tracker_task_re_v2_coveragerR      sq     ++
6
6
6
HC 	 	%	%s"	% $	  	
S	
u r   c                 `    t         dz  j                  d      } t        |       dkD  sJ d       y)u=   pattern-detector.py 파일이 존재하고 읽을 수 있다.pattern-detector.pyr    r!   d   u<   pattern-detector.py 파일이 비어 있거나 너무 작음Nr%   r&   lenr'   s    r   "test_pattern_detector_loads_sourcerX      s1    ..
9
97
9
KCs8c>YYY>r   c                     t         dz  j                  d      } t        j                  d|       }|rd| v sd| v sJ d       yyy)	uZ   pattern-detector.py가 task-\d+\.\d+ 전용 패턴 없이 동작하거나 V2 호환이다.rT   r    r!   ztask-\\\\d\+\\\\\.\\\\d\+rB   r6   uO   pattern-detector.py에 V1 dot-phase 전용 패턴이 있으나 V2 대응 없음N)r%   r&   r7   findall)r(   dot_onlys     r   3test_pattern_detector_no_hard_coded_v1_only_task_rer\      s[    ..
9
97
9
KC zz6<H3&,#*= 	
]	
=*=& r   c                 h    t         dz  j                  d      } d| v xs
 d| v xs d| v }|sJ d       y)	uc   report_utils.py 내 제목 추출 정규식이 V2 ID(언더스코어 phase) 제거를 지원한다.zreport_utils.pyr    r!   r6   z_\\d+rB   uX   report_utils.py 제목 추출 정규식이 V2 언더스코어 phase(_\d+\.\d+) 미지원Nr$   rP   s     r   )test_report_utils_title_pattern_covers_v2r^      sK    **
5
5w
5
GCS NHON7G37NF e6r   c                 `    t         dz  j                  d      } t        |       dkD  sJ d       y)u=   start_task_guard.py 파일이 존재하고 읽을 수 있다.start_task_guard.pyr    r!      u;   start_task_guard.py 파일이 비어있거나 너무 작음NrV   r'   s    r   %test_start_task_guard_source_readablerb      s1    ..
9
97
9
KCs8c>XXX>r   c                 t    t         dz  j                  d      } d| v xs d| v xs
 d| v xs d| v }|sJ d       y	)
u   start_task_guard.py의 branch에서 task-id 추출 로직이 V2 suffix를 처리할 수 있다.
    현재 단순 split('-') 방식이면 task-1234+1-dev4 에서 task-1234 를 잘못 추출할 수 있음.r`   r    r!   rB   extract_task_id_from_branchr6   z+\d+u   start_task_guard.py: branch에서 task-id 추출 시 V2 suffix 미처리 — task/task-1234+1-dev4 에서 task-1234+1 을 올바르게 추출하는지 확인 필요Nr$   rP   s     r   *test_start_task_guard_branch_extraction_v2re      sp     ..
9
97
9
KC 	C 	(C/	3	 c>	  	
f	
u r   )r   r   r   r   )!__doc__
__future__r   importlib.utilr	   r7   r   pathlibr   __file__resolveparentsr   r%   r   r-   r,   r2   r)   r0   r3   r9   r@   rE   rH   rJ   rN   rR   rX   r\   r^   rb   re    r   r   <module>rn      s    #  	 
 N""$,,Q/	)#" %'@A Z^` ,[I
0Z	
"Y
r   