##// END OF EJS Templates
update builtin test - we don't exec in config objects
MinRK -
Show More
@@ -1,299 +1,297 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Tests for IPython.config.loader
3 Tests for IPython.config.loader
4
4
5 Authors:
5 Authors:
6
6
7 * Brian Granger
7 * Brian Granger
8 * Fernando Perez (design help)
8 * Fernando Perez (design help)
9 """
9 """
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Copyright (C) 2008 The IPython Development Team
12 # Copyright (C) 2008 The IPython Development Team
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 import os
22 import os
23 import pickle
23 import pickle
24 import sys
24 import sys
25 from tempfile import mkstemp
25 from tempfile import mkstemp
26 from unittest import TestCase
26 from unittest import TestCase
27
27
28 from nose import SkipTest
28 from nose import SkipTest
29
29
30 from IPython.testing.tools import mute_warn
30 from IPython.testing.tools import mute_warn
31
31
32 from IPython.config.loader import (
32 from IPython.config.loader import (
33 Config,
33 Config,
34 PyFileConfigLoader,
34 PyFileConfigLoader,
35 KeyValueConfigLoader,
35 KeyValueConfigLoader,
36 ArgParseConfigLoader,
36 ArgParseConfigLoader,
37 KVArgParseConfigLoader,
37 KVArgParseConfigLoader,
38 ConfigError
38 ConfigError
39 )
39 )
40
40
41 #-----------------------------------------------------------------------------
41 #-----------------------------------------------------------------------------
42 # Actual tests
42 # Actual tests
43 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
44
44
45
45
46 pyfile = """
46 pyfile = """
47 c = get_config()
47 c = get_config()
48 c.a=10
48 c.a=10
49 c.b=20
49 c.b=20
50 c.Foo.Bar.value=10
50 c.Foo.Bar.value=10
51 c.Foo.Bam.value=list(range(10)) # list() is just so it's the same on Python 3
51 c.Foo.Bam.value=list(range(10)) # list() is just so it's the same on Python 3
52 c.D.C.value='hi there'
52 c.D.C.value='hi there'
53 """
53 """
54
54
55 class TestPyFileCL(TestCase):
55 class TestPyFileCL(TestCase):
56
56
57 def test_basic(self):
57 def test_basic(self):
58 fd, fname = mkstemp('.py')
58 fd, fname = mkstemp('.py')
59 f = os.fdopen(fd, 'w')
59 f = os.fdopen(fd, 'w')
60 f.write(pyfile)
60 f.write(pyfile)
61 f.close()
61 f.close()
62 # Unlink the file
62 # Unlink the file
63 cl = PyFileConfigLoader(fname)
63 cl = PyFileConfigLoader(fname)
64 config = cl.load_config()
64 config = cl.load_config()
65 self.assertEqual(config.a, 10)
65 self.assertEqual(config.a, 10)
66 self.assertEqual(config.b, 20)
66 self.assertEqual(config.b, 20)
67 self.assertEqual(config.Foo.Bar.value, 10)
67 self.assertEqual(config.Foo.Bar.value, 10)
68 self.assertEqual(config.Foo.Bam.value, list(range(10)))
68 self.assertEqual(config.Foo.Bam.value, list(range(10)))
69 self.assertEqual(config.D.C.value, 'hi there')
69 self.assertEqual(config.D.C.value, 'hi there')
70
70
71 class MyLoader1(ArgParseConfigLoader):
71 class MyLoader1(ArgParseConfigLoader):
72 def _add_arguments(self, aliases=None, flags=None):
72 def _add_arguments(self, aliases=None, flags=None):
73 p = self.parser
73 p = self.parser
74 p.add_argument('-f', '--foo', dest='Global.foo', type=str)
74 p.add_argument('-f', '--foo', dest='Global.foo', type=str)
75 p.add_argument('-b', dest='MyClass.bar', type=int)
75 p.add_argument('-b', dest='MyClass.bar', type=int)
76 p.add_argument('-n', dest='n', action='store_true')
76 p.add_argument('-n', dest='n', action='store_true')
77 p.add_argument('Global.bam', type=str)
77 p.add_argument('Global.bam', type=str)
78
78
79 class MyLoader2(ArgParseConfigLoader):
79 class MyLoader2(ArgParseConfigLoader):
80 def _add_arguments(self, aliases=None, flags=None):
80 def _add_arguments(self, aliases=None, flags=None):
81 subparsers = self.parser.add_subparsers(dest='subparser_name')
81 subparsers = self.parser.add_subparsers(dest='subparser_name')
82 subparser1 = subparsers.add_parser('1')
82 subparser1 = subparsers.add_parser('1')
83 subparser1.add_argument('-x',dest='Global.x')
83 subparser1.add_argument('-x',dest='Global.x')
84 subparser2 = subparsers.add_parser('2')
84 subparser2 = subparsers.add_parser('2')
85 subparser2.add_argument('y')
85 subparser2.add_argument('y')
86
86
87 class TestArgParseCL(TestCase):
87 class TestArgParseCL(TestCase):
88
88
89 def test_basic(self):
89 def test_basic(self):
90 cl = MyLoader1()
90 cl = MyLoader1()
91 config = cl.load_config('-f hi -b 10 -n wow'.split())
91 config = cl.load_config('-f hi -b 10 -n wow'.split())
92 self.assertEqual(config.Global.foo, 'hi')
92 self.assertEqual(config.Global.foo, 'hi')
93 self.assertEqual(config.MyClass.bar, 10)
93 self.assertEqual(config.MyClass.bar, 10)
94 self.assertEqual(config.n, True)
94 self.assertEqual(config.n, True)
95 self.assertEqual(config.Global.bam, 'wow')
95 self.assertEqual(config.Global.bam, 'wow')
96 config = cl.load_config(['wow'])
96 config = cl.load_config(['wow'])
97 self.assertEqual(list(config.keys()), ['Global'])
97 self.assertEqual(list(config.keys()), ['Global'])
98 self.assertEqual(list(config.Global.keys()), ['bam'])
98 self.assertEqual(list(config.Global.keys()), ['bam'])
99 self.assertEqual(config.Global.bam, 'wow')
99 self.assertEqual(config.Global.bam, 'wow')
100
100
101 def test_add_arguments(self):
101 def test_add_arguments(self):
102 cl = MyLoader2()
102 cl = MyLoader2()
103 config = cl.load_config('2 frobble'.split())
103 config = cl.load_config('2 frobble'.split())
104 self.assertEqual(config.subparser_name, '2')
104 self.assertEqual(config.subparser_name, '2')
105 self.assertEqual(config.y, 'frobble')
105 self.assertEqual(config.y, 'frobble')
106 config = cl.load_config('1 -x frobble'.split())
106 config = cl.load_config('1 -x frobble'.split())
107 self.assertEqual(config.subparser_name, '1')
107 self.assertEqual(config.subparser_name, '1')
108 self.assertEqual(config.Global.x, 'frobble')
108 self.assertEqual(config.Global.x, 'frobble')
109
109
110 def test_argv(self):
110 def test_argv(self):
111 cl = MyLoader1(argv='-f hi -b 10 -n wow'.split())
111 cl = MyLoader1(argv='-f hi -b 10 -n wow'.split())
112 config = cl.load_config()
112 config = cl.load_config()
113 self.assertEqual(config.Global.foo, 'hi')
113 self.assertEqual(config.Global.foo, 'hi')
114 self.assertEqual(config.MyClass.bar, 10)
114 self.assertEqual(config.MyClass.bar, 10)
115 self.assertEqual(config.n, True)
115 self.assertEqual(config.n, True)
116 self.assertEqual(config.Global.bam, 'wow')
116 self.assertEqual(config.Global.bam, 'wow')
117
117
118
118
119 class TestKeyValueCL(TestCase):
119 class TestKeyValueCL(TestCase):
120 klass = KeyValueConfigLoader
120 klass = KeyValueConfigLoader
121
121
122 def test_basic(self):
122 def test_basic(self):
123 cl = self.klass()
123 cl = self.klass()
124 argv = ['--'+s.strip('c.') for s in pyfile.split('\n')[2:-1]]
124 argv = ['--'+s.strip('c.') for s in pyfile.split('\n')[2:-1]]
125 with mute_warn():
125 with mute_warn():
126 config = cl.load_config(argv)
126 config = cl.load_config(argv)
127 self.assertEqual(config.a, 10)
127 self.assertEqual(config.a, 10)
128 self.assertEqual(config.b, 20)
128 self.assertEqual(config.b, 20)
129 self.assertEqual(config.Foo.Bar.value, 10)
129 self.assertEqual(config.Foo.Bar.value, 10)
130 self.assertEqual(config.Foo.Bam.value, list(range(10)))
130 self.assertEqual(config.Foo.Bam.value, list(range(10)))
131 self.assertEqual(config.D.C.value, 'hi there')
131 self.assertEqual(config.D.C.value, 'hi there')
132
132
133 def test_expanduser(self):
133 def test_expanduser(self):
134 cl = self.klass()
134 cl = self.klass()
135 argv = ['--a=~/1/2/3', '--b=~', '--c=~/', '--d="~/"']
135 argv = ['--a=~/1/2/3', '--b=~', '--c=~/', '--d="~/"']
136 with mute_warn():
136 with mute_warn():
137 config = cl.load_config(argv)
137 config = cl.load_config(argv)
138 self.assertEqual(config.a, os.path.expanduser('~/1/2/3'))
138 self.assertEqual(config.a, os.path.expanduser('~/1/2/3'))
139 self.assertEqual(config.b, os.path.expanduser('~'))
139 self.assertEqual(config.b, os.path.expanduser('~'))
140 self.assertEqual(config.c, os.path.expanduser('~/'))
140 self.assertEqual(config.c, os.path.expanduser('~/'))
141 self.assertEqual(config.d, '~/')
141 self.assertEqual(config.d, '~/')
142
142
143 def test_extra_args(self):
143 def test_extra_args(self):
144 cl = self.klass()
144 cl = self.klass()
145 with mute_warn():
145 with mute_warn():
146 config = cl.load_config(['--a=5', 'b', '--c=10', 'd'])
146 config = cl.load_config(['--a=5', 'b', '--c=10', 'd'])
147 self.assertEqual(cl.extra_args, ['b', 'd'])
147 self.assertEqual(cl.extra_args, ['b', 'd'])
148 self.assertEqual(config.a, 5)
148 self.assertEqual(config.a, 5)
149 self.assertEqual(config.c, 10)
149 self.assertEqual(config.c, 10)
150 with mute_warn():
150 with mute_warn():
151 config = cl.load_config(['--', '--a=5', '--c=10'])
151 config = cl.load_config(['--', '--a=5', '--c=10'])
152 self.assertEqual(cl.extra_args, ['--a=5', '--c=10'])
152 self.assertEqual(cl.extra_args, ['--a=5', '--c=10'])
153
153
154 def test_unicode_args(self):
154 def test_unicode_args(self):
155 cl = self.klass()
155 cl = self.klass()
156 argv = [u'--a=épsîlön']
156 argv = [u'--a=épsîlön']
157 with mute_warn():
157 with mute_warn():
158 config = cl.load_config(argv)
158 config = cl.load_config(argv)
159 self.assertEqual(config.a, u'épsîlön')
159 self.assertEqual(config.a, u'épsîlön')
160
160
161 def test_unicode_bytes_args(self):
161 def test_unicode_bytes_args(self):
162 uarg = u'--a=é'
162 uarg = u'--a=é'
163 try:
163 try:
164 barg = uarg.encode(sys.stdin.encoding)
164 barg = uarg.encode(sys.stdin.encoding)
165 except (TypeError, UnicodeEncodeError):
165 except (TypeError, UnicodeEncodeError):
166 raise SkipTest("sys.stdin.encoding can't handle 'é'")
166 raise SkipTest("sys.stdin.encoding can't handle 'é'")
167
167
168 cl = self.klass()
168 cl = self.klass()
169 with mute_warn():
169 with mute_warn():
170 config = cl.load_config([barg])
170 config = cl.load_config([barg])
171 self.assertEqual(config.a, u'é')
171 self.assertEqual(config.a, u'é')
172
172
173 def test_unicode_alias(self):
173 def test_unicode_alias(self):
174 cl = self.klass()
174 cl = self.klass()
175 argv = [u'--a=épsîlön']
175 argv = [u'--a=épsîlön']
176 with mute_warn():
176 with mute_warn():
177 config = cl.load_config(argv, aliases=dict(a='A.a'))
177 config = cl.load_config(argv, aliases=dict(a='A.a'))
178 self.assertEqual(config.A.a, u'épsîlön')
178 self.assertEqual(config.A.a, u'épsîlön')
179
179
180
180
181 class TestArgParseKVCL(TestKeyValueCL):
181 class TestArgParseKVCL(TestKeyValueCL):
182 klass = KVArgParseConfigLoader
182 klass = KVArgParseConfigLoader
183
183
184 def test_expanduser2(self):
184 def test_expanduser2(self):
185 cl = self.klass()
185 cl = self.klass()
186 argv = ['-a', '~/1/2/3', '--b', "'~/1/2/3'"]
186 argv = ['-a', '~/1/2/3', '--b', "'~/1/2/3'"]
187 with mute_warn():
187 with mute_warn():
188 config = cl.load_config(argv, aliases=dict(a='A.a', b='A.b'))
188 config = cl.load_config(argv, aliases=dict(a='A.a', b='A.b'))
189 self.assertEqual(config.A.a, os.path.expanduser('~/1/2/3'))
189 self.assertEqual(config.A.a, os.path.expanduser('~/1/2/3'))
190 self.assertEqual(config.A.b, '~/1/2/3')
190 self.assertEqual(config.A.b, '~/1/2/3')
191
191
192 def test_eval(self):
192 def test_eval(self):
193 cl = self.klass()
193 cl = self.klass()
194 argv = ['-c', 'a=5']
194 argv = ['-c', 'a=5']
195 with mute_warn():
195 with mute_warn():
196 config = cl.load_config(argv, aliases=dict(c='A.c'))
196 config = cl.load_config(argv, aliases=dict(c='A.c'))
197 self.assertEqual(config.A.c, u"a=5")
197 self.assertEqual(config.A.c, u"a=5")
198
198
199
199
200 class TestConfig(TestCase):
200 class TestConfig(TestCase):
201
201
202 def test_setget(self):
202 def test_setget(self):
203 c = Config()
203 c = Config()
204 c.a = 10
204 c.a = 10
205 self.assertEqual(c.a, 10)
205 self.assertEqual(c.a, 10)
206 self.assertEqual('b' in c, False)
206 self.assertEqual('b' in c, False)
207
207
208 def test_auto_section(self):
208 def test_auto_section(self):
209 c = Config()
209 c = Config()
210 self.assertEqual('A' in c, True)
210 self.assertEqual('A' in c, True)
211 self.assertEqual(c._has_section('A'), False)
211 self.assertEqual(c._has_section('A'), False)
212 A = c.A
212 A = c.A
213 A.foo = 'hi there'
213 A.foo = 'hi there'
214 self.assertEqual(c._has_section('A'), True)
214 self.assertEqual(c._has_section('A'), True)
215 self.assertEqual(c.A.foo, 'hi there')
215 self.assertEqual(c.A.foo, 'hi there')
216 del c.A
216 del c.A
217 self.assertEqual(len(c.A.keys()),0)
217 self.assertEqual(len(c.A.keys()),0)
218
218
219 def test_merge_doesnt_exist(self):
219 def test_merge_doesnt_exist(self):
220 c1 = Config()
220 c1 = Config()
221 c2 = Config()
221 c2 = Config()
222 c2.bar = 10
222 c2.bar = 10
223 c2.Foo.bar = 10
223 c2.Foo.bar = 10
224 c1.merge(c2)
224 c1.merge(c2)
225 self.assertEqual(c1.Foo.bar, 10)
225 self.assertEqual(c1.Foo.bar, 10)
226 self.assertEqual(c1.bar, 10)
226 self.assertEqual(c1.bar, 10)
227 c2.Bar.bar = 10
227 c2.Bar.bar = 10
228 c1.merge(c2)
228 c1.merge(c2)
229 self.assertEqual(c1.Bar.bar, 10)
229 self.assertEqual(c1.Bar.bar, 10)
230
230
231 def test_merge_exists(self):
231 def test_merge_exists(self):
232 c1 = Config()
232 c1 = Config()
233 c2 = Config()
233 c2 = Config()
234 c1.Foo.bar = 10
234 c1.Foo.bar = 10
235 c1.Foo.bam = 30
235 c1.Foo.bam = 30
236 c2.Foo.bar = 20
236 c2.Foo.bar = 20
237 c2.Foo.wow = 40
237 c2.Foo.wow = 40
238 c1.merge(c2)
238 c1.merge(c2)
239 self.assertEqual(c1.Foo.bam, 30)
239 self.assertEqual(c1.Foo.bam, 30)
240 self.assertEqual(c1.Foo.bar, 20)
240 self.assertEqual(c1.Foo.bar, 20)
241 self.assertEqual(c1.Foo.wow, 40)
241 self.assertEqual(c1.Foo.wow, 40)
242 c2.Foo.Bam.bam = 10
242 c2.Foo.Bam.bam = 10
243 c1.merge(c2)
243 c1.merge(c2)
244 self.assertEqual(c1.Foo.Bam.bam, 10)
244 self.assertEqual(c1.Foo.Bam.bam, 10)
245
245
246 def test_deepcopy(self):
246 def test_deepcopy(self):
247 c1 = Config()
247 c1 = Config()
248 c1.Foo.bar = 10
248 c1.Foo.bar = 10
249 c1.Foo.bam = 30
249 c1.Foo.bam = 30
250 c1.a = 'asdf'
250 c1.a = 'asdf'
251 c1.b = range(10)
251 c1.b = range(10)
252 import copy
252 import copy
253 c2 = copy.deepcopy(c1)
253 c2 = copy.deepcopy(c1)
254 self.assertEqual(c1, c2)
254 self.assertEqual(c1, c2)
255 self.assertTrue(c1 is not c2)
255 self.assertTrue(c1 is not c2)
256 self.assertTrue(c1.Foo is not c2.Foo)
256 self.assertTrue(c1.Foo is not c2.Foo)
257
257
258 def test_builtin(self):
258 def test_builtin(self):
259 c1 = Config()
259 c1 = Config()
260 exec('foo = True', c1)
261 self.assertEqual(c1.foo, True)
262 c1.format = "json"
260 c1.format = "json"
263
261
264 def test_fromdict(self):
262 def test_fromdict(self):
265 c1 = Config({'Foo' : {'bar' : 1}})
263 c1 = Config({'Foo' : {'bar' : 1}})
266 self.assertEqual(c1.Foo.__class__, Config)
264 self.assertEqual(c1.Foo.__class__, Config)
267 self.assertEqual(c1.Foo.bar, 1)
265 self.assertEqual(c1.Foo.bar, 1)
268
266
269 def test_fromdictmerge(self):
267 def test_fromdictmerge(self):
270 c1 = Config()
268 c1 = Config()
271 c2 = Config({'Foo' : {'bar' : 1}})
269 c2 = Config({'Foo' : {'bar' : 1}})
272 c1.merge(c2)
270 c1.merge(c2)
273 self.assertEqual(c1.Foo.__class__, Config)
271 self.assertEqual(c1.Foo.__class__, Config)
274 self.assertEqual(c1.Foo.bar, 1)
272 self.assertEqual(c1.Foo.bar, 1)
275
273
276 def test_fromdictmerge2(self):
274 def test_fromdictmerge2(self):
277 c1 = Config({'Foo' : {'baz' : 2}})
275 c1 = Config({'Foo' : {'baz' : 2}})
278 c2 = Config({'Foo' : {'bar' : 1}})
276 c2 = Config({'Foo' : {'bar' : 1}})
279 c1.merge(c2)
277 c1.merge(c2)
280 self.assertEqual(c1.Foo.__class__, Config)
278 self.assertEqual(c1.Foo.__class__, Config)
281 self.assertEqual(c1.Foo.bar, 1)
279 self.assertEqual(c1.Foo.bar, 1)
282 self.assertEqual(c1.Foo.baz, 2)
280 self.assertEqual(c1.Foo.baz, 2)
283 self.assertNotIn('baz', c2.Foo)
281 self.assertNotIn('baz', c2.Foo)
284
282
285 def test_contains(self):
283 def test_contains(self):
286 c1 = Config({'Foo' : {'baz' : 2}})
284 c1 = Config({'Foo' : {'baz' : 2}})
287 c2 = Config({'Foo' : {'bar' : 1}})
285 c2 = Config({'Foo' : {'bar' : 1}})
288 self.assertIn('Foo', c1)
286 self.assertIn('Foo', c1)
289 self.assertIn('Foo.baz', c1)
287 self.assertIn('Foo.baz', c1)
290 self.assertIn('Foo.bar', c2)
288 self.assertIn('Foo.bar', c2)
291 self.assertNotIn('Foo.bar', c1)
289 self.assertNotIn('Foo.bar', c1)
292
290
293 def test_pickle_config(self):
291 def test_pickle_config(self):
294 cfg = Config()
292 cfg = Config()
295 cfg.Foo.bar = 1
293 cfg.Foo.bar = 1
296 pcfg = pickle.dumps(cfg)
294 pcfg = pickle.dumps(cfg)
297 cfg2 = pickle.loads(pcfg)
295 cfg2 = pickle.loads(pcfg)
298 self.assertEqual(cfg2, cfg)
296 self.assertEqual(cfg2, cfg)
299
297
General Comments 0
You need to be logged in to leave comments. Login now