o
    qo™iƒ  ã                   @   s|   d Z ddlZddlZddlZddlmZmZ ddlmZ dedee	 fdd„Z
d	ejdefd
d„Zdedee	 fdd„ZdS )z>A collection of Fiddle-internal tools to reflect over modules.é    N)ÚAnyÚList)ÚconfigÚsource_moduleÚreturnc              	   C   sx   g }t | ƒD ]1}| d¡rqz
t t| |ƒ¡}W n	 ty!   Y qw dd„ |j ¡ D ƒ}t|ƒdkr7| 	|¡ qt
|ƒS )a-  Returns a list of names that look like fiddlers.

  A fiddler is a 1-ary function that mutates a config (and returns None).

  Args:
    source_module: A module upon which to probe for potential fiddler-shaped
      attributes.

  Returns:
    Names of attributes that look like potential fiddlers.
  Ú__c                 S   s   g | ]}t |ƒr|‘qS © )Ú!_is_non_defaulted_positional_args)Ú.0Úparamr   r   úQ/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/module_reflection.pyÚ
<listcomp>-   s    þÿz,find_fiddler_like_things.<locals>.<listcomp>é   )ÚdirÚ
startswithÚinspectÚ	signatureÚgetattrÚ	ExceptionÚ
parametersÚvaluesÚlenÚappendÚsorted)r   Úfound_namesÚnameÚsigÚrequired_argsr   r   r   Úfind_fiddler_like_things   s    
ÿÿ
€r   r   c                 C   s$   | j | jks| j | jko| j| ju S )zAReturns True if `param` is a positional argument with no default.)ÚkindÚPOSITIONAL_OR_KEYWORDÚPOSITIONAL_ONLYÚdefaultÚempty)r   r   r   r   r	   6   s
   
ÿ
þr	   c              	      sº   g }t | ƒD ]T}| d¡rq|t tƒv rqz6t t| |ƒ¡‰ ˆ j}t |¡}|dur2t|t	j
ƒs2W qdtdtf‡ fdd„}tt|ˆ jƒƒsJ| |¡ W q tyZ   t d|¡ Y qw |S )a—  Returns names of attributes of 0-arity functions that might return Configs.

  A base config-producting function is a function that takes no (required)
  arguments, and returns a `fdl.Buildable`.

  Args:
    source_module: A module upon which to search for `base_config`-like
      functions.

  Returns:
    A list of attributes on `source_module` that appear to be base
    config-producing functions.
  r   Nr   r   c                    s.   ˆ j |  }|j|jks|j|jko|j|ju S )N)r   r   r!   r    r"   r#   )r   r   ©r   r   r   Úis_required_argZ   s   

ÿ
þz5find_base_config_like_things.<locals>.is_required_argz:Encountered exception while inspecting function called: %s)r   r   Útypingr   r   r   Úreturn_annotationÚ
get_originÚ
issubclassÚ
config_libÚ	BuildableÚstrÚboolÚanyÚfilterr   r   r   ÚloggingÚdebug)r   Úavailable_base_namesr   Úreturn_typeÚoriginr%   r   r$   r   Úfind_base_config_like_things=   s,   


€ÿÿr5   )Ú__doc__r   r0   r&   r   r   Úfiddle._srcr   r*   r,   r   Ú	Parameterr-   r	   r5   r   r   r   r   Ú<module>   s   