o
    qoi                     @   s   d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
 ddl	mZ ddl	mZ dd	 Zd
d ZG dd dejZejG dd dejZdd Z			ddejdededeeee f fddZdS )zJProvides utilities to generate and test nested values with Fiddle objects.    N)AnyListUnion)daglish)config)partial)taggingc                  G      | S N )argsr   r   U/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/testing/nested_values.pyargs_only_fn      r   c                  K   r	   r
   r   )kwargsr   r   r   	kwargs_fn    r   r   c                   @   s   e Zd ZdZdS )	SampleTagz0`fdl.Tag` that can be used for testing purposes.N)__name__
__module____qualname____doc__r   r   r   r   r   $   s    r   c                   @   s   e Zd ZdZdZdZdZdS )
SampleEnum            N)r   r   r   ENUM_VALUE_AENUM_VALUE_BENUM_VALUE_CENUM_VALUE_Dr   r   r   r   r   (   s
    r   c                 C   sJ   t t| }|r|| ng d f\}}dd |D }|r#dt| S dS )Nc                 S   s   g | ]}t |qS r   )calculate_nested_value_depth).0childr   r   r   
<listcomp>3   s    z0calculate_nested_value_depth.<locals>.<listcomp>r   r   )r   find_node_traversertypeflattenmax)value	traverserchildren_depthsr   r   r   r    0   s   r          Trng	max_depthmax_container_sizeshare_objectsc                    sN  t tr	r	g fdd
fddfddfdd d	d
 fddfdd
fddfdd	d"
fdd	 fdd
fdd} fdd}	fdd}|||g}drrdnd g}j||d!d  }	|	 }
t trt|
r|	|ur|
 |
S )#aw  Generates a (possibly) nested value that (may) contain `fdl.Buildable`s.

  The resulting value can contain: integers, floats, booleans, `None`, strings,
  lists, tuples, dicts, and `fdl.Buildable`s (`fdl.Config`s and `fdl.Partial`s)
  that may have tagged arguments.

  Args:
    rng: The RNG (`random.Random`) instance to use for generating random values.
    max_depth: A guideline controlling the maximum nesting depth of the
      resulting value. The actual nesting depth may be less than this, or if
      `share_objects` is `True`, it may be larger.
    max_container_size: The maximum size of any container in the resulting
      nested_value.
    share_objects: Whether to allow aliasing of generated objects. This can be a
      `bool`, or a list of existing objects to share. If provided as a list, the
      list will be mutated to include aliasable values that are generated during
      nested value creation. If `False`, no aliasing will take place. Note that
      allowing aliasing may result in the final nested value having nesting
      depth greater than `max_depth`.

  Returns:
    A randomly generated nested value.
  c                      s   t d  dS )Nr   )r0   r1   r2   )generate_nested_valuer   )r1   r0   r/   r2   r   r   generate_valueW   s   z-generate_nested_value.<locals>.generate_valuec                      s     ddS )Ni'  )randintr   r/   r   r   generate_int^      z+generate_nested_value.<locals>.generate_intc                      s      d d S )Nr5   i  randomr   r7   r   r   generate_floata   s   z-generate_nested_value.<locals>.generate_floatc                      s      dkS )Ng      ?r:   r   r7   r   r   generate_boold   r9   z,generate_nested_value.<locals>.generate_boolc                   S   s   d S r
   r   r   r   r   r   generate_noneg   r   z,generate_nested_value.<locals>.generate_nonec                     s.    dd} d d fddt| D S )Nr   
   abcdefghijklmnopqrstuvwxyz c                    s   g | ]}  qS r   choicer!   r+   )alphabetr/   r   r   r#   m       zBgenerate_nested_value.<locals>.generate_string.<locals>.<listcomp>)r6   joinrangelengthr7   )rE   r   generate_stringj   s   z.generate_nested_value.<locals>.generate_stringc                      s     ttS r
   )rC   listr   r   r7   r   r   generate_enumo   s   z,generate_nested_value.<locals>.generate_enumc                     s"    d}  fddt| D S )Nr   c                    s   g | ]}  qS r   r   rD   )r4   r   r   r#   t   s    z@generate_nested_value.<locals>.generate_list.<locals>.<listcomp>)r6   rH   rI   )r4   r1   r/   r   r   generate_listr   s   z,generate_nested_value.<locals>.generate_listc                      s
   t   S r
   )tupler   )rN   r   r   generate_tuplev   s   
z-generate_nested_value.<locals>.generate_tupleNc                    s8    d} pg  fddt|D S )Nr   c                    s   i | ]}   qS r   r   rD   )r4   key_generatorr   r   
<dictcomp>}   rF   z@generate_nested_value.<locals>.generate_dict.<locals>.<dictcomp>)r6   rC   rH   )rQ   rJ   )r<   r8   rK   r4   r1   r/   rQ   r   generate_dicty   s
   z,generate_nested_value.<locals>.generate_dictc                     st    tjtjg}   r }| tg|R  S d}| tfi |}  r8|r8 t|}t	||t
h |S )NrS   )rC   r   Configr   Partialr   r   rL   r   set_tagsr   )buildable_type	arguments	buildableargument)r=   rT   rN   rK   r/   r   r   generate_buildable   s   

z1generate_nested_value.<locals>.generate_buildablec                     s(   t D ]} t| k r|   S q  S r
   )	enumerater    )r(   )r4   r0   r2   r   r   generate_alias   s
   z-generate_nested_value.<locals>.generate_aliasc                     s     g} |  S r
   rB   	generator)r=   rM   r<   r8   r>   rK   r/   r   r   generate_leaf   s   z,generate_nested_value.<locals>.generate_leafc                     s     g} |  S r
   rB   r_   )r\   rT   rN   rP   r/   r   r   generate_collection   s   z2generate_nested_value.<locals>.generate_collectionr   r   r   )weightsr
   )
isinstanceboolchoicesrL   r   is_memoizableappend)r/   r0   r1   r2   r^   ra   rb   
generatorsrc   r`   r(   r   )r=   r\   rT   rM   r<   r8   rN   r>   rK   rP   r4   r1   r0   r/   r2   r   r3   7   s0   
	
r3   )r-   r.   T)r   enumr;   typingr   r   r   fiddler   fiddle._srcr   r   r   r   r   Tagr   uniqueEnumr   r    Randomintre   r3   r   r   r   r   <module>   s4   	