
     j                        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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y)u   tests/regression/test_task_id_parser_v3.py — utils/task_id_parser v3 SSOT 확장 회귀 (task-2547).

task-2502 SSOT export 보존 + task-2547 verifier SSOT public alias (TASK_ID_STRICT_RE) 확장 검증.
    )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        c/home/jay/workspace/.worktrees/task-2547-dev6-postupdate/tests/regression/test_task_id_parser_v3.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    tip_2547_v3zutils/task_id_parser.pyc                    d} t        t        |       }|st        j                  d      dz   dt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t        j                  }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                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)uR   TASK_ID_STRICT_RE 가 모듈 attribute 로 노출되어야 한다 (verifier SSOT).TASK_ID_STRICT_REu(   TASK_ID_STRICT_RE public alias 미노출7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrtippy0py1py3py5Nis not)z=%(py2)s
{%(py2)s = %(py0)s.TASK_ID_STRICT_RE
} is not %(py5)s)r!   py2r$   zassert %(py7)spy7)r   r   
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   _call_reprcompare)@py_assert2@py_assert4@py_format6@py_assert1@py_assert3@py_format8s         r   #test_v3_public_strict_alias_exposedr8      s    +X73+,X,XX.XXXXXXX7XXX7XXXXXX3XXX3XXX+XXX,XXXXXX  ,, ,,,, ,,,,,,3,,,3,,, ,,,,,,,,,,r   c                    t         j                  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| r| j                  d      nd       d	z   d
|iz  }t        t        j                  |            dx}}y)uR   TASK_ID_STRICT_RE 가 단어 경계를 강제한다 (foo-task-2487-bar 비매치).zfoo-task-2487-barNis)z%(py0)s is %(py3)smr!   r#   z&strict pattern boundary fail: matched r   
>assert %(py5)sr$   )r   r   searchr)   r1   r+   r,   r-   r.   r*   groupr/   r0   )r<   r2   r5   @py_format4r4   s        r   'test_v3_strict_re_matches_word_boundaryrB   "   s    $$%89AZ19ZZZ1ZZZZZZ1ZZZ1ZZZZZZ>QqwwqzTX>YZZZZZZZr   c            
        t         j                  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  }dd|iz  }t        t        j                  |            dx}}| j                  }d	} ||      }|j                  } |       }d
}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}
}	y)u?   TASK_ID_STRICT_RE 가 단어 단위 깨끗한 ID 는 잡는다.z task-2487+1 Nr%   )z%(py0)s is not %(py3)sr<   r=   zassert %(py5)sr$   r   task-2487+1==)z%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.group
}(%(py4)s)
}.strip
}()
} == %(py13)s)r!   r'   py4py6py8py10py13zassert %(py15)spy15)r   r   r?   r)   r1   r+   r,   r-   r.   r/   r0   r@   strip)r<   r2   r5   rA   r4   r6   @py_assert5@py_assert7@py_assert9@py_assert12@py_assert11@py_format14@py_format16s                r   "test_v3_strict_re_matches_clean_idrU   (   s2   $$_5A1D=1D11D77.1.71:.:.............1...1...7...1...:.................r   c                 f   d} t        t        |       }|st        j                  d      dz   dt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }h d}|t        t        j                        z
  }| }|s~t        j                  d	|       d
z   ddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}y)uB   __all__ 에 핵심 심볼이 모두 포함되어 있어야 한다.__all__u   __all__ 미정의r   r   r   r    N>
   
TASK_ID_RETASK_ID_PATTERNextract_task_idis_valid_task_idparse_task_id_v2r   TASK_ID_V2_PATTERNextract_task_id_from_branchis_valid_task_id_with_legacyextract_task_id_from_filenameu   __all__ 누락 심볼: z
>assert not %(py0)sr!   missing)r   r   r)   r*   r+   r,   r-   r.   r/   r0   setrW   )r2   r3   r4   requiredra   r5   @py_format2s          r   test_v3_all_exports_presentre   /   s    !773	"7"77$77777777777777777737773777	777"777777H S[[))G;;;;;1';;;;;;;w;;;w;;;;;;r   c                    t         j                  } t        |       }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }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-2502 가 추가한 is_valid_task_id_with_legacy 가 보존되어 있어야 한다.z^assert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.is_valid_task_id_with_legacy
})
}callabler   r    Nztask-1234.5Tr:   )zb%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_valid_task_id_with_legacy
}(%(py4)s)
} is %(py9)sr!   r'   rG   rH   py9assert %(py11)spy11)r   r_   rg   r+   r,   r)   r-   r.   r/   r0   r1   )
r2   r3   r4   r5   r6   rN   @py_assert8rO   @py_format10@py_format12s
             r   +test_v3_task_2502_legacy_function_preservedro   B   s   445845555555585558555555C555C55545555555555++BMB+M:BdB:dBBBB:dBBBBBB3BBB3BBB+BBBMBBB:BBBdBBBBBBBBr   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
)uU   task-2485 boundary hardening (task-2472+10 잘림 방지) 가 보존되어야 한다.zfoo task-2472+10 barztask-2472+10rE   )z%(py0)s == %(py3)soutr=   u   loose boundary 회귀: r>   r$   N)r   rZ   r)   r1   r+   r,   r-   r.   r*   r/   r0   )rq   r2   r5   rA   r4   s        r   *test_v3_task_2485_loose_boundary_preservedrr   H   s|    


4
5C A3. AAA3.AAAAAA3AAA3AAA.AAA$;C5"AAAAAAAr   c                 ,   t         j                  } d} | |      }d}||k(  }|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}}t         j                  } d	} | |      }d
}||k(  }|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 )Nzmemory/tasks/task-2487+1.mdrD   rE   )zc%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.extract_task_id_from_filename
}(%(py4)s)
} == %(py9)sr   rh   rj   rk   ztask-2469_1.2_a+3.mdztask-2469_1.2_a+3)
r   r`   r)   r1   r+   r,   r-   r.   r/   r0   r5   r6   rN   rl   rO   rm   rn   s          r   %test_v3_extract_task_id_from_filenameru   N   sA   ,,\-J\,-JK\}\K}\\\\K}\\\\\\3\\\3\\\,\\\-J\\\K\\\}\\\\\\\,,[-C[,-CD[H[[DH[[[[[DH[[[[[[[3[[[3[[[,[[[-C[[[D[[[H[[[[[[[[[r   c                 ,   t         j                  } d} | |      }d}||k(  }|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}}t         j                  } d	} | |      }d
}||k(  }|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 )Nztask/task-2487+1-dev2rD   rE   )za%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.extract_task_id_from_branch
}(%(py4)s)
} == %(py9)sr   rh   rj   rk   ztask/task-2469_1.2-dev3ztask-2469_1.2)
r   r^   r)   r1   r+   r,   r-   r.   r/   r0   rt   s          r   #test_v3_extract_task_id_from_branchrw   S   s=   **T+BT*+BCT}TC}TTTTC}TTTTTT3TTT3TTT*TTT+BTTTCTTT}TTTTTTT**X+DX*+DEXXEXXXXEXXXXXX3XXX3XXX*XXX+DXXXEXXXXXXXXXXXr   c                 "   t         j                  d      } | j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}x}}| j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}x}}| j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       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
)u@   task-2502 에서 추가된 num 필드가 보존되어야 한다.rD   num2487rE   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)srq   rh   rj   rk   Nbasez	task-2487retryz+1)r   r\   getr)   r1   r+   r,   r-   r.   r/   r0   )rq   r5   r6   rN   rl   rO   rm   rn   s           r   +test_v3_parse_task_id_v2_includes_num_fieldr~   X   s   


}
-C77#5#75>#V#>V####>V######3###3###7###5###>###V#######77)6)76?)k)?k))))?k))))))3)))3)))7)))6)))?)))k)))))))77#7#77#t#t####t######3###3###7###7######t########r   )r   r   r   r   )__doc__
__future__r   builtinsr+   _pytest.assertion.rewrite	assertionrewriter)   importlib.utilr   r   pathlibr   __file__resolveparentsr   r   r   r8   rB   rU   re   ro   rr   ru   rw   r~    r   r   <module>r      s    #     
 N""$,,Q/	 =";<-[/<&CB\
Y
$r   