o
    i1                     @   s   d Z ddlmZmZ ddlmZ ddlmZmZ G dd de	Z
G dd de
ZG d	d
 d
e
ZG dd de
ZG dd de
ZG dd de
ZG dd de
ZG dd de
ZdS )u   
oss2.iterators
~~~~~~~~~~~~~~

该模块包含了一些易于使用的迭代器，可以用来遍历Bucket、文件、分片上传等。
   )MultipartUploadInfoSimplifiedObjectInfo)ServerError)defaultshttpc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_BaseIteratorc                 C   s6   d| _ || _t|tj}|dkr|nd| _g | _d S )NT    r   )is_truncatednext_markerr   getrequest_retriesmax_retriesentries)selfmarkerr    r   B/home/ubuntu/.local/lib/python3.10/site-packages/oss2/iterators.py__init__   s
   
z_BaseIterator.__init__c                 C   s   t N)NotImplementedr   r   r   r   _fetch      z_BaseIterator._fetchc                 C   s   | S r   r   r   r   r   r   __iter__   r   z_BaseIterator.__iter__c                 C   s(   	 | j r
| j dS | jst|   q)NTr   )r   popr	   StopIterationfetch_with_retryr   r   r   r   __next__    s   z_BaseIterator.__next__c                 C   s   |   S r   )r   r   r   r   r   next*   s   z_BaseIterator.nextc                 C   sp   t | jD ]0}z|  \| _| _W  d S  ty5 } z|jd dkr# || jd kr+ W Y d }~qd }~ww d S )Nd      r   )ranger   r   r	   r
   r   status)r   ier   r   r   r   -   s   z_BaseIterator.fetch_with_retryN)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r      s    	
r   c                       *   e Zd ZdZd	 fdd	Zdd Z  ZS )
BucketIteratoru  遍历用户Bucket的迭代器。

    每次迭代返回的是 :class:`SimplifiedBucketInfo <oss2.models.SimplifiedBucketInfo>` 对象。

    :param service: :class:`Service <oss2.Service>` 对象
    :param prefix: 只列举匹配该前缀的Bucket
    :param marker: 分页符。只列举Bucket名字典序在此之后的Bucket
    :param max_keys: 每次调用 `list_buckets` 时的max_keys参数。注意迭代器返回的数目可能会大于该值。
     r   Nc                    (   t t| || || _|| _|| _d S r   )superr)   r   serviceprefixmax_keys)r   r-   r.   r   r/   r   	__class__r   r   r   E   s   
zBucketIterator.__init__c                 C   ,   | j j| j| j| jd}|j| _|j|jfS N)r.   r   r/   )r-   list_bucketsr.   r
   r/   bucketsr   r	   r   resultr   r   r   r   K      
zBucketIterator._fetchr*   r*   r   Nr%   r&   r'   __doc__r   r   __classcell__r   r   r0   r   r)   ;   s    	r)   c                       r(   )
ObjectIteratoru  遍历Bucket里文件的迭代器。

    每次迭代返回的是 :class:`SimplifiedObjectInfo <oss2.models.SimplifiedObjectInfo>` 对象。
    当 `SimplifiedObjectInfo.is_prefix()` 返回True时，表明是公共前缀（目录）。

    :param bucket: :class:`Bucket <oss2.Bucket>` 对象
    :param prefix: 只列举匹配该前缀的文件
    :param delimiter: 目录分隔符
    :param marker: 分页符
    :param max_keys: 每次调用 `list_objects` 时的max_keys参数。注意迭代器返回的数目可能会大于该值。

    :param headers: HTTP头部
    :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
    r*   r   Nc                    :   t t| || || _|| _|| _|| _t|| _	d S r   )
r,   r=   r   bucketr.   	delimiterr/   r   CaseInsensitiveDictheaders)r   r?   r.   r@   r   r/   r   rB   r0   r   r   r   c   s   zObjectIterator.__init__c                 C   sV   | j j| j| j| j| j| jd}|jdd |jD  | _	| j	j
dd d |j|jfS )N)r.   r@   r   r/   rB   c              	   S      g | ]}t |d d d d d qS r   r   .0r.   r   r   r   
<listcomp>r       z)ObjectIterator._fetch.<locals>.<listcomp>c                 S      | j S r   keyobjr   r   r   <lambda>t       z'ObjectIterator._fetch.<locals>.<lambda>rJ   )r?   list_objectsr.   r@   r
   r/   rB   object_listprefix_listr   sortr	   r6   r   r   r   r   l   s   


zObjectIterator._fetch)r*   r*   r*   r   NNr:   r   r   r0   r   r=   T   s    	r=   c                       s*   e Zd ZdZd fdd	Zd	d
 Z  ZS )ObjectIteratorV2u{  遍历Bucket里文件的迭代器。

    每次迭代返回的是 :class:`SimplifiedObjectInfo <oss2.models.SimplifiedObjectInfo>` 对象。
    当 `SimplifiedObjectInfo.is_prefix()` 返回True时，表明是公共前缀（目录）。

    :param str prefix: 只罗列文件名为该前缀的文件
    :param str delimiter: 分隔符。可以用来模拟目录
    :param str continuation_token: 分页标志。首次调用传空串，后续使用返回值的next_continuation_token
    :param str start_after: 起始文件名称，OSS会按照文件的字典序排列返回start_after之后的文件。
    :param bool fetch_owner: 是否获取文件的owner信息，默认不返回。
    :param int max_keys: 最多返回文件的个数，文件和目录的和不能超过该值

    :param headers: HTTP头部
    :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
    r*   Furlr   Nc                    sL   t t| ||	 || _|| _|| _|| _|| _|| _|| _	t
|
| _d S r   )r,   rT   r   r?   r.   r@   start_afterfetch_ownerencoding_typer/   r   rA   rB   )r   r?   r.   r@   continuation_tokenrV   rW   rX   r/   r   rB   r0   r   r   r      s   zObjectIteratorV2.__init__c              
   C   sb   | j j| j| j| j| j| j| j| j| j	d}|j
dd |jD  | _| jjdd d |j|jfS )N)r.   r@   rY   rV   rW   rX   r/   rB   c              	   S   rC   r   rD   rE   r   r   r   rG      rH   z+ObjectIteratorV2._fetch.<locals>.<listcomp>c                 S   rI   r   rJ   rL   r   r   r   rN      rO   z)ObjectIteratorV2._fetch.<locals>.<lambda>rJ   )r?   list_objects_v2r.   r@   r
   rV   rW   rX   r/   rB   rQ   rR   r   rS   r	   next_continuation_tokenr6   r   r   r   r      s   


zObjectIteratorV2._fetch)	r*   r*   r*   r*   FrU   r   NNr:   r   r   r0   r   rT   x   s    rT   c                       s.   e Zd ZdZ		d	 fdd	Zdd Z  ZS )
MultipartUploadIteratoru  遍历Bucket里未完成的分片上传。

    每次返回 :class:`MultipartUploadInfo <oss2.models.MultipartUploadInfo>` 对象。
    当 `MultipartUploadInfo.is_prefix()` 返回True时，表明是公共前缀（目录）。

    :param bucket: :class:`Bucket <oss2.Bucket>` 对象
    :param prefix: 仅列举匹配该前缀的文件的分片上传
    :param delimiter: 目录分隔符
    :param key_marker: 文件名分页符
    :param upload_id_marker: 分片上传ID分页符
    :param max_uploads: 每次调用 `list_multipart_uploads` 时的max_uploads参数。注意迭代器返回的数目可能会大于该值。

    :param headers: HTTP头部
    :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
    r*     Nc	           	         s@   t t| || || _|| _|| _|| _|| _t	|| _
d S r   )r,   r\   r   r?   r.   r@   next_upload_id_markermax_uploadsr   rA   rB   )	r   r?   r.   r@   
key_markerupload_id_markerr_   r   rB   r0   r   r   r      s   z MultipartUploadIterator.__init__c                 C   sb   | j j| j| j| j| j| j| jd}|jdd |j	D  | _
| j
jdd d |j| _|j|jfS )N)r.   r@   r`   ra   r_   rB   c                 S   s   g | ]}t |d d qS r   )r   rE   r   r   r   rG      s    z2MultipartUploadIterator._fetch.<locals>.<listcomp>c                 S   rI   r   rJ   )ur   r   r   rN      rO   z0MultipartUploadIterator._fetch.<locals>.<lambda>rJ   )r?   list_multipart_uploadsr.   r@   r
   r^   r_   rB   upload_listrR   r   rS   r	   next_key_markerr6   r   r   r   r      s   
zMultipartUploadIterator._fetch)r*   r*   r*   r*   r]   NNr:   r   r   r0   r   r\      s    r\   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	ObjectUploadIteratoru9  遍历一个Object所有未完成的分片上传。

    每次返回 :class:`MultipartUploadInfo <oss2.models.MultipartUploadInfo>` 对象。
    当 `MultipartUploadInfo.is_prefix()` 返回True时，表明是公共前缀（目录）。

    :param bucket: :class:`Bucket <oss2.Bucket>` 对象
    :param key: 文件名
    :param max_uploads: 每次调用 `list_multipart_uploads` 时的max_uploads参数。注意迭代器返回的数目可能会大于该值。

    :param headers: HTTP头部
    :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
    r]   Nc                    s:   t t| d| || _|| _d| _|| _t|| _	d S )Nr*   )
r,   rf   r   r?   rK   r^   r_   r   rA   rB   )r   r?   rK   r_   r   rB   r0   r   r   r      s   zObjectUploadIterator.__init__c                    sv    j j j j j j jd} fdd|jD  _|j _|j	r% js*d|j
fS |j
 jkr5d|j
fS |j	|j
fS )N)r.   r`   ra   r_   rB   c                    s   g | ]
}|j  j kr|qS r   rJ   )rF   rb   r   r   r   rG      s    z/ObjectUploadIterator._fetch.<locals>.<listcomp>F)r?   rc   rK   r
   r^   r_   rB   rd   r   r	   re   r6   r   r   r   r      s   


zObjectUploadIterator._fetch)r]   NNr:   r   r   r0   r   rf      s    rf   c                       s,   e Zd ZdZ	d	 fdd	Zdd Z  ZS )
PartIteratoru  遍历一个分片上传会话中已经上传的分片。

    每次返回 :class:`PartInfo <oss2.models.PartInfo>` 对象。

    :param bucket: :class:`Bucket <oss2.Bucket>` 对象
    :param key: 文件名
    :param upload_id: 分片上传ID
    :param marker: 分页符
    :param max_parts: 每次调用 `list_parts` 时的max_parts参数。注意迭代器返回的数目可能会大于该值。

    :param headers: HTTP头部
    :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
    0r]   Nc                    r>   r   )
r,   rg   r   r?   rK   	upload_id	max_partsr   rA   rB   )r   r?   rK   ri   r   rj   r   rB   r0   r   r   r     s   zPartIterator.__init__c                 C   s4   | j j| j| j| j| j| jd}|j| _|j	|jfS )N)r   rj   rB   )
r?   
list_partsrK   ri   r
   rj   rB   partsr   r	   r6   r   r   r   r     s   zPartIterator._fetch)rh   r]   NNr:   r   r   r0   r   rg      s
    
rg   c                       r(   )
LiveChannelIteratoru  遍历Bucket里文件的迭代器。

    每次迭代返回的是 :class:`LiveChannelInfo <oss2.models.LiveChannelInfo>` 对象。

    :param bucket: :class:`Bucket <oss2.Bucket>` 对象
    :param prefix: 只列举匹配该前缀的文件
    :param marker: 分页符
    :param max_keys: 每次调用 `list_live_channel` 时的max_keys参数。注意迭代器返回的数目可能会大于该值。
    r*   r   Nc                    r+   r   )r,   rm   r   r?   r.   r/   )r   r?   r.   r   r/   r   r0   r   r   r   "  s   
zLiveChannelIterator.__init__c                 C   r2   r3   )r?   list_live_channelr.   r
   r/   channelsr   r	   r6   r   r   r   r   )  r8   zLiveChannelIterator._fetchr9   r:   r   r   r0   r   rm     s    	rm   N)r;   modelsr   r   
exceptionsr   r*   r   r   objectr   r)   r=   rT   r\   rf   rg   rm   r   r   r   r   <module>   s   +$,*("