U
    l^C                     @   s>   d Z ddlmZ ddlmZ ddlmZ G dd dejZdS )	zV
Keyring Chainer - iterates over other viable backends to
discover passwords in each.
    )absolute_import   )backend)
propertiesc                   @   sX   e Zd ZdZdZejedd Zejedd Z	dd Z
d	d
 Zdd Zdd ZdS )ChainerBackendzZ
    >>> ChainerBackend()
    <keyring.backends.chainer.ChainerBackend object at ...>
    Tc                 C   s   t | jdkrdS dS )z
        If there are backends to chain, high priority
        Otherwise very low priority since our operation when empty
        is the same as null.
           
   i)lenbackends)cls r   :/usr/lib/python3/dist-packages/keyring/backends/chainer.pypriority   s    zChainerBackend.priorityc                 C   s*   dd t tjt D }t|tjddS )z5
        Discover all keyrings for chaining.
        c                 s   s&   | ]}t |ts|jd kr|V  qdS )r   N)
isinstancer   r   ).0keyringr   r   r   	<genexpr>&   s   

z*ChainerBackend.backends.<locals>.<genexpr>T)keyreverse)filterr   Z_limitZget_all_keyringsortedZby_priority)r   Zallowedr   r   r   r
       s    zChainerBackend.backendsc                 C   s,   | j D ] }|||}|d k	r|  S qd S N)r
   get_password)selfserviceusernamer   passwordr   r   r   r   .   s    
zChainerBackend.get_passwordc              	   C   s:   | j D ].}z||||W   S  tk
r2   Y qX qd S r   )r
   set_passwordNotImplementedError)r   r   r   r   r   r   r   r   r   4   s
    
zChainerBackend.set_passwordc              	   C   s8   | j D ],}z|||W   S  tk
r0   Y qX qd S r   )r
   delete_passwordr   )r   r   r   r   r   r   r   r   ;   s
    
zChainerBackend.delete_passwordc                 C   s,   | j D ] }|||}|d k	r|  S qd S r   )r
   get_credential)r   r   r   r   Z
credentialr   r   r   r    B   s    
zChainerBackend.get_credentialN)__name__
__module____qualname____doc__Zviabler   ZClassPropertyclassmethodr   r
   r   r   r   r    r   r   r   r   r      s   r   N)	r$   Z
__future__r    r   utilr   ZKeyringBackendr   r   r   r   r   <module>   s   