a
    Nb*                     @   s   d dl Z d dlZ d dl mZ d dlmZ d dlZd dlZG dd deZ	G dd de	Z
G dd	 d	e	ZG d
d dejj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 )    N	text_type)parse_timestampc                   @   sr   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
edd ZedddZedddZdS )ListzBase class for lazy iteration over api response content

    This is a class providing lazy iteration.  This means that the
    content is loaded in chunks as long as the response hints at
    continuing content.
    Nc           	      O   s~   || _ || _d| _|| _|| || _|d u r6|j}t|| j| jd < d| _|| _	t
tjd| _d| _|| _|| _d S )Nlistlimitr   F)site	list_name	generatorprefixupdateargsZ	api_limitr   count	max_itemsitersixmovesrange_iterlastresult_memberreturn_values)	selfr   r	   r   r   r   r   r   kwargs r   M/var/www/html/diaryflask/venv/lib/python3.9/site-packages/mwclient/listing.py__init__   s    
zList.__init__c                 C   s   | S Nr   r   r   r   r   __iter__*   s    zList.__iter__c                    s   | j d ur| j| j krtzt| j  d ur4W q\W q tyX   | jrL |   Y q0 q|  jd7  _d v rt d  d< t	| t
r S t| jtu rt fdd| jD S | jd urʈ | j S  S )N   	timestampc                 3   s   | ]} | V  qd S r   r   ).0iitemr   r   	<genexpr>F       z List.__next__.<locals>.<genexpr>)r   r   StopIterationr   nextr   r   
load_chunkr   
isinstanceGeneratorListtyper   tupler   r   r$   r   __next__-   s*    



zList.__next__c                 O   s   | j |i |S )z For Python 2.x support )r/   )r   r   r   r   r   r   r)   K   s    z	List.nextc                 C   s   | j jd| j| jfgdd t| jD R  }|s8td|v rJ| | |drf| j	|d  n0| j|ddv r| j	|d | j  nd| _
dS )	a  Query a new chunk of data

        If the query is empty, `raise StopIteration`.

        Else, update the iterator accordingly.

        If 'continue' is in the response, it is added to `self.args`
        (new style continuation, added in MediaWiki 1.21).

        If not, but 'query-continue' is in the response, query its
        item called `self.list_name` and add this to `self.args` (old
        style continuation).

        Else, set `self.last` to True.
        queryc                 S   s   g | ]\}}t ||fqS r   r   )r"   kvr   r   r   
<listcomp>a   r'   z#List.load_chunk.<locals>.<listcomp>continuezquery-continuer   TN)r   getr
   r	   r   	iteritemsr   r(   set_iterr   r   r   datar   r   r   r*   O   s    

zList.load_chunkc                 C   sh   | j |d vr"ttjd| _nBt|d | j  tu rNt|d | j  | _nt|d | j  | _dS )z,Set `self._iter` to the API response `data`.r0   r   N)	r   r   r   r   r   r   r-   r   
itervaluesr8   r   r   r   r7   w   s
    zList.set_iterc                 C   s   d| j | jf S )Nz<List object '%s' for %s>)r	   r   r   r   r   r   __repr__   s    zList.__repr__c                 o   s@   | | t|D ]&\}}|d ur|dur| | |fV  qd S )NF)r   r   r6   )_prefixr   r   keyvaluer   r   r   generate_kwargs   s    
zList.generate_kwargsFc                 C   s   |rdnd|  S )Ng r   )r   r
   r   r   r   
get_prefix   s    zList.get_prefixc                 C   s   | rt S tS r   )r,   r   )r
   r   r   r   get_list   s    zList.get_list)NNN)F)F)__name__
__module____qualname____doc__r   r   r/   r)   r*   r7   r;   staticmethodr?   rB   rC   r   r   r   r   r   	   s    
(	
r   c                       s$   e Zd Z fddZdd Z  ZS )
NestedListc                    s    t t| j|i | || _d S r   )superrI   r   nested_param)r   rK   r   r   	__class__r   r   r      s    zNestedList.__init__c                 C   s   t |d | j | j | _d S )Nr0   )r   r   rK   r   r8   r   r   r   r7      s    zNestedList.set_iterrD   rE   rF   r   r7   __classcell__r   r   rL   r   rI      s   rI   c                       s8   e Zd ZdZ fddZ fddZ fddZ  ZS )r,   zLazy-loaded list of Page, Image or Category objects

    While the standard List class yields raw response data
    (optionally filtered based on the value of List.return_values),
    this subclass turns the data into Page, Image or Category objects.
    c                    s~   t t| j|||g|R i | | j| jd  | jd| j d < | j| jd = d| _d| jd< d| jd< d| _tjj	| _
d S )	Nr   r@   r
   zinfo|imageinfopropZ
protectionZinproppages)rJ   r,   r   r   r   r
   r   mwclientpagePageZ
page_class)r   r   r	   r   r   r   rL   r   r   r      s     

zGeneratorList.__init__c                    sX   t t|  }|d dkr(t| jd|S |d dkrFtj| jd|S tj	| jd|S )Nns   rA      )
rJ   r,   r/   Categoryr   rR   imageImagerS   rT   )r   inforL   r   r   r/      s    zGeneratorList.__next__c                    s   d| j d< tt|  S )Nz9timestamp|user|comment|url|size|sha1|metadata|archivenameZiiprop)r   rJ   r,   r*   r   rL   r   r   r*      s    
zGeneratorList.load_chunk)rD   rE   rF   rG   r   r/   r*   rO   r   r   rL   r   r,      s   r,   c                   @   s(   e Zd ZdddZdd Zdd
dZdS )rX   Nc                 C   sJ   t jj| ||| i }| j|d< |r.||d< tj| |ddfi | d S )NZgcmtitleZgcmnamespacecategorymemberscm)rR   rS   rT   r   namer,   )r   r   r^   r[   	namespacer   r   r   r   r      s    
zCategory.__init__c                 C   s   d| j d| jf S )Nz<Category object '%s' for %s>zutf-8)r^   encoder   r   r   r   r   r;      s    zCategory.__repr__	ids|titlesortkeyascTc           
      C   sH   |  d|}t| j|||||||| jd}	| || jddfi |	S )Nr]   )rP   r_   sortdirstartendtitler\   )rB   dictr?   r^   rC   r   )
r   rP   r_   rd   re   rf   rg   r
   r   r   r   r   r   members   s    zCategory.members)NN)ra   Nrb   rc   NNT)rD   rE   rF   r   r;   rj   r   r   r   r   rX      s
   
  rX   c                       s8   e Zd Zd fdd	Zdd Zdd	d
Zdd Z  ZS )PageListNr   allc                    sX   || _ i }|r||d< |r"||d< |r.||d< tt| j|ddft||d| d S )NZ	gapprefixZgapfromZgaptoZallpagesZap)ZgapnamespaceZgapfilterredir)r_   rJ   rk   r   r   )r   r   r   rf   r_   Z	redirectsrg   r   rL   r   r   r      s    zPageList.__init__c                 C   s   |  |d S r   )r5   )r   r^   r   r   r   __getitem__   s    zPageList.__getitem__r   c                 C   s|   | j dkr*dj| jj| j  |d}| j }n*|}z| |}W n tyR   d}Y n0 ttjj	d
|tjj}|| j||S )a@  Return the page of name `name` as an object.

        If self.namespace is not zero, use {namespace}:{name} as the
        page name, otherwise guess the namespace from the name using
        `self.guess_namespace`.

        Returns:
            One of Category, Image or Page (default), according to namespace.
        r   z{namespace}:{name})r_   r^   )rV   rW   )r_   formatr   
namespacesguess_namespaceAttributeErrorrX   rR   rY   rZ   r5   rS   rT   )r   r^   r[   Zfull_page_namer_   clsr   r   r   r5      s"    


zPageList.getc                 C   s|   | j jD ]n}|dkrqd| j j| dd }||r@|  S || j jv rd| j j| dd }||r|  S qdS )aB  Guess the namespace from name

        If name starts with any of the site's namespaces' names or
        default_namespaces, use that.  Else, return zero.

        Args:
            name (str): The pagename as a string (having `.startswith`)

        Returns:
            The id of the guessed namespace or zero.
        r   z%s: _)r   ro   replace
startswithZdefault_namespaces)r   r^   rU   r_   r   r   r   rp     s    


zPageList.guess_namespace)NNr   rl   N)r   )rD   rE   rF   r   rm   r5   rp   rO   r   r   rL   r   rk      s     
rk   c                       s$   e Zd Z fddZdd Z  ZS )PagePropertyc                    s:   t t| j|j||g|R d|ji| || _d| _d S )NtitlesrP   )rJ   rw   r   r   r^   rS   r
   r   rS   rP   r   r   r   rL   r   r   r   (  s    zPageProperty.__init__c                 C   sJ   t |d d D ].}|d | jjkrt|| jd| _ d S qtd S )Nr0   rQ   rh   r   )	r   r:   rS   r^   r   r5   r	   r   r(   )r   r9   rS   r   r   r   r7   /  s
    zPageProperty.set_iterrN   r   r   rL   r   rw   &  s   rw   c                       s   e Zd Z fddZ  ZS )PagePropertyGeneratorc                    s4   t t| j|j||g|R d|ji| || _d S )Nrx   )rJ   rz   r   r   r^   rS   ry   rL   r   r   r   9  s    zPagePropertyGenerator.__init__)rD   rE   rF   r   rO   r   r   rL   r   rz   7  s   rz   c                       s   e Zd Z fddZ  ZS )RevisionsIteratorc                    s*   d| j v rd| j v r| j d= tt|  S )NZ	rvstartidZrvstart)r   rJ   r{   r*   r   rL   r   r   r*   B  s    zRevisionsIterator.load_chunk)rD   rE   rF   r*   rO   r   r   rL   r   r{   @  s   r{   )r   Z	six.movesr   Zmwclient.utilr   Zmwclient.pagerR   Zmwclient.imageobjectr   rI   r,   rS   rT   rX   rk   rw   rz   r{   r   r   r   r   <module>   s    	&N	