
    ic                    (   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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)ul  tests/dispatch/test_task_id_parsing.py — task-2471 회귀 테스트.

토르가 commit 320c5f0e 에서 신설한 ``utils.task_id_parser`` (V2 패턴) 의
+N suffix / phase / parallel 보존 동작을 영구 차단한다.

또한 commit 2cbce860 의 dispatch ``--task-file`` 자동 task_id 추출 동작도
간접 검증.

헤임달(개발2팀 테스터) 작성.
    )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        =/home/jay/workspace/tests/dispatch_id/test_task_id_parsing.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    task_id_parser_test_aliaszutils/task_id_parser.pyc                    t         j                  d      } ddd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  }d
d|iz  }t        t        j                  |            dx}}y)u.   ``task-2469+1`` -> retry 필드 ``+1`` 보존.task-2469+1	task-2469Nz+1basephaseparallelretry==z%(py0)s == %(py3)soutpy0py3assert %(py5)spy5
tipparse_task_id_v2
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr&   @py_assert2@py_assert1@py_format4@py_format6s        r   !test_parse_retry_suffix_preservedr<   *   sx    


}
-C&4RVWW3WWWWW3WWWWWWW3WWW3WWWWWWWWWWWr   c                    t         j                  d      } ddd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  }d
d|iz  }t        t        j                  |            dx}}y)z$``task-2469_2.1`` -> phase ``_2.1``.ztask-2469_2.1r   _2.1Nr   r#   r%   r&   r'   r*   r+   r,   r7   s        r   test_parse_phase_onlyr?   0   s    



/C	 3   
 3   
  
    
    
     
  r   c                    t         j                  d      } ddd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  }dd|iz  }t        t        j                  |            dx}}y)u3   ``task-2469_2.1_a+3`` -> 4 필드 모두 채워짐.ztask-2469_2.1_a+3r   r>   _az+3r   r#   r%   r&   r'   r*   r+   Nr,   r7   s        r   (test_parse_phase_parallel_retry_all_fourrB   ;   s    


2
3C	 3   
 3   
  
    
    
     
  r   c                    t         j                  d      } ddd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  }dd	|iz  }t        t        j                  |            dx}}y)
u%   매칭 실패 시 모든 필드 None.invalidNr   r#   r%   r&   r'   r*   r+   r,   r7   s        r   "test_parse_invalid_yields_all_nonerE   F   sw    


y
)C$D4PP3PPPPP3PPPPPPP3PPP3PPPPPPPPPPPr   c                    t         j                  d      } ddd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  }dd	|iz  }t        t        j                  |            dx}}y)
u2   ``task-2469`` -> phase/parallel/retry 모두 None.r   Nr   r#   r%   r&   r'   r*   r+   r,   r7   s        r   test_parse_with_only_baserG   L   s    


{
+C	 3   
 3   
  
    
    
     
  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    앞뒤 공백 제거 후 매칭.z  task-2469+5  r   r   r#   )z%(py1)s == %(py4)s)py1py4zassert %(py6)spy6Nr"   z+5)r-   r.   r/   r0   r4   r5   r6   )r&   @py_assert0@py_assert3r8   @py_format5@py_format7s         r   test_parse_strips_whitespacerP   W   s    


0
1Cv;%+%;+%%%%;+%%%;%%%+%%%%%%%w<4<4<4<4r   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 )	Nr   TiszV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_valid_task_id
}(%(py4)s)
} is %(py9)sr-   r(   py2rJ   rK   py9assert %(py11)spy11
r-   is_valid_task_idr/   r0   r1   r2   r3   r4   r5   r6   r9   rM   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s          r   test_is_valid_task_id_simplerb   c   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 )	Nr   TrR   rT   r-   rU   rX   rY   rZ   r\   s          r    test_is_valid_task_id_with_retryrd   g   s    66.6$6.$6666.$66666636663666666666.666$66666666r   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 )	Nztask-2469_1.2_a+3TrR   rT   r-   rU   rX   rY   rZ   r\   s          r   test_is_valid_task_id_fullrf   k   s    < 3< 34<<4<<<<4<<<<<<3<<<3<<<<<< 3<<<4<<<<<<<<<<<r   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}}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}}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 )Nz
not-a-taskFrR   rT   r-   rU   rX   rY   ztask-abc rZ   r\   s          r   %test_is_valid_task_id_rejects_invalidri   o   s   66-66-6666-66666636663666666666-66666666664
4
+4u4+u4444+u44444434443444444
444+444u4444444,,#,u,#u,,,,#u,,,,,,3,,,3,,,,,,,,,#,,,u,,,,,,,,r   c                 z   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  }dd|iz  }t        t        j                  |            d	x}}y	)
z3``memory/tasks/task-2469+1.md`` -> ``task-2469+1``.zmemory/tasks/task-2469+1.mdr   r#   r%   r&   r'   r*   r+   N
r-   extract_task_id_from_filenamer/   r0   r1   r2   r3   r4   r5   r6   r7   s        r   (test_extract_from_filename_relative_pathrm   z   sl    

+
+,I
JC3-3-33-r   c                 z   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  }dd|iz  }t        t        j                  |            d	x}}y	)
u'   절대 경로 + 4 필드 모두 보존.z/abs/path/task-2470_1.2_b+5.mdztask-2470_1.2_b+5r#   r%   r&   r'   r*   r+   Nrk   r7   s        r   (test_extract_from_filename_absolute_pathro      so    

+
+,L
MC%%3%%%%%3%%%%%%%3%%%3%%%%%%%%%%%r   c                 z   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  }dd|iz  }t        t        j                  |            d x}}y )Nz	task-1234r#   r%   r&   r'   r*   r+   rk   r7   s        r   'test_extract_from_filename_no_extensionrq      sk    

+
+K
8C3+3+33+r   c                 x   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  }dd|iz  }t        t        j                  |            d x}}y )Nz	README.mdrR   z%(py0)s is %(py3)sr&   r'   r*   r+   rk   r7   s        r   1test_extract_from_filename_unrelated_returns_nonert      sj    

+
+K
8C3$;3$33$r   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}}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 )Nrh   rR   )zc%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.extract_task_id_from_filename
}(%(py4)s)
} is %(py9)sr-   rU   rX   rY   rk   r\   s          r   1test_extract_from_filename_empty_or_invalid_inputrv      s7   ,,8R8,R08D80D88880D88888838883888,888R8880888D8888888,,:T:,T2:d:2d::::2d::::::3:::3:::,:::T:::2:::d::::::::r   c                 z   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  }dd|iz  }t        t        j                  |            d	x}}y	)
z-``task/task-2467+3-dev6`` -> ``task-2467+3``.ztask/task-2467+3-dev6ztask-2467+3r#   r%   r&   r'   r*   r+   N
r-   extract_task_id_from_branchr/   r0   r1   r2   r3   r4   r5   r6   r7   s        r   #test_extract_from_branch_with_retryrz      sl    

)
)*A
BC3-3-33-r   c                 x   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  }dd|iz  }t        t        j                  |            dx}}y)	u%   main 같은 일반 브랜치는 None.mainNrR   rs   r&   r'   r*   r+   rx   r7   s        r   *test_extract_from_branch_main_returns_noner}      sj    

)
)&
1C3$;3$33$r   c                 z   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  }dd|iz  }t        t        j                  |            d x}}y )	Nztask/task-2469_1.2-dev2ztask-2469_1.2r#   r%   r&   r'   r*   r+   rx   r7   s        r   #test_extract_from_branch_with_phaser      sl    

)
)*C
DC!!3/!!!!3/!!!!!!3!!!3!!!/!!!!!!!r   c                 z   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  }dd|iz  }t        t        j                  |            d	x}}y	)
u4   phase + parallel + retry 모두 포함된 브랜치.ztask/task-2470_1.2_a+5-dev3ztask-2470_1.2_a+5r#   r%   r&   r'   r*   r+   Nrx   r7   s        r   #test_extract_from_branch_full_combor      so    

)
)*G
HC%%3%%%%%3%%%%%%%3%%%3%%%%%%%%%%%r   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}}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 )Nrh   rR   )za%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.extract_task_id_from_branch
}(%(py4)s)
} is %(py9)sr-   rU   rX   rY   rx   r\   s          r   $test_extract_from_branch_empty_inputr      s7   **626*2.6$6.$6666.$66666636663666*6662666.666$6666666**848*408D80D88880D88888838883888*88848880888D88888888r   c            	        ddl } d}t        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                  }| j                  }t        ||      }|s3d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                  |      d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}y)uL   ``TASK_ID_V2_PATTERN`` 가 모듈에서 노출되어야 함 (외부 사용).r   NTASK_ID_V2_PATTERNz5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrr-   )r(   rI   r)   r+   zzassert %(py8)s
{%(py8)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.TASK_ID_V2_PATTERN
}, %(py6)s
{%(py6)s = %(py4)s.Pattern
})
}
isinstance_re)r(   rI   r)   rJ   rK   py8)rer   r-   r1   r2   r/   r3   r4   r5   r6   r   Patternr   )r   r8   @py_assert4r;   r]   r_   @py_format9s          r   test_pattern_constant_exposedr      s4   ,-73,--------7---7------3---3---,----------,,:ckk::,k:::::::::::::::::::c:::c:::,::::::c:::c:::k::::::::::r   )r   r   r   r   ))__doc__
__future__r   builtinsr1   _pytest.assertion.rewrite	assertionrewriter/   importlib.utilr   r   pathlibr   __file__resolveparentsr   r   r-   r<   r?   rB   rE   rG   rP   rb   rd   rf   ri   rm   ro   rq   rt   rv   rz   r}   r   r   r   r    r   r   <module>r      s   	 #     
 N""$,,Q/	 XQ 57=- &

; "
&9;r   