o
    0jS&                  	   @   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S )MarketplaceSkillname	repo_pathN)__name__
__module____qualname__str__annotations__ r   r   \/var/www/html/Deteccion_Ine/venv/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   
$r/   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   r2   )r4   r.   r   r   r   
<dictcomp>C       z!update_skills.<locals>.<dictcomp>c                    s   g | ]}t  |qS r   )_apply_single_update)r4   r   )r,   r-   r   r   r7   D   r9   )_iter_unique_skill_dirsstripr3   r	   r   r   r(   )r0   r1   Z
skill_dirsr   )r,   r-   r6   r   update_skills8   s   $r=   c                 C   s   t | }|d}t|tstdg }|D ](}t|tsq|d}|d}t|tr2t|ts3q|t|t	|d q|S )NpluginszAInvalid marketplace payload: expected a top-level 'plugins' list.r   source)r   r   )
_load_marketplace_payloadget
isinstancelistr	   dictr   appendr   _normalize_repo_path)r,   payloadr>   skillspluginr   r?   r   r   r   r(   G   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$   rP   Zalready_existsZtmp_dir_strrR   r   r   r   r+   Y   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)Zraise_on_missing_fileszutf-8)encodingz4Invalid marketplace payload: expected a JSON object.)rX   rY   r   download_bucket_filesr*   MARKETPLACE_PATHjsonloads	read_textrB   rD   r	   )r,   Ztmp_dirZ
local_pathparsedr   r   r   r@   u   s   

	r@   rH   c                 C   s0   |   }| D ]}|j |kr|  S qd S N)r<   r3   r   )rH   r1   r6   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	   )rg   
normalizedr   r   r   rF      s   


rF   rP   c                 C   s>   |j ddd t| |}t| ||| t| |t   d S )NTrJ   )rU   _list_skill_files_download_skill_files_validate_installed_skill_dirMANAGED_MARKER_FILENAMEtouch)r,   r.   rP   Zbucket_filesr   r   r   rZ      s
   
rZ   r   c                 C   s"   | d }|  std| d S )NzSKILL.mdz%Installed skill is missing SKILL.md: )is_fileRuntimeError)r   Z
skill_filer   r   r   rm      s   rm   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.rh   c                 S   s   g | ]	}t |tr|qS r   )rB   r   )r4   itemr   r   r   r7      s    z%_list_skill_files.<locals>.<listcomp>T)rO   	recursivezPath 'z' not found in bucket ''.)r   rstripZlist_bucket_treer*   FileNotFoundError)r,   r.   rO   filesr   r   r   rk      s   rk   rw   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`.rh   NTrJ   zNo files found under 'z' in bucket 'rt   )r   ru   rg   ri   lenjoinpathr   partsparentrU   rE   rv   r*   r`   )
r,   r.   rw   rP   rO   Zprefix_with_slashZdownload_specsZbucket_filerelative
local_filer   r   r   rl      s   
rl   rQ   rR   c                 C   sb   |j | j d }z| | ||  t| W d S  ty0   | r/|  s/||   w )Nz.backup)r{   r   renamer]   r^   r\   rV   )rQ   rR   
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 )NrM   )setrS   rT   is_dirsortediterdirr   ri   
is_symlinkaddrE   )r0   seenZ
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 rM   )r   r    Tr'   r   )r   )r   r   rn   rV   rA   r3   r   r*   r+   r{   r\   r   )r,   r   r-   baser.   excr   r   r   r:      s"   r:   )Frf   )-__doc__rb   r]   rX   dataclassesr   r   pathlibr   r   typingr   r   Zhuggingface_hub._bucketsr   Zhuggingface_hub.errorsr	   utilsr   Z
_cli_utilsr   r*   ra   rn   r!   r   r   r   boolr/   rC   r=   r(   r+   rD   r@   r)   rF   rZ   rm   rk   rl   r[   r;   r:   r   r   r   r   <module>   sB    $
"