
    MZe                       d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ d
dlmZ erddlmZ 	 d	 	 	 	 	 	 	 ddZddZddZddZ edd      Z ddZ!ddZ"ddZ#	 	 	 	 	 	 d dZ$d!dZ%y)"zUtility functions and classes.    )annotationsN)Fieldfieldsis_dataclassreplace)EnumMeta)Path)TYPE_CHECKINGAny	GeneratorMappingTypeVarRequirement)SpecifierSet   )Key)DataclassInstancec                    |ddg}	 | |z  }|j                         r|S |D ]  }| |z  j                         s y | | j                  k(  ryt        | j                  ||      S )zFind a configuration file given a working directory.

    Args:
        working_directory: Working directory to start from
        filename: Filename to look for
        bases: Bases to stop at

    Returns:
        Path of config file

    Nz.gitz.hg)existsparentfind_config_file)working_directoryfilenamebasestargetbases        4/usr/lib/python3/dist-packages/pytoolconfig/utils.pyr   r      sz      }2)F}} $,,. -444-44hFF    c                    t        |       }t        dt        j                  j                        D ]  }|j                  d|       sd|fc S  dt        j                  j                  fS )zSReturn the minimum python 3 version.

    Between 3.4 and interpreter version.
       3.   r   rangesysversion_infominorcontains	specifierparsedis      r   min_py_versionr.   2   sd    
 )$F1c&&,,- ??Rs8$q6M s%%&&r   c                    t        |       }t        t        j                  j                  dd      D ]  }|j                  d|       sd|fc S  y)zSReturn the maximum python 3 version.

    Between 3.4 and interpreter version.
    r!   r"   r#   )r#   r!   r$   r*   s      r   max_py_versionr1   >   sR    
 )$F3##))1b1 ??Rs8$q6M r   c              #  4   K   | D ]  }t        |        yw)z1Parse the dependencies from TOML using packaging.Nr   )dependencies
dependencys     r   parse_dependenciesr5   J   s      " &
*%%&s   Tr   )boundc                    | j                         D ci c]'  \  }}t        |j                        r||j                  ) c}}S c c}}w N)itemsr   type)dataclass_fieldsnamefields      r   
_subtablesr?   S   sF     ,113D%

# 	ejj  s   ,Ac                n    t        |       D ci c]  }|j                  s|j                  | c}S c c}w r9   )r   initr=   )	dataclassr>   s     r   _fieldsrC   [   s*    +1)+<K%

EJJKKKs   22c                D    t        | t              rd|  dS t        |       S )N")
isinstancestr)options    r   _format_enumrI   _   s$    &#6(!}v;r   c                   i }t        |       }t        |      }|j                         D ]f  \  }}||v r'||   }t        |t              sJ t        ||      ||<   1||v s6||   j                  }t        |t              r	  ||      ||<   b|||<   h  | di |S # t        $ rc t        |j                  j                               }	t        j                  | d| ddj                  t        t         |	             dd       Y w xY w)Nz is not a valid option for z, skipping.Valid options are: ,.r   )
stacklevel )rC   r?   r:   rF   r   _dict_to_dataclassr;   r   
ValueErrorset_value2member_map_keyswarningswarnjoinmaprI   )
rB   
dictionaryfiltered_arg_dictr<   
sub_tableskey_namevalue	sub_tablekeytypevalids
             r   rO   rO   e   s/    )+y),-J%++- 4%z!"8,IeW---*<Y*Nh'))&x055G'8,29%.%h/ /4!(+%4& )()) "  : : ? ? ABEMM '!<XJ G..1hhs<7O.P-QQRT#$s   ?BA)DDc                    i }t        |       }t        |      }|j                         D ]A  \  }}||v r.t        | |      }t	        |t
              sJ t        ||      ||<   8||v s=|||<   C t        | fi |S )z?Overwrite every value specified in dictionary on the dataclass.)rC   r?   r:   getattrrF   r   _recursive_merger   )rB   rX   rY   r<   rZ   r[   r\   r]   s           r   rb   rb      s    (*y),-J%++- 0%z!	84IeW---*:9e*Lh'))*/h'0 92 122r   r9   )r   r	   r   rG   r   zlist[str] | NonereturnzPath | None)r+   rG   rc   ztuple[int, int])r3   z	list[str]rc   z"Generator[Requirement, None, None])r<   dict[str, Field]rc   zdict[str, type[Any]])rB   z+DataclassInstance | type[DataclassInstance]rc   rd   )rH   r   rc   rG   )rB   ztype[T]rX   Mapping[str, Key]rc   r6   )rB   r6   rX   re   rc   r6   )&__doc__
__future__r   r&   rT   dataclassesr   r   r   r   enumr   pathlibr	   typingr
   r   r   r   r   packaging.requirementsr   packaging.specifiersr   typesr   	_typeshedr   r   r.   r1   r5   r6   r?   rC   rI   rO   rb   rN   r   r   <module>rp      s    $ " 
  < <   B B . - + #GGG G 	G<	'	& C*+L**!* *:3r   