test_application.py
199 lines
| 6.6 KiB
| text/x-python
|
PythonLexer
MinRK
|
r12650 | # coding: utf-8 | ||
Brian Granger
|
r3796 | """ | ||
Tests for IPython.config.application.Application | ||||
""" | ||||
Min RK
|
r18527 | # Copyright (c) IPython Development Team. | ||
# Distributed under the terms of the Modified BSD License. | ||||
Brian Granger
|
r3796 | |||
MinRK
|
r4977 | import logging | ||
Min RK
|
r18527 | import os | ||
MinRK
|
r12107 | from io import StringIO | ||
Brian Granger
|
r3796 | from unittest import TestCase | ||
Min RK
|
r18527 | pjoin = os.path.join | ||
MinRK
|
r12107 | import nose.tools as nt | ||
Brian Granger
|
r3796 | from IPython.config.configurable import Configurable | ||
MinRK
|
r4977 | from IPython.config.loader import Config | ||
Brian Granger
|
r3796 | |||
from IPython.config.application import ( | ||||
Application | ||||
) | ||||
Min RK
|
r18527 | from IPython.utils.tempdir import TemporaryDirectory | ||
Brian Granger
|
r3796 | from IPython.utils.traitlets import ( | ||
Thomas Kluyver
|
r11125 | Bool, Unicode, Integer, List, Dict | ||
Brian Granger
|
r3796 | ) | ||
class Foo(Configurable): | ||||
MinRK
|
r5344 | i = Integer(0, config=True, help="The integer i.") | ||
j = Integer(1, config=True, help="The integer j.") | ||||
MinRK
|
r3852 | name = Unicode(u'Brian', config=True, help="First name.") | ||
Brian Granger
|
r3796 | |||
class Bar(Configurable): | ||||
MinRK
|
r5344 | b = Integer(0, config=True, help="The integer b.") | ||
MinRK
|
r3852 | enabled = Bool(True, config=True, help="Enable bar.") | ||
Brian Granger
|
r3796 | |||
class MyApp(Application): | ||||
Brian Granger
|
r3942 | name = Unicode(u'myapp') | ||
MinRK
|
r3861 | running = Bool(False, config=True, | ||
Brian Granger
|
r3796 | help="Is the app running?") | ||
classes = List([Bar, Foo]) | ||||
MinRK
|
r3861 | config_file = Unicode(u'', config=True, | ||
Brian Granger
|
r3796 | help="Load this config file") | ||
MinRK
|
r4214 | aliases = Dict({ | ||
'i' : 'Foo.i', | ||||
'j' : 'Foo.j', | ||||
'name' : 'Foo.name', | ||||
'enabled' : 'Bar.enabled', | ||||
MinRK
|
r4977 | 'log-level' : 'Application.log_level', | ||
MinRK
|
r4214 | }) | ||
MinRK
|
r3861 | |||
flags = Dict(dict(enable=({'Bar': {'enabled' : True}}, "Set Bar.enabled to True"), | ||||
MinRK
|
r4977 | disable=({'Bar': {'enabled' : False}}, "Set Bar.enabled to False"), | ||
crit=({'Application' : {'log_level' : logging.CRITICAL}}, | ||||
"set level=CRITICAL"), | ||||
)) | ||||
MinRK
|
r3852 | |||
Brian Granger
|
r3796 | def init_foo(self): | ||
MinRK
|
r11064 | self.foo = Foo(parent=self) | ||
Brian Granger
|
r3796 | |||
def init_bar(self): | ||||
MinRK
|
r11064 | self.bar = Bar(parent=self) | ||
Brian Granger
|
r3796 | |||
class TestApplication(TestCase): | ||||
MinRK
|
r12107 | def test_log(self): | ||
stream = StringIO() | ||||
app = MyApp(log_level=logging.INFO) | ||||
handler = logging.StreamHandler(stream) | ||||
# trigger reconstruction of the log formatter | ||||
app.log.handlers = [handler] | ||||
app.log_format = "%(message)s" | ||||
Jessica B. Hamrick
|
r20800 | app.log_datefmt = "%Y-%m-%d %H:%M" | ||
MinRK
|
r12107 | app.log.info("hello") | ||
nt.assert_in("hello", stream.getvalue()) | ||||
Brian Granger
|
r3796 | def test_basic(self): | ||
app = MyApp() | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.name, u'myapp') | ||
self.assertEqual(app.running, False) | ||||
self.assertEqual(app.classes, [MyApp,Bar,Foo]) | ||||
self.assertEqual(app.config_file, u'') | ||||
Brian Granger
|
r3796 | |||
def test_config(self): | ||||
app = MyApp() | ||||
MinRK
|
r4214 | app.parse_command_line(["--i=10","--Foo.j=10","--enabled=False","--log-level=50"]) | ||
Brian Granger
|
r3796 | config = app.config | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(config.Foo.i, 10) | ||
self.assertEqual(config.Foo.j, 10) | ||||
self.assertEqual(config.Bar.enabled, False) | ||||
self.assertEqual(config.MyApp.log_level,50) | ||||
Brian Granger
|
r3796 | |||
def test_config_propagation(self): | ||||
app = MyApp() | ||||
MinRK
|
r4214 | app.parse_command_line(["--i=10","--Foo.j=10","--enabled=False","--log-level=50"]) | ||
Brian Granger
|
r3796 | app.init_foo() | ||
app.init_bar() | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.foo.i, 10) | ||
self.assertEqual(app.foo.j, 10) | ||||
self.assertEqual(app.bar.enabled, False) | ||||
Brian Granger
|
r3796 | |||
MinRK
|
r3957 | def test_flags(self): | ||
MinRK
|
r3852 | app = MyApp() | ||
MinRK
|
r4197 | app.parse_command_line(["--disable"]) | ||
MinRK
|
r3852 | app.init_bar() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, False) | ||
MinRK
|
r3852 | app.parse_command_line(["--enable"]) | ||
app.init_bar() | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, True) | ||
MinRK
|
r3852 | |||
MinRK
|
r3957 | def test_aliases(self): | ||
app = MyApp() | ||||
MinRK
|
r4197 | app.parse_command_line(["--i=5", "--j=10"]) | ||
MinRK
|
r3957 | app.init_foo() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.foo.i, 5) | ||
MinRK
|
r3957 | app.init_foo() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.foo.j, 10) | ||
MinRK
|
r3957 | |||
def test_flag_clobber(self): | ||||
"""test that setting flags doesn't clobber existing settings""" | ||||
app = MyApp() | ||||
MinRK
|
r4197 | app.parse_command_line(["--Bar.b=5", "--disable"]) | ||
MinRK
|
r3957 | app.init_bar() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, False) | ||
self.assertEqual(app.bar.b, 5) | ||||
MinRK
|
r4197 | app.parse_command_line(["--enable", "--Bar.b=10"]) | ||
MinRK
|
r3957 | app.init_bar() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, True) | ||
self.assertEqual(app.bar.b, 10) | ||||
MinRK
|
r3957 | |||
MinRK
|
r4977 | def test_flatten_flags(self): | ||
cfg = Config() | ||||
cfg.MyApp.log_level = logging.WARN | ||||
app = MyApp() | ||||
app.update_config(cfg) | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.log_level, logging.WARN) | ||
self.assertEqual(app.config.MyApp.log_level, logging.WARN) | ||||
MinRK
|
r4977 | app.initialize(["--crit"]) | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.log_level, logging.CRITICAL) | ||
MinRK
|
r4977 | # this would be app.config.Application.log_level if it failed: | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.config.MyApp.log_level, logging.CRITICAL) | ||
MinRK
|
r4977 | |||
def test_flatten_aliases(self): | ||||
cfg = Config() | ||||
cfg.MyApp.log_level = logging.WARN | ||||
app = MyApp() | ||||
app.update_config(cfg) | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.log_level, logging.WARN) | ||
self.assertEqual(app.config.MyApp.log_level, logging.WARN) | ||||
MinRK
|
r4977 | app.initialize(["--log-level", "CRITICAL"]) | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.log_level, logging.CRITICAL) | ||
MinRK
|
r4977 | # this would be app.config.Application.log_level if it failed: | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.config.MyApp.log_level, "CRITICAL") | ||
MinRK
|
r4977 | |||
MinRK
|
r3958 | def test_extra_args(self): | ||
app = MyApp() | ||||
MinRK
|
r4197 | app.parse_command_line(["--Bar.b=5", 'extra', "--disable", 'args']) | ||
MinRK
|
r3958 | app.init_bar() | ||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, False) | ||
self.assertEqual(app.bar.b, 5) | ||||
self.assertEqual(app.extra_args, ['extra', 'args']) | ||||
MinRK
|
r4211 | app = MyApp() | ||
app.parse_command_line(["--Bar.b=5", '--', 'extra', "--disable", 'args']) | ||||
app.init_bar() | ||||
Bradley M. Froehle
|
r7874 | self.assertEqual(app.bar.enabled, True) | ||
self.assertEqual(app.bar.b, 5) | ||||
self.assertEqual(app.extra_args, ['extra', '--disable', 'args']) | ||||
MinRK
|
r3958 | |||
MinRK
|
r12650 | def test_unicode_argv(self): | ||
app = MyApp() | ||||
app.parse_command_line(['ünîcødé']) | ||||
Min RK
|
r18527 | |||
def test_multi_file(self): | ||||
app = MyApp() | ||||
app.log = logging.getLogger() | ||||
name = 'config.py' | ||||
with TemporaryDirectory('_1') as td1: | ||||
with open(pjoin(td1, name), 'w') as f1: | ||||
f1.write("get_config().MyApp.Bar.b = 1") | ||||
with TemporaryDirectory('_2') as td2: | ||||
with open(pjoin(td2, name), 'w') as f2: | ||||
f2.write("get_config().MyApp.Bar.b = 2") | ||||
app.load_config_file(name, path=[td2, td1]) | ||||
app.init_bar() | ||||
self.assertEqual(app.bar.b, 2) | ||||
app.load_config_file(name, path=[td1, td2]) | ||||
app.init_bar() | ||||
self.assertEqual(app.bar.b, 1) | ||||
MinRK
|
r3957 | |||