o
    JAfn                     @   s  d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlZddlZddl
Z
ddlZddl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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# ddl$m%Z% ddl&m'Z' ddlm(Z( dj)ej* Z+dd Z,G dd dZ-G dd de-eZ.G dd deZG dd deZ/dd Z0d d! Z1d"d# Z2d$d% Z3d&d' Z4d(d) Z5d*d+ Z6d,d- Z7d9d/d0Z8d1d2 Z9d3d4 Z:d:d5d6Z;G d7d8 d8e(Z<dS );zUsetuptools.command.egg_info

Create a distribution's .egg-info directory and contents    )FileList)DistutilsInternalError)convert_path)logN   )metadata)_entry_points_normalization)Command)sdist)walk_revctrl)edit_config)	bdist_egg)glob)	packaging)yield_lines)SetuptoolsDeprecationWarningz{}.{}c                 C   s  d}|  tjj}ttj}d|f }t|D ]\}}|t|d k}|dkr8|r/|d7 }n|d||f 7 }qd}t|}	||	k r|| }
|
dkrQ||d 7 }n|
d	krZ||7 }nx|
d
kr|d }||	k rp|| dkrp|d }||	k r~|| dkr~|d }||	k r|| dkr|d }||	k r|| dks||	kr|t|
7 }n0||d | }d}|d dkrd}|dd }|t|7 }|d|f 7 }|}n|t|
7 }|d7 }||	k sB|s||7 }q|d7 }tj|tj	tj
B dS )z
    Translate a file path glob like '*.txt' in to a regular expression.
    This differs from fnmatch.translate which allows wildcards to match
    directory separators. It also knows about '**/' which matches any number of
    directories.
     z[^%s]   **z.*z
(?:%s+%s)*r   *?[!]^Nz[%s]z\Z)flags)splitospathsepreescape	enumeratelencompile	MULTILINEDOTALL)r   patchunksr    
valid_charcchunk
last_chunki	chunk_lencharinner_iinner
char_class r4   ]/usr/lib/python3.10/site-packages/setuptools-67.5.1-py3.10.egg/setuptools/command/egg_info.pytranslate_pattern'   s\   


-r6   c                   @   sf   e Zd ZdZdZedd Zdd Zdd Zde	d	e
fd
dZd	e	fddZd	e	fddZeeZdS )
InfoCommonNc                 C   s   t | j S N)r	   	safe_namedistributionget_nameselfr4   r4   r5   name~   s   zInfoCommon.namec                 C   s   |  | j }t|S r8   )
_maybe_tagr:   get_versionr	   best_effort_version)r=   taggedr4   r4   r5   tagged_version   s   
zInfoCommon.tagged_versionc                 C   s   | j r
| |r
|S || j  S )z
        egg_info may be called more than once for a distribution,
        in which case the version string already contains all tags.
        )vtags_already_taggedr=   versionr4   r4   r5   r?      s   zInfoCommon._maybe_tagrG   returnc                 C   s   | | jp| |  S r8   )endswithrD   
_safe_tagsrF   r4   r4   r5   rE         zInfoCommon._already_taggedc                 C   s   t d| j dd  S )N0r   )r	   rA   rD   r<   r4   r4   r5   rJ      rK   zInfoCommon._safe_tagsc                 C   s,   d}| j r
|| j 7 }| jr|td7 }|S )Nr   z%Y%m%d)	tag_buildtag_datetimestrftimerF   r4   r4   r5   tags   s   
zInfoCommon.tags)__name__
__module____qualname__rM   rN   propertyr>   rC   r?   strboolrE   rJ   rQ   rD   r4   r4   r4   r5   r7   z   s    

r7   c                   @   s   e Zd ZdZg dZdgZddiZdd Zedd Z	e	j
d	d Z	d
d Zdd ZedfddZdddZdd Zdd Zdd Zdd Zdd ZdS )egg_infoz+create a distribution's .egg-info directory))z	egg-base=ezLdirectory containing .egg-info directories (default: top of the source tree))tag-datedz0Add date stamp (e.g. 20050528) to version number)z
tag-build=bz-Specify explicit tag to add to version number)no-dateDz"Don't include date stamp [default]rZ   r]   c                 C   s(   d | _ d | _d | _d | _d| _d| _d S )NF)egg_baseegg_namerX   egg_versionbroken_egg_infoignore_egg_info_in_manifestr<   r4   r4   r5   initialize_options   s   
zegg_info.initialize_optionsc                 C      d S r8   r4   r<   r4   r4   r5   tag_svn_revision      zegg_info.tag_svn_revisionc                 C   re   r8   r4   )r=   valuer4   r4   r5   rf      rg   c                 C   s0   t  }|  |d< d|d< t|t|d dS )z
        Materialize the value of date into the
        build tag. Install build keys in a deterministic order
        to avoid arbitrary reordering on subsequent builds.
        rM   r   rN   )rX   N)collectionsOrderedDictrQ   r   dict)r=   filenamerX   r4   r4   r5   save_version_info   s   zegg_info.save_version_infoc              
   C   sl  | j | _|  | _tj| j}zt|tjj}|rdnd}tj	|| j| jf  W n t
yD } ztjd| j| jf |d }~ww | jd u rX| jj}|pQi dtj| _| d t| jd | _| jtjkrvtj| j| j| _d| jv r|   | j| jj_| jj}t|dd pt|d	d }|d ur|| j kr| j|_tj| j|_ d | j_d S d S d S )
Nz%s==%sz%s===%sz2Invalid distribution name or version syntax: %s-%sr   r_   	.egg-info-keyr>   )!r>   r`   rC   ra   r   rG   Version
isinstancerequirementsRequirement
ValueError	distutilserrorsDistutilsOptionErrorr_   r:   package_dirgetr   curdirensure_dirnamer	   filename_componentrX   r   joincheck_broken_egg_infor   _patched_distgetattrlower_version_parsed_version)r=   parsed_version
is_versionspecrY   dirspdrp   r4   r4   r5   finalize_options   sD   




zegg_info.finalize_optionsNc                 C   s   t | j| j||S )0Compute filename of the output egg. Private API.)_egg_basenamer`   ra   )r=   
py_versionplatformr4   r4   r5   _get_egg_basename  s   zegg_info._get_egg_basenameFc                 C   sR   |r|  ||| dS tj|r'|du r |s td|| dS | | dS dS )a  Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        Nz$%s not set in setup(), but %s exists)
write_filer   r   existsr   warndelete_file)r=   whatrl   dataforcer4   r4   r5   write_or_delete_file  s   	zegg_info.write_or_delete_filec                 C   sB   t d|| |d}| jst|d}|| |  dS dS )zWrite `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        zwriting %s to %sutf-8wbN)r   infoencodedry_runopenwriteclose)r=   r   rl   r   fr4   r4   r5   r     s   


zegg_info.write_filec                 C   s$   t d| | jst| dS dS )z8Delete `filename` (if not a dry run) after announcing itzdeleting %sN)r   r   r   r   unlink)r=   rl   r4   r4   r5   r   (  s   zegg_info.delete_filec              
   C   s   |  | j z	t| jd  W n ty) } zd| j d}tj||d }~ww tj	ddD ]}|
 }|| |jtj| j|j q0tj| jd}tj|rX| | |   d S )Nz'Cannot update time stamp of directory ''zegg_info.writers)groupznative_libs.txt)mkpathrX   r   utimeOSErrorrv   rw   DistutilsFileErrorr   entry_pointsloadr>   r   r~   r   r   find_sources)r=   rY   msgepwriternlr4   r4   r5   run.  s   
zegg_info.runc                 C   s<   t j| jd}t| j}| j|_||_|	  |j
| _
dS )z"Generate SOURCES.txt manifest filezSOURCES.txtN)r   r   r~   rX   manifest_makerr:   rc   ignore_egg_info_dirmanifestr   filelist)r=   manifest_filenamemmr4   r4   r5   r   @  s   
zegg_info.find_sourcesc                 C   sX   | j d }| jtjkrtj| j|}tj|r*td|| j	 | j	| _
|| _	d S d S )Nrn   aB  ------------------------------------------------------------------------------
Note: Your current .egg-info directory has a '-' in its name;
this will not work correctly with "setup.py develop".

Please rename %s to %s to correct this problem.
------------------------------------------------------------------------------)r`   r_   r   r{   r   r~   r   r   r   rX   rb   )r=   beir4   r4   r5   r   I  s   

zegg_info.check_broken_egg_infoF)rR   rS   rT   descriptionuser_optionsboolean_optionsnegative_optrd   rU   rf   setterrm   r   PY_MAJORr   r   r   r   r   r   r   r4   r4   r4   r5   rX      s(    

.
	rX   c                       s   e Zd Zd! fdd	Zdd Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd  Z  ZS )"r   NFc                    s   t  || || _d S r8   )super__init__r   )r=   r   debug_printr   	__class__r4   r5   r   \  s   
zFileList.__init__c              	   C   s  |  |\}}}}| j| j| j| jt| j|t| j|| j	| j
d}dddddddd	d}z|| }W n tyD   td
j|dw |d}	|dv rQ|g}|	rV|fnd}
|| }| d|g|	rg|gng  |  |D ]}||stj||g|
R   qpd S )N)includeexcludezglobal-includezglobal-excludezrecursive-includezrecursive-excludegraftprunez%warning: no files found matching '%s'z9warning: no previously-included files found matching '%s'z>warning: no files found matching '%s' anywhere in distributionzRwarning: no previously-included files matching '%s' found anywhere in distributionz:warning: no files found matching '%s' under directory '%s'zNwarning: no previously-included files matching '%s' found under directory '%s'z+warning: no directories found matching '%s'z6no previously-included directories found matching '%s'z/this cannot happen: invalid action '{action!s}')actionz
recursive->   r   r   r4    )_parse_template_liner   r   global_includeglobal_exclude	functoolspartialrecursive_includerecursive_excluder   r   KeyErrorr   format
startswithr   r~   r   r   )r=   liner   patternsdirdir_pattern
action_maplog_mapprocess_actionaction_is_recursiveextra_log_argslog_tmplpatternr4   r4   r5   process_template_line`  sf   

zFileList.process_template_linec                 C   sR   d}t t| jd ddD ]}|| j| r&| d| j|   | j|= d}q|S )z
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        Fr   z
 removing T)ranger$   filesr   )r=   	predicatefoundr.   r4   r4   r5   _remove_files  s   zFileList._remove_filesc                 C   $   dd t |D }| | t|S )z#Include files that match 'pattern'.c                 S      g | ]
}t j|s|qS r4   r   r   isdir.0r   r4   r4   r5   
<listcomp>  s    z$FileList.include.<locals>.<listcomp>r   extendrW   r=   r   r   r4   r4   r5   r     s   
zFileList.includec                 C   s   t |}| |jS )z#Exclude files that match 'pattern'.)r6   r   matchr=   r   r   r4   r4   r5   r     s   zFileList.excludec                 C   s8   t j|d|}dd t|ddD }| | t|S )zN
        Include all files anywhere in 'dir/' that match the pattern.
        r   c                 S   r   r4   r   r   r4   r4   r5   r     s    

z.FileList.recursive_include.<locals>.<listcomp>T)	recursive)r   r   r~   r   r   rW   )r=   r   r   full_patternr   r4   r4   r5   r     s   
zFileList.recursive_includec                 C   s    t tj|d|}| |jS )zM
        Exclude any file anywhere in 'dir/' that match the pattern.
        r   r6   r   r   r~   r   r   )r=   r   r   r   r4   r4   r5   r     s   zFileList.recursive_excludec                 C   r   )zInclude all files from 'dir/'.c                 S   s"   g | ]}t j|D ]}|q
qS r4   )rv   r   findall)r   	match_diritemr4   r4   r5   r     s    
z"FileList.graft.<locals>.<listcomp>r   )r=   r   r   r4   r4   r5   r     s
   
zFileList.graftc                 C   s   t tj|d}| |jS )zFilter out files from 'dir/'.r   r   )r=   r   r   r4   r4   r5   r     s   zFileList.prunec                    sJ   | j du r	|   ttjd|  fdd| j D }| | t|S )z
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        Nr   c                    s   g | ]	}  |r|qS r4   r   r   r   r4   r5   r     s    z+FileList.global_include.<locals>.<listcomp>)allfilesr   r6   r   r   r~   r   rW   r   r4   r   r5   r     s   

zFileList.global_includec                 C   s   t tjd|}| |jS )zD
        Exclude all files anywhere that match the pattern.
        r   r   r   r4   r4   r5   r     s   zFileList.global_excludec                 C   s<   | dr|d d }t|}| |r| j| d S d S )Nr   )rI   r   
_safe_pathr   append)r=   r   r   r4   r4   r5   r     s   

zFileList.appendc                 C   s   | j t| j| d S r8   )r   r   filterr   )r=   pathsr4   r4   r5   r      s   zFileList.extendc                 C   s   t t| j| j| _dS )z
        Replace self.files with only safe paths

        Because some owners of FileList manipulate the underlying
        ``files`` attribute directly, this method must be called to
        repair those paths.
        N)listr   r   r   r<   r4   r4   r5   _repair  s   zFileList._repairc              	   C   s   d}t |}|d u rtd|  dS t |d}|d u r't||d dS z"d|v p/d|v }| jr8|r8W dS tj|sDtj|rGW dS W d S  t	y\   t||t
  Y d S w )Nz!'%s' not %s encodable -- skippingz''%s' in unexpected encoding -- skippingFr   rn   s	   .egg-infoT)unicode_utilsfilesys_decoder   r   
try_encoder   r   r   r   UnicodeEncodeErrorsysgetfilesystemencoding)r=   r   enc_warnu_path	utf8_pathis_egg_infor4   r4   r5   r     s&   

zFileList._safe_path)NNF)rR   rS   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r4   r4   r   r5   r   Y  s     M


r   c                   @   st   e Zd ZdZdd Zdd Z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dS )r   zMANIFEST.inc                 C   s"   d| _ d| _d| _d| _d| _d S )Nr   F)use_defaultsr   manifest_onlyforce_manifestr   r<   r4   r4   r5   rd   ,  s
   
z!manifest_maker.initialize_optionsc                 C   re   r8   r4   r<   r4   r4   r5   r   3  s   zmanifest_maker.finalize_optionsc                 C   sz   t | jd| _tj| js|   |   tj| j	r!| 
  |   |   |   | j  | j  |   d S )N)r   )r   r   r   r   r   r   r   write_manifestadd_defaultstemplateread_templateadd_license_files_add_referenced_filesprune_file_listsortremove_duplicatesr<   r4   r4   r5   r   6  s   

zmanifest_maker.runc                 C   s   t |}|tjdS )N/)r   r  replacer   r    )r=   r   r4   r4   r5   _manifest_normalizeD  s   
z"manifest_maker._manifest_normalizec                    sB    j    fdd j jD }d j } t j|f| dS )zo
        Write the file list in 'self.filelist' to the manifest file
        named by 'self.manifest'.
        c                    s   g | ]}  |qS r4   )r  r   r<   r4   r5   r   P  s    z1manifest_maker.write_manifest.<locals>.<listcomp>zwriting manifest file '%s'N)r   r   r   r   executer   )r=   r   r   r4   r<   r5   r  H  s   

zmanifest_maker.write_manifestc                 C   s   |  |st| | d S d S r8   )_should_suppress_warningr   r   )r=   r   r4   r4   r5   r   T  s   
zmanifest_maker.warnc                 C   s   t d| S )z;
        suppress missing-file warnings from sdist
        zstandard file .*not found)r!   r   )r   r4   r4   r5   r  X  s   z'manifest_maker._should_suppress_warningc                 C   s   t |  | j| j | j| j tt }|r!| j| nt	j
| jr,|   t	j
dr8| jd | d}| j|j d S )Nzsetup.pyrX   )r   r  r   r   r  r   r   r   r   r   r   r   read_manifestget_finalized_commandr   rX   )r=   rcfilesei_cmdr4   r4   r5   r  _  s   


zmanifest_maker.add_defaultsc                 C   s4   | j jjpg }|D ]}td| q	| j| d S )Nzadding license file '%s')r:   r   license_filesr   r   r   r   )r=   r   lfr4   r4   r5   r  q  s   z manifest_maker.add_license_filesc                 C   s4   t | jdg }|D ]}td| q	| j| dS )zGAdd files referenced by the config (e.g. `file:` directive) to filelist_referenced_filesz%adding file referenced by config '%s'N)r   r:   r   debugr   r   )r=   
referencedrfr4   r4   r5   r  w  s   z$manifest_maker._add_referenced_filesc                 C   sZ   |  d}| j }| j|j | j| ttj	}| jj
d| d | dd d S )Nbuildz(^|z)(RCS|CVS|\.svn)r   )is_regex)r  r:   get_fullnamer   r   
build_baser!   r"   r   r    exclude_pattern)r=   r&  base_dirr    r4   r4   r5   r    s   


zmanifest_maker.prune_file_listc                 C   s&   t |dr	| S tdt | S )a0  
        The parent class implementation of this method
        (``sdist``) will try to include data files, which
        might cause recursion problems when
        ``include_package_data=True``.

        Therefore, avoid triggering any attempt of
        analyzing/building the manifest again.
        get_data_files_without_manifestzCustom 'build_py' does not implement 'get_data_files_without_manifest'.
Please extend command classes from setuptools instead of distutils.)hasattrr,  warningsr   r   get_data_files)r=   build_pyr4   r4   r5   _safe_data_files  s   

zmanifest_maker._safe_data_filesN)rR   rS   rT   r  rd   r   r   r  r  r   staticmethodr  r  r  r  r  r1  r4   r4   r4   r5   r   )  s    
	r   c                 C   sN   d |}|d}t| d}|| W d   dS 1 s w   Y  dS )z{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    
r   r   N)r~   r   r   r   )rl   contentsr   r4   r4   r5   r     s
   

"r   c              	   C   s   t d| | jsE| jj}| j|j|_}| j|j|_}z|	| j
 W |||_|_n|||_|_w t| jdd }t| j
| d S d S )Nz
writing %szip_safe)r   r   r   r:   r   ra   rG   r`   r>   write_pkg_inforX   r   r   write_safety_flag)cmdbasenamerl   r   oldveroldnamesafer4   r4   r5   r6    s    r6  c                 C   s   t j|rtd d S d S )NzsWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.)r   r   r   r   r   r8  r9  rl   r4   r4   r5   warn_depends_obsolete  s
   r>  c                 C   s,   t |pd}dd }t||}| | d S )Nr4   c                 S   s   | d S )Nr3  r4   )r   r4   r4   r5   	append_cr  s   z&_write_requirements.<locals>.append_cr)r   map
writelines)streamreqslinesr?  r4   r4   r5   _write_requirements  s   
rE  c                 C   sn   | j }t }t||j |jpi }t|D ]}|djdi t	  t|||  q| 
d||  d S )Nz
[{extra}]
rs   r4   )r:   ioStringIOrE  install_requiresextras_requiresortedr   r   varsr   getvalue)r8  r9  rl   distr   rI  extrar4   r4   r5   write_requirements  s   
rO  c                 C   s,   t  }t|| jj | d||  d S )Nzsetup-requirements)rF  rG  rE  r:   setup_requiresr   rL  )r8  r9  rl   r   r4   r4   r5   write_setup_requirements  s   rQ  c                 C   s:   t dd | j D }| d|dt|d  d S )Nc                 S   s   g | ]
}| d dd qS ).r   r   )r   )r   kr4   r4   r5   r     s    z(write_toplevel_names.<locals>.<listcomp>ztop-level namesr3  )rk   fromkeysr:   iter_distribution_namesr   r~   rJ  )r8  r9  rl   pkgsr4   r4   r5   write_toplevel_names  s    rW  c                 C   s   t | ||d d S )NT)	write_argr=  r4   r4   r5   overwrite_arg  s   rY  Fc                 C   sH   t j|d }t| j|d }|d urd|d }| |||| d S )Nr   r3  )r   r   splitextr   r:   r~   r   )r8  r9  rl   r   argnamerh   r4   r4   r5   rX    s
   rX  c                 C   s,   t | jj}t |}| d||d d S )Nzentry pointsT)r   r   r:   r   renderr   )r8  r9  rl   epsdefnr4   r4   r5   write_entries  s   
r_  c                  C   s   t dt tjdr?td&} | D ]}t	d|}|r.t
|d  W  d   S qW d   dS 1 s:w   Y  dS )zd
    Get a -r### off of PKG-INFO Version in case this is an sdist of
    a subversion revision.
    z$get_pkg_info_revision is deprecated.zPKG-INFOzVersion:.*-r(\d+)\s*$r   Nr   )r.  r   EggInfoDeprecationWarningr   r   r   rF  r   r!   r   intr   )r   r   r   r4   r4   r5   get_pkg_info_revision  s    
rb  c                 C   sB   t | }t |}| d| d|pt }|r|d| 7 }|S )r   ro   z-py)r	   r}   r   )r`   ra   r   r   r>   rG   eggr4   r4   r5   r     s   

r   c                   @   s   e Zd ZdZdS )r`  z?Deprecated behavior warning for EggInfo, bypassing suppression.N)rR   rS   rT   __doc__r4   r4   r4   r5   r`    s    r`  r   )NN)=rd  distutils.filelistr   	_FileListdistutils.errorsr   distutils.utilr   rv   r   r   r   r!   r  rF  r.  rO   ri   
_importlibr   r   r   r	   
setuptoolsr
   setuptools.command.sdistr   r   Zsetuptools.command.setoptr   setuptools.commandr   setuptools.unicode_utilsr   setuptools.globr   setuptools.externr   setuptools.extern.jaraco.textr   r   r   version_infor   r6   r7   rX   r   r   r6  r>  rE  rO  rQ  rW  rY  rX  r_  rb  r   r`  r4   r4   r4   r5   <module>   s`    S* 6 Qu	



