ó
‹²,]c           @   sÄ   d  d l  Z  d  d l Z d  d l Z d  d l Z d Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ e d k rÀ e  j	 d Z
 e e
 ƒ d	 k s¢ d
 GHe  j d ƒ n  e e
 Œ  Z d GHe j ƒ  n  d S(   iÿÿÿÿNi'  t   AsyncServerc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s_   
    Introspection server, provides a separate process
    for interacting with an object.
    c         G   sj   | |  _  |  j | Œ  |  _ t j ƒ  |  _ |  j j t j ƒ |  _ |  j j d | ƒ |  j j	 | ƒ d  S(   Ns   tcp://localhost:%s(
   t   portt
   initializet   objectt   zmqt   Contextt   contextt   sockett   PAIRt   connectt
   send_pyobj(   t   selfR   t   args(    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyt   __init__   s    	c         C   s   t  ƒ  S(   s-   Initialize the object and return it.
        (   R   (   R   t   plugin_name(    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyR   !   s    c         C   sA  t  j  ƒ  } t } t } x"y |  j j t ƒ } Wn! t k
 rT t  j d ƒ q n X| d k rœ | rœ | r t t  j  ƒ  | ƒ } d | GHd St } q n  t } t } g  } xÐ y |  j j	 ƒ  } Wn! t k
 rç t  j d ƒ q± n X| d d k rd GHt
 j j ƒ  d S| d d k r.| j | ƒ n d	 GHy |  j j d ƒ } Wn! t k
 rlt  j d ƒ q± n X| d k r± Pq± q± W| sq n  | d
 } t d | d d | d ƒ } yQ t |  j | d ƒ }	 | j d g  ƒ }
 | j d i  ƒ } |	 |
 | Ž  | d <Wn! t k
 r(t j ƒ  | d <n X|  j j | ƒ q Wd S(   s)   Handle requests from the client.
        gš™™™™™¹?i    s   Timed out after %s secNt	   func_namet   server_quitt   Quittingt   server_heartbeats   Got heartbeatiÿÿÿÿt
   request_idR   t   kwargst   resultt   error(   t   timet   FalseR   t   pollt   TIMEOUTt   KeyboardInterruptt   sleept   intt   Truet
   recv_pyobjt   syst   stdoutt   flusht   appendt   dictt   getattrR   t   gett	   Exceptiont	   tracebackt
   format_excR
   (   R   t   t0t   initializedt	   timed_outt   eventst   deltat   requestst   requestt   responset   funcR   R   (    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyt   run&   sh    	
(   t   __name__t
   __module__t   __doc__R   R   R3   (    (    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyR       s   		t   PluginServerc           B   s   e  Z d  Z d „  Z RS(   se   
    Introspection plugin server, provides a separate process
    for interacting with a plugin.
    c         C   sS   | d } t  d | d | g ƒ} t | d | j ƒ  ƒ } | ƒ  } | j ƒ  | S(   s-   Initialize the object and return it.
        t   _plugins   spyder.utils.introspection.t   fromlists   %sPlugin(   t
   __import__R%   t
   capitalizet   load_plugin(   R   R   t   mod_namet   modt   clst   plugin(    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyR   n   s    
	
(   R4   R5   R6   R   (    (    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyR7   g   s   t   __main__i   i   s/   Usage: plugin_server.py client_port plugin_namei    t   Started(   R    R   R(   R   R   R   R    R7   R4   t   argvR   t   lent   exitR@   R3   (    (    (    sG   lib/python2.7/site-packages/spyder/utils/introspection/plugin_server.pyt   <module>   s   U