##// END OF EJS Templates
Merge pull request #1627 from minrk/msgspec...
Merge pull request #1627 from minrk/msgspec Test the Message Spec and add our zmq subpackage to the test suite. It uses Traitlets to perform validation of keys. Checks right now are not very strict, as (almost) any key is allowed to be None, as long as it is defined. This is because I simply do not know which keys are allowed to be None, and this is not discussed in the specification. If no keys are allowed to be None, we violate that all over the place. Parametric tests are used, so every key validation counts as a test (147!). Message spec doc was found to misrepresent code in a few points, and some changes were made: * spec had error keys as `exc_name/value`, but we are actually using `ename/value` (docs updated to match code) * payloads were inaccurate - list of dicts, rather than single dict, and transformed_output is a payload, not top-level in exec-reply (docs update to match code). * in oinfo_request, detail_level was in message spec, but not actually implemented (code updated to match docs). History messages are not yet tested, but I think I get at least elementary coverage of everything else in the doc.

File last commit:

r5390:c82649ea
r6567:232fa81a merge
Show More
inputhookpyglet.py
115 lines | 3.7 KiB | text/x-python | PythonLexer
/ IPython / lib / inputhookpyglet.py
Nicolas Rougier
Added code for the pyglet interactive session
r4691 # encoding: utf-8
"""
Enable pyglet to be used interacive by setting PyOS_InputHook.
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804 Authors
-------
* Nicolas P. Rougier
* Fernando Perez
Nicolas Rougier
Added code for the pyglet interactive session
r4691 """
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Nicolas Rougier
Added code for the pyglet interactive session
r4691 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import os
import signal
import sys
import time
from timeit import default_timer as clock
import pyglet
#-----------------------------------------------------------------------------
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804 # Platform-dependent imports and functions
Nicolas Rougier
Added code for the pyglet interactive session
r4691 #-----------------------------------------------------------------------------
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804 if os.name == 'posix':
import select
def stdin_ready():
Nicolas Rougier
Added code for the pyglet interactive session
r4691 infds, outfds, erfds = select.select([sys.stdin],[],[],0)
if infds:
return True
else:
return False
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804
elif sys.platform == 'win32':
import msvcrt
def stdin_ready():
Nicolas Rougier
Added code for the pyglet interactive session
r4691 return msvcrt.kbhit()
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804 # On linux only, window.flip() has a bug that causes an AttributeError on
# window close. For details, see:
# http://groups.google.com/group/pyglet-users/browse_thread/thread/47c1aab9aa4a3d23/c22f9e819826799e?#c22f9e819826799e
if sys.platform.startswith('linux'):
def flip(window):
try:
window.flip()
except AttributeError:
pass
else:
def flip(window):
window.flip()
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
Nicolas Rougier
Added code for the pyglet interactive session
r4691 def inputhook_pyglet():
"""Run the pyglet event loop by processing pending events only.
Bernardo B. Marques
remove all trailling spaces
r4872
Nicolas Rougier
Added code for the pyglet interactive session
r4691 This keeps processing pending events until stdin is ready. After
processing all pending events, a call to time.sleep is inserted. This is
needed, otherwise, CPU usage is at 100%. This sleep time should be tuned
though for best performance.
"""
# We need to protect against a user pressing Control-C when IPython is
# idle and this is running. We trap KeyboardInterrupt and pass.
try:
t = clock()
while not stdin_ready():
pyglet.clock.tick()
for window in pyglet.app.windows:
window.switch_to()
window.dispatch_events()
window.dispatch_event('on_draw')
Fernando Perez
Trap AttributeError in window.flip() under linux - pyglet bug.
r4804 flip(window)
Nicolas Rougier
Added code for the pyglet interactive session
r4691
# We need to sleep at this point to keep the idle CPU load
Bernardo B. Marques
remove all trailling spaces
r4872 # low. However, if sleep to long, GUI response is poor. As
Nicolas Rougier
Added code for the pyglet interactive session
r4691 # a compromise, we watch how often GUI events are being processed
# and switch between a short and long sleep time. Here are some
# stats useful in helping to tune this.
# time CPU load
# 0.001 13%
# 0.005 3%
# 0.01 1.5%
# 0.05 0.5%
used_time = clock() - t
if used_time > 5*60.0:
# print 'Sleep for 5 s' # dbg
time.sleep(5.0)
elif used_time > 10.0:
# print 'Sleep for 1 s' # dbg
time.sleep(1.0)
elif used_time > 0.1:
# Few GUI events coming in, so we can sleep longer
# print 'Sleep for 0.05 s' # dbg
time.sleep(0.05)
else:
# Many GUI events coming in, so sleep only very little
time.sleep(0.001)
except KeyboardInterrupt:
pass
return 0