o
    xi/                     @  s  U d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
mZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ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#m$Z$ eryddl%m&Z& ddlm'Z' ddl(m)Z) edddZ*edZ+edZ,edZ-dZ.de/d< dZ0de/d< dZ1de/d< e2d Z3d!e/d"< e2d#Z4d!e/d$< e2d%Z5d!e/d&< eG d'd( d(Z6dgd,d-Z7dgd.d/Z8dhd3d4Z9did6d7Z:e;d8Z<d9e/d:< 	 djd<d=Z=d>Z>de/d?< 	 d@dAdBdCZ?dDe/dE< 	 dkdGdHZ@e
dldLdMZAeABeCdeABeDdmdOdPZEeABeFdndQdPZEdodUdVZGeee+e-f e,f ZH	 dpdYdZZIdpd[d\ZJdqd_d`ZKdrdadbZLeG dcdd ddZMeG dedf dfeMZNdS )sz=Internal validation utilities that are specific to artifacts.    )annotationsN)	dataclassfieldreplace)singledispatchwraps)TYPE_CHECKINGAnyCallableLiteralOptionalTypeVar)r   )Concatenate	ParamSpecSelf)always_listunique_list)	from_json)nameof)json_friendly_val   )ArtifactFinalizedErrorArtifactNotLoggedError)Iterable)Final)Artifact	ArtifactTr   )boundSelfTRPzwandb-registry-z
Final[str]REGISTRY_PREFIXd   z
Final[int]MAX_ARTIFACT_METADATA_KEYS   NAME_MAXLEN/zFinal[frozenset[str]]INVALID_ARTIFACT_NAME_CHARSz/\#?%:
INVALID_URL_CHARSz/:ARTIFACT_SEP_CHARSc                   @  s~   e Zd ZU dZded< ded< ded< ded< ded< ed	d
dZded< ed	edZded< e	dddZ
e	dddZdS )LinkArtifactFieldszLKeep this list updated with fields where linked and source artifacts differ.strentity_nameproject_namenameversion	list[str]aliasesFT)initdefaultzLiteral[True]_is_link)r2   default_factorylist[Artifact]_linked_artifactsreturnboolc                 C     | j S N)r4   self r>   S/home/ubuntu/.local/lib/python3.10/site-packages/wandb/sdk/artifacts/_validators.pyis_link8      zLinkArtifactFields.is_linkc                 C  r:   r;   )r7   r<   r>   r>   r?   linked_artifacts<   rA   z#LinkArtifactFields.linked_artifactsNr8   r9   )r8   r6   )__name__
__module____qualname____doc____annotations__r   r4   listr7   propertyr@   rB   r>   r>   r>   r?   r*   *   s   
 r*   r.   r+   r8   c                 C  s^   t | tkr| dt  d}tdtd|t| r-tddtt d| | S )z~Validate the artifact name, returning it if successful.

    Raises:
        ValueError: If the artifact name is invalid.
    Nz ...zArtifact name is longer than z characters: zAArtifact names must not contain any of the following characters: , z.  Got: )lenr%   
ValueErrorr'   intersectionjoinsorted)r.   
trunc_namer>   r>   r?   validate_artifact_nameA   s   
rR   c                 C  s   | st d| t }st dt| tkr9|| kr,d|dttt d}t |d| dtd}t |tt|  }rZ|pE| }dt	t
t|}t d|d	|| S )
zValidate a project name according to W&B rules.

    Return the original name if successful.

    Args:
        name: The project name string.

    Raises:
        ValueError: If the name is invalid (too long or contains invalid characters).
    zProject name cannot be emptyzRegistry name cannot be emptyzInvalid registry name z
, must be z characters or lesszInvalid project name rK   zInvalid project/registry name z, cannot contain characters: )rM   removeprefixr!   rL   r%   setr(   rN   rO   rP   maprepr)r.   registry_namemsginvalid_chars
error_nameinvalid_chars_reprr>   r>   r?   validate_project_nameV   s"   r\   r1   Iterable[str] | strr0   c                 C  s@   t | }tdd |D rdtttt}td| |S )zValidate the artifact aliases and return them as a list.

    Raises:
        ValueError: If any of the aliases contain invalid characters.
    c                 s      | ]}t |V  qd S r;   r)   rN   .0r.   r>   r>   r?   	<genexpr>~       z#validate_aliases.<locals>.<genexpr>rK   z:Aliases must not contain any of the following characters: )r   anyrO   rP   rU   rV   r)   rM   )r1   aliases_listrY   r>   r>   r?   validate_aliasesw   s   rf   typesc                 C  sb   t | }tdd |D rdtttt}td| tdd |D r/tdtd|S )z;Validate the artifact type names and return them as a list.c                 s  r^   r;   r_   r`   r>   r>   r?   rb      rc   z*validate_artifact_types.<locals>.<genexpr>rK   zAArtifact types must not contain any of the following characters: c                 s  s    | ]	}t |tkV  qd S r;   )rL   r%   r`   r>   r>   r?   rb          z-Artifact types must be less than or equal to z characters)	r   rd   rO   rP   rU   rV   r)   rM   r%   )rg   
types_listrY   r>   r>   r?   validate_artifact_types   s   
rj   z^[-\w]+( +[-\w]+)*$zre.Pattern[str]	TAG_REGEXtagsc                 C  s*   t t| }tdd |D rtd|S )zValidate artifact tag names and return them as a deduped list.

    In the case of duplicates, keep the first tag and maintain the order of
    appearance.

    Raises:
        ValueError: If any of the tags contain invalid characters.
    c                 s  s    | ]	}t | V  qd S r;   )rk   match)ra   tagr>   r>   r?   rb      rh   z validate_tags.<locals>.<genexpr>zqInvalid tag(s).  Tags must only contain alphanumeric characters separated by hyphens, underscores, and/or spaces.)r   r   rd   rM   )rl   	tags_listr>   r>   r?   validate_tags   s   	rp   zwandb-RESERVED_ARTIFACT_TYPE_PREFIX zrun-zsource-)job	run_tablecodezFinal[dict[str, str]]%RESERVED_ARTIFACT_NAME_PREFIX_BY_TYPEtypc                 C  s:   t |  }dur||s| trtd| d| S )z5Validate the artifact type and return it as a string.NzArtifact type z; is reserved for internal use. Please use a different type.)rv   get
startswithrq   rM   )rw   r.   
bad_prefixr>   r>   r?   validate_artifact_type   s   
r{   metadatadict[str, Any] | str | Nonedict[str, Any]c                 C  s   t dt|  d)z7Validate the artifact metadata and return it as a dict.zCannot parse z as artifact metadata)	TypeErrortyper|   r>   r>   r?   validate_metadata      r   
str | Nonec                 C  s   | rt t| S i S r;   )r   r   r   r>   r>   r?   _   r   r   c                 C  s6   t tjt| dd} t| tkrtdtd| S )NF)	allow_nanz!Artifact must not have more than z metadata keys.)r   jsondumpsr   rL   r#   rM   r   r>   r>   r?   r      s   
ttl_duration_secondsint
int | Nonec                 C  s   | dkr| S dS )zValidate the `ttlDurationSeconds` value from a GraphQL response.

    A non-positive value indicates that TTL is DISABLED (-2), which we
    convert to `None`.
    r   Nr>   )r   r>   r>   r?   validate_ttl_duration_seconds   s   r   methodMethodT[ArtifactT, P, R]c                   $   t  t d fd	d
}|S )zEnsure an artifact method runs only if the artifact has been logged.

    If the method is called on an artifact that's not logged, `ArtifactNotLoggedError`
    is raised.
    r=   r   argsP.argskwargsP.kwargsr8   r   c                   s*   |   r
t| d | g|R i |S N)fullnameobj)is_draftr   r=   r   r   r   method_fullnamer>   r?   wrapper   s   zensure_logged.<locals>.wrapperNr=   r   r   r   r   r   r8   r   r   r   r   r   r>   r   r?   ensure_logged      r   c                   r   )zEnsure an `Artifact` method runs only if the artifact is not finalized.

    If the method is called on an artifact that's not logged, `ArtifactFinalizedError`
    is raised.
    r=   r   r   r   r   r   r8   r   c                   s(   | j r	t| d | g|R i |S r   )_finalr   r   r   r>   r?   r     s   z%ensure_not_finalized.<locals>.wrapperNr   r   r   r>   r   r?   ensure_not_finalized  r   r   projectr9   c                 C  s
   |  tS r;   )ry   r!   r   r>   r>   r?   is_artifact_registry_project  s   
r   c                 C  s&   t | std| dt| tS )NzProject z- is not a registry project. Must start with: )r   rM   r!   rS   r   r>   r>   r?   remove_registry_prefix  s
   
r   c                   @  sh   e Zd ZU ded< 	 dZded< 	 dZded< 	 edd
dZdddZddddddZ	dddZ
dS )ArtifactPathr+   r.   NzOptional[str]r   prefixpathr8   r   c           	      C  s   | d\}}}d\}}t|d }dkr|d }nt|dkr'|\}}nt|dkr3|\}}}ntd|| ||| | | d	S )
zInstantiate by parsing a string artifact path.

        Raises:
            ValueError: If the string is not a valid artifact path.
        :)NNr&   r   r         zInvalid artifact path: )r   r   r.   )	partitionrL   splitrM   )	clsr   collection_pathsepaliasr   r   partsr.   r>   r>   r?   from_str*  s   	

zArtifactPath.from_strc                 C  s$   | j | j| jf}ddd |D S )z>Returns the slash-separated string representation of the path.r&   c                 s  s    | ]}|r|V  qd S r;   r>   )ra   partr>   r>   r?   rb   C  s    z&ArtifactPath.to_str.<locals>.<genexpr>)r   r   r.   rO   )r=   ordered_partsr>   r>   r?   to_str@  s   zArtifactPath.to_strr   r   r   c                C  s   t | | jp|| jp
|dS )zJReturns a copy of this path with missing values set to the given defaults.r   )r   r   r   )r=   r   r   r>   r>   r?   with_defaultsE  s
   zArtifactPath.with_defaultsr9   c                 C  s   t | j }o	t|S )z8Returns True if this path appears to be a registry path.)r9   r   r   )r=   pr>   r>   r?   is_registry_pathR  s   zArtifactPath.is_registry_path)r   r+   r8   r   )r8   r+   )r   r   r   r   r8   r   rC   )rD   rE   rF   rH   r   r   classmethodr   r   r   r   r>   r>   r>   r?   r   !  s   
 
r   c                   @  s*   e Zd ZU dZded< ded< ded< dS )FullArtifactPathz2Same as ArtifactPath, but with all parts required.r+   r.   r   r   N)rD   rE   rF   rG   rH   r>   r>   r>   r?   r   W  s
   
 r   )r.   r+   r8   r+   )r1   r]   r8   r0   )rg   r]   r8   r0   )rl   r]   r8   r0   )rw   r+   r.   r+   r8   r+   )r|   r}   r8   r~   )r|   r   r8   r~   )r|   r~   r8   r~   )r   r   r8   r   )r   r   r8   r   )r   r+   r8   r9   )r   r+   r8   r+   )OrG   
__future__r   r   redataclassesr   r   r   	functoolsr   r   typingr   r	   r
   r   r   r   pydantic.dataclassespydantic_dataclasstyping_extensionsr   r   r   wandb._iterutilsr   r   wandb._pydanticr   wandb._strutilsr   
wandb.utilr   
exceptionsr   r   collections.abcr   r   wandb.sdk.artifacts.artifactr   r   r   r   r    r!   rH   r#   r%   	frozensetr'   r(   r)   r*   rR   r\   rf   rj   compilerk   rp   rq   rv   r{   r   registerr   r+   r   dictr   MethodTr   r   r   r   r   r   r>   r>   r>   r?   <module>   s~     


!








5