
    "hj1                         d Z ddlmZmZ ddlmZ ddlmZmZ  G d de	      Z
 G d de
      Z G d	 d
e
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Zy)u   
oss2.iterators
~~~~~~~~~~~~~~

该模块包含了一些易于使用的迭代器，可以用来遍历Bucket、文件、分片上传等。
   )MultipartUploadInfoSimplifiedObjectInfo)ServerError)defaultshttpc                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)_BaseIteratorc                     d| _         || _        t        j                  |t        j                        }|dkD  r|nd| _        g | _        y )NT    r   )is_truncatednext_markerr   getrequest_retriesmax_retriesentries)selfmarkerr   s      L/root/.hermes/SkillClaw/.venv/lib/python3.12/site-packages/oss2/iterators.py__init__z_BaseIterator.__init__   s?     !ll;0H0HI*5/;q    c                     t         N)NotImplementedr   s    r   _fetchz_BaseIterator._fetch   s    r   c                     | S r    r   s    r   __iter__z_BaseIterator.__iter__   s    r   c                     	 | j                   r| j                   j                  d      S | j                  st        | j	                          J)Nr   )r   popr   StopIterationfetch_with_retryr   s    r   __next__z_BaseIterator.__next__    sA    ||||''**$$##!!# r   c                 "    | j                         S r   )r#   r   s    r   nextz_BaseIterator.next*   s    }}r   c                     t        | j                        D ]!  }	 | j                         \  | _        | _         y  y # t
        $ r0}|j                  dz  dk7  r || j                  dz
  k(  r Y d }~Yd }~ww xY w)Nd      r   )ranger   r   r   r   r   status)r   ies      r   r"   z_BaseIterator.fetch_with_retry-   s|    t''( 
	A	6:kkm3!4#3 
	  88s?a'((1,, -	s   ;	A4&A//A4N)	__name__
__module____qualname__r   r   r   r#   r%   r"   r   r   r   r	   r	      s     $r   r	   c                   *     e Zd ZdZd fd	Zd Z x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参数。注意迭代器返回的数目可能会大于该值。
    c                 X    t         t        |   ||       || _        || _        || _        y r   )superr1   r   serviceprefixmax_keys)r   r4   r5   r   r6   r   	__class__s         r   r   zBucketIterator.__init__E   s)    nd,V[A r   c                     | j                   j                  | j                  | j                  | j                        }|j
                  | _        |j                  |j                  fS N)r5   r   r6   )r4   list_bucketsr5   r   r6   bucketsr   r   r   results     r   r   zBucketIterator._fetchK   sV    **$++262B2B48MM + C ~~""F$6$666r    r?   r'   Nr-   r.   r/   __doc__r   r   __classcell__r7   s   @r   r1   r1   ;   s    !7r   r1   c                   *     e Zd ZdZd fd	Zd Z xZS )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
    c                     t         t        |   ||       || _        || _        || _        || _        t        j                  |      | _	        y r   )
r3   rE   r   bucketr5   	delimiterr6   r   CaseInsensitiveDictheaders)	r   rG   r5   rH   r   r6   r   rJ   r7   s	           r   r   zObjectIterator.__init__c   sB    nd,V[A" //8r   c                    | j                   j                  | j                  | j                  | j                  | j
                  | j                        }|j                  |j                  D cg c]  }t        |d d d d d        c}z   | _
        | j                  j                  d        |j                  |j                  fS c c}w )N)r5   rH   r   r6   rJ   c                     | j                   S r   keyobjs    r   <lambda>z'ObjectIterator._fetch.<locals>.<lambda>t   
    #'' r   rM   )rG   list_objectsr5   rH   r   r6   rJ   object_listprefix_listr   r   sortr   r   r=   r5   s      r   r   zObjectIterator._fetchl   s    ))48NN151A1A37==26,,	 * @
 ));A;M;M-O17 .B&$PTVZ\`bf-g -O O12""F$6$666	-Os   ,C)r?   r?   r?   r'   NNr@   rC   s   @r   rE   rE   T   s    9
7r   rE   c                   *     e Zd ZdZd fd	Zd Z x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
    c                     t         t        |   ||	       || _        || _        || _        || _        || _        || _        || _	        t        j                  |
      | _        y r   )r3   rY   r   rG   r5   rH   start_afterfetch_ownerencoding_typer6   r   rI   rJ   )r   rG   r5   rH   continuation_tokenr[   r\   r]   r6   r   rJ   r7   s              r   r   zObjectIteratorV2.__init__   s\    ./A;O"&&* //8r   c                    | j                   j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                        }|j                  |j                  D cg c]  }t        |d d d d d        c}z   | _        | j                  j                  d        |j                  |j                   fS c c}w )N)r5   rH   r^   r[   r\   r]   r6   rJ   c                     | j                   S r   rM   rO   s    r   rQ   z)ObjectIteratorV2._fetch.<locals>.<lambda>   rR   r   rM   )rG   list_objects_v2r5   rH   r   r[   r\   r]   r6   rJ   rT   rU   r   r   rV   r   next_continuation_tokenrW   s      r   r   zObjectIteratorV2._fetch   s    ,,DKK48NN=A=M=M6:6F6F6:6F6F8<8J8J37==26,, - @ ));A;M;M-O17 .B&$PTVZ\`bf-g -O O12""F$B$BBB	-Os   C#)	r?   r?   r?   r?   Furlr'   NNr@   rC   s   @r   rY   rY   x   s     
9Cr   rY   c                   .     e Zd ZdZ	 	 d fd	Zd Z x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
    c	                     t         t        |   ||       || _        || _        || _        || _        || _        t        j                  |      | _
        y r   )r3   re   r   rG   r5   rH   next_upload_id_markermax_uploadsr   rI   rJ   )
r   rG   r5   rH   
key_markerupload_id_markerrh   r   rJ   r7   s
            r   r   z MultipartUploadIterator.__init__   sN     	%t5j+N"%5"&//8r   c           	         | j                   j                  | j                  | j                  | j                  | j
                  | j                  | j                        }|j                  |j                  D cg c]  }t        |d d        c}z   | _        | j                  j                  d        |j
                  | _        |j                  |j                  fS c c}w )N)r5   rH   ri   rj   rh   rJ   c                     | j                   S r   rM   )us    r   rQ   z0MultipartUploadIterator._fetch.<locals>.<lambda>   s
     r   rM   )rG   list_multipart_uploadsr5   rH   r   rg   rh   rJ   upload_listrU   r   r   rV   r   next_key_markerrW   s      r   r   zMultipartUploadIterator._fetch   s    334;;>Bnn?C?O?OEIE_E_@D@P@P<@LL 4 J ))cicucu,vY_-@t-T,vvo.%+%A%A"""F$:$:::	 -ws   7C)r?   r?   r?   r?     NNr@   rC   s   @r   re   re      s      KM=A
9;r   re   c                   *     e Zd ZdZd fd	Zd Z x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
    c                     t         t        |   d|       || _        || _        d| _        || _        t        j                  |      | _	        y )Nr?   )
r3   rs   r   rG   rN   rg   rh   r   rI   rJ   )r   rG   rN   rh   r   rJ   r7   s         r   r   zObjectUploadIterator.__init__   sE    "D22{C%'"&//8r   c                    | j                   j                  | j                  | j                  | j                  | j
                  | j                        }|j                  D cg c]  }|j                  | j                  k(  s|  c}| _        |j                  | _        |j                  r| j                  sd|j                  fS |j                  | j                  kD  rd|j                  fS |j                  |j                  fS c c}w )N)r5   ri   rj   rh   rJ   F)rG   rn   rN   r   rg   rh   rJ   ro   r   r   rp   )r   r=   rm   s      r   r   zObjectUploadIterator._fetch   s    33488?C?O?OEIE_E_@D@P@P<@LL	 4 J $*#5#5Ka$((9JK%+%A%A"""$,,&0000!!DHH,&0000""F$:$::: Ls   !D D)rq   NNr@   rC   s   @r   rs   rs      s    9;r   rs   c                   ,     e Zd ZdZ	 d fd	Zd Z x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
    c                     t         t        |   ||       || _        || _        || _        || _        t        j                  |      | _	        y r   )
r3   rw   r   rG   rN   	upload_id	max_partsr   rI   rJ   )	r   rG   rN   ry   r   rz   r   rJ   r7   s	           r   r   zPartIterator.__init__  sB    lD*6;?""//8r   c                     | j                   j                  | j                  | j                  | j                  | j
                  | j                        }|j                  | _        |j                  |j                  fS )N)r   rz   rJ   )
rG   
list_partsrN   ry   r   rz   rJ   partsr   r   r<   s     r   r   zPartIterator._fetch  sb    ''$../3/?/?26..04 ( > ||""F$6$666r   )0rq   NNr@   rC   s   @r   rw   rw      s     HL97r   rw   c                   *     e Zd ZdZd fd	Zd Z xZS )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参数。注意迭代器返回的数目可能会大于该值。
    c                 X    t         t        |   ||       || _        || _        || _        y r   )r3   r   r   rG   r5   r6   )r   rG   r5   r   r6   r   r7   s         r   r   zLiveChannelIterator.__init__"  s*    !41&+F r   c                     | j                   j                  | j                  | j                  | j                        }|j
                  | _        |j                  |j                  fS r9   )rG   list_live_channelr5   r   r6   channelsr   r   r<   s     r   r   zLiveChannelIterator._fetch)  sV    ..dkk6:6F6F8< / G ""F$6$666r   r>   r@   rC   s   @r   r   r     s    !7r   r   N)rA   modelsr   r   
exceptionsr   r?   r   r   objectr	   r1   rE   rY   re   rs   rw   r   r   r   r   <module>r      s}    > # (F (V7] 72"7] "7H*C} *CX';m ';T%;= %;P7= 7D7- 7r   