o
    ;i7                     @   s&  U d dl Z d dlZd dlZd dl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 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 ddlmZ ddlmZmZ ddlm Z m!Z! dZ"e#e$d< 	ddee% dee% fddZ&dd Z'dd Z(dd Z)G dd dZ*dS )    N)	AwaitableHashableSequencewraps)CallableClassVarOptional)Message)Self)suppress_tb_frame   )LoadContext)Resolver)TaskContextaclosing)deprecation_warning)_Client)configlogger)ExecutionErrorInvalidErrori,   EPHEMERAL_OBJECT_HEARTBEAT_SLEEPenvironment_namereturnc                 C   s   | r| S t dS )zGet environment name from various sources.

    Args:
        environment_name: Explicitly provided environment name (highest priority)

    Returns:
        Environment name from first available source, or config default
    environment)r   get)r    r   A/home/ubuntu/.local/lib/python3.10/site-packages/modal/_object.py_get_environment_name   s   
r   c                       t   fdd}|S )Nc                    s,   |   I d H   | g|R i |I d H S Nhydrateselfargskwargsmethodr   r   wrapped+   s   zlive_method.<locals>.wrappedr   r)   r*   r   r(   r   live_method*   s   r,   c                    r    )Nc              	     s~   |   I d H  t | g|R i |4 I d H }|2 z	3 d H W }|V  q6 W d   I d H  d S 1 I d H s8w   Y  d S r!   )r#   r   )r%   r&   r'   streamitemr(   r   r   r*   4   s   $.z live_method_gen.<locals>.wrappedr   r+   r   r(   r   live_method_gen3   s   r/   c                    s   t  tj fdd}|S )Nc              	     sf   |   I d H   | g|R i |4 I d H }|V  W d   I d H  d S 1 I d H s,w   Y  d S r!   r"   )r%   r&   r'   ctxr(   r   r   r*   C   s
    .z+live_method_contextmanager.<locals>.wrapped)r   
contextlibasynccontextmanagerr+   r   r(   r   live_method_contextmanager>   s   r3   c                       s  e Zd ZU dZeee  ed< i Zee	ee
f  ed< dZeeeeeee ged f  ed< eeeeeee ged f  ed< eed< eed< eed< eed	ed  f  ed
< dZeeg ee f  ed< eed< ee ed< ee ed< eed< eed< ee ed< edWdee f fddZdd Z							dXdddedeeeeeee ged f  dedeeeeeee ged f  dedeed	ed  f  deeg ee f  d ee d!ee fd"d#Zd$d% Zd&d' Zd(d) Zd*ed+ed,ee fd-d.Zd,ee fd/d0Zd1ee fd2d3Z d4d5 Z!d1efd6d7Z"e						dYdeeeeee ged f dededeeeeeee ged f  dedeed	ed  f  deeg ee f  d ee d!efd8d9Z#e$d*ed1e
d  fd:d;Z%ed1efd<d=Z&edWd ed>ee d1efd?d@Z'e		dZd*ed+edAee dedee d1efdBdCZ(dDefdEdFZ)dGdH Z*e+dIdJ Z,e+d1efdKdLZ-e.d1efdMdNZ/e+d1efdOdPZ0e+d1efdQdRZ1e+d1ed	ed  f fdSdTZ2dWd+ee d1efdUdVZ3  Z4S )[_ObjectN_type_prefix_prefix_to_type_load_preload_rep_is_another_app_hydrate_lazily._deps_deduplication_key_load_context_overrides
_object_id_client_is_hydrated_is_rehydrated_nametype_prefixc                    s*   t    |d ur|| _| | j|< d S d S r!   )super__init_subclass__r5   r6   )clsrD   	__class__r   r   rF   e   s
   
z_Object.__init_subclass__c                 O   s   t dt| j d)mdmd:hiddenzClass z; has no constructor. Use class constructor methods instead.)r   type__name__r$   r   r   r   __init__l   s   z_Object.__init__Fload_context_overridesreploadis_another_apppreloadhydrate_lazilydepsdeduplication_keynamerO   c	          
      C   sx   t t | _|| _|| _|| _|| _|| _|| _	|| _
|	d ur"|	nt | _d | _d | _d| _d| _|| _|   d S NF)struuiduuid4_local_uuidr7   r8   r9   r:   r;   r<   r=   r   emptyr>   r?   r@   rA   rB   rC   _initialize_from_empty)
r%   rP   rQ   rR   rS   rT   rU   rV   rW   rO   r   r   r   _initp   s    z_Object._initc                 C   s   d | _ d | _d| _d S rX   )r?   r@   rA   r%   r   r   r   
_unhydrate   s   
z_Object._unhydratec                 C      d S r!   r   r`   r   r   r   r^         z_Object._initialize_from_emptyc                 C   s   |j | _ |j| _|j| _d S r!   )r?   rA   r@   r%   otherr   r   r   _initialize_from_other   s   z_Object._initialize_from_other	object_idclientmetadatac              	   C   sn   t |tr
| jd usJ || js'tdt|  d| j d|d d  d|| _|| _| | d| _	d S )NzCan not hydrate z:  it has type prefix z but the object_id starts with    z. This usually means the object name was previously used for a different type. Rename the object/app or stop the previous deployment and redeploy.T)

isinstancerY   r5   
startswithr   rK   r?   r@   _hydrate_metadatarA   )r%   rg   rh   ri   r   r   r   _hydrate   s   


z_Object._hydratec                 C   rb   r!   r   )r%   ri   r   r   r   rm      rc   z_Object._hydrate_metadatar   c                 C   rb   r!   r   r`   r   r   r   _get_metadata   s   z_Object._get_metadatac                 C   sR   | j s'| jjd}t| drt| jddd u rd}nd}t| d| dd S )N__app_running_app z1, because the App it is defined on is not runningzA has not been hydrated with the metadata it needs to run on Modal.)rA   rI   rL   striphasattrgetattrrq   r   )r%   object_typereasonr   r   r   _validate_is_hydrated   s   z_Object._validate_is_hydratedc                 C   sF   | j jd}td| d |   t| t| }||  |S )zmdmd:hidden Clone a given hydrated object.

        Note: This is not intended to be public API and has no public use. It will be removed in a future release.
        rp   )i        zR.clone() is not intended to be public API and will be removed in a future release.)rI   rL   ru   r   rz   rK   __new__rf   )r%   object_classobjr   r   r   clone   s   
z_Object.clonec	                C   s*   t | }
|
j|||||||||	d	 |
S )NrN   )r4   r}   r_   )rG   rQ   rP   rR   rS   rT   rU   rV   rW   rO   r   r   r   r   _from_loader   s   
z_Object._from_loaderc                 C   sR   |  d}t|dkrtd|  d|d }|tjvr$td| dtj| S )N-   z
Object id z has no dash in itr   zObject prefix z does not correspond to a type)splitlenr   r4   r6   )rg   partsprefixr   r   r   _get_type_from_id   s   


z_Object._get_type_from_idc                 C   s   |  || kS r!   )r   )rG   rg   r   r   r   _is_id_type   s   z_Object._is_id_typer   c                 C   s4   | j d}|rd|nd}d| d|| dS )Nrp   z, environment_name=rs   modal.z.from_name())rL   ru   )rG   rW   r   
public_clsenvironment_reprr   r   r   _repr  s   z_Object._reprhandle_metadatac                 C   s   | j d ur|| j d std| d| j  | }nttt | |}t	|}|p9d|j
d d|d}|j||d |||| |S )	Nr   zObject z does not start with r   rp   z	.from_id(r   )rR   )r5   rl   r   typingcastrK   r   r   r4   r}   rL   ru   r_   rn   )rG   rg   rh   r   rR   rP   obj_clsr   r   r   r   _new_hydrated	  s   


z_Object._new_hydratedre   c                 C   s   |  |j|j|  d S r!   )rn   rg   rh   ro   rd   r   r   r   _hydrate_from_other'  s   z_Object._hydrate_from_otherc                 C      | j S r!   )r9   r`   r   r   r   __repr__*  s   z_Object.__repr__c                 C   r   rJ   )r\   r`   r   r   r   
local_uuid-     z_Object.local_uuidc                 C      | j du rtd|  | j S )rJ   Nz*Attempting to get object_id of unhydrated )r?   AttributeErrorr`   r   r   r   rg   2     
z_Object.object_idc                    s   d| j  S )rJ   zhttps://modal.com/id/)rg   r`   r   r   r   get_dashboard_url9  s   z_Object.get_dashboard_urlc                 C   r   )rJ   Nz'Attempting to get client of unhydrated )r@   r   r`   r   r   r   rh   >  r   z_Object.clientc                 C   r   r   )rA   r`   r   r   r   is_hydratedE  r   z_Object.is_hydratedc                 C   s&   dt d fdd}| jdur| jS |S )rJ   r   r4   c                  _   s   g S r!   r   )r&   r'   r   r   r   default_depsN  s   z"_Object.deps.<locals>.default_depsN)r   r<   )r%   r   r   r   r   rU   J  s   z_Object.depsc              	      s  | j r|| jjrz| jsztd|  d | jrVtd|  d d| _ t }t 4 I dH }t	|d}|
tt| |I dH  W d  I dH  n1 I dH sPw   Y  ntd|  d	 |pgt I dH | _d
| _td|  dt| j  | S | js|   | S t }t 4 I dH .}t	||d}t  |
| |I dH  W d   n1 sw   Y  W d  I dH  | S 1 I dH sw   Y  | S )au  Synchronize the local object with its identity on the Modal server.

        It is rarely necessary to call this method explicitly, as most operations
        will lazily hydrate when needed. The main use case is when you need to
        access object metadata, such as its ID.

        *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
        zrehydrating z after snapshotzreloading lazy z from serverFN)task_contextzreloading non-lazy z by replacing clientTzrehydrated z with client )rh   r   )rA   rh   _snapshottedrB   r   debugr;   r   r   r   rQ   r   r   r4   r   from_envr@   idrz   r   )r%   rh   resolvertcroot_load_contextr   r   r   r#   S  s>   

(	z_Object.hydrater!   )NFNFNNN)FNFNNN)FN)5rL   
__module____qualname__r5   r   r	   rY   __annotations__r6   dictrK   r7   r   r   r   r   r   boolr   r=   r   r   classmethodrF   rM   r_   ra   r^   rf   r
   rn   rm   ro   rz   r   r   staticmethodr   r   r   r   r   r   propertyr   rg   r,   r   rh   r   rU   r#   __classcell__r   r   rH   r   r4   M   s   
 ($	
"		
 r4   r!   )+r1   r   rZ   collections.abcr   r   r   	functoolsr   r   r   r	   google.protobuf.messager
   typing_extensionsr   modal._tracebackr   _load_contextr   	_resolverr   _utils.async_utilsr   r   _utils.deprecationr   rh   r   r   r   	exceptionr   r   r   intr   rY   r   r,   r/   r3   r4   r   r   r   r   <module>   s6   

	