o
     
j>'                  	   @   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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ZdZdZed ZeddG dd dZeddG dd dZdBdedededefddZdCdee dedB dee fdd Zdee fd!d"Z dBd#edededefd$d%Z!de"eef fd&d'Z#d(ee dededB fd)d*Z$d+edefd,d-Z%d#ed.eddfd/d0Z&d1eddfd2d3Z'd#edee fd4d5Z(d#ed6ee d.eddfd7d8Z)d9ed:eddfd;d<Z*dee dee fd=d>Z+d1ed?e"eef defd@dAZ,dS )DzNInternal helpers for Hugging Face marketplace skill installation and upgrades.    N)	dataclassreplace)PathPurePosixPath)AnyLiteral)
BucketFile)CLIError   )disable_progress_bars   )
get_hf_apizhuggingface/skillsmarketplace.jsonz.hf-skill-manifest.json)
up_to_date	unmanagedsource_unreachableT)frozenc                   @   s.   e Zd ZU eed< eed< dZedB ed< dS )MarketplaceSkillname	repo_pathNdescription)__name__
__module____qualname__str__annotations__r    r   r   N/home/kuhnn/.local/lib/python3.10/site-packages/huggingface_hub/cli/_skills.pyr      s   
 r   c                   @   s6   e Zd ZU eed< eed< eed< dZedB ed< dS )SkillUpdateInfor   	skill_dirstatusNdetail)r   r   r   r   r   r   SkillUpdateStatusr!   r   r   r   r   r   #   s
   
 r   F
skill_namedestination_rootforcereturnc                 C   sp   t  }t ( t|}t|| }|du rtd|  dt dt||||dW  d   S 1 s1w   Y  dS )z3Resolve a marketplace skill by name and install it.NSkill 'z' not found in zD. Try `hf skills add` to install `hf-cli` or use a known skill name.r%   )r   r   _load_marketplace_skills_select_marketplace_skillr	   DEFAULT_SKILLS_BUCKET_ID_install_marketplace_skill)r#   r$   r%   apimarketplace_skillsskillr   r   r   	add_skill+   s   
$r0   rootsselectorc                    s   t | }|dur$|  fdd|D }|s$td| d| dt  t  dd t D  fd	d|D W  d   S 1 sHw   Y  dS )
z;Re-sync managed marketplace skill installs from the bucket.Nc                    s   g | ]}|j   kr|qS r   r   lower).0d)selector_lowerr   r   
<listcomp>>   s    z!update_skills.<locals>.<listcomp>zNo installed skill matches 'z"'. Install it with `hf skills add z`.c                 S   s   i | ]}|j  |qS r   r3   )r5   r/   r   r   r   
<dictcomp>D       z!update_skills.<locals>.<dictcomp>c                    s   g | ]}t  |qS r   )_apply_single_update)r5   r   )r-   r.   r   r   r8   E   r:   )_iter_unique_skill_dirsstripr4   r	   r   r   r)   )r1   r2   
skill_dirsr   )r-   r.   r7   r   update_skills9   s   $r?   c              	   C   s   t | }|d}t|tstdg }|D ]5}t|tsq|d}|d}t|tr2t|ts3q|d}|t|t	|t|trF|nd d q|S )NpluginszAInvalid marketplace payload: expected a top-level 'plugins' list.r   sourcer   )r   r   r   )
_load_marketplace_payloadget
isinstancelistr	   dictr   appendr   _normalize_repo_path)r-   payloadr@   skillspluginr   rA   r   r   r   r   r)   H   s*   





r)   r/   c                 C   s   |   }|jddd ||j }| }|r!|s!td| |rVtj|d|j dd}t||j }t	| ||d t
||d W d	   |S 1 sOw   Y  |S z
t	| ||d W |S  tyq   | rpt|  w )
z:Install a marketplace skill into a local skills directory.Tparentsexist_okzSkill already exists: .z	.install-)dirprefix)r/   install_dir)existing_dir
staged_dirN)
expanduserresolvemkdirr   existsFileExistsErrortempfileTemporaryDirectoryr   _populate_install_dir_atomic_replace_directory	Exceptionshutilrmtree)r-   r/   r$   r%   rR   already_existstmp_dir_strrT   r   r   r   r,   a   s.   


r,   c                 C   sr   t  "}t|d }| jtt|fgdd t|jdd}W d    n1 s)w   Y  t	|t
s7td|S )Nr   T)raise_on_missing_fileszutf-8)encodingz4Invalid marketplace payload: expected a JSON object.)rZ   r[   r   download_bucket_filesr+   MARKETPLACE_PATHjsonloads	read_textrD   rF   r	   )r-   tmp_dir
local_pathparsedr   r   r   rB   }   s   

	rB   rJ   c                 C   s0   |   }| D ]}|j |kr|  S qd S N)r=   r4   r   )rJ   r2   r7   r/   r   r   r   r*      s   r*   pathc                 C   sB   |   }|dr|dd  }|ds	| d}|std|S )Nz./r
   /z-Invalid marketplace entry: empty source path.)r=   
startswithr	   )rn   
normalizedr   r   r   rH      s   


rH   rR   c                 C   s>   |j ddd t| |}t| ||| t| |t   d S )NTrL   )rW   _list_skill_files_download_skill_files_validate_installed_skill_dirMANAGED_MARKER_FILENAMEtouch)r-   r/   rR   bucket_filesr   r   r   r\      s
   
r\   r   c                 C   s"   | d }|  std| d S )NzSKILL.mdz%Installed skill is missing SKILL.md: )is_fileRuntimeError)r   
skill_filer   r   r   rt      s   rt   c                 C   sD   |j d}dd | jt|ddD }|s td| dt d|S )	zAList all files under `skill.repo_path` in the marketplace bucket.ro   c                 S   s   g | ]	}t |tr|qS r   )rD   r   )r5   itemr   r   r   r8      s    z%_list_skill_files.<locals>.<listcomp>T)rQ   	recursivezPath 'z' not found in bucket ''.)r   rstriplist_bucket_treer+   FileNotFoundError)r-   r/   rQ   filesr   r   r   rr      s   rr   r   c           
      C   s   |j d}| d}g }|D ])}|j|sq|jt|d }|jt|j }	|	jj	ddd |
||	f q|sFtd| dt d| t| dS )z)Download bucket files into `install_dir`.ro   NTrL   zNo files found under 'z' in bucket 'r}   )r   r~   rn   rp   lenjoinpathr   partsparentrW   rG   r   r+   re   )
r-   r/   r   rR   rQ   prefix_with_slashdownload_specsbucket_filerelative
local_filer   r   r   rs      s   
rs   rS   rT   c                 C   sb   |j | j d }z| | ||  t| W d S  ty0   | r/|  s/||   w )Nz.backup)r   r   renamer_   r`   r^   rX   )rS   rT   
backup_dirr   r   r   r]      s   


r]   c                 C   s   t  }g }| D ]=}|  }| sqt| D ])}|jdr#q| s,| s,q| }||v s8| s9q|	| |
| qq|S )NrO   )setrU   rV   is_dirsortediterdirr   rp   
is_symlinkaddrG   )r1   seen
discoveredrootchildresolvedr   r   r   r<      s$   

r<   r.   c              
   C   s   t |j|dd}|t  s|S ||j }|d u r+t|dd|j dt ddS zt| ||j	dd	 W n t
yQ } zt|dt|dW  Y d }~S d }~ww t|d
dS )Nr   )r   r   r    r   r'   z' is no longer available in rO   )r    r!   Tr(   r   )r    )r   r   ru   rX   rC   r4   r   r+   r,   r   r^   r   )r-   r   r.   baser/   excr   r   r   r;      s"   r;   )Frm   )-__doc__rg   r_   rZ   dataclassesr   r   pathlibr   r   typingr   r   huggingface_hub._bucketsr   huggingface_hub.errorsr	   utilsr   
_cli_utilsr   r+   rf   ru   r"   r   r   r   boolr0   rE   r?   r)   r,   rF   rB   r*   rH   r\   rt   rr   rs   r]   r<   r;   r   r   r   r   <module>   sB    $
"