
    *je&                    d   d Z ddlmZ ddlZddlmc mZ ddl	m
Z
 ddlZddlZddlmZ ddlmZ ddlmZ  e            Zd Zd	 Zd
 Zd Zej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Zd Zd Zd Z ddddZ!dS )z(CLI tests for the discovery review flow.    )annotationsN)Path)SourceCandidate)	CliRunner)clic                    t           j        } | j        }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        |          dz  }dd|iz  }t          t          j
        |                    d x} x}x}}t           j        } d}| |z  }|j        } |            }|sd	dt          j                    v st          j        t                     rt          j        t                     ndt          j        |           t          j        |          t          j        |          t          j        |          d
z  }t          t          j
        |                    d x} x}x}x}}d S )N
MentorCore==)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.REPO_ROOT
}.name
} == %(py7)sr   )py0py2py4py7zassert %(py9)spy9sourceszlassert %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = (%(py2)s
{%(py2)s = %(py0)s.REPO_ROOT
} / %(py4)s).is_dir
}()
})r   r   r   r   r   )r   	REPO_ROOTname
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationis_dir)@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10@py_assert8s          M/Users/jameslopez/projects/MentorCore/tests/compiler/test_cli_compile_flow.py)test_cli_repo_root_points_at_project_rootr%      s   =-=------------------------3-----3------=-------------------------------------M/I/MI%/%-/--///////////////C/////C//////M////I////-////////////////////////////////    c           	     
   d'd}|                      d|           |dz  }t                              t          j        dddt          |          d	g          }|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        |j                  dz   d|iz  }	t          t          j        |	                    d x}x}}t#          j        |                                          }
|
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
         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
         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
         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"}|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 S )(Nr   strc           	       K   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}}t          dd	d
ddddi          gS )NAda Lovelacer
   z%(py0)s == %(py3)sr   r   py3assert %(py5)spy5articlezWikipedia: Ada Lovelacez*https://en.wikipedia.org/wiki/Ada_Lovelace	wikipediazwikipedia-ada-lovelacewikipedia_title)source_typetitle
origin_url
fetch_type	source_idfetch_config)	r   r   r   r   r   r   r   r   r   )r   @py_assert2r   @py_format4@py_format6s        r$   fake_discoverz>test_compile_propose_writes_review_yaml.<locals>.fake_discover   s      %%t~%%%%%%%%%%t~%%%%%%%%%%%%t%%%%%t%%%%%%~%%%%%%%%%%%%%%%%%%%%%%%%%%/G&2/@  	
 		
r&   z"compiler.sources.discover.discoverada-lovelace.yamlcompiler*   	--sourcesz	--proposer   r
   z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)sresultr   r   r/   
>assert %(py7)sr   slugada-lovelacez%(py1)s == %(py4)spy1r   assert %(py6)spy6display_namevoice_policy	generatedr   approvedF)is)z%(py1)s is %(py4)sr6   r1   r2   z#mentor compile ada-lovelace --buildinz.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.output
}rH   r-   r/   assert %(py7)s)r   r(   )setattrrunnerinvoker   appr(   	exit_coder   r   r   r   r   r   _format_assertmsgoutputr   r   yaml	safe_load	read_text)monkeypatchtmp_pathr<   sources_pathrA   r   @py_assert4r   r;   r!   data@py_assert0r9   @py_format5@py_format7s                  r$   'test_compile_propose_writes_review_yamlrg      sm   
 
 
 
 <mLLL11L]]	NK\1B1BKP F
 /q/q /////////q////////////6/////6//////////q////////&-////////////////////////>,002233D<)>)<>))))))))))<>)))))<))))>)))))))))))))))))))))))))))1>1>1111111111>111111111>111111111111111111111111111.;.;..........;.........;...........................	?1j)2U2)U2222222222)U22222)2222U222222222222222222222222222	?1l+:{:+{::::::::::+{:::::+::::{:::::::::::::::::::::::::::	?1/0BNB0NBBBBBBBBBB0NBBBBB0BBBBNBBBBBBBBBBBBBBBBBBBBBBBBBBB0AFMA0MAAAAAAAAAA0MAAAAA0AAAAAAAAAAAFAAAAAFAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr&   c           	        i dd fd}|                      t          d	|           t          |          }t                              t          j        d
ddt          |          dg          }|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        |j                  dz   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         }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dt          j                    v st          j        t&                    rt          j        t&                    ndt          j        |          dz  }t!          t          j        |                    d }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 S )!Nr   rD   r(   sources_configdictfrom_stage_idxintc                *   K   | d<   |d<   |d<   d S )NrD   ri   rk    )rD   ri   rk   receiveds      r$   fake_compile_oncezHtest_compile_build_uses_only_approved_sources.<locals>.fake_compile_once:   s-      %3!"%3!"""r&   _compile_oncer>   rE   r?   --buildr
   r@   rA   rB   rC   r   rF   rG   rI   rJ   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceconfig)r   rH   r   r   c                    g | ]
}|d          S )idrn   ).0ss     r$   
<listcomp>zAtest_compile_build_uses_only_approved_sources.<locals>.<listcomp>L   s    ///AdG///r&   r   approved-book)r   )rD   r(   ri   rj   rk   rl   )rU   r   _write_sources_yamlrV   rW   rX   r(   rY   r   r   r   r   r   r   rZ   r[   r   r   rs   rj   )r_   r`   rp   ra   rA   r   rb   r   r;   r!   rd   r9   re   rf   rt   ro   s                  @r$   -test_compile_build_uses_only_approved_sourcesr|   7   s   "$H4 4 4 4 4 4 4
 _.?@@@&x00L]]	NK\1B1BIN F
 /q/q /////////q////////////6/////6//////////q////////&-////////////////////////F-~-~----------~---------~---------------------------$%**%**********%*****%*******************************&'Ffd###############:#####:#############f#####f#############d#####d########################//VI.///DO3DD/3DDDDDDDDDDD/3DDDDDD/DDDD3DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDr&   c           	        t          | d          }t                              t          j        dddt          |          dg          }|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}}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 S )NFrN   r>   rE   r?   rr      r
   r@   rA   rB   rT   r   zNo approved sources foundrP   rR   rS   )r{   rV   rW   r   rX   r(   rY   r   r   r   r   r   r   r   r   r[   )
r`   ra   rA   r   rb   r   r;   r!   rd   r9   s
             r$   ,test_compile_build_requires_approved_sourcesr   O   s   &x%@@@L]]	NK\1B1BIN F
  q q          q            6     6          q                           &7&-7&-7777777777&-77777&77777777777&77777&777777-77777777777777777777777777777r&   c                  K   g dfd}|                      t          d|           |                      t          dd            t          j        d	d
g id           d {V  d	g}|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}}d S )NrD   r(   ri   rj   c                @   K                        |            dddddS )Ng
ףp=
?g{Gz?r   Tgroundednessstyle_matchmisattributionpassedappendrD   ri   callss     r$   rp   zGtest_compile_loop_stops_when_thresholds_pass.<locals>.fake_compile_once_   s4      T 	
 
 	
r&   rq   _best_existing_evalc                    d S Nrn   rD   s    r$   <lambda>z>test_compile_loop_stops_when_thresholds_pass.<locals>.<lambda>i        r&   rE   r      budgetr
   r+   r   r,   r.   r/   rD   r(   ri   rj   )rU   r   _compile_loopr   r   r   r   r   r   r   r   )r_   rp   r9   r   r:   r;   r   s         @r$   ,test_compile_loop_stops_when_thresholds_passr   [   s^     E
 
 
 
 
 
 _.?@@@24E4EFFF

NYOA
F
F
FFFFFFFF#$$5$$$$$$$$$$$5$$$$$$$$$$$$$5$$$$$5$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r&   c                  K   g dfd}|                      t          d|           |                      t          dd            t          j        d	d
g id           d {V  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 S )NrD   r(   ri   rj   c                @   K                        |            dddddS )NgRQ?g=
ףp=?r   Fr   r   r   s     r$   rp   z=test_compile_loop_stops_on_plateau.<locals>.fake_compile_oncet   s4      T 	
 
 	
r&   rq   r   c                    ddddS )N      ?g?r   r   r   r   rn   r   s    r$   r   z4test_compile_loop_stops_on_plateau.<locals>.<lambda>       c#QRSS r&   rE   r      r   r   r
   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   )r   rH   r-   rJ   assert %(py8)spy8r   )rU   r   r   r   r   r   r   r   r   r   r   r   )r_   rp   r9   r    rb   rf   @py_format9r   s          @r$   "test_compile_loop_stops_on_plateaur   p   s     E
 
 
 
 
 
 _.?@@@SS   
NYOA
F
F
FFFFFFFFu:::?:33uu:r&   c                   K   g dfd}dd	}|                      t          d
|           |                      t          dd            |                      d|           t          j        ddg id           d {V  d         }dg i}||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         }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 S )NrD   r(   ri   rj   c                @   K                        |           dddddS )N333333?r   r   Fr   r   )rD   ri   seen_configss     r$   rp   zTtest_compile_loop_uses_improved_config_between_iterations.<locals>.fake_compile_once   s6      N+++	
 
 	
r&   eval_result	iterationrl   c               8   K   t          |           }||d<   |dgfS )Nimproved_atztest action)rj   )ri   r   r   updateds       r$   fake_improve_sources_configz^test_compile_loop_uses_improved_config_between_iterations.<locals>.fake_improve_sources_config   s,       ~&&!*''r&   rq   r   c                    d S r   rn   r   s    r$   r   zKtest_compile_loop_uses_improved_config_between_iterations.<locals>.<lambda>   r   r&   z.compiler.stages.improve.improve_sources_configrE   r      r   r   r
   rF   rG   rI   rJ   r   r   r   )ri   rj   r   rj   r   rl   )rU   r   r   r   r   r   r   r   )	r_   rp   r   rd   r   r9   re   rf   r   s	           @r$   9test_compile_loop_uses_improved_config_between_iterationsr      s      L
 
 
 
 
 
( ( ( ( _.?@@@24E4EFFF8#  
 
NYOA
F
F
FFFFFFFF?-y"o-?o----------?o-----?----o---------------------------?=).Q.)Q..........)Q.....)....Q.............................r&   c                  K   g dd}|                      t          d|           |                      t          dd            |                      t          d	fd
           t          j        t          d          5  t          j        ddg id           d {V  d d d            n# 1 swxY w Y   dg}|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}}d S )NrD   r(   ri   rj   c                   K   dddddS )Nffffff?r   r   Fr   rn   )rD   ri   s     r$   rp   zEtest_compile_loop_rolls_back_on_regression.<locals>.fake_compile_once   s!      	
 
 	
r&   rq   r   c                    ddddS )Ng?r   r   r   rn   r   s    r$   r   z<test_compile_loop_rolls_back_on_regression.<locals>.<lambda>   r   r&   _rollback_currentc                .                         |           S r   r   )rD   rolled_backs    r$   r   z<test_compile_loop_rolls_back_on_regression.<locals>.<lambda>   s    {?Q?QRV?W?W r&   	regressed)matchrE   r   r   r   r
   r+   r   r,   r.   r/   r   )rU   r   pytestraisesRuntimeErrorr   r   r   r   r   r   r   r   r   )r_   rp   r9   r   r:   r;   r   s         @r$   *test_compile_loop_rolls_back_on_regressionr      s     K
 
 
 
 _.?@@@SS  
 02W2W2W2WXXX	|;	7	7	7 K KBJJJJJJJJJJK K K K K K K K K K K K K K K ***;***********;*************;*****;**********************************s   = B))B-0B-c                   |dz  }|dz  dz  dz  dz  }|j                             d           |                    d                    d	d
g          dz              |                     dt          |                     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}}|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 S )NpersonasrE   currentevalzhistory.jsonlT)parents
z>{"groundedness": 0.4, "style_match": 0.8, "misattribution": 0}z>{"groundedness": 0.7, "style_match": 0.6, "misattribution": 0}MENTORCORE_PERSONAS_ROOT)is not)z%(py0)s is not %(py3)srA   r,   r.   r/   r   r   r
   rF   rG   rI   rJ   r   r   )parentmkdir
write_textjoinsetenvr(   r   r   r   r   r   r   r   r   r   r   )r_   r`   roothistoryrA   r9   r   r:   r;   rd   r   re   rf   s                r$   -test_best_existing_eval_reads_current_historyr      s   j D^#i/&8?JGN&&&		PP	
 	
 	   13t99===$^44F6666.!(S(!S((((((((((!S(((((!((((S(((((((((((((((((((((((((((- 'C' C'''''''''' C''''' ''''C'''''''''''''''''''''''''''''r&   c                *   | dz  }|                     t          j        dddddd dd                     t          j        | dd	d
d           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         }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         }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 S )Nzpersona.yamlr   rE   r*   g        )r   r   	last_eval)schema_versionrD   rK   fidelityz2026-06-11T00:00:00+00:00g=
ףp=?gQ?)	timestampr   r   r   r   r
   rF   rG   rI   rJ   r   r   )r   r\   dumpr   _write_eval_to_manifestr]   r^   r   r   r   r   r   )r`   manifest_pathrc   rd   r   r9   re   rf   s           r$   ,test_write_eval_to_manifest_updates_fidelityr      s   ~-M	"#& .-0SWXX	 	
 	
	 	 	 4 	
 	
   >-113344D
N+3t3+t3333333333+t33333+3333t333333333333333333333333333
M*2d2*d2222222222*d22222*2222d222222222222222222222222222
K(G,GG(,GGGGGGGGGGG(,GGGGGG(GGGG,GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGr&   c                   |                      dd           d }t          j        dddddd	d
dddddg|dz  |          }|d         }|j        }d}||k    }|st	          j        d|fd||f          t	          j        |          t	          j        |          t	          j        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}}|d         }|j        }d}||k    }|st	          j        d|fd||f          t	          j        |          t	          j        |          t	          j        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}}|d         }|j        }d}||k    }|st	          j        d|fd||f          t	          j        |          t	          j        |          t	          j        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}}d}|d         }
|
j	        } |            }||v }|st	          j        d|fd||f          t	          j        |          t	          j        |
          t	          j        |          t	          j        |          dz  }	dd|	iz  }t          t	          j        |                    d x}x}x}
x}}d
}|d         }
|
j	        } |            }||v }|st	          j        d|fd||f          t	          j        |          t	          j        |
          t	          j        |          t	          j        |          dz  }	dd|	iz  }t          t	          j        |                    d x}x}x}
x}}d}|d         }
|
j	        } |            }||v }|st	          j        d|fd||f          t	          j        |          t	          j        |
          t	          j        |          t	          j        |          dz  }	dd|	iz  }t          t	          j        |                    d x}x}x}
x}}d S )NFAKE_COMPILER1c                     t          d          )Nz5real acquisition should not run in fake compiler mode)r   )r   raw_dirs     r$   should_not_call_real_acquirezYtest_fake_compiler_acquire_all_writes_text_fixtures.<locals>.should_not_call_real_acquire   s    TUUUr&   zbook-src	gutenbergzBook Source)rv   r6   r4   zwiki-srcr1   zWiki Source)rv   r6   r2   zurl-srcurlz
URL Sourcerawz.txtr
   )z.%(py3)s
{%(py3)s = %(py1)s.suffix
} == %(py6)s)rH   r-   rJ   r   r   z.jsonz.htmlrP   )zH%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.read_text
}()
})rH   r   rJ   r   zassert %(py10)spy10)
r   r   _compiler_acquire_allsuffixr   r   r   r   r   r^   )r_   r`   r   resultsrd   r9   r    rb   rf   r   r   @py_assert7@py_format11s                r$   3test_fake_compiler_acquire_all_writes_text_fixturesr      s   ,,,V V V '[=QQ )#0 
 ELII	
 	5$ G :/%//%//////////%/////////%/////////////////////////////////:0%00%0000000000%000000000%0000000000000000000000000000000009/$//$//////////$/////////$/////////////////////////////////;GJ/;/9;99;;;=;;;;;;;;;;;=;;;;;;=;;;;/;;;;9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GJ/;/9;99;;;=;;;;;;;;;;;=;;;;;;=;;;;/;;;;9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;979-9-7977999<99999999999<999999<9999-9999799999999999999999999999999999999999999r&   Tr~   r`   r   rN   boolreturnc                   | dz  }|                     t          j        dddddddd	|d
dddddddd
gd                     |S )Nr=   rE   r*   rz   bookApprovedzpublic-domainr   zhttps://example.com/approved)rv   typer4   rightsr6   r   rN   zrejected-bookRejectedzfair-use-excerptzhttps://example.com/rejectedF)rD   rK   r   )r   r\   r   )r`   rN   paths      r$   r{   r{     s    ))DOO	& . . &!+"1&+=$,  . &!+"4&+=$)  	
 	
  8 Kr&   )r`   r   rN   r   r   r   )"__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   pathlibr   r   r\   compiler.sources.discoverr   typer.testingr   compilerr   rV   r%   rg   r|   r   markasyncior   r   r   r   r   r   r   r{   rn   r&   r$   <module>r      s   . . " " " " " "                       5 5 5 5 5 5 # # # # # #      	0 0 0
B B BBE E E0	8 	8 	8 % % %(   0  /  /  /F + + +2( ( (,H H H8: : :8 =A        r&   