
    i!                    R   d Z ddlmZ ddlZddlmc 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ddZ ed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# ejH                  dejJ                        Z&d Z'd Z(y)u+  tests/regression/test_legacy_compat_2487.py — task-2487 회귀 테스트 (legacy 호환).

V2 패턴 도입 이후에도 기존 단순 ID(task-1234)와 dot-phase(task-1234.5)가
파괴되지 않는지 검증한다. 회장 명시 합격 조건.

헤임달(개발2팀 테스터) 작성 / task-2487.
    )annotationsN)Path   c                <   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        Y/home/jay/workspace/.worktrees/task-2487-dev2/tests/regression/test_legacy_compat_2487.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    tip_2487_legacyzutils/task_id_parser.pyc                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uW   기존 단순 task-1234 ID가 V2 parser에서 valid로 인식된다 (미파괴 확인).	task-1234TiszV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_valid_task_id
}(%(py4)s)
} is %(py9)stippy0py2py4py6py9assert %(py11)spy11N
r    is_valid_task_id
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation@py_assert1@py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12s          r   test_legacy_base_id_validr;   %   s    44,44,4444,44444434443444444444,44444444444r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u0   큰 번호 task-99999 도 valid로 인식된다.z
task-99999Tr   r   r    r!   r'   r(   Nr)   r3   s          r    test_legacy_base_id_large_numberr=   *   s    55-55-5555-55555535553555555555-55555555555r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u2   단자리 번호 task-1 도 valid로 인식된다.ztask-1Tr   r   r    r!   r'   r(   Nr)   r3   s          r    test_legacy_base_id_small_numberr?   /   s    11)1T1)T1111)T11111131113111111111)111T11111111r   c                    t         j                  d      } d}| |u }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}}y
)u   dot phase 'task-1234.5'는 V2 strict 패턴에서 invalid (언더스코어 아님).
    이 동작은 의도된 것으로, dot phase는 V1 호환 경로에서 처리해야 한다.task-1234.5Fr   )z%(py0)s is %(py3)sresultr"   py3ui   task-1234.5는 V2 패턴에서 False여야 함. True이면 dot-phase가 V2로 흡수됨 — 확인 필요
>assert %(py5)spy5N)r    r*   r+   r,   r-   r.   r/   r0   _format_assertmsgr1   r2   rB   @py_assert2r4   @py_format4@py_format6s        r   %test_legacy_dot_phase_not_valid_in_v2rL   ;   s     !!-0F  6U?  6U                  t    r   c                 V   t         j                  d      } g }d}| |u}|}|rd}|| v }|}|sqt        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd	|iz  }|j                  |       |rt        j                  d
fd| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }	dd|	iz  }
|j                  |
       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}x}x}x}}y)u   _TASK_ID_LOOSE_PATTERN 으로는 dot phase 내 base('task-1234')가 추출된다.
    실제 filename/branch 파이프라인에서 dot-phase 처리가 완전히 망가지지 않음을 검증.task-1234.5.mdNr   is notz%(py2)s is not %(py5)srB   r#   rF   %(py7)spy7inz%(py10)s in %(py12)spy10py12%(py14)spy14r   u8   task-1234.5.md 에서 base task-1234 추출 실패: got 
>assert %(py17)spy17)r    extract_task_id_from_filenamer+   r,   r-   r.   r/   r0   append_format_booloprG   r1   r2   rB   r4   @py_assert4r5   @py_assert0@py_assert9@py_assert11rK   @py_format8@py_format13@py_format15@py_format16@py_format18s                r   *test_legacy_dot_phase_loose_pattern_searchrl   G   sl    ../?@F 6 + +"7   6                   +    #.      28    28        C6*M     r   c                 V   t         j                  d      } g }d}| |u}|}|rd}|| v }|}|sqt        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd	|iz  }|j                  |       |rt        j                  d
fd| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }	dd|	iz  }
|j                  |
       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}x}x}x}}y)u@   'task/task-1234.5-dev1' 브랜치에서 base ID가 추출된다.ztask/task-1234.5-dev1Nr   rO   rQ   rB   rR   rS   rT   rU   rW   rX   r[   r\   r   u?   task/task-1234.5-dev1 에서 base task-1234 추출 실패: got r]   r^   )r    extract_task_id_from_branchr+   r,   r-   r.   r/   r0   r`   ra   rG   r1   r2   rb   s                r   -test_legacy_dot_phase_branch_base_extractablero   R   sj   ,,-DEF 6 + +"7   6                   +    #.      28    28        J&T     r   c                 ^   t         j                  d      } | d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|        dz   d	|iz  }t        t        j                  |            dx}x}}y)
uL   parse_task_id_v2('task-1234.5')는 모든 필드 None (V2 패턴 불일치).rA   baseNr   z%(py1)s is %(py4)spy1r$   u#   dot phase가 V2 base로 파싱됨: 
>assert %(py6)sr%   )r    parse_task_id_v2r+   r,   r0   rG   r1   r2   outrd   r5   rI   @py_format5@py_format7s         r   ,test_legacy_parse_returns_none_for_dot_phaser{   _   ss    


}
-Cv;K$K;$KKK;$KKK;KKK$KKK"EcU KKKKKKKKr   c                 *   t         j                  d      } | d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d	   }d}||u }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d   }d}||u }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uC   parse_task_id_v2('task-1234')는 base='task-1234'를 정상 반환.r   rq   ==z%(py1)s == %(py4)srs   assert %(py6)sr%   Nphaser   rr   retryr    rv   r+   r,   r0   r1   r2   rw   s         r   test_legacy_parse_v2_base_okr   e   s    


{
+Cv;%+%;+%%%%;+%%%;%%%+%%%%%%%w<4<4<4<4w<4<4<4<4r   c                 .   t         j                  d      } | d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}| d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)u@   V2 언더스코어 phase 'task-1234_1.2'는 정상 파싱된다.task-1234_1.2rq   r   r}   r   rs   r   r%   Nr   z_1.2r   rw   s         r   (test_legacy_parse_v2_phase_underscore_okr   m   s    



/Cv;%+%;+%%%%;+%%%;%%%+%%%%%%%w<!6!<6!!!!<6!!!<!!!6!!!!!!!r   c                    ddl } ddl}t        dd      }d}| j                         }|j                  j                  |d      }t        |dd	      5 }|j                  |       ddd       	 |j                  |      }|d
   d}|d
   }	||	v }
|
st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }t        j                  d|d
         dz   d|iz  }t        t        j                  |            dx}x}
}	|j                  |       |j!                  |       y# 1 sw Y   xY w# |j                  |       |j!                  |       w xY w)u   report_parser가 'task-1234.5.md' basename 에서 최소한 task-1234를 추출한다.
    V2 regex는 dot phase 미지원이지만 basename fallback이 작동해야 한다.r   Nrp_legacy_2487zreport_parser.pyu   # 완료 보고서

내용rN   wzutf-8)encodingtask_idr   rU   )z%(py1)s in %(py4)srs   u@   report_parser가 task-1234.5.md에서 잘못된 task_id 반환: ru   r%   )tempfileosr   mkdtemppathjoinopenwriteparse_reportr+   r,   r0   rG   r1   r2   unlinkrmdir)r   r   rpcontenttmp_dirtmpfrB   rd   r5   rI   ry   rz   s                r   ,test_legacy_report_parser_dot_phase_basenamer   y   sT    	&(:	;B,G G
'',,w 0
1C	c3	) Q	
%)( &"3 ;"33  ;"3  I   I #4    SSYZcSdRgh    
 			#
  			#
s   E ,B1E  E	$E0c                    t         j                  d      } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
x}}y
)u@   'task-1234.md' → 'task-1234' 추출 (기존 동작 미파괴).ztask-1234.mdr   r}   z%(py0)s == %(py3)srB   rC   got rE   rF   Nr    r_   r+   r,   r-   r.   r/   r0   rG   r1   r2   rH   s        r   #test_legacy_extract_filename_simpler      sz    ..~>F 36[ 3336[33333363336333[333D
"3333333r   c                    t         j                  d      } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
x}}y
)u=   'task-1234+1.md' → 'task-1234+1' 추출 (V2 신규 동작).ztask-1234+1.mdtask-1234+1r}   r   rB   rC   r   rE   rF   Nr   rH   s        r   %test_legacy_extract_filename_v2_retryr      s{    ../?@F"56]"5556]55555565556555]555d6*$5555555r   c                    t         j                  d      } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
x}}y
)uA   'task-1234_1.2.md' → 'task-1234_1.2' 추출 (V2 신규 동작).ztask-1234_1.2.mdr   r}   r   rB   rC   r   rE   rF   Nr   rH   s        r   %test_legacy_extract_filename_v2_phaser      s{    ../ABF$76_$7776_77777767776777_777VJ&7777777r   c                    t         j                  d      } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
x}}y
)u@   'task/task-1234-dev1' → 'task-1234' (기존 동작 미파괴).ztask/task-1234-dev1r   r}   r   rB   rC   r   rE   rF   Nr    rn   r+   r,   r-   r.   r/   r0   rG   r1   r2   rH   s        r   !test_legacy_extract_branch_simpler      s{    ,,-BCF 36[ 3336[33333363336333[333D
"3333333r   c                    t         j                  d      } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
x}}y
)u=   'task/task-1234+1-dev1' → 'task-1234+1' (V2 신규 동작).ztask/task-1234+1-dev1r   r}   r   rB   rC   r   rE   rF   Nr   rH   s        r   #test_legacy_extract_branch_v2_retryr      s{    ,,-DEF"56]"5556]55555565556555]555d6*$5555555r   uO   ^(?:task-\d+(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?|Task\s+\d+[\.\d]*)\s*[:：]?\s*c                    t         j                  dd      j                         } d}| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}y)uR   대시보드 prefix 제거가 'task-1234: 제목'을 정상 처리한다 (legacy). u   task-1234: 제목   제목r}   r   rB   rC   r   rE   rF   N_DASH_PREFIX_RE_LEGACYsubstripr+   r,   r-   r.   r/   r0   rG   r1   r2   rH   s        r   'test_dashboard_prefix_legacy_base_stripr      s    #'',?@FFHF06X0006X00000060006000X000fZ0000000r   c                    t         j                  dd      j                         } d}| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}y)ud   'Task 1234.5: 제목' (숫자.숫자 dot 형식)을 prefix 제거 정규식이 처리할 수 있다.r   u   Task 1234.5: 제목r   r}   r   rB   rC   r   rE   rF   Nr   rH   s        r   +test_dashboard_prefix_dot_phase_title_stripr      s     $'',ABHHJF06X0006X00000060006000X000fZ0000000r   )r   r   r   r   ))__doc__
__future__r   builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   importlib.utilr   rer   pathlibr   __file__resolveparentsr   r   r    r;   r=   r?   rL   rl   ro   r{   r   r   r   r   r   r   r   r   compile
IGNORECASEr   r   r    r   r   <module>r      s    #     	 
 N""$,,Q/	 $&?@5
6
2	L ":46846 $VMM 11r   