##// END OF EJS Templates
Fix config loader test for Python 3.
Thomas Kluyver -
Show More
@@ -1,225 +1,225 b''
1 1 # encoding: utf-8
2 2 """
3 3 Tests for IPython.config.loader
4 4
5 5 Authors:
6 6
7 7 * Brian Granger
8 8 * Fernando Perez (design help)
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (C) 2008-2009 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import os
23 23 import sys
24 24 from tempfile import mkstemp
25 25 from unittest import TestCase
26 26
27 27 from nose import SkipTest
28 28
29 29 from IPython.testing.tools import mute_warn
30 30
31 31 from IPython.utils.traitlets import Int, Unicode
32 32 from IPython.config.configurable import Configurable
33 33 from IPython.config.loader import (
34 34 Config,
35 35 PyFileConfigLoader,
36 36 KeyValueConfigLoader,
37 37 ArgParseConfigLoader,
38 38 ConfigError
39 39 )
40 40
41 41 #-----------------------------------------------------------------------------
42 42 # Actual tests
43 43 #-----------------------------------------------------------------------------
44 44
45 45
46 46 pyfile = """
47 47 c = get_config()
48 48 c.a=10
49 49 c.b=20
50 50 c.Foo.Bar.value=10
51 c.Foo.Bam.value=range(10)
51 c.Foo.Bam.value=list(range(10)) # list() is just so it's the same on Python 3
52 52 c.D.C.value='hi there'
53 53 """
54 54
55 55 class TestPyFileCL(TestCase):
56 56
57 57 def test_basic(self):
58 58 fd, fname = mkstemp('.py')
59 59 f = os.fdopen(fd, 'w')
60 60 f.write(pyfile)
61 61 f.close()
62 62 # Unlink the file
63 63 cl = PyFileConfigLoader(fname)
64 64 config = cl.load_config()
65 65 self.assertEquals(config.a, 10)
66 66 self.assertEquals(config.b, 20)
67 67 self.assertEquals(config.Foo.Bar.value, 10)
68 68 self.assertEquals(config.Foo.Bam.value, range(10))
69 69 self.assertEquals(config.D.C.value, 'hi there')
70 70
71 71 class MyLoader1(ArgParseConfigLoader):
72 72 def _add_arguments(self, aliases=None, flags=None):
73 73 p = self.parser
74 74 p.add_argument('-f', '--foo', dest='Global.foo', type=str)
75 75 p.add_argument('-b', dest='MyClass.bar', type=int)
76 76 p.add_argument('-n', dest='n', action='store_true')
77 77 p.add_argument('Global.bam', type=str)
78 78
79 79 class MyLoader2(ArgParseConfigLoader):
80 80 def _add_arguments(self, aliases=None, flags=None):
81 81 subparsers = self.parser.add_subparsers(dest='subparser_name')
82 82 subparser1 = subparsers.add_parser('1')
83 83 subparser1.add_argument('-x',dest='Global.x')
84 84 subparser2 = subparsers.add_parser('2')
85 85 subparser2.add_argument('y')
86 86
87 87 class TestArgParseCL(TestCase):
88 88
89 89 def test_basic(self):
90 90 cl = MyLoader1()
91 91 config = cl.load_config('-f hi -b 10 -n wow'.split())
92 92 self.assertEquals(config.Global.foo, 'hi')
93 93 self.assertEquals(config.MyClass.bar, 10)
94 94 self.assertEquals(config.n, True)
95 95 self.assertEquals(config.Global.bam, 'wow')
96 96 config = cl.load_config(['wow'])
97 97 self.assertEquals(config.keys(), ['Global'])
98 98 self.assertEquals(config.Global.keys(), ['bam'])
99 99 self.assertEquals(config.Global.bam, 'wow')
100 100
101 101 def test_add_arguments(self):
102 102 cl = MyLoader2()
103 103 config = cl.load_config('2 frobble'.split())
104 104 self.assertEquals(config.subparser_name, '2')
105 105 self.assertEquals(config.y, 'frobble')
106 106 config = cl.load_config('1 -x frobble'.split())
107 107 self.assertEquals(config.subparser_name, '1')
108 108 self.assertEquals(config.Global.x, 'frobble')
109 109
110 110 def test_argv(self):
111 111 cl = MyLoader1(argv='-f hi -b 10 -n wow'.split())
112 112 config = cl.load_config()
113 113 self.assertEquals(config.Global.foo, 'hi')
114 114 self.assertEquals(config.MyClass.bar, 10)
115 115 self.assertEquals(config.n, True)
116 116 self.assertEquals(config.Global.bam, 'wow')
117 117
118 118
119 119 class TestKeyValueCL(TestCase):
120 120
121 121 def test_basic(self):
122 122 cl = KeyValueConfigLoader()
123 123 argv = ['--'+s.strip('c.') for s in pyfile.split('\n')[2:-1]]
124 124 with mute_warn():
125 125 config = cl.load_config(argv)
126 126 self.assertEquals(config.a, 10)
127 127 self.assertEquals(config.b, 20)
128 128 self.assertEquals(config.Foo.Bar.value, 10)
129 129 self.assertEquals(config.Foo.Bam.value, range(10))
130 130 self.assertEquals(config.D.C.value, 'hi there')
131 131
132 132 def test_extra_args(self):
133 133 cl = KeyValueConfigLoader()
134 134 with mute_warn():
135 135 config = cl.load_config(['--a=5', 'b', '--c=10', 'd'])
136 136 self.assertEquals(cl.extra_args, ['b', 'd'])
137 137 self.assertEquals(config.a, 5)
138 138 self.assertEquals(config.c, 10)
139 139 with mute_warn():
140 140 config = cl.load_config(['--', '--a=5', '--c=10'])
141 141 self.assertEquals(cl.extra_args, ['--a=5', '--c=10'])
142 142
143 143 def test_unicode_args(self):
144 144 cl = KeyValueConfigLoader()
145 145 argv = [u'--a=épsîlön']
146 146 with mute_warn():
147 147 config = cl.load_config(argv)
148 148 self.assertEquals(config.a, u'épsîlön')
149 149
150 150 def test_unicode_bytes_args(self):
151 151 uarg = u'--a=é'
152 152 try:
153 153 barg = uarg.encode(sys.stdin.encoding)
154 154 except (TypeError, UnicodeEncodeError):
155 155 raise SkipTest("sys.stdin.encoding can't handle 'é'")
156 156
157 157 cl = KeyValueConfigLoader()
158 158 with mute_warn():
159 159 config = cl.load_config([barg])
160 160 self.assertEquals(config.a, u'é')
161 161
162 162
163 163 class TestConfig(TestCase):
164 164
165 165 def test_setget(self):
166 166 c = Config()
167 167 c.a = 10
168 168 self.assertEquals(c.a, 10)
169 169 self.assertEquals(c.has_key('b'), False)
170 170
171 171 def test_auto_section(self):
172 172 c = Config()
173 173 self.assertEquals(c.has_key('A'), True)
174 174 self.assertEquals(c._has_section('A'), False)
175 175 A = c.A
176 176 A.foo = 'hi there'
177 177 self.assertEquals(c._has_section('A'), True)
178 178 self.assertEquals(c.A.foo, 'hi there')
179 179 del c.A
180 180 self.assertEquals(len(c.A.keys()),0)
181 181
182 182 def test_merge_doesnt_exist(self):
183 183 c1 = Config()
184 184 c2 = Config()
185 185 c2.bar = 10
186 186 c2.Foo.bar = 10
187 187 c1._merge(c2)
188 188 self.assertEquals(c1.Foo.bar, 10)
189 189 self.assertEquals(c1.bar, 10)
190 190 c2.Bar.bar = 10
191 191 c1._merge(c2)
192 192 self.assertEquals(c1.Bar.bar, 10)
193 193
194 194 def test_merge_exists(self):
195 195 c1 = Config()
196 196 c2 = Config()
197 197 c1.Foo.bar = 10
198 198 c1.Foo.bam = 30
199 199 c2.Foo.bar = 20
200 200 c2.Foo.wow = 40
201 201 c1._merge(c2)
202 202 self.assertEquals(c1.Foo.bam, 30)
203 203 self.assertEquals(c1.Foo.bar, 20)
204 204 self.assertEquals(c1.Foo.wow, 40)
205 205 c2.Foo.Bam.bam = 10
206 206 c1._merge(c2)
207 207 self.assertEquals(c1.Foo.Bam.bam, 10)
208 208
209 209 def test_deepcopy(self):
210 210 c1 = Config()
211 211 c1.Foo.bar = 10
212 212 c1.Foo.bam = 30
213 213 c1.a = 'asdf'
214 214 c1.b = range(10)
215 215 import copy
216 216 c2 = copy.deepcopy(c1)
217 217 self.assertEquals(c1, c2)
218 218 self.assert_(c1 is not c2)
219 219 self.assert_(c1.Foo is not c2.Foo)
220 220
221 221 def test_builtin(self):
222 222 c1 = Config()
223 223 exec 'foo = True' in c1
224 224 self.assertEquals(c1.foo, True)
225 225 self.assertRaises(ConfigError, setattr, c1, 'ValueError', 10)
General Comments 0
You need to be logged in to leave comments. Login now