
    h              !          S SK r S SKrS SKrS SKJr  S SKJrJrJrJ	r	J
r
JrJrJr  S SKrS SKr S SKJrJrJrJr  S SKJr  S SKJrJr  S SKJrJrJ r   S S	K!J"r"J#r#  S
r$Sr% " S S\5      r& " S S\5      r' " S S\5      r(SSSS.r)SSSS.r*SSSS.r+SSSS.r,S r-S r.S r/S r0S r1S r2S r3S r4S r5S r6S  r7S! r8S" r9S# r:S$ r;S% r<S& r=S' r>S( r?S) r@S* rAS+ rBS, rCS- rDS. rES/ rFS0 rGS1 rHS2 rIS3 rJS4 rKS5 rLS6 rMS7 rNS8 rOS9 rPS: rQS; rRS< rSS= rTS> rU\R                  R                  S?S@SA/5      SB 5       rX\R                  R                  SCSDSE/5      SF 5       rYSG rZSH r[\R                  R                  SI/ SJQ5      SK 5       r\SL r]SM r^SN r_\R                  R                  \R                  " 5       SO:H  SPSQ9SR 5       rbSS rcST rdSU re\R                  R                  SVSWSX/5      SY 5       rfSZ rg\R                  R                  SVSWSX/5      S[ 5       rhS\ riS] rj\R                  R                  SVSWSX/5      S^ 5       rkS_ rlS` rmSa rnSb roSc rp\R                  R                  Sd/ Se/ SfQ4/ SgQSh/ SgQ4Si/Sj/ SkQ4/5      Sl 5       rqSm rrSn rsSo rtSp ruSq rvSr rwSs rx\R                  R                  StSuSv\y/SwSv\z/SxSv\z//5      Sy 5       r{\R                  R                  St/ SzQ/ S{Q/ S|Q/ S}Q/ S~Q/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ\R                  " SSS\R                  R                  S9/ SQ/ SQ/ SQ\R                  " SSS\R                  R                  S9/ SQ/ SQ/ SQ\R                  " SSS\R                  R                  S9/ SQ/ SQ/ SQ\R                  " SSS\R                  R                  S9/5      S 5       r~S rS rg! \ a    S SKJrJrJrJr  S SKJr   GNf = f)    N)GeneratorType)AnyCallableDictIterableListOptionalTupleUnion)	BaseModelPositiveIntStrictFloatconstr)
StrictBool)r   r   r   r   )ConfigConfigValidationError)Catmake_tempdirmy_registry)	Generatorpartiala  
[optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
use_averages = true

[optimizer.learn_rate]
@schedules = "warmup_linear.v1"
initial_rate = 0.1
warmup_steps = 10000
total_steps = 100000

[pipeline]

[pipeline.classifier]
name = "classifier"
factory = "classifier"

[pipeline.classifier.model]
@layers = "ClassifierModel.v1"
hidden_depth = 1
hidden_width = 64
token_vector_width = 128

[pipeline.classifier.model.embedding]
@layers = "Embedding.v1"
width = ${pipeline.classifier.model:token_vector_width}

z
[optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
use_averages = true

[optimizer.learn_rate]
@schedules = "warmup_linear.v1"
initial_rate = 0.1
warmup_steps = 10000
total_steps = 100000
c                   >    \ rS rSr% \\S'   \\S'    " S S5      rSrg)HelloIntsSchemaC   helloworldc                       \ rS rSrSrSrg)HelloIntsSchema.ConfigG   forbid N__name__
__module____qualname____firstlineno__extra__static_attributes__r!       V/home/james-whalen/.local/lib/python3.13/site-packages/confection/tests/test_config.pyr   r   G       r)   r   r!   N)r#   r$   r%   r&   int__annotations__r   r(   r!   r)   r*   r   r   C   s    JJ r)   r   c                   B    \ rS rSr% \\S'   Sr\\S'    " S S5      rSr	g)	DefaultsSchemaK   requireddefault valueoptionalc                       \ rS rSrSrSrg)DefaultsSchema.ConfigO   r    r!   Nr"   r!   r)   r*   r   r5   O   r+   r)   r   r!   N)
r#   r$   r%   r&   r,   r-   r3   strr   r(   r!   r)   r*   r/   r/   K   s    M#Hc# r)   r/   c                   N    \ rS rSr% \\S'   Sr\\S'   \\S'   \	" SS9r
\	\S'   S	rg
)ComplexSchemaS   	outer_reqr2   	outer_opt
level2_req   )r1   
level2_optr!   N)r#   r$   r%   r&   r,   r-   r<   r7   r   r/   r?   r(   r!   r)   r*   r9   r9   S   s&    N$Is$!/!;J;r)   r9   	catsie.v1FT@catsevilcutec                  f    SSS.n [         R                  " U [        5      u  pnX:X  d   eX0:X  d   eg )Nr>      r   r   )r   _fillr   )simple_configf_vs       r*   test_validate_simple_configrM   a   s:    !,M?GA!r)   c                     SSS.n [         R                  " [        5       n[        R                  " U [
        5        S S S 5        WR                  n[        UR                  5      S:X  d   eSUR                  ;   d   eg ! , (       d  f       NH= f)Nr>   hi!rG   type_error.integer)
pytestraisesr   r   rH   r   valuelenerrorserror_types)invalid_configexc_infoerrors      r*   test_invalidate_simple_configrZ   h   sm     51N	,	-./: 
.NNEu||!!!5#4#4444	 
.	-s   A>>
Bc                      SSSS.n [         R                  " [        5         [        R                  " U [
        5        S S S 5        g ! , (       d  f       g = f)Nr>   rF      )r   r   r'   )rQ   rR   r   r   rH   r   )rW   s    r*   test_invalidate_extra_argsr]   q   s7     1q9N	,	-./: 
.	-	-s   A
Ac                     SS0n [         R                  " U [        5      u  pnUS   S:X  d   eUS   S:X  d   eSS0n[        R                  " [
        5         [         R                  " U[        5        S S S 5        g ! , (       d  f       g = f)Nr1   r>   r3   r2   z
some value)r   rH   r/   rQ   rR   r   )valid_configfilledrK   rL   rW   s        r*    test_fill_defaults_simple_configra   w   sz    ?L$$\>BLFq*"""*000 ,/N	,	-..9 
.	-	-s   A<<
B
c                      SSSS.S.n [         R                  " U [        5      u  pnUS   S:X  d   eUS   S:X  d   eUS	   S
   S:X  d   eUS	   S   S:X  d   eUS   S   S:X  d   eUS   S   S:X  d   eg )Nr>         rG   )r;   r=   r;   r<   r2   r=   r   r   r?   r1   r3   )r   rH   r9   )r_   r`   rK   
validations       r*   test_fill_recursive_configrf      s    !"A2JKL'--lMJFz+!###+/111,(A---,(A---,
+q000,
+>>>r)   c                     [         R                  " [        5      (       d   e[         R                  " SS05      (       a   e[         R                  " S5      (       a   eSSSS.n [         R                  " U 5      (       d   eg )Nr   r   r>   
complex.v1      ?r@   @complexraterB   )r   
is_promisegood_catsie)invalids    r*   test_is_promiserp      so    !!+....%%w&89999%%a(((('{KG!!'****r)   c                  D    [         R                  " [        5      S:X  d   eg )N)catsr@   )r   get_constructorrn   r!   r)   r*   test_get_constructorrt      s    &&{37LLLLr)   c                  b    [         R                  " [        5      u  pU / :X  d   eUSSS.:X  d   eg )NT)rC   rD   )r   
parse_args
bad_catsie)argskwargss     r*   test_parse_argsrz      s3    ))*5LD2::dD1111r)   c                      [         R                  " [        5      n SU R                  ;   d   eSU R                  ;   d   eg )NrC   rD   )r   make_promise_schemarn   
__fields__schemas    r*   test_make_promise_schemar      s:    ,,[9FV&&&&&V&&&&&r)   c                  v    S[         S.n [        R                  " U [        5      u  pnX:X  d   eUSSS.:X  d   eg )Nr>   r1   r3   meow)rn   r   rH   r/   configr`   rK   	validateds       r*   test_validate_promiser      sB    5F&,,V^DFyQF;;;;r)   c                  j    SSSS.S.n [         R                  " U [        5      u  pnUS   S   SL d   eg )	Nr>   r@   FrB   rC   r   r3   rD   T)r   rH   r/   r   s       r*   test_fill_validate_promiser      s@    ;)NOF&,,V^DFy*f%---r)   c                  `   SSSS.S.n [         R                  " [        5         [        R                  " U [
        5        S S S 5        SU S   S'   [         R                  " [        5         [        R                  " U [        5        S S S 5        g ! , (       d  f       NU= f! , (       d  f       g = f)	Nr>   r@   Fr   r   Tr3   whiskers)rQ   rR   r   r   rH   r   r/   )r   s    r*   test_fill_invalidate_promiser      sy    ;)NOF	,	-&/2 
.%)F:z"	,	-&.1 
.	- 
.	- 
.	-s   B)B
B
B-c                  ~   [         R                  " [        R                  SSS9[        l        [        [        S5      (       d   e[        [        R                  R                  5       5      S:X  d   e[        R                  R                  SS S9  [        [        R                  R                  5       5      S:X  d   eg )	NdogsFentry_pointsr   zgood_boy.v1c                     U $ Nr!   )xs    r*   <lambda>&test_create_registry.<locals>.<lambda>   s    Ar)   )funcr>   )		cataloguecreater   	namespacer   hasattrrT   get_allregisterr!   r)   r*   test_create_registryr      s     ''vEK ;''''{'')*a///m+>{'')*a///r)   c                  z   [         R                  " [        5         [        R                  " SS5        S S S 5        [        R
                  R                  S5      " S 5        [         R                  " [        5         [        R                  " SS5        S S S 5        g ! , (       d  f       Nn= f! , (       d  f       g = f)N	dfkoofkdsr@   zcatsie.v123rr   )rQ   rR   
ValueErrorr   getrr   r   r!   r)   r*   test_registry_methodsr      sn    	z	"[1 
#m,T2	z	". 
#	" 
#	" 
#	"s   B:B,
B),
B:c                  $   SSSSS.0S.n [         R                  " SU 05      S   nUS   S:X  d   eUS	   SS
0:X  d   e[        R                  " [        5         S	SSSS.00n [         R                  " U 5        S S S 5        g ! , (       d  f       g = f)Nr>   threer@   Tr   onetwocfgr   r   scratch!truer   resolverQ   rR   r   r   results     r*   test_resolve_no_schemar      s    ;)MNOF  %1%8F%=A%=Wj1111	,	-'[&#IJKF# 
.	-	-s    B
Bc                    ^^  " S S[         5      m " U4S jS[         5      m " U4S jS[         5      n SSS	S
S.0S.n[        R                  " SU0U S9  SSS	S
S.0S.n[        R                  " [
        5         [        R                  " SU0U S9  S S S 5        SSS	S
S.0S.n[        R                  " [
        5         [        R                  " SU0U S9  S S S 5        g ! , (       d  f       NS= f! , (       d  f       g = f)Nc                        \ rS rSr% \\S'   Srg).test_resolve_schema.<locals>.TestBaseSubSchema   r   r!   N)r#   r$   r%   r&   r7   r-   r(   r!   r)   r*   TestBaseSubSchemar      s    
r)   r   c                   B   > \ rS rSr% \\S'    Y \S'    " S S5      rSrg)+test_resolve_schema.<locals>.TestBaseSchema   r   r   c                       \ rS rSrSrSrg)2test_resolve_schema.<locals>.TestBaseSchema.Config   r    r!   Nr"   r!   r)   r*   r   r          Er)   r   r!   N)r#   r$   r%   r&   r   r-   r   r(   )r   s   r*   TestBaseSchemar      s    	 	r)   r   c                   $   > \ rS rSr%  Y \S'   Srg)'test_resolve_schema.<locals>.TestSchema   r   r!   Nr#   r$   r%   r&   r-   r(   r   s   r*   
TestSchemar      	    r)   r   r>   r   r@   Tr   r   r   r~   four)r   r   r   rQ   rR   r   )r   r   r   r   s     @@r*   test_resolve_schemar      s    I  Y  ;)MNOF
;K*N OPF	,	-UFOJ? 
. +t(LMNF	,	-UFOJ? 
.	-	 
.	- 
.	-s   ;C ?C1 
C.1
C?c                     ^  " S S[         5      m " U4S jS[         5      n SSSS.n[        R                  " S	U0U S
9n[        R                  " S	U0U S
9nUS	   SSSS.:X  d   eUS	   U:X  d   eg )Nc                   4    \ rS rSr% \\S'   \\S'   \\S'   Srg)3test_resolve_schema_coerced.<locals>.TestBaseSchema   test1test2test3r!   N)	r#   r$   r%   r&   r7   r-   boolfloatr(   r!   r)   r*   r   r      s    
r)   r   c                   $   > \ rS rSr%  Y \S'   Srg)/test_resolve_schema_coerced.<locals>.TestSchema   r   r!   Nr   r   s   r*   r   r      r   r)   r   {   r>      )r   r   r   r   r~   123Tg      @)r   r   fillr   )r   r   r`   r   r   s       @r*   test_resolve_schema_coercedr      s     
Y  Q3FufojAF  %DF%=edSIIII%=F"""r)   c                      [         R                  S5      n [        5       R                  U 5      nUS   S   S:X  d   eUS   S   S   S:X  d   eUS   S	   S
   S	:X  d   eUS   S	   S   S   S   S:X  d   eg )Nutf8	optimizerbeta1?
learn_rateinitial_rate皙?pipeline
classifierfactorymodel	embeddingwidth   )EXAMPLE_CONFIGencoder   
from_bytes)byte_stringr   s     r*   test_read_configr     s     ''/K
(

k
*C{G$+++{L).9S@@@z?<(3|CCCz?<(1+>wG3NNNr)   c                      [        5       R                  [        5      n [        R                  " U SS9S   nUR
                  S:X  d   eg )NTvalidater   r   )r   from_strOPTIMIZER_CFGr   r   r   )r   r   s     r*   test_optimizer_configr     s=    
(

M
*C##C$7DI??c!!!r)   c                  Z   [        5       R                  [        5      n U R                  5       R	                  5       [        R	                  5       :X  d   e[        SSS005      R                  [        5      n U R                  5       R	                  5       [        R	                  5       :X  d   eg )Nr   foobar)r   r   r   to_strstripr   s    r*   test_config_to_strr     s~    
(

M
*C::<=#6#6#8888
+u~.
/
8
8
GC::<=#6#6#8888r)   c                      [        SSSS0005      n U R                  5       R                  5       SR                  5       :X  d   eg )Nr   r   r   r>   z*
[optimizer]

[optimizer.foo]
bar = 1
    )r   r   r   r   s    r*   .test_config_to_str_creates_intermediate_blocksr     sI    
+qz23
4C


 			r)   c                      Sn SSSS.0n[        5       R                  U 5      nX!:X  d   e[        U5      nX!:X  d   eUR                  5       nSU;   d   e[        5       R                  U5      nX!:X  d   eg )NzK
        [section]
        node1 = "^a$$"
        node2 = "$$b$$c"
        sectionz^a$z$b$c)node1node2z^a$$r   r   r   )section_strsection_dictr   cfg_strnew_cfgs        r*   test_config_to_str_escapesr  %  s    K
 @AL (

K
(C 
C jjlGWh(Gr)   c                      [        5       R                  [        5      n U R                  5       n[        5       R	                  U5      nUR                  5       R                  5       [        R                  5       :X  d   eg r   )r   r   r   to_bytesr   r   r   )r   	cfg_bytesr  s      r*   test_config_roundtrip_bytesr	  <  sX    
(

M
*CIh!!),G>>!!#}':':'<<<<r)   c                  P   [        5       R                  [        5      n [        5        nUS-  nU R	                  U5        [        5       R                  U5      nS S S 5        WR                  5       R                  5       [        R                  5       :X  d   eg ! , (       d  f       NE= fNz
config.cfg)r   r   r   r   to_disk	from_diskr   r   )r   pathcfg_pathr  s       r*   test_config_roundtrip_diskr  C  sy    
(

M
*C	4,&H($$X. 
 >>!!#}':':'<<<<	 
s   0B
B%c                    [        5       R                  [        5      nU S-  nUR                  U5        [        5       R	                  U5      nUR                  5       R                  5       [        R                  5       :X  d   eg r  )r   r   r   r  r  r   r   )pathy_fixturer   r  r  s       r*   3test_config_roundtrip_disk_respects_path_subclassesr  L  sc    
(

M
*C|+HKKh  *G>>!!#}':':'<<<<r)   c                  L   SSSS.S.n [         R                  " [        5         [        U 5      R	                  5         SSS5        Sn[         R                  " [        5         [        5       R                  U5        SSS5        g! , (       d  f       NM= f! , (       d  f       g= f)zTest that an error is raised if a config contains top-level keys without
a section that would otherwise be interpreted as [DEFAULT] (which causes
the values to be included in *all* other sections).
r>   r@   r   r   r   Nz[DEFAULT]
one = 1)rQ   rR   r   r   r   r   )r   
config_strs     r*   #test_config_to_str_invalid_defaultsr  T  sq    
 k7C
DC	,	-s 
.%J	,	-*% 
.	- 
.	- 
.	-s   B!B
B
B#c            
      8     SS[         S[        S[        SS94S jjn [        R                  " [
        R                  SSS	9[
        l        [
        R                  " S
5      " U 5        S
SSSS.n[
        R                  " SU05        S
SSSS.n[        R                  " [        5         [
        R                  " SU05        S S S 5        S
SSSS.n[        R                  " [        5         [
        R                  " SU05        S S S 5        S
SSSS.n[        R                  " [        5         [
        R                  " U5        S S S 5        [        R                  " [        5         [
        R                  " U5        S S S 5        S
SSS.n[        R                  " [        5         [
        R                  " SU05        S S S 5        g ! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)Nrl   steps	log_levelz(DEBUG|INFO|WARNING|ERROR))regexc                     g r   r!   )rl   r  r  s      r*   complex_args2test_validation_custom_types.<locals>.complex_argsb  s    
 r)   complexFr   rh   ri      INFO)rk   rl   r  r  r   r   noner@   rj   )
   ERROR)r   r   r   r   r   r   r   r  r   rQ   rR   r   r   )r  r   s     r*   test_validation_custom_typesr$  a  s     @G  <= $**yuK %l3#S2F
SC3(#S2F
SC	,	-XsO, 
. $S2F
SC	,	-XsO, 
. $S2F
SC	,	-C  
. 
,	- 
. $S;
GC	,	-XsO, 
.	- 
.	- 
.	- 
.	- 
.	- 
.	-s<   (G*G,G)%G:$H
G
G&)
G7:
H
Hc                      SSSSS.0S.n [         R                  " SU 0SS	9n[         R                  " SU 0SS	9nUS   S
   S:X  d   eUS   S   SS0:X  d   eUS   S   S   S   S:X  d   eUS   S   S   S   SL d   eg )Nr>   r   r@   falser   r   r   Fr   r   r   r   rC   rD   T)r   r   r   )r   r   r`   s      r*   test_validation_no_validater'    s    ;)PQRF  %5AFufo>F%=1$$$%=GZ#8888%=(0G;;;%=(0D888r)   c                     SSSSS.S.0n [         R                  " U SS9n[        US   S	   5      S
:X  d   e[        R                  " [
        5         [         R                  " U 5        S S S 5        SSSSS.S.0n [         R                  " U 5      n[        US   S	   5      S:X  d   eUS   S	   S   SL d   eUS   S	   S   SL d   eUS   S	   S   S:X  d   eg ! , (       d  f       Nw= f)Nr   r>   r@   r   r   r   Fr   r   r\   z	catsie.v2rc   rC   rD   T
cute_level)r   r   rT   rQ   rR   r   r   s     r*   test_validation_fill_defaultsr*    s   Qg'NOPFfu5Fve}U#$)))	,	-  
. Qe'LMNFf%Fve}U#$)))%='5000%='4///%=-222 
.	-s   C
C'c                      [         R                  " S5      SS.S[        [           S[        4S jj5       n SS/nS	SS
US.0n[         R                  " U5      S	   S:X  d   eg )Nzcatsie.v567r   r   rx   r   c                 H    US   S:X  d   eUS   S:X  d   eU S:X  d   eUS   $ )Nr   ^_^r>   ^(*.*)^bazr!   r   rx   s     r*   
catsie_5674test_make_config_positional_args.<locals>.catsie_567  s;    Aw%Aw)###e||Awr)   r.  r/  r   r0  )rB   r   *)r   rr   r	   r7   r   )r2  rx   r   s      r*    test_make_config_positional_argsr5    so    m$49 (3- c  % 9D}UF
GCs#H-666r)   c                  (   [         R                  " S5      SS.S[        S[        4S jj5       n [         R                  " S5      S[        4S	 j5       nS
SSSS00S.0n[         R                  " USS9nUS
   S   S:X  d   eUS
   S   SSS00:X  d   eg )Nzcatsie.v568r   r,  rx   r   c                 2    US   S:X  d   eU S:X  d   eUS   $ )Nr   r/  r0  r!   r1  s     r*   
catsie_568>test_fill_config_positional_args_w_promise.<locals>.catsie_568  s)    Aw)###e||Awr)   zcat_promise.v568returnc                      g)Nr/  r!   r!   r)   r*   cat_promise?test_fill_config_positional_args_w_promise.<locals>.cat_promise  s    r)   r   promiserB   rB   r4  Tr   r4  )r   rr   r7   r   )r8  r<  r   r`   s       r*   *test_fill_config_positional_args_w_promiser@    s    m$*/ # C  %
 ()  * 	"g'9:;
C cD1F(E"e+++(C Y:L0M$NNNNr)   c                  j   [         R                  " S5      S[        [        [        [
        4      4S j5       n SS/ SQS.0n[         R                  " U5      S   S:X  d   eSSSS/S.0n[        R                  " [        5         [         R                  " U5        S S S 5        g ! , (       d  f       g = f)	Nzcatsie.v890rx   c                  "    U S   S:X  d   eU S   $ )Nr   r   r!   )rx   s    r*   
catsie_890<test_make_config_positional_args_complex.<locals>.catsie_890  s    Aw#~~Awr)   r   )r   Tr>   Fr?  r   True)
r   rr   r	   r   r   r   r   rQ   rR   r   )rC  r   s     r*   (test_make_config_positional_args_complexrF    s    m$(5[)@#AB  % }3HI
JCs#H-444}C=A
BC	,	-C  
.	-	-s   B$$
B2c                  @   Sn [        5       R                  U 5      R                  5       U :X  d   eSn [        5       R                  U 5      R                  5       U :X  d   e[        R                  " S5      SS.S j5       nSn [        R
                  " [        5       R                  U 5      5      R                  5       nUS:X  d   e[        R                  " [        5       R                  U 5      5      nUS	S
0:X  d   eSn [        R
                  " [        5       R                  U 5      5      R                  5       nUS:X  d   e[        R                  " [        5       R                  U 5      5      nUS	SS040:X  d   e[        R                  " S5      SS[        4S jj5       nSn [        R
                  " [        5       R                  U 5      5      R                  5       nSnX%:X  d   eSn [        R                  " [        5       R                  U 5      5      nUS	S0:X  d   eg )Nz[a]
b = 1
* = ["foo","bar"]z1[a]
b = 1

[a.*.bar]
test = 2

[a.*.foo]
test = 1zcatsie.v666F)r   c                     U$ r   r!   )r   rx   s     r*   
catsie_6667test_positional_args_to_from_string.<locals>.catsie_666      r)   z+[a]
@cats = "catsie.v666"
* = ["foo","bar"]z8[a]
@cats = "catsie.v666"
* = ["foo","bar"]
meow = falsea)r   r   z*[a]
@cats = "catsie.v666"

[a.*.foo]
x = 1z7[a]
@cats = "catsie.v666"
meow = false

[a.*.foo]
x = 1r   r>   zcatsie.v777yc                     SU -  $ )Nr   r!   )rM  s    r*   
catsie_7777test_positional_args_to_from_string.<locals>.catsie_777  s    zr)   z:[a]
@cats = "catsie.v666"

[a.*.foo]
@cats = "catsie.v777"zM[a]
@cats = "catsie.v666"
meow = false

[a.*.foo]
@cats = "catsie.v777"
y = 1z@[a]
@cats = "catsie.v666"

[a.*.foo]
@cats = "catsie.v777"
y = 3)meowmeowmeowr>   )r   r   r   r   rr   r   r   r,   )r   rI  r`   resolvedrO  expectedr   s          r*   #test_positional_args_to_from_stringrU    s   
-C8S!((*c111
HC8S!((*c111m$$  % >Cfh//45<<>FVVVV""68#4#4S#9:H^,,,,
>Cfh//45<<>FWWWW""68#4#4S#9:HsAh[))))m$c  % PCfh//45<<>FhH
UC  !2!23!78Fc,----r)   c                      [         R                  " S5      S[        SS 4S j5       n [         R                  " S5      SS[        S[        [           4S jj5       nSSS	S
.0n[         R
                  " U5        g )Nztest_optimizer.v1rl   r:  c                     g r   r!   rl   s    r*   test_optimizer_v1>test_validation_generators_iterable.<locals>.test_optimizer_v1      r)   ztest_schedule.v1
some_valuec              3      #     U v   M  7fr   r!   )r\  s    r*   test_schedule_v1=test_validation_generators_iterable.<locals>.test_schedule_v1  s         
r   r   @optimizersrl   )ri   )r   
optimizersr   	schedulesr   r   )rY  r^  r   s      r*   #test_validation_generators_iterablere    s    /0 $  1 -.U Xe_  / +>LMFr)   c                      [         R                  " S5      S
S[        SS4S jj5       n SSSSS	.0n[         R                  " U5        g)zFTest that unset type hints are handled correctly (and treated as Any).test_optimizer.v2r  r:  Nc                     g r   r!   )rl   r  s     r*   test_optimizer_v2;test_validation_unset_type_hints.<locals>.test_optimizer_v2  r[  r)   testr   r  )rb  rl   r  r"  )r   rc  r,   r   )ri  r   s     r*    test_validation_unset_type_hintsrm    sS     /0s D  1 &93QSTUFr)   c                     [         R                  " S5      S	S j5       n [         R                  " S5      S	S j5       nSSS00n[        R                  " [        5         [         R
                  " U5        S S S 5        SSSS.0n[        R                  " [        5         [         R
                  " U5        S S S 5        g ! , (       d  f       NO= f! , (       d  f       g = f)
Nzbad.v1c                      [        S5      e)Nz This is an error in the function)r   r!   r)   r*   bad)test_validation_bad_function.<locals>.bad  s    ;<<r)   zgood.v1c                      g r   r!   r!   r)   r*   good*test_validation_bad_function.<locals>.good  r[  r)   rk  rb  r>   )rb  invalid_arg)r:  N)r   rc  rQ   rR   r   r   r   )rp  rs  r   s      r*   test_validation_bad_functionrv  
  s    H% & I& ' }h/0F	z	"F# 
# iBCF	,	-F# 
.	-	 
#	" 
.	-s   B=C=
C
Cc                      SSSSSSS.S.0n [         R                  " U 5      S   nUR                  S:X  d   eUR                  S/S-  :X  d   eg )	Nr   zmy_cool_optimizer.v1g?zmy_cool_repetitive_schedule.v1gMbP?rc   )
@schedules	base_raterepeat)rb  r   r   )r   r   r   r   )r   r   s     r*   test_objects_from_configr{    sh    1>"

F ##F+K8I??c!!!E7Q;...r)   c                  
  ^^ [         R                  " S5      mSSS.S[        [        S4   S[        S[        S	[
        [           4U4S
 jjjm[        R                  " S5      SSS.S[        S[        S	[        [
        [           /[
        [           4   4U4S jjj5       n SnSUSS.0n[        R                  " U5      S   n[        US5      (       d   e[        [        R                  " U5      R                  5      S:X  d   e[        R                  " U5      R                  S   R                  S:X  d   eTR!                  U" S5      5      R"                  S:X  d   eSUS/S.0n[         R$                  " [&        5         [        R                  " U5        SSS5        SUSSS.0n[         R$                  " [&        5         [        R                  " U5        SSS5        g! , (       d  f       NP= f! , (       d  f       g= f)zcTest that functions registered with partial applications are handled
correctly (e.g. initializers).numpygr   lohishape.r  r  r:  c                X   > TR                   R                  XU 5      R                  5       $ r   )randomuniformtolist)r  r  r  r}  s      r*   uniform_init/test_partials_from_config.<locals>.uniform_init5  s%     ||##BE299;;r)   zuniform_init.v1c                    > [        TXS9$ )Nr~  r   )r  r  r  s     r*   configure_uniform_init9test_partials_from_config.<locals>.configure_uniform_init:  s     |22r)   rk  gɿ)@initializersr  __call__r\   )rF   r\   g      ?Nr"  )r  r  other)rQ   importorskipr
   r,   r   r   r   initializersr   r   r   rT   inspect	signature
parametersdefaultasarrayr  rR   r   )r  namer   r   bad_cfgr}  r  s        @@r*   test_partials_from_configr  0  s    (E 04<S#X<',<9><	e< <
 /033!&3	4;-e,	-3 13
 DT6
7Cs#F+D4$$$$w  &112a777T"--d3;;tCCC==f&,,666cU;<G	,	-G$ 
.TBGHG	,	-G$ 
.	- 
.	- 
.	-s   G#G4#
G14
Hc            
        ^ SS[         S[         S[         4S jjm[        R                  " S5      SS[         S[        [         /[         4   4U4S jjj5       n [        R                  " S5      SS	[        [         /[         4   S
[         S[        [         /[         4   4S jj5       nSSSSS.S.n[        R
                  " SU05      S   nU" S5      S:X  d   eU" S5      S:X  d   eg)zTest that partial functions are passed correctly to other registered
functions that consume them (e.g. initializers -> layers).r>   rL  br:  c                 
    X-  $ r   r!   rL  r  s     r*   test_initializer:test_partials_from_config_nested.<locals>.test_initializerW  s	    ur)   ztest_initializer.v1c                    > [        TU S9$ )N)r  r  )r  r  s    r*   configure_test_initializerDtest_partials_from_config_nested.<locals>.configure_test_initializerZ  s    '1--r)   ztest_layer.v1initcc                    ^ ^ UU 4S j$ )Nc                    > U T" T5      -   $ r   r!   )r   r  r  s    r*   r   Ftest_partials_from_config_nested.<locals>.test_layer.<locals>.<lambda>`  s    T!Wr)   r!   )r  r  s   ``r*   
test_layer4test_partials_from_config_nested.<locals>.test_layer^  s	    $$r)   r   r"  )r  r  )z@layersr  r  rk  3   d      NrR  )r,   r   r  r   layersr   )r  r  r   r   r  s       @r*    test_partials_from_config_nestedr  S  s    C C   34.c .(C5#:2F . 5. (%3%*- %# %hucz>R % )% #"7bAC
 }-f5D7b==9r)   c                     [         R                  " S5      S 5       n SS0n[         R                  " SU05      S   n[        U[        5      (       d   e[         R
                  " S5      S[        S[        4S j5       nSSS0S	.n[         R                  " SU05      S   n[        U[        5      (       d   e[         R
                  " S
5      S[        [        [        4   S[        4S j5       nS
SSS00S.n[         R                  " SU05      S   n[        U[        5      (       d   e[         R
                  " S5      S[        S[        4S j5       ng)zeTest that generator replacement for validation in config doesn't
actually replace the returned value.ztest_schedule.v2c               3      #     Sv   M  7f)Nr"  r!   r!   r)   r*   test_schedule.test_validate_generator.<locals>.test_schedulep  s     H r`  rx  rk  rg  rl   r:  c                     U $ r   r!   rX  s    r*   test_optimizer20test_validate_generator.<locals>.test_optimizer2y  rK  r)   ra  ztest_optimizer.v3rd  c                     U S   $ )Nrl   r!   rd  s    r*   test_optimizer30test_validate_generator.<locals>.test_optimizer3  s      r)   )rb  rd  ztest_optimizer.v4c                      U S   $ )Nr   r!   r  s    r*   test_optimizer40test_validate_generator.<locals>.test_optimizer4  s    |r)   N)	r   rd  r   
isinstancer   rc  r   r   r7   )r  r   r   r  r  r  s         r*   test_validate_generatorr  l  ss    -. / +
,C  &#/7Ffm,,,,/0i I  1 +12C   &#/7Ffm,,,,/0!4Y#7 !I ! 1! +|-?@AC   &#/7Ffm,,,,/0I )  1r)   c                      SSSS.S.n [         R                  " SU 05      S   n[        U[        5      (       d   eUR                  S:X  d   eUR
                  b   eUR                  S:X  d   eg)	zhTest that validation can handle checks against arbitrary generic
types in function argument annotations.zgeneric_cat.v1z
int_cat.v1r\   )rB   value_in)rB   catrk  Ngeneric_cat)r   r   r  r   r  	value_outr  )r   r  s     r*   test_handle_generic_typer    st     %|QR-S
TC


vsm
,V
4Cc3<<1==   88}$$$r)   r   z[a]
b = 1
c = 2

[a.c]
d = 3z%[a]
b = 1

[a.c]
d = 2

[a.c.d]
e = 3c                     [         R                  " [        5         [        5       R	                  U 5        SSS5        g! , (       d  f       g= f)zwThis would cause very cryptic error when interpreting config.
(TypeError: 'X' object does not support item assignment)
NrQ   rR   r   r   r   r   s    r*    test_handle_error_duplicate_keysr    s-     
,	-# 
.	-	-s	   >
Azcfg,is_valid)z[a]
b = 1

[a.c]
d = 3T)z[a]
b = 1

[A.c]
d = 2Fc                     U(       a  [        5       R                  U 5        g[        R                  " [        5         [        5       R                  U 5        SSS5        g! , (       d  f       g= f)zTest that you can't expand a block that hasn't been created yet. This
comes up when you typo a name, and if we allow expansion of undefined blocks,
it's very hard to create good errors for those typos.
Nr   r   rQ   rR   r   )r   is_valids     r*    test_cant_expand_undefined_blockr    s@     #]]01Hc" 211s   A
A-c                     SSSSSSS.0S.0n S	S0n[         R                  " XSS
9nUS   S   S   S   SL d   eSS0n[         R                  " XSS
9nUS   S   S   S:X  d   eSSSS.S S.0n[         R                  " XS9nUS   S   b   eUS   S   S   S:X  d   eUS   S   S   SL d   eUS   S   S   SL d   e[        R                  " [        5         S	S0n[         R                  " XSS
9  S S S 5        [        R                  " [        5         SSS0S S.0n[         R                  " XS9  S S S 5        [        R                  " [        5         SSS.n[         R                  " XSS
9  S S S 5        [        R                  " [        5         SS0n[         R                  " XSS
9  S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nm= f! , (       d  f       g = f)Nr   r>   r   r@   TFrA   r   cfg.two.three.evil	overridesr   r   rC   cfg.two.threer\   r   r  r   rB   rD   r  )r  ztwo.fourcfg.five)r   r   rQ   rR   r   r   r  r   s      r*   test_fill_config_overridesr    s   {D%PQ
F &u-IfDIF%=(0E999 !$IfDIF%=(A--- +u EdSTIf:F%='''%=(K777%='5000%='4///	,	-)2.	tD 
. 
,	-Wk$:4HI	5 
. 
,	-+0dC	tD 
. 
,	-'	tD 
.	- 
.	- 
.	- 
.	- 
.	-s0   F4GGG'4
G
G
G$'
G5c                     SSSSSSS.0S.0n S	S0n[         R                  " XSS
9nUS   S   S   S:X  d   eSS0n[         R                  " XSS
9nUS   S   S   S:X  d   eSSSS.S S.0n[         R                  " XS9nUS   S   S:X  d   eUS   S   b   e[        R                  " [        5         S	S0n[         R                  " XSS
9  S S S 5        [        R                  " [        5         SSS0S S.0n[         R                  " XS9  S S S 5        [        R                  " [        5         SSS.n[         R                  " XSS
9  S S S 5        [        R                  " [        5         SS0n[         R                  " XSS
9  S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nm= f! , (       d  f       g = f)Nr   r>   r   r@   TFrA   r   r  r  r   r   r  r\   r   r  r   r  rB   )r  zcfg.two.fourr  r   r  s      r*   test_resolve_overridesr    s   {D%PQ
F &u-I  tLF%=(F222 !$I  tLF%=(A---+u EdSTI  =F%=6)))%='''	,	-)2.	F$G 
. 
,	-Wk$:4HI	F8 
. 
,	-+0$G	F$G 
. 
,	-'	F$G 
.	- 
.	- 
.	- 
.	- 
.	-s0   3F/F /F1,G
F 
F.1
F?
Gzprop,expected))za.b.cT)a.bT)rL  T)za.eT)za.b.c.dFc                 R    SSSS.SS/S.0n[         R                  " X5      UL d   eg )NrL  r      r  dr>   rF   r  e)r   _is_in_config)proprT  r   s      r*   test_is_in_configr  
  s5    
 qq)A78F$$T2h>>>r)   c                      " S S[         5      n [        R                  " S5      SSU S[        4S jj5       nSSU " 5       SS	.0n[        R                  " US
S9nUS   n[        US   U 5      (       d   eUS   S:X  d   eg )Nc                       \ rS rSrS rSrg)/test_resolve_prefilled_values.<locals>.Languagei  c                     g r   r!   )selfs    r*   __init__8test_resolve_prefilled_values.<locals>.Language.__init__  s    r)   r!   N)r#   r$   r%   r&   r  r(   r!   r)   r*   Languager    s    	r)   r  zprefilled.v1nlprS   c                     X4$ r   r!   )r  rS   s     r*   	prefilled0test_resolve_prefilled_values.<locals>.prefilled  s
    |r)   rk  2   )rb  r  rS   Tr   r   r>   rl  )objectr   rc  r,   r   r  )r  r  r   rS  r   s        r*   test_resolve_prefilled_valuesr    s    6  N+x   ,
 nXZRTUVF""6D9HfFfQi****!9??r)   c                  @   [         R                  R                  S5      S[        S[        [
        [        4   4S j5       n SSS.SS.n[         R                  " S	U0S
S9S	   S   nUS   SL d   eSU;  d   e[         R                  " S	U0S
S9S	   S   nUS   S
L d   eg)zFTest that a registered function returning a dict is handled correctly.zcatsie_with_dict.v1rC   r:  c                     SU (       + 0$ )Nnot_evilr!   )rC   s    r*   catsie_with_dict;test_fill_config_dict_return_type.<locals>.catsie_with_dict(  s    H%%r)   Fr   r"  )rk  r   r   Tr   rk  r  N)	r   rr   r   r   r   r7   r   r   r   )r  r   r   s      r*   !test_fill_config_dict_return_typer  %  s     45&z &d39o & 6& !6uEbQFufo=eDVLF&>U"""V###  %4@GOF*%%%r)   c                  `    [        SSSS.S.5      n U R                  5       nX:X  d   eXLd   eg )Nr>   rF   r\   r  r  )r   copy)r   copieds     r*   test_deepcopy_configr  4  s9    !"234F[[]Fr)   PyPyzcopy does not fail for pypy)reasonc                      [         R                  " S5      n [        SU S.5      n[         R                  " [        5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr}  r>   r  )rQ   r  r   rR   r   r  )r}  r   s     r*   test_deepcopy_config_pickler  <  sD     (E!%()F	z	" 
#	"	"s   A
A'c                      Sn [        5       R                  U 5      nUS   S   S   S:X  d   eUR                  5       U :X  d   eg)z\Test that references to function registries without arguments are
serialized inline as dict.z,[section]
subsection = {"@registry":"value"}r   
subsectionz	@registryrS   Nr   r  r   s     r*   "test_config_to_str_simple_promisesr   G  sM     EJXz*F)\*;77BBB==?j(((r)   c                  @   Sn [         R                  " [        5         [        5       R	                  U 5        S S S 5        Sn [         R                  " [        5         [        5       R	                  U 5        S S S 5        g ! , (       d  f       NM= f! , (       d  f       g = f)Nz[a]
b = null

[a.b]
c = 1z[a]
b = null

[a.b.c]
d = 1r  r  s    r*   $test_config_from_str_invalid_sectionr  P  sg    4J	,	-*% 
. 7J	,	-*% 
.	-	 
.	- 
.	-s   A>B>
B
Bc                  n    SSS.SS.SSSS	S
.00S.n Sn[        U 5      n U R                  5       U:X  d   eg)z,Test that Config.to_str orders the sections.r>   rF   r  r\   r  ghrc   r   )ij)rL  rJ   z=[a]
e = 3

[a.b]
c = 1
d = 2

[f]

[f.g]

[f.g.h]
i = 4
j = 5N)r   r   )r   rT  s     r*   test_config_to_str_orderr	  Z  sM     q)2#1STEU?V9WXFT  F^F==?h&&&r)   r  .:c                    Sn[         R                  " [        5         [        5       R	                  U5        SSS5        SU  S3n[        5       R	                  U5      S   S   S:X  d   eSU  S3n[        5       R	                  U5      S   S   S	:X  d   eS
U  S3n[        5       R	                  U5      S   S   S	:X  d   eSU  S3n[        5       R	                  U5      S   S   S:X  d   eSU  S3n[        5       R	                  U5      S   S   SS/:X  d   eSU  SU  S3n[        5       R	                  U5      S   S   S:X  d   e[        5       R	                  U5      S   S   S:X  d   eg! , (       d  f       GN<= f)a  Test that config values are interpolated correctly. The parametrized
value is the final divider (${a.b} vs. ${a:b}). Both should now work and be
valid. The double {{ }} in the config strings are required to prevent the
references from being interpreted as an actual f-string variable.
z#[a]
foo = "hello"

[b]
bar = ${foo}Nz [a]
foo = "hello"

[b]
bar = ${afoo}r  r   r   zfoo}!zhello!z![a]
foo = "hello"

[b]
bar = "${azfoo}!"z[a]
foo = 15

[b]
bar = ${az15!z#[a]
foo = ["x", "y"]

[b]
bar = ${ar   rM  z[a]
foo = "x"
bar = ${azfoo}
baz = "${azfoo}y"rL  r0  xyr  )r  c_strs     r*   test_config_interpolationr  d  s    :E	,	-%  
.5aS@E8U#C(/7:::5aSAE8U#C(/8;;;6qcDE8U#C(/8;;;06<E8U#C(/588885CE8U#C(/C:===*1#-?s(ME8U#C(/36668U#C(/4777 
.	-s   E,,
E;c                     Sn [        5       R                  U SS9nUS   S   SS/:X  d   eUR                  5       nUS   S   SS/:X  d   eS	n [        5       R                  U 5      nUS   S   / S
Q:X  d   e[        5       R                  U SS9nSn [        5       R                  U 5      nUS   S   SSS0/:X  d   eSn [        R                  " [
        5         [        5       R                  U 5        S S S 5        Sn[        5       R                  U5      nUS   S   SS/SS./:X  d   eSn[        R                  " [
        5         [        5       R                  U 5        S S S 5        g ! , (       d  f       N|= f! , (       d  f       g = f)Nz,[a]
b = 1

[c]
d = ["hello ${a.b}", "world"]Finterpolater  r  zhello ${a.b}r   hello 1z4[a]
b = 1

[c]
d = [${a.b}, "hello ${a.b}", "world"])r>   r  r   z"[a]
b = 1

[c]
d = ["hello", ${a}]r   r  r>   z*[a]
b = 1

[c]
d = ["hello", "hello ${a}"]z=[a]
b = 1

[c]
d = ["hello", {"x": ["hello ${a.b}"], "y": 2}]rF   )r   rM  z5[a]
b = 1

[c]
d = ["hello", {"x": [${a.b}], "y": 2}])r   r   r  rQ   rR   r   )r  r   r  s      r*   test_config_interpolation_listsr  ~  s   BEXu%8F#;s8888!F#;s	73333JEXu%F#;s6666Xu%8F 9EXu%F#;s#q2222@E	,	-%  
.XJXz*F#;s	{)CDDDDPJ	,	-%  
.	- 
.	- 
.	-s   E'E8'
E58
Fc                    Sn[        5       R                  U5      nUS   S   US   :X  d   eSU  S3n[        5       R                  U5      nUS   S   S   US   S   :X  d   eS	U  S
U  S3n[        5       R                  U5      nUS   S   S:X  d   eSU  S3n[        5       R                  U5      nUS   S   S:X  d   eSn[        5       R                  U5      nUS   S   US   :X  d   eUS   S   US   :X  d   eSU  S3n[        5       R                  U5      nUS   S   US   S   :X  d   eSn[        5       R                  U5      nUS   S   US   :X  d   eSn[        5       R                  U5      nUS   S   S   US   :X  d   eSU  S3n[        R                  " [        5         [        5       R                  U5        SSS5        SU  S3n[        R                  " [        5         [        5       R                  U5        SSS5        Sn[        R                  " [        5         [        5       R                  U5        SSS5        g! , (       d  f       N= f! , (       d  f       N^= f! , (       d  f       g= f)a  Test that config sections are interpolated correctly. The parametrized
value is the final divider (${a.b} vs. ${a:b}). Both should now work and be
valid. The double {{ }} in the config strings are required to prevent the
references from being interpreted as an actual f-string variable.
z-[a]
foo = "hello"
bar = "world"

[b]
c = ${a}r  r  rL  z [a]
foo = "hello"

[a.x]
y = ${azb}

[a.b]
c = 1
d = [10]r   rM  z%[a]
x = "string"
y = 10

[b]
z = "${azx}/${azy}"zz	string/10z0[a]
x = ["hello", "world"]

[b]
y = "result: ${azx}"zresult: ["hello", "world"]z-[a]
foo = "x"

[b]
bar = ${a}

[c]
baz = ${b}r   r0  z,[a]
foo = "x"

[b]
bar = ${a}

[c]
baz = ${bzbar}z.[a]
foo = "x"

[a.b]
bar = 100

[c]
baz = ${a}z[a]
foo ="x"

[a.b]
bar = ${a}z0[a]
foo = "x"

[b]
bar = ${a}

[c]
baz = ${b.barr  Nz[a]
foo = ${bz/[a]

[a.b]
foo = "x: ${c}"

[c]
bar = 1
baz = 2r  )r  r  r   s      r*   "test_config_interpolation_sectionsr    s    EEXu%F#;svc{***5aS8UXEXu%F#;sC F3K$4444;A3hqcQEXu%F#;s{***EaSPEXu%F#;s;;;;FEXu%F#;u,,,#;u,,,FqcQEXu%F#;uU!3333GEXu%F#;u,,,4EXu%F#;sE"fSk111J1#UUE	,	-%  
.  s%*E	,	-%  
. IE	,	-%  
.	- 
.	- 
.	- 
.	-s$   +I-I+I0
I
I-0
I>c                  b   Sn SSS.n[        5       R                  XS9nUS   S   S:X  d   eUS   S   S	   S:X  d   eUS   S   S
   S:X  d   e[        5       R                  U SS0S9nUS   S   S	   S:X  d   eUS   S   S
   S:X  d   eUS   S   S   S:X  d   e[        R                  " [        5         [        5       R                  U SS0S9  S S S 5        [        R                  " [        5         [        5       R                  U SS0S9  S S S 5        Sn [        5       R                  U SS0S9nUS   S   S:X  d   eUS   S   S
   S:X  d   eSn [        5       R                  U SS0S9nUS   S   S	   S:X  d   eUS
   S   S	S0:X  d   eg ! , (       d  f       N= f! , (       d  f       N= f)Nz0[a]
b = 1

[a.c]
d = 2
e = 3

[f]
g = {"x": "y"}r"  r  )r  a.c.dr  rL  r  r  r  r  r\   za.c.fr  rF   rJ   zf.g.xr  z![a]
b = 1

[a.c]
d = 2
e = ${a:b}r  z%[a]
b = 1

[a.c]
d = 2
[e]
f = ${a.c}r  r  )r  r  r   s      r*   test_config_from_str_overridesr    s   OJR(IXz?F#;sr!!!#;sC B&&&#;sC A%%%Xzgs^DF#;sC A%%%#;sC A%%%#;sC C'''	,	-*b	: 
. 
,	-*#? 
. >JXzeR[AF#;sr!!!#;sC B&&&BJXzgr]CF#;sC B&&&#;sRy((( 
.	- 
.	-s   6F3F 
F 
F.c                     [         R                  " S5      S	S[        4S jj5       n SSS.n[         R                  " SU05      n[         R                  " SU05      nUS   SL d   eUS   U:X  d   eSSS.n[
        R                  " [        5         [         R                  " SU05        SSS5        g! , (       d  f       g= f)
zTest that the auto-generated pydantic schemas auto-alias reserved
attributes like "validate" that would otherwise cause NameError.zcatsie.with_aliasr   c                     U $ r   r!   r   s    r*   catsie_with_alias7test_config_reserved_aliases.<locals>.catsie_with_alias  s    r)   T)rB   r   rk  r  N)F)r   rr   r   r   r   rQ   rR   r   )r  r   rS  r`   s       r*   test_config_reserved_aliasesr     s     )*J  + (T
:C""FC=1Hvsm,FFt###&>S   'R
8C	,	-VSM* 
.	-	-s   B22
C c                 <   [         R                  " S5      nSU  SU  S3n[        5       R                  USS9nUR                  (       a   eUS   S   S	U  S
3:X  d   eUS   S   SU  S3:X  d   eUS   S   S:X  d   e[        5       R                  UR                  5       SS9nUR                  (       d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S   SS0:X  d   eUR                  5       nUR                  (       d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S   SS0:X  d   eSUR                  SS/SS//SS9SU  S3S.0n[         R                  " [        5         [        U5      R                  5         SSS5        g! , (       d  f       g= f)a  Test that interpolation is correctly preserved. The parametrized
value is the final divider (${a.b} vs. ${a:b}). Both should now work and be
valid. The double {{ }} in the config strings are required to prevent the
references from being interpreted as an actual f-string variable.
r}  z[a]
b = 1

[c]
d = ${azb}
e = "hello${azb}"
f = ${a}Fr  r  r  z${azb}r  z	"hello${azb}"rJ   z${a}Tr>   hello1r  r   rF   rc   r   dtypez${xzy})rM  r  N)
rQ   r  r   r   is_interpolatedr   r  r  rR   r   )r  r}  r  r   config2config3r   s          r*   test_config_no_interpolationr(    s    (E+A3.B1#EUXEXu%8F%%%%#;saS},,,#;sA3d3333#;sv%%%hTBG""""3<!!!3<(((3<a(((  "G""""3<!!!3<(((3<a(((emmaVaV$4Cm@aSPS}U
VC	,	-s! 
.	-	-s   *F
Fc                     Sn [        5       R                  U SS9nUR                  (       a   eUS   S   S:X  d   eUS   S   S	:X  d   e[        R                  " U5      n[        R
                  " U5      nUS   S
:X  d   eUS   S   S
:X  d   eUS   S   S:X  d   eUS   S   SL d   eUS   S   S	:X  d   eUR                  5       nUR                  (       d   eUS   S   SL d   eUS   S   US   :X  d   e[        5       R                  U SS9nUR                  (       d   e[        R                  " U5      n[        R
                  " U5      nUS   S
:X  d   eUS   S   S
:X  d   eUS   S   SL d   eUS   S   US   :X  d   e[        5       R                  U SS9nUR                  (       a   e[        R                  " U5      nUR                  (       a   eUS   S   S	:X  d   e[        R
                  " U5      nUS   S   S
:X  d   eg )NzE[a]
bad = true
[b]
@cats = "catsie.v1"
evil = ${a:bad}

[c]
 d = ${b}Fr  r  rC   z${a:bad}r  r  z${b}r   rD   T)r   r   r%  r   r   r   r  )r  r   r`   rS  interpolateds        r*   %test_config_no_interpolation_registryr+  "  s_   cJXzu=F%%%%#;v*,,,#;sv%%%f%F""6*HC=J&&&C=+++#;v*,,,#;v$&&&#;sv%%%%%'L''''V$,,,S!\#%6666Xzt<F!!!!f%F""6*HC=J&&&C=+++#;v$&&&#;svc{***Xzu=F%%%%f%F%%%%#;sv%%%""6*HC=+++r)   c                  b   SSS0S.n SSSS.S.n[        U5      R                  U 5      n[        U5      S	:X  d   eUS
   S:X  d   eUS   SSS.:X  d   eSSSS.S.n SSSS	S.SS.n[        U5      R                  U 5      n[        U5      S:X  d   eUS
   S:X  d   eUS   SSS	S.:X  d   eUS   S:X  d   eSSSS.SS.n SSSS	S.S.n[        U5      R                  U 5      n[        U5      S:X  d   eUS
   S:X  d   eUS   SSS.:X  d   eUS   S:X  d   eSSS0SS.n SSSS	S.S.n[        U5      R                  U 5      n[        U5      S:X  d   eUS
   S:X  d   eUS   SSS	S.:X  d   eUS   S:X  d   eSSS0SS.n SSS0S.n[        U5      R                  U 5      n[        U5      S:X  d   eUS
   S:X  d   eUS   SS0:X  d   eUS   S:X  d   eSSS0SS.n SSS.n[        U5      R                  U 5      n[        U5      S:X  d   eUS
   S:X  d   eUS   SS0:X  d   eUS   S:X  d   eg )Nr   r  r  r  r   r  r  )r  rJ   rF   rL  r  r   r>   )@testr   r  )r-  r   r   rL  r  r  r\   rM  r   z@fooz@bar)r   mergerT   )r   defaultsmergeds      r*   test_config_deep_merger2  E  s   #s,F3#78HH##F+Fv;!#;'!!!#;#....3q!9:FSQ#GcRHH##F+Fv;!#;'!!!#;C!<<<<#;#3q!9DFSQ#GHHH##F+Fv;!#;'!!!#;C2222#;#%#6FSQ#GHHH##F+Fv;!#;'!!!#;C!<<<<#;#&!37FFC=1HH##F+Fv;!#;'!!!#;61+%%%#;#&!37F3'HH##F+Fv;!#;'!!!#;61+%%%#;#r)   c                     Sn Sn[        5       R                  U SS9n[        5       R                  U5      nUR                  U5      nUS   SSSS	.:X  d   eUS
   SSS.:X  d   eUR                  5       S
   SSS.:X  d   e[        5       R                  S5      n[        5       R                  SSS9nUR                  U5      nUS   S   S:X  d   eg )Nz[a]
b= 1
c = 2

[d]
e = ${a:b}z[a]
x = 100

[d]
y = 500Fr  rL  r>   rF   r  )r  r  r   r  z${a:b}i  )r  rM  z[a]
b= 1
c = 2z[a]
b = 100
c = ${a:b}r  )r   r   r/  r  )r  defaults_strr   r0  r1  s        r*    test_config_deep_merge_variablesr5  s  s    :J5LXzu=Fx  .H^^F#F#;4444#;s3333$ac(::::X56Fx  !?U SH^^F#F#;sq   r)   c                     [         R                  " S5      n SSS00n[        U5      R                  5       nUS:X  d   e[        5       R	                  U5      n[        U5      U:X  d   eSSS00n[        U5      R                  5       nUS:X  d   e[        5       R	                  U5      n[        U5      U:X  d   eSSU R                  / S	Q/ S
Q/SS900n[        U5      n[         R                  " [        5         UR                  5         S S S 5        Sn[        5       R	                  USS9nUR                  5       U:X  d   eg ! , (       d  f       N?= f)Nr}  r   r   Fz[cfg]
foo = falser&  z[cfg]
foo = "false"r   )r>   rF   r\   rc   )rc   r   r\   rc   rJ   r#  z8[a]
b = 1

[c]
d = ${a:b}
e = "hello${a:b}"
f = "${a:b}"r  )	rQ   r  r   r   r   dictr  rR   r   )r}  r   r  r   s       r*   test_config_to_str_roundtripr8    s:   (E5%.
!C##%J----Xz*F<35'"
#C##%J////Xz*F<33|\&B#NO
PCC[F	,	- 
. XJXzu=F==?j((( 
.	-s   8E
Ec                     Sn [        5       R                  U SS9nUR                  (       a   eUR                  [        SSS005      5      nUR                  (       a   e[        U5      nUR                  (       a   eUR	                  5       nUR                  (       d   eUR                  [        5       R                  U SS95      nUR                  (       a   eg)zFTest that a config object correctly reports whether it's interpolated.z4[a]
b = 1

[c]
d = ${a:b}
e = "hello${a:b}"
f = ${a}Fr  r   rM  r  N)r   r   r%  r/  r  r  s     r*   test_config_is_interpolatedr:    s    RJXzu=F%%%%\\&#Sz!234F%%%%F^F%%%%!F!!!!\\&(++JE+JKF%%%%%r)   z(section_order,expected_str,expected_keysz?[a]
b = 1
c = 2

[a.d]
e = 3

[a.f]
g = 4

[h]
i = 5

[j]
k = 6)rL  r  r  )r  r  rL  z?[j]
k = 6

[h]
i = 5

[a]
b = 1
c = 2

[a.d]
e = 3

[a.f]
g = 4r  z?[h]
i = 5

[a]
b = 1
c = 2

[a.d]
e = 3

[a.f]
g = 4

[j]
k = 6)r  rL  r  c                 P   SS0SSS0SSS0S	.S
S0S.n[        U5      R                  5       n[        X0S9R                  5       U:X  d   e[        [        U S9R                  U5      R	                  5       5      nXR:X  d   e[        [        X0S9R	                  5       5      nXR:X  d   eg )Nkr  r>   r  r\   rF   r  rc   )r  r  r  rJ   r  r   )r  rL  r  section_order)r   r   listr   keys)r>  expected_strexpected_keysr   r  r@  s         r*   !test_config_serialize_custom_sortrC    s     1XC8!3(;1XC
 Sk  "G#3::<LLL]3<<WEJJLMD   s8==?@D   r)   c                  
   0 0 0 S.n / SQnSn[        XS9nUR                  5       U:X  d   eUR                  5       nUR                  5       U:X  d   eUR                  S0 05      nUR                  5       U S3:X  d   e[        U5      nUR                  5       U:X  d   eSn/ SQn[        US9R	                  U5      n[        UR                  5       5      U:X  d   e[        R                  " U5      n	U	R                  U:X  d   eg	)
zlTest that sort order is preserved when merging and copying configs,
or when configs are filled and resolved.)r   rM  r  )rM  r  r   z[y]

[z]

[x]r=  rL  z

[a]z9[a]
b = 1
[c]
@cats = "catsie.v1"
evil = true

[t]
 x = 2)r  rL  tN)
r   r   r  r/  r   r?  r@  r   r   r>  )
r   r>  rT  r   r&  r'  config4r  config5r`   s
             r*    test_config_custom_sort_preserverH    s     "
%C#M"HC5F==?h&&&kkmG>>x'''llC9%G>>(73333VnG>>x'''WJ#M=1:::FG=000g&F=000r)   c                      [        SS0/ SQS9n [        R                  " U 5      n[        R                  " U5      nUSS0:X  d   eUR                  / SQ:X  d   eg )Nr   r   )r   r   r0  r=  )r   pickledumpsloadsr>  )r   data
config_news      r*   test_config_picklerO    sV    UEN2GHF<<Dd#J%'''##'<<<<r)   c                    ^^  " S S[         5      m " U4S jS[         5      n [        SSSSS	.05      n[        R                  " [        5         [
        R                  " XS
9  SSS5        [
        R                  " XSS9S   nUSSS.:X  d   eUR                  5       n[
        R                  " X0SS9S   nUSSS.:X  d   e[        SSSSS	.0SS9n[
        R                  " X@SS9S   nUSSS.:X  d   e " S S[         5      m " U4S jS[         5      n[
        R                  " XSS9S   nUSSSS	.:X  d   eg! , (       d  f       N= f)z>Test that filling a config from a schema removes extra fields.c                   >    \ rS rSr% \\S'   \\S'    " S S5      rSrg)8test_config_fill_extra_fields.<locals>.TestSchemaContenti  rL  r  c                       \ rS rSrSrSrg)?test_config_fill_extra_fields.<locals>.TestSchemaContent.Configi  r    r!   Nr"   r!   r)   r*   r   rT    r   r)   r   r!   N	r#   r$   r%   r&   r7   r-   r,   r   r(   r!   r)   r*   TestSchemaContentrR    s    	 	r)   rV  c                   $   > \ rS rSr%  Y \S'   Srg)1test_config_fill_extra_fields.<locals>.TestSchemai  r   r!   Nr   )rV  s   r*   r   rX    s	    r)   r   r   1rF   Tr.  r~   NF)r   r   r  )r%  c                   >    \ rS rSr% \\S'   \\S'    " S S5      rSrg)9test_config_fill_extra_fields.<locals>.TestSchemaContent2i  rL  r  c                       \ rS rSrSrSrg)@test_config_fill_extra_fields.<locals>.TestSchemaContent2.Configi  allowr!   Nr"   r!   r)   r*   r   r]    s    Er)   r   r!   NrU  r!   r)   r*   TestSchemaContent2r[    s    	 	r)   r_  c                   $   > \ rS rSr%  Y \S'   Srg)2test_config_fill_extra_fields.<locals>.TestSchema2i  r   r!   Nr   )r_  s   r*   TestSchema2ra    s	    r)   rb  )r   r   rQ   rR   r   r   r   r  )r   r   r`   r&  r'  rb  rV  r_  s         @@r*   test_config_fill_extra_fieldsrc    sF   I Y  U#AD9:;F	,	-3 
.f%HOF3Q''''  "Gg5I%PF3Q''''e3QT:;USGg5I%PF3Q''''Y  i   f5I%PF3QT2222- 
.	-s   D;;
E	c                      " S S[         5      n SSS.n[        R                  " [        5       n[        R
                  " X5        S S S 5        WR                  nUR                  S:X  d   eUR                  b   eUR                  (       a   eUR                  SL d   e[        UR                  5      S:X  d   eUR                  S   S	   S
:X  d   eUR                  S   S   S:X  d   eUR                  S   S   S:X  d   eUR                  [        S/5      :X  d   eSnSn[        R                  " X4USS9nUR                  UR                  :X  d   eUR                  UR                  :X  d   eUR                  U:X  d   eUR                  U:X  d   eUR                  SL d   eUR                   UR                   :w  d   eg ! , (       d  f       GN= f)Nc                   *    \ rS rSr% \\S'   \\S'   Srg)3test_config_validation_error_custom.<locals>.Schemai  r   r   r!   Nr#   r$   r%   r&   r,   r-   r(   r!   r)   r*   Schemarf    s    

r)   rh  r>   rO   rG   zConfig validation errorTr   loc)r   msgzvalue is not a valid integertyperP   zCustom errorzSome error description hereF)titledescshow_config)r   rQ   rR   r   r   rH   rS   rl  rm  parentrn  rT   rU   rV   set
from_errortext)rh  r   rX   e1rl  rm  e2s          r*   #test_config_validation_error_customru    s     5)F	,	-&) 
.	B88000077??yy=>>T!!!ryy>Q99Q<*,,,99Q<"@@@@99Q<#7777>>S"6!78888E(D		)	)"RW	XB99		!!!>>R^^+++88u77d??>>U"""77bgg+ 
.	-s   G
Gc                      Sn [         R                  " [        5         [        5       R	                  U 5        S S S 5        g ! , (       d  f       g = f)Nz[a]
b cr  r  s    r*   test_config_parsing_errorrw  $  s0    J	,	-*% 
.	-	-s   A  
Ac                  R    " S S[         5      n SSSS.0n[        R                  " U5      n[        R                  " U5      nUS   S:X  d   eUS   S   S	L d   e[        R
                  " [        5         [        R                  " XS
9  S S S 5        [        R                  " XS
9nUS   S   S	L d   e[        R                  " U5      nUS   S:X  d   e " S S[         5      nSSSS.0n[        R                  " XS
9nUS   US   :X  d   eUS   S:X  d   eg ! , (       d  f       N= f)Nc                        \ rS rSr% \\S'   Srg)4test_config_fill_without_resolve.<locals>.BaseSchemai+  catsier!   Nrg  r!   r)   r*   
BaseSchemarz  +  s    r)   r|  r{  r@   Fr   r   rD   Tr~   c                   .    \ rS rSr% \\S'   Sr\\S'   Srg)5test_config_fill_without_resolve.<locals>.BaseSchema2i;  r{     r  r!   N)	r#   r$   r%   r&   r   r-   r  r,   r(   r!   r)   r*   BaseSchema2r~  ;  s    sr)   r  dogr  r  )r   r   r   r   rQ   rR   r   )r|  r   r`   rS  filled2r  filled3s          r*    test_config_fill_without_resolver  *  s6   Y  +u=>Ff%F""6*HH'''(F#t+++	,	-F6 
.v9G8V$,,,""7+HH'''i  %78Fv:G8x 00007r!!! 
.	-s   5D
D&c                  0   [        SSSS9n SSU S.0n[        R                  " U5      S   n[        U[         5      (       d   eUR                  U R                  :X  d   eUR
                  U R
                  :X  d   eUR                  U R                  :X  d   eg )Ntestcatr>   rF   )r  r  r   z	catsie.v3)rB   arg)r   r   r   r  r  r  r  )r  r   r   s      r*   test_config_dataclassesr  E  s    
i!q
1C{378F  (/Ffc"""";;#(("""??cll***s}},,,r)   zgreeting,value,expectedV  	${vars.a}342everyonec                 t    SU S3nSU 0n[        5       R                  X4S9n[        US   S   5      U:X  d   eg )Nz
    [project]
    my_par = z%

    [vars]
    a = "something"
    vars.ar  projectmy_par)r   r   rk  greetingrS   rT  str_cfgr  r   s         r*   test_config_interpolatesr  O  sU    W G 8$I
(

G

9CIx()X555r)   )	hello 342r  r  )hello everyoner  r  )hello tout le monder  r  )hello 42r  r  )r  [1, ${vars.a}, 3]r  )r  r  r  )r  r  r  )r  r  r  )r  hello ${vars.a}r  )r  r  r  )tout le monder  r  42r  r  )marks)r  [1, hello ${vars.a}, 3]r  )r  r  r  )r  r  r  r  )r  [1, 'hello ${vars.a}', '3']r  )r  r  r  )r  r  r  r  )r  +[{'name':'x','script':['hello ${vars.a}']}]r  )r  r  r  )r  r  r  r  c                 x    SU S3nSU 0nSU;   d   e[        5       R                  X4S9nU[        U5      ;   d   eg )Nz
    [project]
    commands = z!

    [vars]
    a = "world"
    r  r  r  )r   r   r7   r  s         r*   test_config_overridesr  e  sZ    Lw G 8$I'!!!
(

G

9Cs3xr)   c                      Sn [         R                  " [        SS9   [        5       R	                  U 5        S S S 5        Sn [        5       R	                  U 5        g ! , (       d  f       N*= f)Nz-
    [project]
    commands = 'do stuff'
    zsingle-quoted)matchz-
    [project]
    commands = some'thing
    )rQ   warnsUserWarningr   r   )r  s    r*   test_warn_single_quotesr    sP    G
 
k	9'" 
:G Hg 
:	9s   A
A(c                  r    [        5       R                  S5      n U S   S   / SQ:X  d   eU S   S   S:X  d   eg)	zWTest whether strings interpretable as integers are parsed correctly (i. e. as strings).z4[a]
foo = [${b.bar}, "00${b.bar}", "y"]

[b]
bar = 3rL  r   )r\   003rM  r  r   r\   N)r   r   r   s    r*   (test_parse_strings_interpretable_as_intsr    sE    
(

HC s8E?o---s8E?ar)   )r  rJ  platformtypesr   typingr   r   r   r   r   r	   r
   r   r   rQ   pydantic.v1r   r   r   r   pydantic.v1.typesr   ImportErrorpydanticpydantic.types
confectionr   r   confection.tests.utilr   r   r   confection.utilr   r   r   r   r   r/   r9   rn   	ok_catsierw   worst_catsierM   rZ   r]   ra   rf   rp   rt   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r$  r'  r*  r5  r@  rF  rU  re  rm  rv  r{  r  r  r  r  markparametrizer  r  r  r  r  r  r  r  skipifpython_implementationr  r   r  r	  r  r  r  r  r   r(  r+  r2  r5  r8  r:  rC  rH  rO  rc  ru  rw  r  r  r,   r7   r  paramxfailr  r  r  r!   r)   r*   <module>r     s       N N N  *GG,
 5 @ @ .>i Y <I < $UDA!5%@	"D$?
$dEB5;:?+M2'<.20/$@4#"O"9
.===
& -F93 
7O,!.D  $(/$ %F2%P	% 	+6 )+PQ	#		#$EN!HH T?	?
$&  ""$.7T  )&' sCj)8 *82!< sCj)2! *2!j)@+$ sCj)" *": ,F+\! ).& . 
\^mn	ikz{
_apq		!	!1,=$3N<&"6-  
k3	S!	[#&	
6
6  	09C-7AK5-9CT,j@Q@QR5AKT4jHYHYZ9EOT8*FKKL]L]^IU_TH*\b\g\g\m\mn?!$J K$J " y,  *DD))*s   O O! O!