o
    yAf9s                     @  sd  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	m
Z
 d dlmZ d dlmZmZmZ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 d d	lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d d
l%m&Z&m'Z' er~d dl(m)Z) d dlm*Z* dZ+ee,e,e,e,e,e,f Z-G dd deZ.G dd dZ/G dd dZ0G dd deZ1G dd deZ2dS )    )annotationsN)cached_property)StringIO)TYPE_CHECKINGAnyCallableIterable
NamedTupleSequenceTuplecast)__version__)BuilderConfig)BuilderInterface)format_file_hashget_known_python_major_versionsget_reproducible_timestampnormalize_archive_pathnormalize_file_permissionsnormalize_inclusion_mapreplace_fileset_zip_info_mode)DEFAULT_METADATA_VERSIONget_core_metadata_constructors)TracebackType)IncludedFilez0.3c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )FileSelectionOptions	list[str]includeexcludepackagesonly_includeN)__name__
__module____qualname____annotations__ r&   r&   =/usr/lib/python3.10/site-packages/hatchling/builders/wheel.pyr   (   s
   
 r   c                   @  s>   e Zd ZdddZdddZdd
dZdddZdddZdS )
RecordFilereturnNonec                 C  s"   t  | _tj| jdddd| _d S )N,"
)	delimiter	quotecharlineterminator)r   _RecordFile__file_objcsvwriter_RecordFile__writerselfr&   r&   r'   __init__0   s   zRecordFile.__init__recordIterable[Any]c                 C  s   | j | d S N)r4   writerow)r6   r8   r&   r&   r'   write4   s   zRecordFile.writestrc                 C  s
   | j  S r:   )r1   getvaluer5   r&   r&   r'   	construct7   s   
zRecordFile.constructc                 C     | S r:   r&   r5   r&   r&   r'   	__enter__:      zRecordFile.__enter__exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebackTracebackType | Nonec                 C  s   | j   d S r:   )r1   closer6   rC   rE   rG   r&   r&   r'   __exit__=   s   zRecordFile.__exit__N)r)   r*   )r8   r9   r)   r*   r)   r=   )r)   r(   rC   rD   rE   rF   rG   rH   r)   r*   )r"   r#   r$   r7   r<   r?   rA   rK   r&   r&   r&   r'   r(   /   s    



r(   c                   @  sj   e Zd Zd)ddZed*d
dZd+ddZd,ddZd-ddZd.ddZ	d,ddZ
d/ddZd0d&d'Zd(S )1WheelArchive
project_idr=   reproducibleboolr)   r*   c                C  sv   | d| _ | d| _d| _|| _| jr|  | _nd| _tjdd\}| _t	|d| _
tj| j
dtjd| _dS )	z<
        https://peps.python.org/pep-0427/#abstract
        z
.dist-infoz.dataN.whl)suffixzw+bw)compression)metadata_directoryshared_data_directory
time_tuplerP   get_reproducible_time_tupletempfilemkstemppathosfdopenfdzipfileZipFileZIP_DEFLATEDzf)r6   rO   rP   Zraw_fdr&   r&   r'   r7   D   s   zWheelArchive.__init__
TIME_TUPLEc                  C  s<   ddl m } m} | t |j}|j|j|j|j|j	|j
fS )Nr   )datetimetimezone)re   rf   fromtimestampr   utcyearmonthdayhourminutesecond)re   rf   dr&   r&   r'   rY   V   s   z(WheelArchive.get_reproducible_time_tupleincluded_filer   tuple[str, str, str]c              	   C  s(  t |j}t|j}| jr2t|tt	| j
}t|j}t||d@  t|jr1| jdO  _ntj|j|}tj|_t }t|jd3}| j|d}	 |d}	|	sZn||	 ||	 qRW d    n1 sow   Y  W d    n1 s~w   Y  t| }
|d|
 t|jfS )Ni     rbrT   Ti @  sha256=)r   distribution_pathr]   statr\   rP   r`   ZipInfor   rd   rX   r   st_moder   S_ISDIRexternal_attr	from_filerb   compress_typehashlibsha256openrc   readupdater<   r   digestr=   st_size)r6   rp   relative_pathZ	file_statzip_infoZnew_modehash_objin_fileout_filechunkhash_digestr&   r&   r'   add_file]   s4   




 	zWheelArchive.add_filer   contentsstr | bytesc                 C  s    | j  dt| }| ||S )N/)rV   r   
write_file)r6   r   r   r&   r&   r'   write_metadata{   s   zWheelArchive.write_metadatashared_filec                 C     | j  d|j |_| |S )Nz/data/)rW   ru   r   )r6   r   r&   r&   r'   add_shared_file   s   
zWheelArchive.add_shared_fileextra_metadata_filec                 C  r   )Nz/extra_metadata/)rV   ru   r   )r6   r   r&   r&   r'   add_extra_metadata_file   s   
z$WheelArchive.add_extra_metadata_filec                 C  st   t |ts
|d}| jpd}t||}t| t|}t	|
 }| jj||tjd |d| tt|fS )Nzutf-8)i     r   r   r   r   )r|   rt   )
isinstancebytesencoderX   r`   rw   r   r}   r~   r   r   rc   writestrrb   r=   len)r6   r   r   rX   r   r   r   r&   r&   r'   r      s   



zWheelArchive.write_filec                 C  r@   r:   r&   r5   r&   r&   r'   rA      rB   zWheelArchive.__enter__rC   rD   rE   rF   rG   rH   c                 C  s   | j   | j  d S r:   )rc   rI   r_   rJ   r&   r&   r'   rK      s   
zWheelArchive.__exit__N)rO   r=   rP   rQ   r)   r*   )r)   rd   )rp   r   r)   rq   )r   r=   r   r   r)   rq   )r   r   r)   rq   )r   r   r)   rq   )r)   rN   rM   )r"   r#   r$   r7   staticmethodrY   r   r   r   r   r   rA   rK   r&   r&   r&   r'   rN   C   s    






rN   c                      s   e Zd Zd* fddZed+d	d
Zd,ddZd,ddZd,ddZd,ddZ	e
d-ddZe
d.ddZe
d.ddZe
d/ddZe
d/dd Zed/d!d"Zejd#v r`ed0d'd(Z  ZS ed0d)d(Z  ZS )1WheelBuilderConfigargsr   kwargsr)   r*   c                   s4   t  j|i | d | _d | _d | _d | _d | _d S r:   )superr7   ._WheelBuilderConfig__core_metadata_constructor _WheelBuilderConfig__shared_data#_WheelBuilderConfig__extra_metadata"_WheelBuilderConfig__strict_naming%_WheelBuilderConfig__macos_max_compat)r6   r   r   	__class__r&   r'   r7      s   
zWheelBuilderConfig.__init__r   c              	   C  s
  | j d| jdg }| j d| jdg }| j d| jdg }| j d| jdg }|s6|s6|r=t||||S | j| jjjj| j| jjjj	fD ]}t
jt
j| j|drq| | j|}tg ||gg   S t
jt
j| jd|dr| t
j| jd|}tg |d| gg   S | d}t
jt
j| j|rtg |g |g  S d	d
lm} |t
j| jd|d}	t|	dkrt
j|	d	 | j}
|
t
jd	 }tg ||gg   S qQ| js| jd us|  r|   tg |g g S d}t|)Nr   r   r    zonly-includez__init__.pysrczsrc/.pyr   )glob*   a  Unable to determine which files to ship inside the wheel using the following heuristics: https://hatch.pypa.io/latest/plugins/builder/wheel/#default-file-selection

At least one file selection option must be defined in the `tool.hatch.build.targets.wheel` table, see: https://hatch.pypa.io/latest/config/build/

As an example, if you intend to ship a directory named `foo` that resides within a `src` directory located at the root of your project, you can define the following:

[tool.hatch.build.targets.wheel]
packages = ["src/foo"])target_configgetbuild_configr   Zbuildernormalize_file_name_componentmetadatacoreraw_namenamer]   r\   isfilejoinrootget_raw_fs_path_namer   r   relpathsplitsepbypass_selectionZbuild_artifact_specget_force_includeZset_exclude_all
ValueError)r6   r   r   r    r!   project_nameZnormalized_project_nameZmodule_filer   Zpossible_namespace_packagesr   	namespacemessager&   r&   r'   default_file_selection_options   s>   
	z1WheelBuilderConfig.default_file_selection_optionsr   c                 C     | j jS r:   )r   r   r5   r&   r&   r'   default_include      z"WheelBuilderConfig.default_includec                 C  r   r:   )r   r   r5   r&   r&   r'   default_exclude   r   z"WheelBuilderConfig.default_excludec                 C  r   r:   )r   r    r5   r&   r&   r'   default_packages   r   z#WheelBuilderConfig.default_packagesc                 C  r   r:   )r   r!   r5   r&   r&   r'   default_only_include   r   z'WheelBuilderConfig.default_only_includeCallable[..., str]c              	   C  s   | j d u r=| jdt}t|tsd| j d}t|t }||vr8d| d| j dd	t
| }t||| | _ | j S )Nzcore-metadata-version Field `tool.hatch.build.targets.z(.core-metadata-version` must be a stringzUnknown metadata version `z&` for field `tool.hatch.build.targets.z$.core-metadata-version`. Available: z, )r   r   r   r   r   r=   plugin_name	TypeErrorr   r   sortedr   )r6   Zcore_metadata_versionr   constructorsr&   r&   r'   core_metadata_constructor   s    


z,WheelBuilderConfig.core_metadata_constructordict[str, str]c                 C     | j d u rd| jdi }t|tsd| j d}t|t| dD ]9\}\}}|s9d| d| j d}t	|t|t
sLd| d	| j d
}t||s\d| d	| j d}t	|q#t|| j| _ | j S )Nzshared-datar   z.shared-data` must be a mappingr   Source #$ in field `tool.hatch.build.targets.z'.shared-data` cannot be an empty stringPath for source `%` in field `tool.hatch.build.targets.z.shared-data` must be a string)r   r   r   r   dictr   r   	enumerateitemsr   r=   r   r   )r6   shared_datar   isourcer   r&   r&   r'   r      2   


zWheelBuilderConfig.shared_datac                 C  r   )Nzextra-metadatar   z".extra-metadata` must be a mappingr   r   r   z*.extra-metadata` cannot be an empty stringr   r   z!.extra-metadata` must be a string)r   r   r   r   r   r   r   r   r   r   r=   r   r   )r6   extra_metadatar   r   r   r   r&   r&   r'   r     r   z!WheelBuilderConfig.extra_metadatarQ   c                 C  sp   | j d u r5d| jv r | jd }t|tsd| j d}t|n| jdd}t|ts2d}t||| _ | j S )Nzstrict-namingr   z!.strict-naming` must be a booleanTz8Field `tool.hatch.build.strict-naming` must be a boolean)r   r   r   rQ   r   r   r   r   )r6   strict_namingr   r&   r&   r'   r   A  s   




z WheelBuilderConfig.strict_namingc                 C  sD   | j d u r| jdd}t|tsd| j d}t||| _ | j S )Nzmacos-max-compatTr   z$.macos-max-compat` must be a boolean)r   r   r   r   rQ   r   r   )r6   macos_max_compatr   r&   r&   r'   r   S  s   

z#WheelBuilderConfig.macos_max_compatc                 C  s2   | j dd}t|tsd| j d}t||S )Nzbypass-selectionFr   z$.bypass-selection` must be a boolean)r   r   r   rQ   r   r   )r6   r   r   r&   r&   r'   r   _  s
   
z#WheelBuilderConfig.bypass_selection>   darwinwin32	directoryr=   r   c                 C  s4   |  }t| }|D ]}|  |kr|  S q|S r:   )casefoldr]   listdir)r   r   
normalizedentriesentryr&   r&   r'   r   j  s   
z'WheelBuilderConfig.get_raw_fs_path_namec                 C  s   |S r:   r&   )r   r   r&   r&   r'   r   v     )r   r   r   r   r)   r*   )r)   r   r)   r   )r)   r   )r)   r   )r)   rQ   )r   r=   r   r=   r)   r=   )r"   r#   r$   r7   r   r   r   r   r   r   propertyr   r   r   r   r   r   sysplatformr   r   __classcell__r&   r&   r   r'   r      s2    	
0


!!
r   c                   @  s  e Zd ZdZdZdCddZdDdd	ZdEddZdFddZdFddZ	dFddZ
dFddZdGd!d"ZdHd#d$Z	%dIdGd&d'ZedJd(d)ZdHd*d+Z	%dIdKd,d-ZdHd.d/ZdJd0d1ZdLd2d3ZdLd4d5ZdLd6d7ZdMd8d9ZdNd;d<ZedLd=d>ZedOd@dAZdBS )PWheelBuilderz1
    Build a binary distribution (.whl file)
    wheelr)   dict[str, Callable]c                 C  s   | j | jdS )N)standardeditable)build_standardbuild_editabler5   r&   r&   r'   get_version_api  s   zWheelBuilder.get_version_apir   c                 C  s   dgS )Nr   r&   r5   r&   r&   r'   get_default_versions  s   z!WheelBuilder.get_default_versionsr   r=   versionsr*   c                 C  s2   t |D ]}|drt t j|| qd S )NrR   )r]   r   endswithremover\   r   )r6   r   r   filenamer&   r&   r'   clean  s
   
zWheelBuilder.clean
build_datar   c              	   K  s  d|vr|d r|   |d< n|  |d< t| j| jjdJ}t 7}|  D ]}||}|	| q'| 
||||d  |	|j dddf |d|  W d    n1 s\w   Y  W d    n1 skw   Y  tj|| j d|d  d	}t|j| |S )
Ntag	infer_tagrP   dependencies/RECORD RECORD-rR   )get_best_matching_tagget_default_tagrN   artifact_project_idconfigrP   r(   Zrecurse_included_filesr   r<   
write_datarV   r   r?   r]   r\   r   r   )r6   r   r   archiverecordsrp   r8   targetr&   r&   r'   r     s,   

  zWheelBuilder.build_standardc                 K  s,   | j jr| j|fi |S | j|fi |S r:   )r  dev_mode_dirsbuild_editable_explicitbuild_editable_detection)r6   r   r   r&   r&   r'   r     s   zWheelBuilder.build_editablec                 K  s  ddl m} |  |d< t| j| jjd8}t #}i }|  D ]l}|j	
ds+q"|j}|j}	|tj}
t|
dkrNtj	| j||tj	|d < q"|
d }|	|kratj	| j|||< q"|	tjd }ztj	| j|d ||	  | ||< W q" ty   d}t|d w || jjj| j}| jjr| D ]
\}}||| qn| D ]}|tj	| qt|  D ] \}}|}|
dr|!d	sd	| }|"||}|#| q| $| %|D ]}|&|}|#| qt'|d
 }|( D ]}|}|dkr|dt) 7 }n	 |*| q| +|||| |#|j, dddf |-d|.  W d    n	1 sBw   Y  W d    n	1 sRw   Y  tj	|| j d|d  d}t/|j	| |S )Nr   )EditableProjectr   r   r   r   zDev mode installations are unsupported when any path rewrite in the `sources` option changes a prefix rather than removes it, see: https://github.com/pfmoore/editables/issues/20.pth_r   	editablesz~=r  r  r  r  rR   )0r  r  r  rN   r  r  rP   r(   Zrecurse_selected_project_filesr\   r   r   ru   r   r]   r   r   r   r   splitextindexr   r   r   r   Zdev_mode_exactr   mapvaluesZadd_to_pathdirnamer   files
startswithr   r<   recurse_forced_filesget_forced_inclusion_mapr   listr   EDITABLES_MINIMUM_VERSIONappendr	  rV   r   r?   r   )r6   r   r   r  r
  r  Zexposed_packagesrp   r   ru   
path_partsZroot_moduleZdistribution_moduler   Zeditable_projectmoduleZraw_filenamecontentr   r8   extra_dependenciesZraw_dependency
dependencyr  r&   r&   r'   r    s   
 



  Hz%WheelBuilder.build_editable_detectionc           	   	     sF     |d< t j jjdt}t a}t fdd jjD }|d j	j
jdd dd|}||   |D ]}||}|| qB ||||d	  ||j d
ddf |d|  W d    n1 sww   Y  W d    n1 sw   Y  tj| j d|d  d}t|j| |S )Nr   r   c                 3  s(    | ]}t jt j j|V  qd S r:   )r]   r\   normpathr   r   ).0Zrelative_directoryr5   r&   r'   	<genexpr>  s
    
z7WheelBuilder.build_editable_explicit.<locals>.<genexpr>r  r  r  r-   r   r  r  r  rR   )r  rN   r  r  rP   r(   r   r  r   r   r   r   replacer   r<   r  r  r   r	  rV   r   r?   r]   r\   r   )	r6   r   r   r
  r  directoriesr8   rp   r  r&   r5   r'   r    s0   
(

  z$WheelBuilder.build_editable_explicitr
  rN   r  r(   dict[str, Any]r#  Sequence[str]c                 C  s"   |  || | j||||d d S Nr#  )add_shared_datar   r6   r
  r  r   r#  r&   r&   r'   r	    s   zWheelBuilder.write_datac                 C  s,   |  | jjD ]}||}|| qd S r:   )recurse_explicit_filesr  r   r   r<   )r6   r
  r  r   r8   r&   r&   r'   r.  %  s   
zWheelBuilder.add_shared_datar&   c                 C  sH   | j |||d | ||| | || | || | ||| d S r,  )write_project_metadatawrite_archive_metadatawrite_entry_points_fileadd_licensesadd_extra_metadatar/  r&   r&   r'   r   *  s
   zWheelBuilder.write_metadatac                 C  sp   ddl m} dt d|d rdnd d}ttt||d	 D ]
}|d
| d7 }q | d|}|| d S )Nr   )	parse_tagz(Wheel-Version: 1.0
Generator: hatchling z
Root-Is-Purelib: pure_pythontruefalser-   r   zTag: ZWHEEL)packaging.tagsr6  r   r   r  r=   r   r<   )r
  r  r   r6  r   r   r8   r&   r&   r'   r2  C  s   z#WheelBuilder.write_archive_metadatac                 C  s*   |   }|r|d|}|| d S d S )Nzentry_points.txt)construct_entry_points_filer   r<   )r6   r
  r  Zentry_points_filer8   r&   r&   r'   r3  S  s
   z$WheelBuilder.write_entry_points_filec                 C  s(   | d| jj| j|d}|| d S )NMETADATAr-  )r   r  r   r   r<   )r6   r
  r  r#  r8   r&   r&   r'   r1  Y  s   z#WheelBuilder.write_project_metadatac              	   C  sv   | j jjD ]3}tjtj| j|}t|d}|	d| |
 }|| W d    n1 s3w   Y  qd S )Nrs   z	licenses/)r   r   Zlicense_filesr]   r\   r%  r   r   r   r   r   r<   )r6   r
  r  r   Zlicense_filefr8   r&   r&   r'   r4  a  s   zWheelBuilder.add_licensesc                 C  sJ   t | jj}|t|d | j | |D ]}||}|| qd S )Nr   )	r   r  r   r   r   r   r0  r   r<   )r6   r
  r  r   r   r   r8   r&   r&   r'   r5  h  s   
zWheelBuilder.add_extra_metadatac                 C  s   | j j}d}|jr!|d7 }|j D ]\}}|| d| d7 }q|jr<|d7 }|j D ]\}}|| d| d7 }q-|jrd|j D ]\}}|d| d7 }| D ]\}}|| d| d7 }qTqD| S )Nr  z
[console_scripts]
z = r-   z
[gui_scripts]
z
[z]
)r   r   scriptsr   gui_scriptsentry_pointslstrip)r6   Zcore_metadataZmetadata_filer   Z
object_refgroupr@  r&   r&   r'   r;  p  s"   z(WheelBuilder.construct_entry_points_filec                 C  s\   g }t  D ] }tdD ]}| jjj| d| r$|d|   nqqd| dS )Nd   .pyz	-none-any)r   ranger   r   Zpython_constraintcontainsr  r   )r6   Zsupported_python_versionsmajor_versionminor_versionr&   r&   r'   r    s   
zWheelBuilder.get_default_tagc                 C  s0  dd l }ddlm} t| }|j|j|jg}tj	dd}|jdkr|re|j
d d dkredd l}dd l}|d|}|re|d }	| d }
t|d	d
hkrRdn|d }|	d |	|
  | |d< | jjrdd l}|d }	|d|	}|r|d}ttt|ddkr|	|dd|d< d|S )Nr   )sys_tagsZ	ARCHFLAGSr  r   r   )      z-arch (\S+)x86_64arm64
universal2zmacosx_(\d+_\d+)r   r  )   r   Z10_16r  )r   r:  rJ  nextinterpreterabir   r]   environr   version_inforefindallmac_versetrfindr  r   searchrB  tupler  intr   r(  r   )r6   r   rJ  r   Z	tag_partsZ	archflagsr   rV  ZarchsplatZcurrent_archZnew_archZ	sdk_matchZsdk_version_partr&   r&   r'   r    s0   



z"WheelBuilder.get_best_matching_tagc                 C  s   ddg i i dS )NFT)r   r7  r   force_include_editabler   r&   r5   r&   r&   r'   get_default_build_data  s   z#WheelBuilder.get_default_build_datar   c                 C  s"   |d s	| j  S t|d | jS )Nr_  )r  r   r   r   )r6   r   r&   r&   r'   r    s   
z%WheelBuilder.get_forced_inclusion_mapc                 C  s,   | j jr| jS | | jjj d| jj S )Nr  )r  r   rO   r   r   r   r   versionr5   r&   r&   r'   r    s
   z WheelBuilder.artifact_project_idtype[WheelBuilderConfig]c                 C  s   t S r:   )r   )clsr&   r&   r'   get_config_class  r   zWheelBuilder.get_config_classN)r)   r   r   )r   r=   r   r   r)   r*   )r   r=   r   r   r)   r=   )
r
  rN   r  r(   r   r*  r#  r+  r)   r*   )r
  rN   r  r(   r)   r*   )r&   )r
  rN   r  r(   r   r*  r)   r*   )r
  rN   r  r(   r#  r+  r)   r*   rL   )r)   r*  )r   r*  r)   r   )r)   rb  )r"   r#   r$   __doc__ZPLUGIN_NAMEr   r   r   r   r   r  r  r	  r.  r   r   r2  r3  r1  r4  r5  r;  r  r  r`  r  r   r  classmethodrd  r&   r&   r&   r'   r   {  s<    



	


R










!
	r   )3
__future__r   r2   r}   r]   rv   r   rZ   r`   	functoolsr   ior   typingr   r   r   r   r	   r
   r   r   Zhatchling.__about__r   Zhatchling.builders.configr   Z#hatchling.builders.plugin.interfacer   Zhatchling.builders.utilsr   r   r   r   r   r   r   r   Zhatchling.metadata.specr   r   typesr   r   r  r]  rd   r   r(   rN   r   r   r&   r&   r&   r'   <module>   s6    ((
^ [