""" Debug a script (like %run -d) in IPython process, Using WinPdb

Usage:

%wdb test.py
    run test.py, with a winpdb breakpoint at start of the file 
    
%wdb pass
    Change the password (e.g. if you have forgotten the old one)


Notes
-----

**WARNING**: As of March 2009 (IPython 0.10), WinPdb has a known bug, which
causes PyTables to become impossible to import if winpdb is loaded.  Therefore,
if you need PyTables, do *not* use this extension.

For more details: https://bugs.launchpad.net/ipython/+bug/249036
"""

import os

import IPython.ipapi
import rpdb2

ip = IPython.ipapi.get()

rpdb_started = False

def wdb_f(self, arg):
    """ Debug a script (like %run -d) in IPython process, Using WinPdb
    
    Usage:
    
    %wdb test.py
        run test.py, with a winpdb breakpoint at start of the file 
        
    %wdb pass
        Change the password (e.g. if you have forgotten the old one)
        
    Note that after the script has been run, you need to do "Go" (f5) 
    in WinPdb to resume normal IPython operation.
    """

    global rpdb_started
    if not arg.strip():
        print __doc__
        return
        
    if arg.strip() == 'pass':
        passwd = raw_input('Enter new winpdb session password: ')
        ip.db['winpdb_pass'] = passwd
        print "Winpdb password changed"
        if rpdb_started:
            print "You need to restart IPython to use the new password"
        return 
    
    path = os.path.abspath(arg)
    if not os.path.isfile(path):
        raise IPython.ipapi.UsageError("%%wdb: file %s does not exist" % path)
    if not rpdb_started:
        passwd = ip.db.get('winpdb_pass', None)
        if passwd is None:
            import textwrap
            print textwrap.dedent("""\
            Winpdb sessions need a password that you use for attaching the external
            winpdb session. IPython will remember this. You can change the password later 
            by '%wpdb pass'
            """)
            passwd = raw_input('Enter new winpdb session password: ')
            ip.db['winpdb_pass'] = passwd
            
        print "Starting rpdb2 in IPython process"
        rpdb2.start_embedded_debugger(passwd, timeout = 0)
        rpdb_started = True
        
    rpdb2.set_temp_breakpoint(path)
    print 'It is time to attach with WinPdb (launch WinPdb if needed, File -> Attach)'
    ip.magic('%run ' + arg)
    

ip.expose_magic('wdb', wdb_f)
