o
    -wiP)                     @  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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 ddlmZ ddlm Z m!Z! ddl"m#Z#m$Z$ erddlm%Z%m&Z& ddl'm(Z( ede(dZ)edZ*dZ+de,d< dZ-de,d< dZ.de,d< e/dhZ0de,d< ee Z1de,d< ee!Z2de,d < eG d!d" d"Z3d]d&d'Z4d(Z5d^d*d+Z6d_d/d0Z7d`d2d3Z8e9d4Z:d5e,d6< dad8d9Z;d:Z<de,d;< d<Z=d=e,d>< d?d@dAZ>dBe,dC< dbdEdFZ?dcdJdKZ@dddNdOZAedPedQef dZB	 dedSdTZCdedUdVZDdfdYdZZEeG d[d\ d\ZFdS )gz=Internal validation utilities that are specific to artifacts.    )annotationsN)astuple	dataclassfieldreplace)wraps)TYPE_CHECKINGAnyCallableDictLiteralOptionalTypeVarcast)r   )Self)always_list)gql_typename)json_friendly_val   )ArtifactPortfolioTypeFieldsArtifactSequenceTypeFields)ArtifactFinalizedErrorArtifactNotLoggedError)
CollectionFinal)Artifact	ArtifactT)boundTzwandb-registry-z
Final[str]REGISTRY_PREFIXd   z
Final[int]MAX_ARTIFACT_METADATA_KEYS   ARTIFACT_NAME_MAXLEN/zFinal[frozenset[str]]ARTIFACT_NAME_INVALID_CHARSLINKED_ARTIFACT_COLLECTION_TYPESOURCE_ARTIFACT_COLLECTION_TYPEc                   @  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 )_LinkArtifactFieldsz\Keep this list updated with fields where the linked artifact and the source artifact differ.strentity_nameproject_namenameversion	list[str]aliasesFT)initdefaultzLiteral[True]_is_link)r0   default_factorylist[Artifact]_linked_artifactsreturnboolc                 C     | j S N)r2   self r<   \/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/artifacts/_validators.pyis_link8      z_LinkArtifactFields.is_linkc                 C  r8   r9   )r5   r:   r<   r<   r=   linked_artifacts<   r?   z$_LinkArtifactFields.linked_artifactsN)r6   r7   )r6   r4   )__name__
__module____qualname____doc____annotations__r   r2   listr5   propertyr>   r@   r<   r<   r<   r=   r(   (   s   
 r(   r,   r)   r6   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,   
short_namer<   r<   r=   validate_artifact_nameA   s   
rO   )r$   \#?%:
Nonec                 C  s   d}t | dkrtdd}| tr%| t td }t |dkr%tdt | |krG|r<td|d|t t  d	td
| d| d	tt|  }rh|pS| }dtt	t
|}td|d|dS )zValidates a project name according to W&B rules.

    Args:
        name: The project name string.

    Raises:
        ValueError: If the name is invalid (too long or contains invalid characters).
    r"   r   zProject name cannot be empty NzRegistry name cannot be emptyzInvalid registry name z
, must be z characters or lesszInvalid project name rH   zInvalid project/registry name z, cannot contain characters: )rI   rJ   
startswithr   setINVALID_URL_CHARACTERSrK   rL   rM   maprepr)r,   max_lenregistry_nameinvalid_chars
error_nameinvalid_chars_reprr<   r<   r=   validate_project_nameY   s.   	
rc   r/   Collection[str] | strr.   c                   s:   t | }d t fdd|D rtdd  |S )zValidate the artifact aliases and return them as a list.

    Raises:
        ValueError: If any of the aliases contain invalid characters.
    r$   rT   c                 3  s"    | ]} D ]}||v V  qqd S r9   r<   ).0aliascharr`   r<   r=   	<genexpr>   s     z#validate_aliases.<locals>.<genexpr>z:Aliases must not contain any of the following characters: rH   r   anyrJ   rL   )r/   aliases_listr<   ri   r=   validate_aliases   s   rn   artifact_typesc                   s<   t | } d t fdd| D rtdd  d| S )zAReturn True if the artifact types list is valid, False otherwise.re   c                 3  s.    | ]} D ]}||v pt |d kV  qqdS )r"   N)rI   )rf   typerh   ri   r<   r=   rj      s    z/validate_artifact_types_list.<locals>.<genexpr>zAArtifact types must not contain any of the following characters: rH   z<
              and must be less than equal to 128 charactersrk   )ro   r<   ri   r=   validate_artifact_types_list   s   rq   z^[-\w]+( +[-\w]+)*$zre.Pattern[str]_VALID_TAG_PATTERNtagsc                 C  s0   t | }tdd |D rtdtt|S )a   Validate the artifact tag names and return them as a deduped list.

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

    Raises:
        ValueError: If any of the tags contain invalid characters.
    c                 s  s    | ]	}t | V  qd S r9   )rr   match)rf   tagr<   r<   r=   rj      s    z validate_tags.<locals>.<genexpr>zqInvalid tag(s).  Tags must only contain alphanumeric characters separated by hyphens, underscores, and/or spaces.)r   rl   rJ   rF   dictfromkeys)rs   	tags_listr<   r<   r=   validate_tags   s   ry   zwandb-RESERVED_ARTIFACT_TYPE_PREFIX)job	run_tablecodezFinal[tuple[str, ...]]RESERVED_ARTIFACT_TYPESzrun-zsource-)r|   r}   zFinal[dict[str, str]]RESERVED_ARTIFACT_NAME_PREFIXEStypc                 C  sR   | t v rt| }|r||rtd| d| S | tr'td| d| S )z5Validate the artifact type and return it as a string.zArtifact type z; is reserved for internal use. Please use a different type.)r~   r   getrY   rJ   rz   )r   r,   reserved_name_prefixr<   r<   r=   validate_artifact_type   s   

	

r   metadatadict[str, Any] | Nonedict[str, Any]c                 C  sJ   | du ri S t | tstdt|  ttttf t	t
t| S )z7Validate the artifact metadata and return it as a dict.Nzmetadata must be dict, not )
isinstancerv   	TypeErrorrp   r   r   r)   r	   jsonloadsdumpsr   )r   r<   r<   r=   validate_metadata   s
   
"r   gql_ttl_duration_seconds
int | Nonec                 C  s   | r| dkr| S dS )zIValidate the `ttlDurationSeconds` value (if any) from a GraphQL response.r   Nr<   )r   r<   r<   r=   validate_ttl_duration_seconds   s   r   
DecoratedF.methodc                   (    j t d
 fdd}tt|S )zDecorator to ensure that an Artifact method can only be called if the artifact has been logged.

    If the method is called on an artifact that's not logged, `ArtifactNotLoggedError` is raised.
    r;   r   argsr	   kwargsr6   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	   r6   r	   rC   r   r   r   r   r   r<   r   r=   ensure_logged      
r   c                   r   )zDecorator to ensure that an `Artifact` method can only be called if the artifact isn't finalized.

    If the method is called on an artifact that's not logged, `ArtifactFinalizedError` is raised.
    r;   r   r   r	   r   r6   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   projectr7   c                 C  s
   |  tS r9   )rY   r   )r   r<   r<   r=   is_artifact_registry_project  s   
r   c                   @  sV   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Z	dS )ArtifactPathr)   r,   NzOptional[str]r   prefixpathr6   r   c                 C  s0   t |d }dkr| t| S td|)z(Instantiate by parsing an artifact path.r$      zSExpected a valid path like `name`, `project/name`, or `prefix/project/name`.  Got: )rI   splitreversedrJ   )clsr   partsr<   r<   r=   from_str  s
   zArtifactPath.from_strc                 C  s   d tttt| S )z>Returns the slash-separated string representation of the path.r$   )rL   filterr7   r   r   r:   r<   r<   r=   to_str  s   zArtifactPath.to_str
str | Nonec                 C  s   t | | jp|| jp
|dS )z@Returns this path with missing values set to the given defaults.)r   r   )r   r   r   )r;   r   r   r<   r<   r=   with_defaults!  s
   zArtifactPath.with_defaults)r   r)   r6   r   )r6   r)   )NN)r   r   r   r   r6   r   )
rA   rB   rC   rE   r   r   classmethodr   r   r   r<   r<   r<   r=   r     s   
 
r   )r,   r)   r6   r)   )r,   r)   r6   rW   )r/   rd   r6   r.   )ro   r.   r6   r.   )rs   rd   r6   r.   )r   r)   r,   r)   r6   r)   )r   r   r6   r   )r   r   r6   r   )r   r   r6   r   )r   r)   r6   r7   )GrD   
__future__r   r   redataclassesr   r   r   r   	functoolsr   typingr   r	   r
   r   r   r   r   r   pydantic.dataclassespydantic_dataclasstyping_extensionsr   wandb._iterutilsr   wandb._pydanticr   
wandb.utilr   
_generatedr   r   
exceptionsr   r   r   r   wandb.sdk.artifacts.artifactr   r   r   r   rE   r!   r#   	frozensetr%   r&   r'   r(   rO   r[   rc   rn   rq   compilerr   ry   rz   r~   r   r   r   r   r   r   r   r   r   r<   r<   r<   r=   <module>   sb    (


'




	



