##// END OF EJS Templates
Added GTK support to ZeroMQ kernel....
Added GTK support to ZeroMQ kernel. We use an approach which is a combination of an gtk timer callback into our execution loop, like we do for Qt and Wx, I've run as tests several GTK examples found on the net, as well as multiple matplotlib scripts, and so far everything works as expected. The only catch is that we silently trap gtk.main_quit(), so examples that call it with a 'close' button or similar seem to not do anything. But their windows close normally and no other problems have been found. This solution uses code taken from an old bug report of ours: https://bugs.launchpad.net/ipython/+bug/270856 specifically the attachment in this comment: https://bugs.launchpad.net/ipython/+bug/270856/comments/6 along with the changes suggested by Michiel de Hoon there. Thanks to Ville and Michiel for that old discussion, which put me on the right track to figure out the details of the logic needed for GTK.

File last commit:

r2501:84ec5449
r2949:13751b1c
Show More
test_loader.py
174 lines | 5.2 KiB | text/x-python | PythonLexer
Brian Granger
Work on Application and loader testing.
r2187 #!/usr/bin/env python
# encoding: utf-8
"""
Tests for IPython.config.loader
Authors:
* Brian Granger
* Fernando Perez (design help)
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2009 The IPython Development Team
#
# 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
from tempfile import mkstemp
from unittest import TestCase
Brian Granger
Massive refactoring of of the core....
r2245 from IPython.config.loader import (
Config,
PyFileConfigLoader,
ArgParseConfigLoader,
ConfigError
)
Brian Granger
Work on Application and loader testing.
r2187
#-----------------------------------------------------------------------------
# Actual tests
#-----------------------------------------------------------------------------
pyfile = """
Fernando Perez
Fix failing config test: https://bugs.launchpad.net/ipython/+bug/503731...
r2394 c = get_config()
c.a = 10
c.b = 20
c.Foo.Bar.value = 10
c.Foo.Bam.value = range(10)
c.D.C.value = 'hi there'
Brian Granger
Work on Application and loader testing.
r2187 """
class TestPyFileCL(TestCase):
def test_basic(self):
Fernando Perez
Progress towards getting the test suite in shape again....
r2392 fd, fname = mkstemp('.py')
Brian Granger
Work on Application and loader testing.
r2187 f = os.fdopen(fd, 'w')
f.write(pyfile)
f.close()
Brian Granger
Minor changes to a few files to reflect design discussion.
r2198 # Unlink the file
Brian Granger
Work on Application and loader testing.
r2187 cl = PyFileConfigLoader(fname)
config = cl.load_config()
Brian Granger
Massive refactoring of of the core....
r2245 self.assertEquals(config.a, 10)
self.assertEquals(config.b, 20)
self.assertEquals(config.Foo.Bar.value, 10)
self.assertEquals(config.Foo.Bam.value, range(10))
self.assertEquals(config.D.C.value, 'hi there')
Brian Granger
Work on Application and loader testing.
r2187
Brian Granger
Refactored the command line config system and other aspects of config....
r2501 class MyLoader1(ArgParseConfigLoader):
def _add_arguments(self):
p = self.parser
p.add_argument('-f', '--foo', dest='Global.foo', type=str)
p.add_argument('-b', dest='MyClass.bar', type=int)
p.add_argument('-n', dest='n', action='store_true')
p.add_argument('Global.bam', type=str)
class MyLoader2(ArgParseConfigLoader):
def _add_arguments(self):
subparsers = self.parser.add_subparsers(dest='subparser_name')
subparser1 = subparsers.add_parser('1')
subparser1.add_argument('-x',dest='Global.x')
subparser2 = subparsers.add_parser('2')
subparser2.add_argument('y')
Brian Granger
Work on the config system....
r2500
Brian Granger
Work on Application and loader testing.
r2187 class TestArgParseCL(TestCase):
def test_basic(self):
Brian Granger
Refactored the command line config system and other aspects of config....
r2501 cl = MyLoader1()
Brian Granger
Work on Application and loader testing.
r2187 config = cl.load_config('-f hi -b 10 -n wow'.split())
Brian Granger
Massive refactoring of of the core....
r2245 self.assertEquals(config.Global.foo, 'hi')
self.assertEquals(config.MyClass.bar, 10)
self.assertEquals(config.n, True)
self.assertEquals(config.Global.bam, 'wow')
Brian Granger
Work on the config system....
r2500 config = cl.load_config(['wow'])
self.assertEquals(config.keys(), ['Global'])
self.assertEquals(config.Global.keys(), ['bam'])
self.assertEquals(config.Global.bam, 'wow')
Brian Granger
Work on Application and loader testing.
r2187
def test_add_arguments(self):
Brian Granger
Refactored the command line config system and other aspects of config....
r2501 cl = MyLoader2()
Brian Granger
Work on Application and loader testing.
r2187 config = cl.load_config('2 frobble'.split())
self.assertEquals(config.subparser_name, '2')
self.assertEquals(config.y, 'frobble')
config = cl.load_config('1 -x frobble'.split())
self.assertEquals(config.subparser_name, '1')
Brian Granger
Massive refactoring of of the core....
r2245 self.assertEquals(config.Global.x, 'frobble')
Brian Granger
Work on the config system....
r2500 def test_argv(self):
Brian Granger
Refactored the command line config system and other aspects of config....
r2501 cl = MyLoader1(argv='-f hi -b 10 -n wow'.split())
Brian Granger
Work on the config system....
r2500 config = cl.load_config()
self.assertEquals(config.Global.foo, 'hi')
self.assertEquals(config.MyClass.bar, 10)
self.assertEquals(config.n, True)
self.assertEquals(config.Global.bam, 'wow')
Brian Granger
Massive refactoring of of the core....
r2245 class TestConfig(TestCase):
def test_setget(self):
c = Config()
c.a = 10
self.assertEquals(c.a, 10)
self.assertEquals(c.has_key('b'), False)
def test_auto_section(self):
c = Config()
self.assertEquals(c.has_key('A'), True)
self.assertEquals(c._has_section('A'), False)
A = c.A
A.foo = 'hi there'
self.assertEquals(c._has_section('A'), True)
self.assertEquals(c.A.foo, 'hi there')
del c.A
self.assertEquals(len(c.A.keys()),0)
def test_merge_doesnt_exist(self):
c1 = Config()
c2 = Config()
c2.bar = 10
c2.Foo.bar = 10
c1._merge(c2)
self.assertEquals(c1.Foo.bar, 10)
self.assertEquals(c1.bar, 10)
c2.Bar.bar = 10
c1._merge(c2)
self.assertEquals(c1.Bar.bar, 10)
def test_merge_exists(self):
c1 = Config()
c2 = Config()
c1.Foo.bar = 10
c1.Foo.bam = 30
c2.Foo.bar = 20
c2.Foo.wow = 40
c1._merge(c2)
self.assertEquals(c1.Foo.bam, 30)
self.assertEquals(c1.Foo.bar, 20)
self.assertEquals(c1.Foo.wow, 40)
c2.Foo.Bam.bam = 10
c1._merge(c2)
self.assertEquals(c1.Foo.Bam.bam, 10)
def test_deepcopy(self):
c1 = Config()
c1.Foo.bar = 10
c1.Foo.bam = 30
c1.a = 'asdf'
c1.b = range(10)
import copy
c2 = copy.deepcopy(c1)
self.assertEquals(c1, c2)
self.assert_(c1 is not c2)
self.assert_(c1.Foo is not c2.Foo)
def test_builtin(self):
c1 = Config()
exec 'foo = True' in c1
self.assertEquals(c1.foo, True)
self.assertRaises(ConfigError, setattr, c1, 'ValueError', 10)