test_loader.py
255 lines
| 8.1 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2187 | # 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 | ||||
MinRK
|
r4162 | import sys | ||
Brian Granger
|
r2187 | from tempfile import mkstemp | ||
from unittest import TestCase | ||||
MinRK
|
r4162 | from nose import SkipTest | ||
MinRK
|
r4214 | from IPython.testing.tools import mute_warn | ||
MinRK
|
r5344 | from IPython.utils.traitlets import Unicode | ||
Brian Granger
|
r3791 | from IPython.config.configurable import Configurable | ||
Brian Granger
|
r2245 | from IPython.config.loader import ( | ||
Config, | ||||
Brian Granger
|
r3786 | PyFileConfigLoader, | ||
KeyValueConfigLoader, | ||||
Brian Granger
|
r2245 | ArgParseConfigLoader, | ||
MinRK
|
r4830 | KVArgParseConfigLoader, | ||
Brian Granger
|
r2245 | ConfigError | ||
) | ||||
Brian Granger
|
r2187 | |||
#----------------------------------------------------------------------------- | ||||
# Actual tests | ||||
#----------------------------------------------------------------------------- | ||||
pyfile = """ | ||||
Fernando Perez
|
r2394 | c = get_config() | ||
Brian Granger
|
r3786 | c.a=10 | ||
c.b=20 | ||||
c.Foo.Bar.value=10 | ||||
Thomas Kluyver
|
r4762 | c.Foo.Bam.value=list(range(10)) # list() is just so it's the same on Python 3 | ||
Brian Granger
|
r3786 | c.D.C.value='hi there' | ||
Brian Granger
|
r2187 | """ | ||
class TestPyFileCL(TestCase): | ||||
def test_basic(self): | ||||
Fernando Perez
|
r2392 | fd, fname = mkstemp('.py') | ||
Brian Granger
|
r2187 | f = os.fdopen(fd, 'w') | ||
f.write(pyfile) | ||||
f.close() | ||||
Brian Granger
|
r2198 | # Unlink the file | ||
Brian Granger
|
r2187 | cl = PyFileConfigLoader(fname) | ||
config = cl.load_config() | ||||
Brian Granger
|
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
|
r2187 | |||
Brian Granger
|
r2501 | class MyLoader1(ArgParseConfigLoader): | ||
MinRK
|
r4606 | def _add_arguments(self, aliases=None, flags=None): | ||
Brian Granger
|
r2501 | 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): | ||||
MinRK
|
r4606 | def _add_arguments(self, aliases=None, flags=None): | ||
Brian Granger
|
r2501 | 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
|
r2500 | |||
Brian Granger
|
r2187 | class TestArgParseCL(TestCase): | ||
def test_basic(self): | ||||
Brian Granger
|
r2501 | cl = MyLoader1() | ||
Brian Granger
|
r2187 | config = cl.load_config('-f hi -b 10 -n wow'.split()) | ||
Brian Granger
|
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
|
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
|
r2187 | |||
def test_add_arguments(self): | ||||
Brian Granger
|
r2501 | cl = MyLoader2() | ||
Brian Granger
|
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
|
r2245 | self.assertEquals(config.Global.x, 'frobble') | ||
Brian Granger
|
r2500 | def test_argv(self): | ||
Brian Granger
|
r2501 | cl = MyLoader1(argv='-f hi -b 10 -n wow'.split()) | ||
Brian Granger
|
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
|
r3786 | class TestKeyValueCL(TestCase): | ||
MinRK
|
r4830 | klass = KeyValueConfigLoader | ||
Brian Granger
|
r3786 | |||
def test_basic(self): | ||||
MinRK
|
r4830 | cl = self.klass() | ||
MinRK
|
r4197 | argv = ['--'+s.strip('c.') for s in pyfile.split('\n')[2:-1]] | ||
MinRK
|
r4214 | with mute_warn(): | ||
config = cl.load_config(argv) | ||||
Brian Granger
|
r3786 | 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') | ||||
MinRK
|
r3958 | |||
MinRK
|
r5189 | def test_expanduser(self): | ||
cl = self.klass() | ||||
argv = ['--a=~/1/2/3', '--b=~', '--c=~/', '--d="~/"'] | ||||
with mute_warn(): | ||||
config = cl.load_config(argv) | ||||
self.assertEquals(config.a, os.path.expanduser('~/1/2/3')) | ||||
self.assertEquals(config.b, os.path.expanduser('~')) | ||||
self.assertEquals(config.c, os.path.expanduser('~/')) | ||||
self.assertEquals(config.d, '~/') | ||||
MinRK
|
r3958 | def test_extra_args(self): | ||
MinRK
|
r4830 | cl = self.klass() | ||
MinRK
|
r4214 | with mute_warn(): | ||
config = cl.load_config(['--a=5', 'b', '--c=10', 'd']) | ||||
MinRK
|
r4211 | self.assertEquals(cl.extra_args, ['b', 'd']) | ||
MinRK
|
r3958 | self.assertEquals(config.a, 5) | ||
MinRK
|
r4211 | self.assertEquals(config.c, 10) | ||
MinRK
|
r4214 | with mute_warn(): | ||
config = cl.load_config(['--', '--a=5', '--c=10']) | ||||
MinRK
|
r4197 | self.assertEquals(cl.extra_args, ['--a=5', '--c=10']) | ||
MinRK
|
r4162 | |||
def test_unicode_args(self): | ||||
MinRK
|
r4830 | cl = self.klass() | ||
MinRK
|
r4197 | argv = [u'--a=épsîlön'] | ||
MinRK
|
r4214 | with mute_warn(): | ||
config = cl.load_config(argv) | ||||
MinRK
|
r4162 | self.assertEquals(config.a, u'épsîlön') | ||
def test_unicode_bytes_args(self): | ||||
MinRK
|
r4197 | uarg = u'--a=é' | ||
MinRK
|
r4162 | try: | ||
barg = uarg.encode(sys.stdin.encoding) | ||||
except (TypeError, UnicodeEncodeError): | ||||
raise SkipTest("sys.stdin.encoding can't handle 'é'") | ||||
MinRK
|
r4830 | cl = self.klass() | ||
MinRK
|
r4214 | with mute_warn(): | ||
config = cl.load_config([barg]) | ||||
MinRK
|
r4162 | self.assertEquals(config.a, u'é') | ||
MinRK
|
r4830 | |||
def test_unicode_alias(self): | ||||
cl = self.klass() | ||||
argv = [u'--a=épsîlön'] | ||||
with mute_warn(): | ||||
config = cl.load_config(argv, aliases=dict(a='A.a')) | ||||
self.assertEquals(config.A.a, u'épsîlön') | ||||
Brian Granger
|
r3786 | |||
MinRK
|
r4830 | class TestArgParseKVCL(TestKeyValueCL): | ||
klass = KVArgParseConfigLoader | ||||
Brian Granger
|
r3791 | |||
MinRK
|
r5189 | def test_expanduser2(self): | ||
cl = self.klass() | ||||
argv = ['-a', '~/1/2/3', '--b', "'~/1/2/3'"] | ||||
with mute_warn(): | ||||
config = cl.load_config(argv, aliases=dict(a='A.a', b='A.b')) | ||||
self.assertEquals(config.A.a, os.path.expanduser('~/1/2/3')) | ||||
self.assertEquals(config.A.b, '~/1/2/3') | ||||
Brian Granger
|
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) | ||||