
    =eB)                       U d Z ddlmZ g dZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ej        rddlZ ej        d          Z ej        d          Z G d dej                  Z ej!        e"         Z#de$d<   ej!        e          Z%de$d<   d@dZ&ej'        e"ge#f         Z(de$d<   ej'        e"ge%f         Z)de$d<    ej*                    Z+de$d<   dAdZ,dBd#Z- e,ej.                  dCd%            Z/ e,ej0                  dCd&            Z1 e,ej2                  dCd'            Z3 e,ej4                  dCd(            Z5 e,ej6                  dCd)            Z7  e,ej8                  ej9                  Z9d*e$d+<    e,ej:                  dCd,            Z;dDd.Z<dEd/Z=dFd0Z>dGd2Z?ej@        e"ejA        f         ZBde$d3<   ej@        e"ejA        f         ZCde$d4<   ej@        e"ejA        f         ZDde$d5<   ejE        eBeCeDf         ZFde$d6<    G d7 d8ejG                  ZHd9 ZIej.        eej0        eej2        eej4        eej6        eej8        ejJ        ejK        eIiZLd:e$d;<   dHd?ZMdS )Iz0Package type detection and meta-data extraction.    )annotations)detect_package_metadetect_package_extensiondetect_package_type	get_attrsN)path)PackageType)inspect_conda_package)conda_installer)inspect_pypi_package)inspect_r_package)inspect_ipynb_package)inspect_env_packagePzbinstar.detectc                  (    e Zd ZU dZded<   ded<   dS )Metaz$General details on detected package.r	   package_typestr	extensionN)__name__
__module____qualname____doc____annotations__     ;lib/python3.11/site-packages/binstar_client/utils/detect.pyr   r   $   s+         ..NNNNNr   r   ztyping_extensions.TypeAliasRawOptMetar   r	   returnGtyping.Callable[[typing.Callable[P, Raw]], typing.Callable[P, OptMeta]]c                     d fd}|S )zDConvert function to a checker for a particular :code:`package_type`.functiontyping.Callable[P, Raw]r    typing.Callable[P, OptMeta]c                L     t          j                   d fd            }|S )	NargsP.argskwargsP.kwargsr    r   c                 >     | i |}|d S t          |          S )N)r   r   )r   )r'   r)   r   r#   r   s      r   wrappedz-checker_for.<locals>.wrapper.<locals>.wrapped2   s5    .6h.G.G.GI t\YGGGGr   )r'   r(   r)   r*   r    r   )	functoolswraps)r#   r,   r   s   ` r   wrapperzchecker_for.<locals>.wrapper1   sJ    		"	"	H 	H 	H 	H 	H 	H 
#	"	H
 r   )r#   r$   r    r%   r   )r   r/   s   ` r   checker_forr0   /   s(          Nr   RawDetectorDetectorz7typing.Final[typing.OrderedDict[PackageType, Detector]]	DETECTORS(typing.Callable[[RawDetector], Detector]c                     d fd}|S )z
    Same as :func:`~checker_for`, but also registers checker in the registry of detectors.

    .. warning::

        All detectors must be defined in the order they must be used to check for a package type.
    r#   r1   r    r2   c                     t                    |           }t                              |          |urt          dj         d          |S )Nzdetector for "z" is already registered)r0   r3   
setdefault
ValueErrorvalue)r#   resultr   s     r   registerzdetector_for.<locals>.registerI   sW    4;|44X>>f55VCCYl.@YYYZZZr   )r#   r1   r    r2   r   )r   r;   s   ` r   detector_forr<   A   s(         
 Or   r9   r   optionstyping.Optional[str]c                B    |D ]}|                      |          r|c S dS )zSFind a first applicable postfix for a :code:`value` from available :code:`options`.Nendswith)r9   r=   options      r   find_postfixrC   Q   s:       >>&!! 	MMM	4r   filenamec                   t                               d|            |                     d          rdS |                     d          r	 t          j        | d          5 }|                    d           ddd           n# 1 swxY w Y   n+# t          $ r t                               d           Y dS w xY wt                               d	           dS t                               d
           dS )z
    Check if :code:`filename` is a conda package.

    :return: File extension if it is a conda package, otherwise - :code:`None`.
    z#Testing if %s is a conda package ..z.condaz.tar.bz2zr:bz2)modezinfo/index.jsonNz=Not a conda package: no 'info/index.json' file in the tarballzThis is a conda packagez9Not a conda package (should be a .tar.bz2 or .conda file))loggerdebugrA   tarfileopen	getmemberKeyError)rD   tar_files     r   is_condarN   Z   s3    LL6AAA"" x$$ 		hW555 6""#45556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 	 	 	LLXYYY44	 	.///z
LLLMMM4s6   	B B5B BB B	B $B54B5c                &   t           j        j        }t                              d| |           |                     d          rt                              d|           dS t          | dd          }|t                              d|           dS t          j        |           5 }t          d |
                                D                       r|cddd           S 	 ddd           n# 1 swxY w Y   t                              d	|           dS )
z
    Check if :code:`filename` is a python package.

    :return: File extension if it is a python package, otherwise - :code:`None`.
    z Testing if %s is a %s package ..z.whlzThis is a %s wheel package.tar.gztgzNz9This is not a %s package (expected .tgz, .tar.gz or .whl)c              3  @   K   | ]}|                     d           V  dS )z	/PKG-INFONr@   ).0names     r   	<genexpr>zis_pypi.<locals>.<genexpr>   s.      JJdt}}[))JJJJJJr   z4This is not a %s package (no '/PKG-INFO' in tarball))r	   STANDARD_PYTHONlabelrG   rH   rA   rC   rI   rJ   anygetnames)rD   package_type_labelr:   rM   s       r   is_pypir[   r   sd    *9?
LL3X?QRRR   13EFFFv#/)U#K#KF~PRdeeet	h		 8JJh6G6G6I6IJJJJJ 	       	               LLGI[\\\4s   $-C++C/2C/c                   t                               d|            t          | dd          }|t                               d           dS t          j        |           5 }d}|                                D ]O}|                    d          r|dz  }n|                    d	          r|d
z  }n9|dk    r|c cddd           S P	 ddd           n# 1 swxY w Y   t                               d           dS )z
    Check if :code:`filename` is an r package.

    :return: File extension if it is an r package, otherwise - :code:`None`.
    z Testing if %s is an R package ..rP   rQ   Nz2This not is an R package (expected .tgz, .tar.gz).r   z/DESCRIPTION   z
/NAMESPACE      zFThis not is an R package (no '*/DESCRIPTION' and '*/NAMESPACE' files).)rG   rH   rC   rI   rJ   rY   rA   )rD   r:   rM   flagsrT   s        r   is_rra      sf    LL3X>>>#/)U#K#KF~IJJJt	h		 8%%'' 	 	D}}^,, 
|,, 
zz        	               LLYZZZ4s   ACCCCc                    t                               d|            t          | d          }|t                               d           |S )z~
    Check if :code:`filename` is a notebook.

    :return: File extension if it is a notebook, otherwise - :code:`None`.
    z!Testing if %s is an ipynb file ..z.ipynbNzNot an ipynb filerG   rH   rC   rD   r:   s     r   is_ipynbre      sE     LL4h???#/(#C#CF~()))Mr   c                    t                               d|            t          | dd          }|t                               d           |S )z
    Check if :code:`filename` is an environment.

    :return: File extension if it is an environment, otherwise - :code:`None`.
    z'Testing if %s is an environment file ..z.ymlz.yamlNzNot an environment filerc   rd   s     r   is_environmentrg      sG     LL:HEEE#/&'#J#JF~.///Mr   ztyping.Final[Detector]is_installerc                    t                               d|            t          j        |           rdS t	          | d          }|t                               d           |S )z|
    Check if :code:`filename` is a project.

    :return: File extension if it is a project, otherwise - :code:`None`.
    zTesting if %s is a project .. z.pyNzNot a project)rG   rH   r   isdirrC   rd   s     r   
is_projectrl      s[     LL0(;;;z( r#/%#@#@F~_%%%Mr   typing.Union[str, bytes]c                    t          | t                    r|                     dd          } t                              |d          }|o
 ||           S )zOCollect package metadata on a :code:`filename` with known :code:`package_type`.utf-8ignoreerrorsN)
isinstancebytesdecoder3   get)rD   r   detectors      r   complete_package_metarx      sQ    (E"" =??78?<<*3--d*K*KH****r   c                    t          | t                    r|                     dd          } t                                          D ]} ||           x}r|c S dS )zIDetect package type of a :code:`filename` with additional metadata on it.ro   rp   rq   N)rs   rt   ru   r3   values)rD   rw   r:   s      r   r   r      sr    (E"" =??78?<< $$&&  Xh'''6 	MMM	 4r   c                2    t          |           }|o|j        S )z=Detect an extension of a package located at :code:`filename`.)r   r   rd   s     r   r   r      s    )(33F&f&&r   typing.Optional[PackageType]c                2    t          |           }|o|j        S )z,Detect a package type of a :code:`filename`.)r   r   rd   s     r   r   r      s    )(33F)f))r   PackageAttributesReleaseAttributesFileAttributes
Attributesc                      e Zd ZdZddZdS )	Inspectorz(Common interface for package inspectors.rD   r   fileobjtyping.BinaryIOr'   
typing.Anyr)   r    r   c                    dS )zCollect metadata on a package.Nr   )selfrD   r   r'   r)   s        r   __call__zInspector.__call__  s      r   N)
rD   r   r   r   r'   r   r)   r   r    r   )r   r   r   r   r   r   r   r   r   r     s.        22- - - - - -r   r   c                :    i ddit          j        |           i dfS )z#Collect metadata on a generic file.descriptionrj   )basenameattrs)r   r   )rD   r   r'   r)   s       r   inspect_filer   
  s'    r"x1H1HSU$V$VVVr   z4typing.Final[typing.Mapping[PackageType, Inspector]]
INSPECTORSr'   r   r)   c                    t          |d          5 }t          |          ||g|R i |cddd           S # 1 swxY w Y   dS )z)Collect metadata attributes on a package.rbN)rJ   r   )r   rD   r'   r)   r   s        r   r   r     s     
h		 L,''KDKKKFKKL L L L L L L L L L L L L L L L L Ls   599)r   r	   r    r!   )r   r	   r    r4   )r9   r   r=   r   r    r>   )rD   r   r    r>   )rD   rm   r   r	   r    r   )rD   rm   r    r   )rD   rm   r    r>   )rD   rm   r    r|   )
r   r	   rD   r   r'   r   r)   r   r    r   )Nr   
__future__r   __all__collectionsr-   loggingrI   typingosr   binstar_client.utils.configr	   $binstar_client.inspect_package.condar
   binstar_client.inspect_packager   #binstar_client.inspect_package.pypir    binstar_client.inspect_package.rr   $binstar_client.inspect_package.ipynbr   "binstar_client.inspect_package.envr   TYPE_CHECKINGtyping_extensions	ParamSpecr   	getLoggerrG   
NamedTupler   Optionalr   r   r   r   r0   Callabler1   r2   OrderedDictr3   r<   rC   CONDArN   rV   r[   
STANDARD_Rra   NOTEBOOKre   ENVrg   	INSTALLERrh   PROJECTrl   rx   r   r   r   DictAnyr~   r   r   Tupler   Protocolr   r   inspect_packageFILEr   r   r   r   r   <module>r      s   7 6 6 " " " " " "
a
a
a                  3 3 3 3 3 3 F F F F F F : : : : : : D D D D D D > > > > > > F F F F F F B B B B B B	 )##C((A 
	+	,	,    6    $*?3#7 7 7 7 7'-t'< < < < <
 
 
 
 ,2?C5#:+F F F F F(.w(G G G G GE\[E\E^E^	 ^ ^ ^ ^        k     ! . k)**   +*. k$%%   &%8 k"##
 
 
 $#
 ko
 
 
 
 (LL&''(DEE     
 k!""   #"+ + + +   ' ' ' '* * * * 28S&*_1M  M M M M17S&*_1M  M M M M.4k#vz/.J J J J J*0,7HJ[]k7k*l
 l l l l- - - - - - - -W W W ,!5-/O(?:lD
    L L L L L Lr   