
    e~                         d dl Z d dlZd dlZd dlZd dlZ G d d      Ze j                  d        Zd Zej                  ej                  z   ZefdZy)    Nc                   0    e Zd ZdZd ZddZd Zd Zd Zy)	ImportKillerz@Context manager to make an import of a given name or names fail.c                     || _         y Nnames)selfr   s     6/usr/lib/python3/dist-packages/keyring/testing/util.py__init__zImportKiller.__init__   s	    
    Nc                 $    || j                   v r| S y r   r   )r	   fullnamepaths      r
   find_modulezImportKiller.find_module   s    tzz!K "r   c                 8    || j                   v sJ t        |      r   )r   ImportError)r	   r   s     r
   load_modulezImportKiller.load_module   s    4::%%%(##r   c                     i | _         | j                  D ]/  }t        j                  j	                  |d       | j                   |<   1 t        j
                  j                  d|        y )Nr   )originalr   sysmodulespop	meta_pathinsert)r	   names     r
   	__enter__zImportKiller.__enter__   sM    JJ 	>D"%++//$"=DMM$	>Q%r   c                     t         j                  j                  |        | j                  j	                         D ]  \  }}|	|t         j
                  |<    y r   )r   r   remover   itemsr   )r	   argskeyvalues       r
   __exit__zImportKiller.__exit__   sH    T"----/ 	)JC #(C 	)r   r   )	__name__
__module____qualname____doc__r   r   r   r   r#    r   r
   r   r      s    F$&)r   r   c              +      K   i }|j                         D ])  \  }}| j                  |      ||<   |	|| v s!| |= %|| |<   + d |j                         D ]  \  }}|	|| v s| |= || |<    yw)zHelper context manager to make and unmake changes to a dict.

    A None is not a valid value for the destination, and so means that the
    associated name should be removed.N)r   get)destinationchangesr   r!   r"   s        r
   NoNoneDictMutatorr-   #   s      Hmmo %
U#,=k!$$K% 
nn& %
U=k!$$K%s   3A.+A."A.c                  6    t        t        j                  fi | S )z6A context manager to temporarily change the os.environ)r-   osenviron)r,   s    r
   Environr1   :   s    RZZ3733r   c                 \    d}t        d|       D ]  }|t        j                  |      z  } |S )z-Generate a random string with length <i>k</i> r   )rangerandomchoice)ksourceresultis       r
   random_stringr;   B   s4    F1a[ (&--''(Mr   )
contextlibr/   r   r5   stringr   contextmanagerr-   r1   ascii_lettersdigitsALPHABETr;   r(   r   r
   <module>rB      s]     	 
  ) )6 % %,4
 &--/ % r   