
    vj                          d Z ddlZddlmc mZ ddlZej                  j                  dd       ddl
mZmZ d Zd Zd Zd Zd	 Zd
 Zd Zd Zy)uI  task-2709 회귀 테스트: allowed_resources cross-key paths normalization.

배경
----
task-2709는 ``allowed_resources``의 schema mismatch(task-2706 ``paths`` key ↔
task-2707/2708 ``expected_files`` key)를 양 layer cross-key normalization으로
고친다.

- ``dispatch._normalize_allowed_resources(ar)``: ``ar["paths"]``가 비어있거나
  없으면 ``expected_files`` ∪ ``allowed_existing_file_edits``의 순서보존 union으로
  ``paths``를 채운다. 기존 ``paths``가 채워져 있으면 그대로 유지.
- ``dispatch._parse_allowed_resources(task_desc)``: task md의 ```yaml``` 블록에서
  allowed_resources를 파싱하며, 위 정규화를 적용해 반환.

RS-1 ~ RS-5 회귀 케이스를 검증한다.

import 실패 시 skip하지 않고 그대로 에러나게 둔다(구현이 끝나면 통과해야 함).
    Nz/home/jay/workspace)_normalize_allowed_resources_parse_allowed_resourcesc                  (   t        ddgdgd      } | d   }ddg}||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}|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t	        t        j
                  |            dx}x}}y)uV   RS-1: paths가 채워져 있으면 expected_files로 덮어쓰지 않고 유지한다.za.pyzb.pyzc.pypathsexpected_filesr   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Nnot inz%(py1)s not in %(py4)sr   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s         G/home/jay/workspace/tests/test_allowed_resources_paths_normalization.py(test_rs1_backward_compat_paths_preservedr"      s    )6"vh?F '?.vv..?.....?....?...........((6((((6(((6((((((((((    c                  $   dddgi} t        |       }t        |        | |k(  }|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  }d	d
|iz  }t        t        j                  |            d}d}|| v}|st        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  }t        t        j                  |            dx}}y)uG   RS-1: 입력 dict는 원본 불변(side-effect 없음)이어야 한다.r   x.pyy.pyr	   )z%(py0)s == %(py2)soriginalsnapshot)py0py2zassert %(py4)sr   Nr   r   )z%(py1)s not in %(py3)s)r   py3assert %(py5)spy5)
dictr   r   r   @py_builtinslocals_should_repr_global_namer   r   r   )	r'   r(   @py_assert1@py_format3r   r   r   @py_format4@py_format6s	            r!   test_rs1_input_dict_not_mutatedr6   (   s     66"23HH~H *x8x88xx"7(""""7("""7""""""("""("""""""r#   c                  ,   t        ddgddgd      } | d   }g 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   RS-2: paths가 없으면 expected_files ∪ allowed_existing_file_edits union으로 채운다.

    순서보존 + 중복제거를 확인한다(x.py가 양쪽에 있으나 한 번만).
    r%   r&   z.pyr   allowed_existing_file_editsr   r%   r&   r8   r	   r   r   r   r   Nr   r   s         r!   test_rs2_forward_compat_unionr<   5   sw    
 *%v.,2F+;	
F '?666?66666?6666?66666666666r#   c                  l   d} t        |       }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}}|d	   }g 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   RS-2: _parse_allowed_resources도 union normalization을 적용한다.

    expected_files/allowed_existing_file_edits만 있는 yaml 블록을 파싱하면
    반환 dict의 paths가 union으로 채워져야 한다.
    z# task body

```yaml
allowed_resources:
  expected_files:
    - x.py
    - y.py
  allowed_existing_file_edits:
    - x.py
    - z.py
```
N)is not)z%(py0)s is not %(py3)sparsed)r)   r+   r,   r-   r   r;   r	   r   r   r   r   )	r   r   r   r/   r0   r1   r   r   r   )
	task_descr?   r   r2   r4   r5   r   r   r   r    s
             r!   &test_rs2_parse_allowed_resources_unionrA   C   s    
	  &i0F6666'?666?66666?6666?66666666666r#   c                  *   t        ddgdgd      } | d   }ddg}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d
x}x}}y
)uT   RS-3: paths 키가 아예 없는 dict도 union으로 채워진다(task-2708 재현).zdispatch/__init__.pyzscripts/task-scope-guard.shr9   r   r	   r   r   r   r   Nr   r   s         r!   %test_rs3_task2708_replay_no_paths_keyrC   ^   s    )57TU,B+C	
F '? % ?    ?               r#   c                     t        ddgi      } | j                  }d} ||      }| }|sddt        j                         v st	        j
                  |       rt	        j                  |       ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}x}x}}| d   }dg}||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   RS-4: union 대상이 없으면 paths가 추가되지 않거나 falsy로 유지된다.

    forbidden_paths는 그대로 보존되어야 한다.
    forbidden_pathsz	secret.pyr   zIassert not %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}r   )r)   r*   r   r   Nr	   r   r   r   r   )
r   getr/   r0   r   r1   r   r   r   r   )
r   r2   r   @py_assert5@py_assert7@py_format8r   r   r   r    s
             r!   #test_rs4_empty_union_no_paths_addedrJ   o   s    
 *+<{m*LMFzz"'"z'"""""""""""v"""v"""z"""'""""""""""#$55$5555$555$5555555555r#   c                  $   t        dgdgd      } | d   }dg}||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}|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d
x}x}}y
)uM   RS-5: paths가 비어있지 않으면(union 미적용) paths를 우선한다.zmain.pyzextra.pyr   r   r	   r   r   r   r   Nr   r   r   r   s         r!   $test_rs5_mixed_schema_paths_priorityrL   ~   s    )+*>F '?)yk)?k))))?k)))?)))k))))))),VG_,:_,,,,:_,,,:,,,_,,,,,,,r#   c                  $   t        g dgd      } | d   }dg}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}y	)
uB   RS-5: 빈 리스트 paths는 falsy이므로 union이 적용된다.ze.pyr   r   r	   r   r   r   r   Nr   r   s         r!   (test_rs5_empty_paths_list_triggers_unionrN      sh    )1F '?&vh&?h&&&&?h&&&?&&&h&&&&&&&r#   )__doc__builtinsr/   _pytest.assertion.rewrite	assertionrewriter   syspathinsertdispatchr   r   r"   r6   r<   rA   rC   rJ   rL   rN    r#   r!   <module>rY      sQ   &  
 ( ) K)#776"	6-'r#   