o
    wi                     @  s  d dl mZ d dlmZmZ d dlmZmZmZm	Z	 d dl
mZmZmZmZmZmZ d dlZd dlmZ erHd dlmZ d dlmZ d d	lmZ ed
Z	 edZ	 G dd dee eZG dd dee e	eZG dd dee eeef eZG dd deeef e	eZdS )    )annotations)ABCabstractmethod)IterableIteratorMappingSized)TYPE_CHECKINGAnyClassVarGenericTypeVaroverloadN)nameof)Document)
Connection)RetryingClient_WandbT_NodeTc                   @  s   e Zd ZU dZded< 	d.d/ddZd0ddZeed1ddZ	eed2ddZ
ed3ddZd4ddZd4ddZd1dd Zed5d#d$Zed6d'd$Zd7d*d$Zd8d+d,ZeZd-S )9	Paginatorz8An iterator for paginated objects from GraphQL requests.z$Document | ClassVar[Document | None]QUERY2   clientr   	variablesMapping[str, Any]per_pageintc                 C  s,   || _ t|| _|| _g | _d| _d | _d S N)r   dictr   r   objectsindexlast_response)selfr   r   r    r$   H/home/ubuntu/.local/lib/python3.10/site-packages/wandb/apis/paginator.py__init__   s   

zPaginator.__init__returnIterator[_WandbT]c                 C  s
   d| _ | S r   )r!   r#   r$   r$   r%   __iter__,   s   zPaginator.__iter__boolc                 C     t )z+Whether there are more pages to be fetched.NotImplementedErrorr)   r$   r$   r%   more0      zPaginator.more
str | Nonec                 C  r,   )z2The start cursor to use for the next fetched page.r-   r)   r$   r$   r%   cursor6   r0   zPaginator.cursorIterable[_WandbT]c                 C  r,   )zAConvert the last fetched response data into the iterated objects.r-   r)   r$   r$   r%   convert_objects<      zPaginator.convert_objectsNonec                 C  s   | j | j| jd dS )z3Update the query variables for the next page fetch.)perPager2   N)r   updater   r2   r)   r$   r$   r%   update_variablesA   s   zPaginator.update_variablesc                 C  s   | j j| j| jd| _dS )z4Fetch and store the response data for the next page.)variable_valuesN)r   executer   r   r"   r)   r$   r$   r%   _update_responseE   s   zPaginator._update_responsec                 C  s.   | j sdS |   |   | j|   dS )zVFetch the next page, if any, returning True and storing the response if there was one.FT)r/   r9   r<   r    extendr4   r)   r$   r$   r%   
_load_pageK   s   zPaginator._load_pager!   r   c                 C     d S Nr$   r#   r!   r$   r$   r%   __getitem__T      zPaginator.__getitem__slicelist[_WandbT]c                 C  r?   r@   r$   rA   r$   r$   r%   rB   V   rC   int | slice_WandbT | list[_WandbT]c                 C  sV   d}t |tr
|jn|}|r&|t| jd kr&|  }|r&|t| jd ks| j| S )NT   )
isinstancerD   stoplenr    r>   )r#   r!   loadedrJ   r$   r$   r%   rB   Y   s   
c                 C  sJ   |  j d7  _ t| j| j kr|  stt| j| j krt| j| j  S )NrH   )r!   rK   r    r>   StopIterationr)   r$   r$   r%   __next__`   s   zPaginator.__next__N)r   )r   r   r   r   r   r   )r'   r(   r'   r+   r'   r1   r'   r3   )r'   r6   )r!   r   r'   r   )r!   rD   r'   rE   )r!   rF   r'   rG   )r'   r   )__name__
__module____qualname____doc____annotations__r&   r*   propertyr   r/   r2   r4   r9   r<   r>   r   rB   rN   nextr$   r$   r$   r%   r      s0   
 



	

	r   c                   @  s:   e Zd ZdZedddZdddZeedd	d
ZdS )SizedPaginatorz1A Paginator for objects with a known total count.r'   
int | Nonec                 C  s   t jddd t| S )NzX`.length` is deprecated and will be removed in a future version. Use `len(...)` instead.F)repeat)wandbtermwarnrK   r)   r$   r$   r%   lengtho   s
   zSizedPaginator.lengthr   c                 C  s*   | j d u r	|   | j d u rtd| j S )NzObject doesn't provide length)_lengthr>   
ValueErrorr)   r$   r$   r%   __len__z   s
   

zSizedPaginator.__len__c                 C  r,   r@   r-   r)   r$   r$   r%   r_      r5   zSizedPaginator._lengthN)r'   rZ   r'   r   )	rR   rS   rT   rU   rW   r^   ra   r   r_   r$   r$   r$   r%   rY   l   s    

rY   c                   @  sN   e Zd ZU dZded< edddZedd	d
ZedddZ	dddZ
dS )RelayPaginatorzlA Paginator for GQL relay-style nodes parsed via Pydantic.

    <!-- lazydoc-ignore-class: internal -->
    Connection[_NodeT] | Noner"   r'   r+   c                 C  s   | j  }d u p	|jS r@   )r"   has_nextr#   connr$   r$   r%   r/         zRelayPaginator.morer1   c                 C  s   | j  }r|jS d S r@   )r"   next_cursorrf   r$   r$   r%   r2      rh   zRelayPaginator.cursornoder   _WandbT | Anyc                 C  r,   )zConvert a parsed GraphQL node into the iterated object.

        If a falsey value is returned, it will be skipped during iteration.
        r-   )r#   rj   r$   r$   r%   _convert   s   zRelayPaginator._convertr3   c                 c  s0    | j  }rtd t| j| E d H  d S d S r@   )r"   filtermaprl   nodesrf   r$   r$   r%   r4      s   
 zRelayPaginator.convert_objectsNrO   rP   )rj   r   r'   rk   rQ   )rR   rS   rT   rU   rV   rW   r/   r2   r   rl   r4   r$   r$   r$   r%   rc      s   
 rc   c                   @  s$   e Zd ZU dZded< d	ddZdS )
SizedRelayPaginatorzzA Paginator for GQL nodes parsed via Pydantic, with a known total count.

    <!-- lazydoc-ignore-class: internal -->
    rd   r"   r'   r   c                 C  sD   | j du r	|   | j  }r|j }dur|S ttt| d)z.Returns the total number of objects to expect.Nz doesn't provide length)r"   r>   total_countr.   r   type)r#   rg   totalr$   r$   r%   ra      s
   
zSizedRelayPaginator.__len__Nrb   )rR   rS   rT   rU   rV   ra   r$   r$   r$   r%   rp      s   
 rp   ) 
__future__r   abcr   r   collections.abcr   r   r   r   typingr	   r
   r   r   r   r   r\   wandb._strutilsr   wandb_graphql.language.astr   wandb._pydanticr   wandb.apis.public.apir   r   r   r   rY   rc   rp   r$   r$   r$   r%   <module>   s$     U  