##// END OF EJS Templates
Upgrade to prompt_toolkit 2.0
Upgrade to prompt_toolkit 2.0

File last commit:

r24111:98c4cb9b
r24376:8e256bd3
Show More
test_formatters.py
533 lines | 15.0 KiB | text/x-python | PythonLexer
/ IPython / core / tests / test_formatters.py
MinRK
warn on failed formatter calls
r13977 """Tests for the Formatters."""
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209
Min RK
JSON formatter expects JSONable dict/list...
r19557 import warnings
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 from math import pi
try:
import numpy
except:
numpy = None
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209 import nose.tools as nt
Min RK
JSON formatter expects JSONable dict/list...
r19557 from IPython import get_ipython
Min RK
update dependency imports...
r21253 from traitlets.config import Config
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 from IPython.core.formatters import (
Min RK
test IPythonDisplayFormatter
r19384 PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key,
Min RK
JSON formatter expects JSONable dict/list...
r19557 DisplayFormatter, JSONFormatter,
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 )
MinRK
warn on failed formatter calls
r13977 from IPython.utils.io import capture_output
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209
class A(object):
def __repr__(self):
return 'A()'
class B(A):
def __repr__(self):
return 'B()'
MinRK
add lookup logic based on apptools.type_registry...
r13781 class C:
pass
MinRK
show tracebacks for errors in formatters...
r18025 class BadRepr(object):
def __repr__(self):
raise ValueError("bad repr")
Robert Kern
BUG: Fix pretty-printing for overzealous objects that will return something non-callable for any requested attribute (thus confusing hasattr).
r6268 class BadPretty(object):
_repr_pretty_ = None
class GoodPretty(object):
def _repr_pretty_(self, pp, cycle):
pp.text('foo')
def __repr__(self):
return 'GoodPretty()'
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209 def foo_printer(obj, pp, cycle):
pp.text('foo')
def test_pretty():
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f = PlainTextFormatter()
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209 f.for_type(A, foo_printer)
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(f(A()), 'foo')
Thomas Kluyver
Update test for displaying subclass instance
r24111 nt.assert_equal(f(B()), 'B()')
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(f(GoodPretty()), 'foo')
Robert Kern
BUG: Fix pretty-printing for overzealous objects that will return something non-callable for any requested attribute (thus confusing hasattr).
r6268 # Just don't raise an exception for the following:
f(BadPretty())
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209 f.pprint = False
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(f(A()), 'A()')
nt.assert_equal(f(B()), 'B()')
nt.assert_equal(f(GoodPretty()), 'GoodPretty()')
Robert Kern
BUG: Fix pretty-printing for overzealous objects that will return something non-callable for any requested attribute (thus confusing hasattr).
r6268
Robert Kern
ENH: Implement and test the default pretty formatter.
r3209
def test_deferred():
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f = PlainTextFormatter()
def test_precision():
"""test various values for float_precision."""
f = PlainTextFormatter()
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(f(pi), repr(pi))
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f.float_precision = 0
if numpy:
po = numpy.get_printoptions()
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(po['precision'], 0)
nt.assert_equal(f(pi), '3')
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f.float_precision = 2
if numpy:
po = numpy.get_printoptions()
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(po['precision'], 2)
nt.assert_equal(f(pi), '3.14')
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f.float_precision = '%g'
if numpy:
po = numpy.get_printoptions()
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(po['precision'], 2)
nt.assert_equal(f(pi), '3.14159')
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f.float_precision = '%e'
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(f(pi), '3.141593e+00')
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350 f.float_precision = ''
if numpy:
po = numpy.get_printoptions()
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(po['precision'], 8)
nt.assert_equal(f(pi), repr(pi))
MinRK
add `float_precision` trait to PlainTextFormatter...
r3350
def test_bad_precision():
"""test various invalid values for float_precision."""
f = PlainTextFormatter()
def set_fp(p):
f.float_precision=p
nt.assert_raises(ValueError, set_fp, '%')
nt.assert_raises(ValueError, set_fp, '%.3f%i')
nt.assert_raises(ValueError, set_fp, 'foo')
nt.assert_raises(ValueError, set_fp, -1)
MinRK
exercise formatter.for_type in tests
r13655 def test_for_type():
f = PlainTextFormatter()
MinRK
more formatter type lookup tests
r13783 # initial return, None
nt.assert_is(f.for_type(C, foo_printer), None)
MinRK
exercise formatter.for_type in tests
r13655 # no func queries
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type(C), foo_printer)
MinRK
exercise formatter.for_type in tests
r13655 # shouldn't change anything
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type(C), foo_printer)
MinRK
add lookup logic based on apptools.type_registry...
r13781 # None should do the same
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type(C, None), foo_printer)
nt.assert_is(f.for_type(C, None), foo_printer)
MinRK
exercise formatter.for_type in tests
r13655
MinRK
add lookup logic based on apptools.type_registry...
r13781 def test_for_type_string():
MinRK
exercise formatter.for_type in tests
r13655 f = PlainTextFormatter()
MinRK
add lookup logic based on apptools.type_registry...
r13781 type_str = '%s.%s' % (C.__module__, 'C')
MinRK
more formatter type lookup tests
r13783 # initial return, None
nt.assert_is(f.for_type(type_str, foo_printer), None)
MinRK
add lookup logic based on apptools.type_registry...
r13781 # no func queries
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type(type_str), foo_printer)
nt.assert_in(_mod_name_key(C), f.deferred_printers)
nt.assert_is(f.for_type(C), foo_printer)
nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
nt.assert_in(C, f.type_printers)
MinRK
add lookup logic based on apptools.type_registry...
r13781
def test_for_type_by_name():
f = PlainTextFormatter()
mod = C.__module__
MinRK
exercise formatter.for_type in tests
r13655
MinRK
more formatter type lookup tests
r13783 # initial return, None
nt.assert_is(f.for_type_by_name(mod, 'C', foo_printer), None)
MinRK
exercise formatter.for_type in tests
r13655 # no func queries
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer)
MinRK
exercise formatter.for_type in tests
r13655 # shouldn't change anything
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer)
MinRK
add lookup logic based on apptools.type_registry...
r13781 # None should do the same
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer)
nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer)
MinRK
exercise formatter.for_type in tests
r13655
MinRK
add lookup logic based on apptools.type_registry...
r13781 def test_lookup():
f = PlainTextFormatter()
MinRK
more formatter type lookup tests
r13783 f.for_type(C, foo_printer)
nt.assert_is(f.lookup(C()), foo_printer)
with nt.assert_raises(KeyError):
f.lookup(A())
def test_lookup_string():
f = PlainTextFormatter()
type_str = '%s.%s' % (C.__module__, 'C')
f.for_type(type_str, foo_printer)
nt.assert_is(f.lookup(C()), foo_printer)
# should move from deferred to imported dict
nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
nt.assert_in(C, f.type_printers)
def test_lookup_by_type():
f = PlainTextFormatter()
f.for_type(C, foo_printer)
nt.assert_is(f.lookup_by_type(C), foo_printer)
with nt.assert_raises(KeyError):
f.lookup_by_type(A)
def test_lookup_by_type_string():
f = PlainTextFormatter()
type_str = '%s.%s' % (C.__module__, 'C')
f.for_type(type_str, foo_printer)
# verify insertion
nt.assert_in(_mod_name_key(C), f.deferred_printers)
nt.assert_not_in(C, f.type_printers)
MinRK
add lookup logic based on apptools.type_registry...
r13781
MinRK
another pass on formatter lookup...
r13788 nt.assert_is(f.lookup_by_type(type_str), foo_printer)
# lookup by string doesn't cause import
nt.assert_in(_mod_name_key(C), f.deferred_printers)
nt.assert_not_in(C, f.type_printers)
MinRK
more formatter type lookup tests
r13783 nt.assert_is(f.lookup_by_type(C), foo_printer)
# should move from deferred to imported dict
nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
nt.assert_in(C, f.type_printers)
MinRK
another pass on formatter lookup...
r13788 def test_in_formatter():
f = PlainTextFormatter()
f.for_type(C, foo_printer)
type_str = '%s.%s' % (C.__module__, 'C')
nt.assert_in(C, f)
nt.assert_in(type_str, f)
def test_string_in_formatter():
f = PlainTextFormatter()
type_str = '%s.%s' % (C.__module__, 'C')
f.for_type(type_str, foo_printer)
nt.assert_in(type_str, f)
nt.assert_in(C, f)
MinRK
more formatter type lookup tests
r13783 def test_pop():
f = PlainTextFormatter()
f.for_type(C, foo_printer)
nt.assert_is(f.lookup_by_type(C), foo_printer)
MinRK
another pass on formatter lookup...
r13788 nt.assert_is(f.pop(C, None), foo_printer)
f.for_type(C, foo_printer)
nt.assert_is(f.pop(C), foo_printer)
MinRK
more formatter type lookup tests
r13783 with nt.assert_raises(KeyError):
f.lookup_by_type(C)
with nt.assert_raises(KeyError):
f.pop(C)
with nt.assert_raises(KeyError):
f.pop(A)
MinRK
another pass on formatter lookup...
r13788 nt.assert_is(f.pop(A, None), None)
MinRK
more formatter type lookup tests
r13783
def test_pop_string():
f = PlainTextFormatter()
MinRK
add lookup logic based on apptools.type_registry...
r13781 type_str = '%s.%s' % (C.__module__, 'C')
MinRK
more formatter type lookup tests
r13783 with nt.assert_raises(KeyError):
f.pop(type_str)
f.for_type(type_str, foo_printer)
f.pop(type_str)
with nt.assert_raises(KeyError):
f.lookup_by_type(C)
with nt.assert_raises(KeyError):
f.pop(type_str)
f.for_type(C, foo_printer)
MinRK
another pass on formatter lookup...
r13788 nt.assert_is(f.pop(type_str, None), foo_printer)
MinRK
more formatter type lookup tests
r13783 with nt.assert_raises(KeyError):
f.lookup_by_type(C)
with nt.assert_raises(KeyError):
f.pop(type_str)
MinRK
another pass on formatter lookup...
r13788 nt.assert_is(f.pop(type_str, None), None)
MinRK
more formatter type lookup tests
r13783
MinRK
show tracebacks for errors in formatters...
r18025 def test_error_method():
MinRK
warn on failed formatter calls
r13977 f = HTMLFormatter()
class BadHTML(object):
def _repr_html_(self):
MinRK
show tracebacks for errors in formatters...
r18025 raise ValueError("Bad HTML")
MinRK
warn on failed formatter calls
r13977 bad = BadHTML()
with capture_output() as captured:
result = f(bad)
nt.assert_is(result, None)
MinRK
show tracebacks for errors in formatters...
r18025 nt.assert_in("Traceback", captured.stdout)
nt.assert_in("Bad HTML", captured.stdout)
nt.assert_in("_repr_html_", captured.stdout)
MinRK
warn on failed formatter calls
r13977
MinRK
test formatter raising NotImplementedError
r14636 def test_nowarn_notimplemented():
f = HTMLFormatter()
class HTMLNotImplemented(object):
def _repr_html_(self):
raise NotImplementedError
h = HTMLNotImplemented()
with capture_output() as captured:
result = f(h)
nt.assert_is(result, None)
MinRK
show tracebacks for errors in formatters...
r18025 nt.assert_equal("", captured.stderr)
nt.assert_equal("", captured.stdout)
MinRK
test formatter raising NotImplementedError
r14636
MinRK
warn on failed formatter calls
r13977 def test_warn_error_for_type():
f = HTMLFormatter()
f.for_type(int, lambda i: name_error)
with capture_output() as captured:
result = f(5)
nt.assert_is(result, None)
MinRK
show tracebacks for errors in formatters...
r18025 nt.assert_in("Traceback", captured.stdout)
nt.assert_in("NameError", captured.stdout)
nt.assert_in("name_error", captured.stdout)
MinRK
warn on failed formatter calls
r13977
MinRK
show tracebacks for errors in formatters...
r18025 def test_error_pretty_method():
MinRK
warn on failed formatter calls
r13977 f = PlainTextFormatter()
class BadPretty(object):
def _repr_pretty_(self):
return "hello"
bad = BadPretty()
with capture_output() as captured:
result = f(bad)
nt.assert_is(result, None)
MinRK
show tracebacks for errors in formatters...
r18025 nt.assert_in("Traceback", captured.stdout)
nt.assert_in("_repr_pretty_", captured.stdout)
nt.assert_in("given", captured.stdout)
nt.assert_in("argument", captured.stdout)
def test_bad_repr_traceback():
f = PlainTextFormatter()
bad = BadRepr()
with capture_output() as captured:
result = f(bad)
# catches error, returns None
nt.assert_is(result, None)
nt.assert_in("Traceback", captured.stdout)
nt.assert_in("__repr__", captured.stdout)
nt.assert_in("ValueError", captured.stdout)
MinRK
warn on failed formatter calls
r13977
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 class MakePDF(object):
def _repr_pdf_(self):
return 'PDF'
MinRK
exercise formatter.for_type in tests
r13655
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 def test_pdf_formatter():
pdf = MakePDF()
f = PDFFormatter()
nt.assert_equal(f(pdf), 'PDF')
MinRK
require print_method to be a bound method...
r15216
def test_print_method_bound():
f = HTMLFormatter()
class MyHTML(object):
def _repr_html_(self):
return "hello"
with capture_output() as captured:
result = f(MyHTML)
nt.assert_is(result, None)
nt.assert_not_in("FormatterWarning", captured.stderr)
with capture_output() as captured:
result = f(MyHTML())
nt.assert_equal(result, "hello")
nt.assert_equal(captured.stderr, "")
Min RK
only check for formatters on instances...
r19026 def test_print_method_weird():
class TextMagicHat(object):
def __getattr__(self, key):
return key
f = HTMLFormatter()
text_hat = TextMagicHat()
nt.assert_equal(text_hat._repr_html_, '_repr_html_')
with capture_output() as captured:
result = f(text_hat)
nt.assert_is(result, None)
nt.assert_not_in("FormatterWarning", captured.stderr)
class CallableMagicHat(object):
def __getattr__(self, key):
return lambda : key
call_hat = CallableMagicHat()
with capture_output() as captured:
result = f(call_hat)
Min RK
remove _valid_formatter...
r19128 nt.assert_equal(result, None)
Min RK
only check for formatters on instances...
r19026
class BadReprArgs(object):
def _repr_html_(self, extra, args):
return "html"
bad = BadReprArgs()
with capture_output() as captured:
result = f(bad)
nt.assert_is(result, None)
nt.assert_not_in("FormatterWarning", captured.stderr)
MinRK
require print_method to be a bound method...
r15216 def test_format_config():
"""config objects don't pretend to support fancy reprs with lazy attrs"""
f = HTMLFormatter()
cfg = Config()
with capture_output() as captured:
result = f(cfg)
nt.assert_is(result, None)
nt.assert_equal(captured.stderr, "")
with capture_output() as captured:
result = f(Config)
nt.assert_is(result, None)
nt.assert_equal(captured.stderr, "")
Min RK
make pretty.max_seq_length configurable...
r18518
def test_pretty_max_seq_length():
f = PlainTextFormatter(max_seq_length=1)
lis = list(range(3))
text = f(lis)
nt.assert_equal(text, '[0, ...]')
f.max_seq_length = 0
text = f(lis)
nt.assert_equal(text, '[0, 1, 2]')
text = f(list(range(1024)))
lines = text.splitlines()
nt.assert_equal(len(lines), 1024)
Min RK
test IPythonDisplayFormatter
r19384
def test_ipython_display_formatter():
"""Objects with _ipython_display_ defined bypass other formatters"""
f = get_ipython().display_formatter
catcher = []
class SelfDisplaying(object):
def _ipython_display_(self):
catcher.append(self)
class NotSelfDisplaying(object):
def __repr__(self):
return "NotSelfDisplaying"
def _ipython_display_(self):
raise NotImplementedError
Min RK
enable IPython formatter when testing it
r23310 save_enabled = f.ipython_display_formatter.enabled
f.ipython_display_formatter.enabled = True
Min RK
test IPythonDisplayFormatter
r19384 yes = SelfDisplaying()
no = NotSelfDisplaying()
d, md = f.format(no)
nt.assert_equal(d, {'text/plain': repr(no)})
nt.assert_equal(md, {})
nt.assert_equal(catcher, [])
d, md = f.format(yes)
nt.assert_equal(d, {})
nt.assert_equal(md, {})
nt.assert_equal(catcher, [yes])
Min RK
enable IPython formatter when testing it
r23310 f.ipython_display_formatter.enabled = save_enabled
Min RK
JSON formatter expects JSONable dict/list...
r19557 def test_json_as_string_deprecated():
class JSONString(object):
def _repr_json_(self):
return '{}'
f = JSONFormatter()
with warnings.catch_warnings(record=True) as w:
d = f(JSONString())
nt.assert_equal(d, {})
nt.assert_equal(len(w), 1)
Min RK
Define `_repr_mimebundle_`...
r23578
def test_repr_mime():
class HasReprMime(object):
Matthias Bussonnier
Pass down include and exclude as kwarg to repr_mimebundle
r23618 def _repr_mimebundle_(self, include=None, exclude=None):
Min RK
Define `_repr_mimebundle_`...
r23578 return {
'application/json+test.v2': {
'x': 'y'
Matthias Bussonnier
Respect the ignore and include keyword in display
r23612 },
'plain/text' : '<HasReprMime>',
'image/png' : 'i-overwrite'
Min RK
Define `_repr_mimebundle_`...
r23578 }
Matthias Bussonnier
Respect the ignore and include keyword in display
r23612
def _repr_png_(self):
return 'should-be-overwritten'
Min RK
Define `_repr_mimebundle_`...
r23578 def _repr_html_(self):
return '<b>hi!</b>'
f = get_ipython().display_formatter
html_f = f.formatters['text/html']
save_enabled = html_f.enabled
html_f.enabled = True
obj = HasReprMime()
d, md = f.format(obj)
html_f.enabled = save_enabled
Matthias Bussonnier
Respect the ignore and include keyword in display
r23612 nt.assert_equal(sorted(d), ['application/json+test.v2',
'image/png',
'plain/text',
'text/html',
'text/plain'])
Min RK
Define `_repr_mimebundle_`...
r23578 nt.assert_equal(md, {})
Matthias Bussonnier
Respect the ignore and include keyword in display
r23612 d, md = f.format(obj, include={'image/png'})
nt.assert_equal(list(d.keys()), ['image/png'],
'Include should filter out even things from repr_mimebundle')
nt.assert_equal(d['image/png'], 'i-overwrite', '_repr_mimebundle_ take precedence')
Min RK
Define `_repr_mimebundle_`...
r23578
Matthias Bussonnier
Document _repr_mimebundle_...
r23674
def test_pass_correct_include_exclude():
class Tester(object):
def __init__(self, include=None, exclude=None):
self.include = include
self.exclude = exclude
def _repr_mimebundle_(self, include, exclude, **kwargs):
if include and (include != self.include):
raise ValueError('include got modified: display() may be broken.')
if exclude and (exclude != self.exclude):
raise ValueError('exclude got modified: display() may be broken.')
return None
include = {'a', 'b', 'c'}
exclude = {'c', 'e' , 'f'}
f = get_ipython().display_formatter
f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude)
f.format(Tester(exclude=exclude), exclude=exclude)
f.format(Tester(include=include), include=include)
Min RK
Define `_repr_mimebundle_`...
r23578 def test_repr_mime_meta():
class HasReprMimeMeta(object):
Matthias Bussonnier
Pass down include and exclude as kwarg to repr_mimebundle
r23618 def _repr_mimebundle_(self, include=None, exclude=None):
Min RK
Define `_repr_mimebundle_`...
r23578 data = {
'image/png': 'base64-image-data',
}
metadata = {
'image/png': {
'width': 5,
'height': 10,
}
}
return (data, metadata)
f = get_ipython().display_formatter
obj = HasReprMimeMeta()
d, md = f.format(obj)
nt.assert_equal(sorted(d), ['image/png', 'text/plain'])
nt.assert_equal(md, {
'image/png': {
'width': 5,
'height': 10,
}
})
Thomas Kluyver
Ensure that MimeBundleFormatter always returns a 2-tuple
r24042
def test_repr_mime_failure():
class BadReprMime(object):
def _repr_mimebundle_(self, include=None, exclude=None):
raise RuntimeError
f = get_ipython().display_formatter
obj = BadReprMime()
d, md = f.format(obj)
nt.assert_in('text/plain', d)