ó
Û¤[c           @  s<  d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z d d l m	 Z	 m
 Z
 y d d l m Z Wn! e k
 r— d d l m Z n Xd d l Z d d l m Z d Z d	 Z d a d a d
 „  Z d d „ Z d d d „ Z d „  Z e d „  ƒ Z d „  Z d „  Z d d „ Z d „  Z d „  Z  d S(   s%   utilities for testing IPython kernelsiÿÿÿÿ(   t   print_functionN(   t   contextmanager(   t   PIPEt   STDOUT(   t   Empty(   t   manageri<   i   c          K  sb   y t  j ƒ  } Wn  t k
 r2 t t j ƒ } n X|  j t d | d t ƒ ƒ t	 j
 d t |   S(   so   start a new kernel, and return its Manager and Client

    Integrates with our output capturing for tests.
    t   stdoutt   stderrt   startup_timeout(   t   noset   iptest_stdstreams_filenot   AttributeErrort   opent   ost   devnullt   updatet   dictR   R   t   start_new_kernelt   STARTUP_TIMEOUT(   t   kwargsR   (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyR      s    c         C  sŽ   d d l  m } |  d k r% t }  n  xb |  j |  j f D]N } xE t r… y | j d t d d ƒ } Wn t k
 rw PqA X| | ƒ qA Wq8 Wd S(   s'   flush any messages waiting on the queuei   (   t   validate_messaget   blockt   timeoutgš™™™™™¹?N(	   t   test_message_specR   t   Nonet   KCt   shell_channelt   iopub_channelt   Truet   get_msgR   (   t   kcR   t   channelt   msg(    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   flush_channels,   s    		t    c         K  s.  d d l  m } | d k r% t } n  | j d |  |  } | j d t ƒ } | | d | ƒ | j d t ƒ } | | d | ƒ | d d d	 k s˜ t ‚ | j	 d
 ƒ sæ | j d t ƒ } | | d | ƒ | d d |  k sæ t ‚ n  | d j	 d ƒ r t
 d j | d d ƒ d t j ƒn  | | d f S(   sB   wrapper for doing common steps for validating an execution requesti   (   R   t   codeR   t   execute_replyt   statust   contentt   execution_statet   busyt   silentt   execute_inputt	   tracebacks   
t   fileN(   R   R   R   R   t   executet   get_shell_msgt   TIMEOUTt   get_iopub_msgt   AssertionErrort   gett   printt   joint   sysR   (   R#   R   R   R   t   msg_idt   replyR(   R*   (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyR-   <   s     	'c           C  s9   t  d k r+ t ƒ  \ a  a t j t ƒ n
 t t ƒ t S(   sC   start the global kernel (if it isn't running) and return its clientN(   t   KMR   R   R   t   atexitt   registert   stop_global_kernelR!   (    (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   start_global_kernelT   s
    
c           c  s   t  ƒ  Vd S(   s©   Context manager for the global kernel instance

    Should be used for most kernel tests

    Returns
    -------
    kernel_client: connected KernelClient instance
    N(   R<   (    (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   kernel^   s    
c           s+   ‡  f d †  } ˆ  j  | _  ˆ  j | _ | S(   s.   Decorator for tests that use the global kernelc            s    t  ƒ   }  ˆ  |  ƒ Wd  QXd  S(   N(   R=   (   R   (   t   test_f(    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   wrapped_testl   s    (   t   __doc__t   __name__(   R>   R?   (    (   R>   s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   uses_kernelj   s    c           C  s:   t  j ƒ  d a  t d k r  d St j d t ƒ d a d S(   s4   Stop the global shared kernel instance, if it existsNt   now(   R   t   stop_channelsR   R8   t   shutdown_kernelR   (    (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyR;   s   s    
c         C  sV   t  t d t t j ƒ ƒ } t d | d t ƒ } |  d k	 rI |  | d <n  t j	 |   S(   sÊ   Context manager for a new kernel in a subprocess

    Should only be used for tests where the kernel must not be re-used.

    Returns
    -------
    kernel_client: connected KernelClient instance
    R
   R   R   t   extra_argumentsN(
   t   getattrR	   R   R   R   R   R   R   R   t
   run_kernel(   t   argvR   R   (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt
   new_kernel}   s
    	c         C  sØ   d } d } x¿ t  rÍ |  j d t  d d ƒ } | d } | d } | d k ra | d d	 k ra Pq | d d
 k r | d d k r’ | | d 7} qÊ | d d k r³ | | d 7} qÊ t d | d ƒ ‚ q q W| | f S(   s%   assemble stdout/err from an executionR"   R   R   i   t   msg_typeR&   R%   R'   t   idlet   streamt   nameR   t   textR   s   bad stream: %r(   R   R   t   KeyError(   t   iopubR   R   R    RK   R&   (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   assemble_outputŒ   s     	

c         C  s`   xY t  r[ |  j j d t  d d ƒ } | d } | d } | d k r | d d k r Pq q Wd  S(	   NR   R   i   RK   R&   R%   R'   RL   (   R   R   R   (   R   R    RK   R&   (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   wait_for_idle£   s    	

(!   R@   t
   __future__R    R9   R   R5   t
   contextlibR   t
   subprocessR   R   t   queueR   t   ImportErrort   QueueR	   t   jupyter_clientR   R   R/   R   R8   R   R   R!   R-   R<   R=   RB   R;   RJ   RR   RS   (    (    (    s4   lib/python2.7/site-packages/ipykernel/tests/utils.pyt   <module>   s4   		
			
	