o
    0iP                     @   s  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Zddl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mZmZ ddlZddlmZmZ ddlmZmZmZ d	d
lmZmZmZmZm Z  dZ!edZ"dZ#dZ$e e$dZ%dZ&dZ'dZ(dZ)e*e+Z,e
G dd dZ-e%j.dg dd	dmdej/dee0ej1ddf dee2ej3dddf d dfd!d"Z4e%j.d#d$dd$d%d&d'gd(dej/d)ee0ej1d*df d dfd+d,Z5e%j.d-d.gdej6dfd/ed0ed dfd1d2Z7e%j.d3d4gdej6dfd/ed0ed dfd5d6Z8e%j.d7d8gdd)ee0ej1d9df d dfd:d;Z9d e:e- fd<d=Z;d e:e<e0e0f  fd>d?Z=d@e:e0 dAe>e0 d ee? fdBdCZ@dDe0dEe0dFe0dGe0d eAf
dHdIZBdDe0dEe0dGe0dJedKeAd e-fdLdMZCdDe0dEe0dGe0dJedFe0d e-fdNdOZDdDe0dEe0dFe0dPee0 d ee0 f
dQdRZEd efdSdTZFdGe0d efdUdVZGdDe0dEe0d e<e0ee0 f fdWdXZHdGe0d e0fdYdZZIdGe0d efd[d\ZJd]ed efd^d_ZKd]edGe0d efd`daZLeMdbZNdGe0dce0d e0fdddeZOde0d e<e0e0e0f fdfdgZPd)e0d e0fdhdiZQdjed@e:e0 d e?fdkdlZRdS )nz0Contains helper utilities for hf CLI extensions.    N)asdict	dataclass)datetimetimezone)Path)	AnnotatedLiteralOptional)CLIErrorCLIExtensionInstallError)
StatusLineget_sessionlogging   )	FormatOptOutputFormatQuietOptprint_list_outputtyper_factoryZhuggingfacez~/.local/share/hf/extensionszmanifest.jsonzManage hf CLI extensions.

Security Warning: extensions are third-party executables or Python packages. Install only from sources you trust.)helpmainzhf-extension
   i,  c                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< ed ed< eed	< eed
< dZee ed< e	de
dd fddZde
ddfddZdS )ExtensionManifestownerreporepo_id
short_nameexecutable_nameexecutable_path)binarypythontypeinstalled_atsourceNdescriptionpathreturnc                 C   sN   |t  }| std| dt| }t|d |d< tdi |S )NzManifest file not found at z". Your extension may be corrupted.r"    )	MANIFEST_FILENAMEis_filer
   jsonloads	read_textr   fromisoformatr   )clsr%   manifest_pathdatar'   r'   X/home/kim/smarthome/.venv/lib/python3.10/site-packages/huggingface_hub/cli/extensions.pyloadB   s   zExtensionManifest.loadc                 C   sH   |t  }|jjddd t| }| j |d< |tj|ddd d S )NTparentsexist_okr"      )indent	sort_keys)	r(   parentmkdirr   r"   	isoformat
write_textr*   dumps)selfr%   r/   r0   r'   r'   r1   saveK   s
   zExtensionManifest.save)__name__
__module____qualname__str__annotations__r   r   r$   r	   classmethodr   r2   r?   r'   r'   r'   r1   r   5   s   
 r   install)zhf extensions install hf-claudez-hf extensions install hanouticelina/hf-claudez(hf extensions install alvarobartt/hf-mem)examplesFctxr   z:GitHub extension repository in `[OWNER/]hf-<name>` format.forcez--forcezOverwrite if already installed.r&   c                 C   sX  t |\}}}|  }tt|jdi  }||v r%td| d| dt|}| }	|	r9|s9td| dt	||d\}
}|	rHt
| z
t|||
|d}W n ty]   d	}Y nw |d	ur{td
 t|||||d}td| d| d ntd t|||||
d}td| d| d t|||
|d}||_|| td|  d	S )zInstall an extension from a public GitHub repository.

    Security warning: this installs a third-party executable or Python package.
    Install only from sources you trust.
    commandszCannot install extension 'z,' because it conflicts with an existing `hf z
` command.Extension 'z1' is already installed. Use --force to overwrite.)r   	repo_name)r   rL   branchr   Nz/Binary found, installing as binary extension...)r   rL   r   extension_dirr   z-Binary extension installed successfully from /.z:Binary not found, trying to install as Python extension...)r   rL   r   rN   rM   z-Python extension installed successfully from )r   rL   rM   candidate_descriptionzRun it with: hf )_normalize_repo_idZ	find_rootsetgetattrcommandkeysr
   _get_extension_direxists_resolve_github_repo_infoshutilrmtree_fetch_remote_binary	Exceptionprint_install_binary_extension_install_python_extension_try_fetch_remote_descriptionr$   r?   )rH   r   rI   r   rL   r   Zroot_ctxZreserved_commandsrN   Zextension_existsrM   r$   r   manifestr'   r'   r1   extension_installS   sX   

rc   execT)Zallow_extra_argsallow_interspersed_argsZignore_unknown_optionsz#hf extensions exec claude -- --helpz/hf extensions exec claude --model zai-org/GLM-5)Zcontext_settingsrG   namez.Extension name (with or without `hf-` prefix).c                 C   sF   t |}t|}| std| dt|t| jd}tj|d)zExecute an installed extension.rK   ' is not installed.r   args)code)	_normalize_extension_name"_resolve_installed_executable_pathr)   r
   _execute_extension_binarylistri   typerZExit)rH   rf   r   r   	exit_coder'   r'   r1   extension_exec   s   rq   z	list | lszhf extensions listformatquietc                 C   s$   dd t  D }t|| |dd dS )z"List installed extension commands.c                 S   s:   g | ]}d |j  t|jt|j|jd|jdqS )zhf z%Y-%m-%d)rU   r#   r!   	installedr$   )r   rC   r   r!   r"   strftimer$   ).0rb   r'   r'   r1   
<listcomp>   s    

z"extension_list.<locals>.<listcomp>rU   )rr   rs   id_keyN)_list_installed_extensionsr   )rr   rs   rowsr'   r'   r1   extension_list   s   
r{   searchzhf extensions searchc           	   	   C   s   t  jddt dddddtd}|  | }d	d
 t D }g }|dg D ]/}|d }|dr;|dd n|}|||d |dd|dpNd||v rTdndd q*t	|| |dddid dS )zISearch extensions available on GitHub (tagged with 'hf-extension' topic).z*https://api.github.com/search/repositoriesztopic:starsZdescd   )qsortorderZper_pageT)paramsfollow_redirectstimeoutc                 S   s   h | ]}|j qS r'   )r   )rv   mr'   r'   r1   	<setcomp>   s    z#extension_search.<locals>.<setcomp>itemsrf   hf-   NZ	full_nameZstargazers_countr   r$    yes)rf   r   r}   r$   rt   r   right)rr   rs   rx   Z
alignments)
r   get_EXTENSIONS_GITHUB_TOPIC_EXTENSIONS_DOWNLOAD_TIMEOUTraise_for_statusr*   ry   
startswithappendr   )	rr   rs   responser0   rt   rz   r   rL   r   r'   r'   r1   extension_search   s,   

r   zremove | rmzhf extensions remove claudez8Extension name to remove (with or without `hf-` prefix).c                 C   sF   t | }t|}| std| dt| td| d dS )zRemove an installed extension.rK   rg   zRemoved extension ''.N)rk   rW   is_dirr
   rZ   r[   r^   )rf   r   rN   r'   r'   r1   extension_remove   s   
r   c                  C   s   t  } |  s
g S g }t|  D ]5}| r|jdsqz
|t	| W q t
yG } ztd|j d|  W Y d}~qd}~ww |S )zPReturn manifests for all validly-installed extensions, sorted by directory name.r   z'Failed to load manifest for extension '': N)EXTENSIONS_ROOT
expanduserr   sortediterdirrf   r   r   r   r2   r]   loggerdebug)root_dirZ	manifestsrN   er'   r'   r1   ry      s   ry   c                  C   sP   g } t  D ] }d|j d}|jd ur|j d| n|}| |j|f q| S )Nz[extension ] )ry   r   r$   r   r   )entriesrb   tag	help_textr'   r'   r1   "list_installed_extensions_for_help  s   
r   ri   known_commandsc                 C   s   | sd S | d }| drd S ||v rd S | dr |dd  n|}|s&d S zt|}W n
 ty6   Y d S w | s=d S t|t| dd  dS )Nr   -r   r   r   rh   )r   rl   r]   r)   rm   rn   )ri   r   Zcommand_namer   r   r'   r'   r1   $dispatch_unknown_top_level_extension  s$   
r   r   rL   rM   r   c                 C   sD   t |}d|  d| d| d| }t j|dtd}|  |jS )N"https://raw.githubusercontent.com/rO   /refs/heads/Tr   r   )_get_executable_namer   r   r   r   content)r   rL   rM   r   r   Zraw_urlr   r'   r'   r1   r\   1  s
   r\   rN   r   c                 C   sz   t |}|jddd || }|| tjdkrt|d t| ||  d| ||t|dt	t
jd|  d| d		S )
NTFr3   nti  rO   r   https://github.com/	r   r   r   r   r   r   r!   r"   r#   )r   r:   write_bytesosrf   chmodr   rC   r   nowr   utc)r   rL   r   rN   r   r   r   r'   r'   r1   r_   9  s"   


r_   c                 C   s  d|  d| d| d}|d }d}t  }z-z|d|  | r+tj|dd	 |jddd
 td}	t|}
|	rjtj	|	dt
|gdd |d|  |d|  tj	|	dddt
|
|gdtd n,tjddt
| |d|  |d|  tj	t
|
ddddd|gdtd |d|  t|}t||}| std|  d| d| dt| ||  d| ||t
| dttjd|  d| d	}d}|W W |stj|dd	 S S  ty     tjy } ztdt d|  d| d|d }~w tjy) } ztd |  d| d!|j d"|d }~w tyC } ztd#|  d| d$| |d }~ww |sOtj|dd	 w w )%Nr   rO   z/archive/refs/heads/z.zipvenvFz Creating virtual environment in T)ignore_errorsr3   Zuv)checkzVirtual environment created in zInstalling package from piprF   z--python)r   r   )Zwith_pipz-mz--disable-pip-version-checkz
--no-inputzPackage installed from zInstalled package from 'z/' does not expose the required console script 'r   r    r   zPip install timed out after zs for 'z$'. See pip output above for details.z$Failed to install pip package from 'z' (exit code z$). See pip output above for details.z%Failed to set up pip extension from 'r   )r   updaterX   rZ   r[   r:   which_get_venv_python_path
subprocessrunrC   done_EXTENSIONS_PIP_INSTALL_TIMEOUTr   Z
EnvBuildercreater   #_get_venv_extension_executable_pathr)   r
   r   resolver   r   r   r   TimeoutExpiredr   CalledProcessError
returncoder]   )r   rL   r   rN   rM   
source_urlvenv_dirrt   statusZuv_pathZvenv_pythonr   Zvenv_executablerb   r   r'   r'   r1   r`   T  s   
	


r`   rQ   c           
   	   C   s   z+t  jd|  d| d| dt dd}|  | }|d}t|tr*|W S W n	 ty4   Y nw z<t  jd|  d| d| ddd}|  |j	 D ]}|
 }|drn|d\}}}	|	
 
d	  W S qQW |S  ty{   Y |S w )
zTry to fetch project description either from:
    - manifest.json
    - pyproject.toml

    Only best effort, no error handling.
    r   rO   r   T)r   r$   z/pyproject.toml=z"')r   r   r(   r   r*   
isinstancerC   r]   text
splitlinesstripr   	partition)
r   rL   rM   rQ   r   r0   r$   line_valuer'   r'   r1   ra     s@   



	ra   c                  C   s   t  } | jddd | S )NTr3   )r   r   r:   )r   r'   r'   r1   _get_extensions_root  s   r   c                 C   sF   t | | d}t  }|d|   }||jvr!td|  d|S )Noriginal_inputr   Invalid extension name 'r   )_validate_extension_short_namer   r   r4   r
   )r   	safe_nameroottargetr'   r'   r1   rW     s   

rW   c                 C   s^   z!t  jd|  d| dtd}|  | }|d |dfW S  ty.   td f Y S w )Nzhttps://api.github.com/repos/rO   Tr   Zdefault_branchr$   )r   r   r   r   r*   r]   _EXTENSIONS_DEFAULT_BRANCH)r   rL   r   r0   r'   r'   r1   rY     s   rY   c                 C   s    d|  }t jdkr|d7 }|S )Nr   r   z.exer   rf   )r   rf   r'   r'   r1   r     s   

r   c                 C   s    t | }t|}t|j S N)rW   r   r2   r   r   r   )r   rN   rb   r'   r'   r1   rl     s   
rl   r   c                 C   s"   t jdkr| d d S | d d S )Nr   Scriptsz
python.exebinr    r   )r   r'   r'   r1   r      s   
r   c                 C   s*   t |}tjdkr| d | S | d | S )Nr   r   r   )r   r   rf   )r   r   r   r'   r'   r1   r     s   
r   z^[A-Za-z0-9][A-Za-z0-9._-]*$r   c                   sx   |     s
tdt fdddD rtd| dd v s%d v r-td| dt s:td| d	 S )
NExtension name cannot be empty.c                 3   s    | ]}| v V  qd S r   r'   )rv   seprf   r'   r1   	<genexpr>  s    z1_validate_extension_short_name.<locals>.<genexpr>)rO   \r   r   z..:z9'. Allowed characters: letters, digits, '.', '_' and '-'.)r   r
   any_ALLOWED_EXTENSION_NAME	fullmatch)r   r   r'   r   r1   r     s   

r   c                 C   s   d| v rt d| d}t|dkrt}|d }nt|dkr)t|r)|\}}nt d|  d|d	s>t d
| d|dd  }|sJt dt|| d |||fS )Nz://zEOnly GitHub repositories in `[OWNER/]hf-<name>` format are supported.rO   r   r   r6   z%Expected `[OWNER/]REPO` format, got 'r   r   z6Extension repository name must start with 'hf-', got 'r   z(Invalid extension repository name 'hf-'.r   )r
   splitlenDEFAULT_EXTENSION_OWNERallr   r   )r   partsr   rL   r   r'   r'   r1   rR     s    




rR   c                 C   s:   |   }|s
td|dr|dd  n|}t|| dS )Nr   r   r   r   )r   r
   r   r   )rf   	candidate
normalizedr'   r'   r1   rk   7  s
   rk   r   c              
   C   sj   zt t| g| W S  ty4 } ztjdks|jtjkr t dt| g| W  Y d }~S d }~ww )Nr   sh)r   callrC   OSErrorr   rf   errnoZENOEXEC)r   ri   r   r'   r'   r1   rm   ?  s   "rm   )F)S__doc__r   r*   r   rerZ   r   r   dataclassesr   r   r   r   pathlibr   typingr   r   r	   ro   Zhuggingface_hub.errorsr
   r   Zhuggingface_hub.utilsr   r   r   Z
_cli_utilsr   r   r   r   r   r   r   r(   ZEXTENSIONS_HELPZextensions_clir   r   r   r   Z
get_loggerr@   r   r   rU   ContextrC   ZArgumentboolOptionrc   rq   tabler{   r   r   rn   ry   tupler   rS   intr   bytesr\   r_   r`   ra   r   rW   rY   r   rl   r   r   compiler   r   rR   rk   rm   r'   r'   r'   r1   <module>   s  


E

  
"	

V
,"	
