
    IAi)                    H   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
mZ  ee      j                         j                  d   Z ee      e	j"                  vr"e	j"                  j%                  d ee             ddlm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/dispatch/test_routing_classification.py — task-2473 regression test.

dispatch.py 휴리스틱 false-positive hotfix 검증.

5건 시나리오:
1. 백틱 코드 블록 안의 디자인 키워드 → coding (false positive 없음)
2. regex pattern 안의 키워드 → coding
3. 코딩 컨텍스트 + 키워드 (Gemini gate / severity badge) → coding
4. 실제 디자인 작업 spec → design (true positive 보존)
5. 정상 코딩 작업 spec → coding (정상 동작 보존)
    )annotationsN)Path   )classify_task_routingc                    d} t        | 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                  |      dz  }t        j                  d	|j                   d
|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uA   백틱 코드 블록 안의 디자인 키워드는 coding 분류.u   task-X: hardening 작업.

    아래 패턴을 탐지해야 합니다 (코드 검증 대상):
    `image markdown severity badge` 형식의 표현
    `![high](...)` `![critical](...)` 등
    Fwrite_auditcoding==z6%(py2)s
{%(py2)s = %(py0)s.classification
} == %(py5)sdpy0py2py5uP   백틱 코드 블록 안의 디자인 키워드는 coding이어야 함. matched=
, signals=, score=
>assert %(py7)spy7Nallowz.%(py2)s
{%(py2)s = %(py0)s.result
} == %(py5)sassert %(py7)sr   classification
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgmatched_keywordscontext_signalsscoreAssertionError_format_explanationresult	task_descr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          A/home/jay/workspace/tests/dispatch/test_routing_classification.py=test_backtick_code_block_design_keywords_classified_as_codingr1      s   I 	iU;A x x'  x                   (    [[\[m[mZnnxyz  zK  zK  yL  LT  UV  U\  U\  T]  	^     88w8w8w118w    c                    d} t        | 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                  |      dz  }t        j                  d	|j                   d
|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u0   regex pattern 안의 키워드는 coding 분류.u   task-Y: regex pattern 휴리스틱 정정.

    다음 정규식 표현을 탐지: !\[(high|critical)\] 형식.
    raw string r"image|banner|design" 패턴.
    Fr   r
   r   r   r   r   u?   regex pattern 안의 키워드는 coding이어야 함. matched=r   r   r   r   Nr   r   r   r   r)   s          r0   7test_regex_pattern_design_keywords_classified_as_codingr4   '   s   I
 	iU;A x x'  x                   (    J!J\J\I]]ghihyhygz  {C  DE  DK  DK  CL  	M     88w8w8w118wr2   c                 h   d} t        | 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                  |      dz  }t        j                  d	|j                   d
|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }t        |      }d}||k\  }	|	s-t        j                  d|	fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }
t        j                  d|j                         dz   d|
iz  }t        t        j                  |            dx}x}x}	}y)uM   코딩 컨텍스트 시그널 다수 + 디자인 키워드 → coding 분류.u  task-Z: Gemini gate severity badge 검증 hardening.

    regression test로 false positive 차단.
    qc-gate 룰 정정. 검사 대상 탐지 휴리스틱 보강.
    image 키워드도 본문에 등장하지만 코드 블록과 동등한 검증 컨텍스트.
    Fr   r
   r   r   r   r   uH   코딩 컨텍스트 시그널이 design을 override 해야 함. matched=r   r   r   r   Nr   r   r   r   >=)zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.context_signals
})
} >= %(py8)slenr   py1py3r   py8u&   컨텍스트 시그널 검출 누락: 
>assert %(py10)spy10r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r8   r*   r   r+   r,   r-   r.   r/   @py_assert2@py_assert7@py_assert6@py_format9@py_format11s               r0   4test_coding_context_signals_override_design_keywordsrF   5   sT   I 	iU;A x x'  x                   (    SSTSeSeRffpqr  rC  rC  qD  DL  MN  MT  MT  LU  	V     88w8w8w118w  d3 !dQd!Q&ddd!Qdddddd3ddd3ddddddqdddqddd ddd!dddQddd*PQRQbQbPc(ddddddddr2   c                 h   d} t        | 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                  |      dz  }t        j                  d	|j                   d
|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }t        |      }d}||k\  }	|	s-t        j                  d|	fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }
t        j                  d|j                         dz   d|
iz  }t        t        j                  |            dx}x}x}	}y)uF   실제 디자인 작업 spec → design 분류 (true positive 보존).u   task-A: InsuRo 신규 광고 배너 디자인 제작.

    1080x1080 SNS 광고 이미지 5종.
    포스터 디자인 가이드라인 준수.
    배너 일러스트 색상 시안 검토.
    Fr   designr   r   r   r   u8   실제 디자인 작업은 design이어야 함. matched=r   r   r   r   Nblockr   r   r   r6   )zV%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.matched_keywords
})
} >= %(py8)sr8   r9   u#   디자인 키워드 검출 누락: r=   r>   r?   r@   s               r0   /test_real_design_task_spec_classified_as_designrJ   E   s>   I 	iU;A x x'  x                   (    C1CUCUBVV`abarar`ss{|}  }D  }D  |E  	F     88w8w8w118w!!c3!"cac"a'ccc"acccccc3ccc3ccccccqcccqccc!ccc"cccaccc+NqOaOaNb)ccccccccr2   c                    d} t        | 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                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|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                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                  }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                         dz   d
|iz  }t        t        j                  |            dx}x}}y)uC   정상 코딩 작업 spec → coding 분류 (정상 동작 보존).u   task-B: API endpoint 추가 + DB 마이그레이션.

    /api/users 엔드포인트에 POST/PUT 추가.
    Postgres 스키마 변경 (users 테이블 컬럼 추가).
    pytest 단위 테스트 5건.
    Fr   r
   r   r   r   r   r   r   Nr   r   )z8%(py2)s
{%(py2)s = %(py0)s.matched_keywords
} == %(py5)suB   정상 코딩 작업에 디자인 키워드 매칭되면 안 됨: r   )r   r   r   r   r   r   r    r!   r&   r'   r(   r#   r"   r)   s          r0   ,test_normal_coding_task_classified_as_codingrL   U   s   I 	iU;A'x'x''''x''''''1'''1''''''x'''''''88w8w8w118w~~#~~~~~~~~~1~~~1~~~~~~~~~'ijkj|j|i}%~~~~~~~~r2   c                l   | dz  }|j                  d|       t        dddd       t        dd	dd       |j                  } |       }|sd
dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}|j                  d      j                         j                  d      }t        |      }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}ddl}|j!                  |d         }|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}}|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}}|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}}d&D ]  }||v }|st        j                  d'|fd(||f      d)t        j                         v st        j                  |      rt        j                  |      nd)d*t        j                         v st        j                  |      rt        j                  |      nd*d+z  }t        j"                  d,|       d-z   d.|iz  }t        t        j                  |            d} y)/u.   audit jsonl이 정상 append 되는지 확인.zdispatch-routing-decision.jsonlz!utils.dispatch_routing.AUDIT_PATHu"   새 광고 배너 디자인 제작ztest-1ztest.mdTtask_id	task_filer	   u   API 엔드포인트 추가ztest-2zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}
fake_audit)r   r   py4Nutf-8encoding
r   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr8   lines)r   r:   r;   py6zassert %(py8)sr<   r      rO   z%(py1)s == %(py4)sr:   rR   assert %(py6)srX   r   rH   r(   rI   r
   r   )	tsrO   rP   r#   r$   r   r(   r%   raw_text_hash)in)z%(py0)s in %(py2)srequirede1)r   r   zaudit entry missing field: z
>assert %(py4)srR   )setattrr   existsr   r   r   r    r!   r&   r'   	read_textstripsplitr8   r   jsonloadsr"   )tmp_pathmonkeypatchrQ   r+   r-   @py_format5rW   rA   @py_assert5r,   @py_format7rD   rg   ra   e2@py_assert0r`   @py_format3s                     r0   test_audit_jsonl_appends_entryrq   c   s   ==J;ZH>\eswx6T]kop::  ' 288:@@FEu::?:33uu:	E!H	B	E!H	Bi=$H$=H$$$$=H$$$=$$$H$$$$$$$+8+8++++8++++++8+++++++h<"7"<7""""<7"""<"""7"""""""i=$H$=H$$$$=H$$$=$$$H$$$$$$$+8+8++++8++++++8+++++++h<"7"<7""""<7"""<"""7""""""" P H2~GGGx2GGGGGGxGGGxGGGGGG2GGG2GGGG!<XJGGGGGGGHr2   c                    d} t        | 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                  |      dz  }t        j                  d	|j                         d
z   d|iz  }t        t        j                  |            dx}x}}d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y)u;   imagery, imagine 같은 영어 합성어는 매칭 안 됨.zQtask-C: imagine a new feature with imagery rendering. designation system upgrade.Fr   r
   r   r   r   r   uM   imagery/imagine/designation은 단어 경계로 분리되어야 함. matched=r   r   Nimagenot in)z<%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.matched_keywords
})r:   r;   r   r   rH   )r   r   r   r   r   r   r    r!   r"   r#   r&   r'   )	r*   r   r+   r,   r-   r.   r/   ro   rA   s	            r0   $test_word_boundary_no_false_positiverv   z   s   cIiU;A x x'  x                   (    XXYXjXjWkl     ,!,,,7,,,,,7,,,,7,,,,,,!,,,!,,,,,,,,,,,-1---8-----8----8------1---1-----------r2   c                 Z   t         dz  dz  dz  } | j                         sddl}|j                  d       | j	                  d      }t        |d	t        |       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                  |      dz  }t        j                  d|j                   d|j                    d|j"                         dz   d|iz  }t%        t        j&                  |            dx}x}}|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                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}}y)uG   task-2472 spec 본문 시뮬레이션 — false positive 차단 검증.memorytaskstask-2472.mdr   N   task-2472.md 없음rS   rT   z	task-2472FrN   r
   r   r   r   r   uK   task-2472는 코드 hardening 작업이므로 coding이어야 함. matched=r   r   r   r   r   r   r   )	WORKSPACErc   pytestskiprd   r   strr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   )	task_2472_pathr}   r*   r   r+   r,   r-   r.   r/   s	            r0   0test_task_2472_spec_simulation_no_false_positiver      s   )G3nDN  ")*(('(:IiNH[inoA x x'  x                   (   %%&j1B1B0C8AGG9	V     88w8w8w118wr2   c                 f   d} t        | 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                  |      dz  }t        j                  d	|j                   d
|j                         dz   d|iz  }t        t        j                  |            dx}x}}g }d}|j                  }||v}|}	|s |j                  }
t        |
      }d}||k\  }|}	|	st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfdf      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  
      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                   |d      i z  }dd|iz  }t        t        j                  |            dx}	x}x}x}x}x}
x}x}}y)up   raw string 안에 이스케이프된 따옴표가 있어도 strip이 끊기지 않음 (마아트/Gemini 발견).u}   task-Q: regex 작업. raw string r"image quote \" middle quote \" end" 패턴 처리.
hardening regression test 컨텍스트.Fr   r
   r   r   r   r   u[   이스케이프된 따옴표가 있어도 raw string 전체가 strip되어야 함. matched=r   r   r   Nrs   rY   rt   )z<%(py3)s not in %(py7)s
{%(py7)s = %(py5)s.matched_keywords
})r;   r   r   z%(py9)spy9r6   )z\%(py16)s
{%(py16)s = %(py11)s(%(py14)s
{%(py14)s = %(py12)s.context_signals
})
} >= %(py19)sr8   )py11py12py14py16py19z%(py21)spy21zassert %(py24)spy24)r   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r$   r8   append_format_boolop)r*   r   r+   r,   r-   r.   r/   rA   rC   ro   @py_assert13@py_assert15@py_assert18@py_assert17@py_format10@py_format20@py_format22@py_format23@py_format25s                      r0   &test_escaped_quote_in_raw_string_stripr      s"   	2  	iU;A x x'  x                   (   %%&hqwwi	9     L7K!,,K7,,KA4E4EK4E0FK!K0F!0KKKKK7,KKK7KKKKKK!KKK!KKK,KKKKKKK0F!KKKKKKKKKKKKKKKAKKKAKKK4EKKK0FKKK!KKKKKKKKKKKKKKKr2   c                    d} t        | d      }|j                  }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d	x}}|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                  |      dz  }t        j                  d|j                   d|j                   d|j                         dz   d|iz  }	t        t        j                  |	            d	x}x}}y	)u   닫히지 않은 펜스 코드 블록도 분류기가 crash하지 않고 정확히 분류 (마아트/Gemini 발견).

    펜스가 닫히지 않아도 코드 블록 안의 디자인 키워드가 false positive를 만들지 않아야 함.
    u   task-R: hardening regression test.
```python
design_keywords = ['디자인']  # 닫히지 않은 펜스 (의도적 edge case)
이미지 광고 배너 키워드도 본문에 등장하나 코드 검증 컨텍스트임.
Fr   zPassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.score
}, %(py4)s)
}
isinstancer   int)r   r:   r;   rR   rX   Nr
   r   r   r   uI   닫히지 않은 펜스 안의 키워드는 coding이어야 함. matched=r   r   r   r   )r   r%   r   r   r   r   r   r    r!   r&   r'   r   r   r"   r#   r$   )
r*   r   rA   rl   rm   r+   r,   r-   r.   r/   s
             r0   'test_unclosed_code_fence_does_not_crashr      s   	g  	iU;Agg#:gs########:###:######a###a###g######s###s########## x x'  x                   (   %%&j1B1B0C8AGG9	V     r2   c                    ddl } ddl}ddl}t        }|dz  dz  dz  }|j	                         sddl}|j                  d       | j                  ddd	t        |      d
gt        |      dddi |j                  dt        |      i      }|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                   |      dz  }
t        j"                  d|j$                         dz   d|
iz  }t'        t        j(                  |            dx}x}	}|j+                  |j,                  j/                         j1                         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!}	||	k(  }|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}}	|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)&uT   CLI 통합: dispatch.py --task-file task-2472.md --dry-run → qc-gate 미트리거.r   Nrx   ry   rz   r{   python3dispatch.py--task-file	--dry-runT   
PYTHONPATHcwdcapture_outputtexttimeoutenvr   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr(   r      dry-run 실패: stderr=r   r   statusokrZ   r[   r\   rX   dry_runisz%(py1)s is %(py4)sr   r
   u"   task-2472는 coding이어야 함: z
>assert %(py6)sqc_gate_triggeredF)
subprocessrg   osr|   rc   r}   r~   runr   environ
returncoder   r   r   r   r    r!   r"   stderrr&   r'   rh   stdoutre   
splitlines)r   _jsonr   repo	task_2472r}   r(   r+   r,   r-   r.   r/   payloadro   rA   rk   rm   s                    r0   .test_dispatch_cli_dry_run_task_2472_no_qc_gater      s   ((Dx')N:I)*^^	M=#i.+NIdr3rzz3<T3  F
 LL!LLLLLLLLL6LLL6LLLLLLLLL%<V]]O#LLLLLLLLkk&----/::<R@AG8$$$$$$$$$$$$$$$$$$$9%%%%%%%%%%%%%%%%%%%#$``$0```$```$``````4VW^V_2````````&'050'50000'5000'00050000000r2   c                    ddl } ddl}ddl}ddl}t        }d}|j                  dddd      5 }|j                  |       |j                  }ddd       	 | j                  d	d
ddgt        |      dddi |j                  dt        |      i      }|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"                  |
      dz  }t        j$                  d|j&                         dz   d|iz  }t)        t        j*                  |            dx}	x}}
|j-                  |j.                  j1                         j3                         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}}|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l}|j5                  |       y# 1 sw Y   xY w# ddl}|j5                         w xY w)#uW   CLI 통합: 실제 디자인 spec dry-run → qc-gate 트리거 (true positive 보존).r   Nu   # task-design-test: InsuRo 광고 배너 디자인 제작

- 1080x1080 SNS 광고 이미지 5종
- 포스터 디자인 + 일러스트 색상 시안
- 배너 시안 검토
wz.mdFrS   )suffixdeleterU   r   r   r   r   Tr   r   r   r   r   r(   r   r   r   r   r   r   rH   rZ   r[   r\   rX   rI   r   r   r   )r   rg   r   tempfiler|   NamedTemporaryFilewritenamer   r   r   r   r   r   r   r   r    r!   r"   r   r&   r'   rh   r   re   r   unlink)r   r   r   r   r   specf	spec_pathr(   r+   r,   r-   r.   r/   r   ro   rA   rk   rm   _oss                       r0   ,test_dispatch_cli_dry_run_design_task_blocksr      ss   22D	# 	 
	$	$Suw	$	W [\	FF	}iMD	$T272::7|SY7   

   PAP A%PPP APPPPPPvPPPvPPP PPPAPPP)@'PPPPPPPP++fmm113>>@DE'(4H4(H4444(H444(444H4444444x +G+ G++++ G+++ +++G+++++++*+3t3+t3333+t333+333t3333333

9!  	

9s   MK"M MM1)!__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   syspathlibr   __file__resolveparentsr|   r   pathinsertutils.dispatch_routingr   r1   r4   rF   rJ   rL   rq   rv   r   r   r   r   r    r2   r0   <module>r      s   
 #   
  N""$,,Q/	y>!HHOOAs9~& 8e d H..L(1*r2   