##// END OF EJS Templates
Reset the interactive namespace __warningregistry__ before executing code...
Reset the interactive namespace __warningregistry__ before executing code Fixes #6611. Idea: Right now, people often don't see important warnings when running code in IPython, because (to a first approximation) any given warning will only issue once per session. Blink and you'll miss it! This is a very common contributor to confused emails to numpy-discussion. E.g.: In [5]: 1 / my_array_with_random_contents /home/njs/.user-python2.7-64bit-3/bin/ipython:1: RuntimeWarning: divide by zero encountered in divide #!/home/njs/.user-python2.7-64bit-3/bin/python Out[5]: array([ 1.77073316, -2.29765021, -2.01800811, ..., 1.13871243, -1.08302964, -8.6185091 ]) Oo, right, guess I gotta be careful of those zeros -- thanks, numpy, for giving me that warning! A few days later: In [592]: 1 / some_other_array Out[592]: array([ 3.07735763, 0.50769289, 0.83984078, ..., -0.67563917, -0.85736257, -1.36511271]) Oops, it turns out that this array had a zero in it too, and that's going to bite me later. But no warning this time! The effect of this commit is to make it so that warnings triggered by the code in cell 5 do *not* suppress warnings triggered by the code in cell 592. Note that this only applies to warnings triggered *directly* by code entered interactively -- if somepkg.foo() calls anotherpkg.bad_func() which issues a warning, then this warning will still only be displayed once, even if multiple cells call somepkg.foo(). But if cell 5 and cell 592 both call anotherpkg.bad_func() directly, then both will get warnings. (Important exception: if foo() is defined *interactively*, and calls anotherpkg.bad_func(), then every cell that calls foo() will display the warning again. This is unavoidable without fixes to CPython upstream.) Explanation: Python's warning system has some weird quirks. By default, it tries to suppress duplicate warnings, where "duplicate" means the same warning message triggered twice by the same line of code. This requires determining which line of code is responsible for triggering a warning, and this is controlled by the stacklevel= argument to warnings.warn. Basically, though, the idea is that if foo() calls bar() which calls baz() which calls some_deprecated_api(), then baz() will get counted as being "responsible", and the warning system will make a note that the usage of some_deprecated_api() inside baz() has already been warned about and doesn't need to be warned about again. So far so good. To accomplish this, obviously, there has to be a record of somewhere which line this was. You might think that this would be done by recording the filename:linenumber pair in a dict inside the warnings module, or something like that. You would be wrong. What actually happens is that the warnings module will use stack introspection to reach into baz()'s execution environment, create a global (module-level) variable there named __warningregistry__, and then, inside this dictionary, record just the line number. Basically, it assumes that any given module contains only one line 1, only one line 2, etc., so storing the filename is irrelevant. Obviously for interactive code this is totally wrong -- all cells share the same execution environment and global namespace, and they all contain a new line 1. Currently the warnings module treats these as if they were all the same line. In fact they are not the same line; once we have executed a given chunk of code, we will never see those particular lines again. As soon as a given chunk of code finishes executing, its line number labels become meaningless, and the corresponding warning registry entries become meaningless as well. Therefore, with this patch we delete the __warningregistry__ each time we execute a new block of code.

File last commit:

r16822:a925e260
r18548:61431d7d
Show More
export.py
174 lines | 5.3 KiB | text/x-python | PythonLexer
MinRK
add PDFExporter...
r16265 """Module containing single call export functions."""
Jonathan Frederic
Post code-review, extended refactor.
r10485
MinRK
add PDFExporter...
r16265 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Jonathan Frederic
Finished rename/refact on API namespace
r10690
Jonathan Frederic
Docstring decorator
r10771 from functools import wraps
Jonathan Frederic
Finished rename/refact on API namespace
r10690
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624 from IPython.nbformat.v3.nbbase import NotebookNode
Thomas Kluyver
Miscellaneous docs fixes
r13597 from IPython.utils.decorators import undoc
Thomas Kluyver
Replace references to unicode and basestring
r13353 from IPython.utils.py3compat import string_types
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624
Jonathan Frederic
Fixed Travis, missing import in export.py
r12507 from .exporter import Exporter
Jonathan Frederic
Rebase changes made by hand
r12505 from .templateexporter import TemplateExporter
Jonathan Frederic
Part way through adding 'flavor' support
r11733 from .html import HTMLExporter
Jonathan Frederic
HTML-Slides -> Slides-Reveal
r11744 from .slides import SlidesExporter
Jonathan Frederic
Moved export.py back into exporters directory
r10788 from .latex import LatexExporter
MinRK
add PDFExporter...
r16265 from .pdf import PDFExporter
Jonathan Frederic
Moved export.py back into exporters directory
r10788 from .markdown import MarkdownExporter
from .python import PythonExporter
MinRK
RST class capitalization
r11449 from .rst import RSTExporter
Julia Evans
Add IPython Notebook exporter
r16822 from .notebook import NotebookExporter
Jonathan Frederic
Import fix for renamed /api/ to /exporters/
r10768
Jonathan Frederic
Post code-review, extended refactor.
r10485 #-----------------------------------------------------------------------------
Jonathan Frederic
Docstring decorator
r10771 # Classes
Jonathan Frederic
Post code-review, extended refactor.
r10485 #-----------------------------------------------------------------------------
Jonathan Frederic
Finished a rough draft of the exporters.
r10588
Thomas Kluyver
Miscellaneous docs fixes
r13597 @undoc
MinRK
populate exporter list in NbConvertApp.classes
r11451 def DocDecorator(f):
Jonathan Frederic
Finished rename/refact on API namespace
r10690
Jonathan Frederic
Docstring decorator
r10771 #Set docstring of function
f.__doc__ = f.__doc__ + """
Thomas Kluyver
Programmatically fill up-to-date location of NotebookNode class.
r13625 nb : :class:`~{nbnode_mod}.NotebookNode`
Thomas Kluyver
Miscellaneous docs fixes
r13597 The notebook to export.
Jonathan Frederic
Added writers and supporting code.
r11367 config : config (optional, keyword arg)
Jonathan Frederic
Finished rename/refact on API namespace
r10690 User configuration instance.
Jonathan Frederic
Added writers and supporting code.
r11367 resources : dict (optional, keyword arg)
Resources used in the conversion process.
Jonathan Frederic
Finished rename/refact on API namespace
r10690
Returns
Thomas Kluyver
Miscellaneous docs fixes
r13597 -------
Jonathan Frederic
Finished rename/refact on API namespace
r10690 tuple- output, resources, exporter_instance
output : str
Jinja 2 output. This is the resulting converted notebook.
resources : dictionary
Dictionary of resources used prior to and during the conversion
process.
exporter_instance : Exporter
Instance of the Exporter class used to export the document. Useful
to caller because it provides a 'file_extension' property which
Jonathan Frederic
Added warnings
r11755 specifies what extension the output should be saved as.
Thomas Kluyver
Miscellaneous docs fixes
r13597 Notes
-----
Jonathan Frederic
Added warnings
r11755 WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT
Thomas Kluyver
Programmatically fill up-to-date location of NotebookNode class.
r13625 """.format(nbnode_mod=NotebookNode.__module__)
Jonathan Frederic
Docstring decorator
r10771
@wraps(f)
def decorator(*args, **kwargs):
return f(*args, **kwargs)
return decorator
#-----------------------------------------------------------------------------
# Functions
#-----------------------------------------------------------------------------
Brian E. Granger
Fixing import logic.
r11088 __all__ = [
'export',
Jonathan Frederic
Part way through adding 'flavor' support
r11733 'export_html',
Jonathan Frederic
Added ability to export to a 'custom' format,...
r11743 'export_custom',
Jonathan Frederic
HTML-Slides -> Slides-Reveal
r11744 'export_slides',
Brian E. Granger
Fixing import logic.
r11088 'export_latex',
MinRK
add PDFExporter...
r16265 'export_pdf',
Brian E. Granger
Fixing import logic.
r11088 'export_markdown',
'export_python',
'export_rst',
Paul Ivanov
added listing of known exporters on error
r11250 'export_by_name',
Jonathan Frederic
Added ExporterNameError to exported names
r11395 'get_export_names',
'ExporterNameError'
Brian E. Granger
Fixing import logic.
r11088 ]
Jonathan Frederic
Added ExporterNameError to exported names
r11395
Jonathan Frederic
Catch export specific name error only
r11372 class ExporterNameError(NameError):
pass
Jonathan Frederic
Docstring decorator
r10771 @DocDecorator
Jonathan Frederic
Added ability support for already instanciate exporter
r11426 def export(exporter, nb, **kw):
Jonathan Frederic
Docstring decorator
r10771 """
Export a notebook object using specific exporter class.
Thomas Kluyver
Miscellaneous docs fixes
r13597 Parameters
----------
exporter : class:`~IPython.nbconvert.exporters.exporter.Exporter` class or instance
Class type or instance of the exporter that should be used. If the
method initializes it's own instance of the class, it is ASSUMED that
the class type provided exposes a constructor (``__init__``) with the same
signature as the base Exporter class.
Jonathan Frederic
Finished rename/refact on API namespace
r10690 """
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624
#Check arguments
Jonathan Frederic
Added ability support for already instanciate exporter
r11426 if exporter is None:
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624 raise TypeError("Exporter is None")
Jonathan Frederic
Check if class is an instance of Exporter, not TemplateExporter
r12506 elif not isinstance(exporter, Exporter) and not issubclass(exporter, Exporter):
Jonathan Frederic
Added ability support for already instanciate exporter
r11426 raise TypeError("exporter does not inherit from Exporter (base)")
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624 if nb is None:
raise TypeError("nb is None")
#Create the exporter
Jonathan Frederic
Changes after in person review with @ellisonbg including TODO tags
r11379 resources = kw.pop('resources', None)
Jonathan Frederic
Check if class is an instance of Exporter, not TemplateExporter
r12506 if isinstance(exporter, Exporter):
Jonathan Frederic
Added ability support for already instanciate exporter
r11426 exporter_instance = exporter
else:
MinRK
rollback singleton exporter instances in `export_foo`
r11864 exporter_instance = exporter(**kw)
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624 #Try to convert the notebook using the appropriate conversion function.
if isinstance(nb, NotebookNode):
Jonathan Frederic
Added writers and supporting code.
r11367 output, resources = exporter_instance.from_notebook_node(nb, resources)
Thomas Kluyver
Replace references to unicode and basestring
r13353 elif isinstance(nb, string_types):
Jonathan Frederic
Added writers and supporting code.
r11367 output, resources = exporter_instance.from_filename(nb, resources)
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624 else:
Jonathan Frederic
Added writers and supporting code.
r11367 output, resources = exporter_instance.from_file(nb, resources)
return output, resources
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624
MinRK
generate `export_foo` methods...
r11863 exporter_map = dict(
Matthias BUSSONNIER
Exporter -> TemplateExporter / BaseExporter
r12500 custom=TemplateExporter,
MinRK
generate `export_foo` methods...
r11863 html=HTMLExporter,
slides=SlidesExporter,
latex=LatexExporter,
MinRK
add PDFExporter...
r16265 pdf=PDFExporter,
MinRK
generate `export_foo` methods...
r11863 markdown=MarkdownExporter,
python=PythonExporter,
rst=RSTExporter,
Julia Evans
Add IPython Notebook exporter
r16822 notebook=NotebookExporter,
MinRK
generate `export_foo` methods...
r11863 )
def _make_exporter(name, E):
"""make an export_foo function from a short key and Exporter class E"""
def _export(nb, **kw):
return export(E, nb, **kw)
_export.__doc__ = """Export a notebook object to {0} format""".format(name)
return _export
g = globals()
Jonathan Frederic
Cleanup and refactor of API, almost complete....
r10677
MinRK
generate `export_foo` methods...
r11863 for name, E in exporter_map.items():
g['export_%s' % name] = DocDecorator(_make_exporter(name, E))
Jonathan Frederic
Cleanup and refactor of API, almost complete....
r10677
Jonathan Frederic
Docstring decorator
r10771 @DocDecorator
Jonathan Frederic
Added writers and supporting code.
r11367 def export_by_name(format_name, nb, **kw):
Jonathan Frederic
Finished rename/refact on API namespace
r10690 """
Export a notebook object to a template type by its name. Reflection
(Inspect) is used to find the template's corresponding explicit export
method defined in this module. That method is then called directly.
Thomas Kluyver
Miscellaneous docs fixes
r13597 Parameters
----------
Jonathan Frederic
Added writers and supporting code.
r11367 format_name : str
Jonathan Frederic
Finished rename/refact on API namespace
r10690 Name of the template style to export to.
"""
Jonathan Frederic
Added writers and supporting code.
r11367 function_name = "export_" + format_name.lower()
Jonathan Frederic
Finished rename/refact on API namespace
r10690
Jonathan Frederic
Use globals dict to find right export function instead of...
r10769 if function_name in globals():
Jonathan Frederic
Added writers and supporting code.
r11367 return globals()[function_name](nb, **kw)
Jonathan Frederic
Use globals dict to find right export function instead of...
r10769 else:
Jonathan Frederic
Catch export specific name error only
r11372 raise ExporterNameError("template for `%s` not found" % function_name)
Matthias BUSSONNIER
pylint plus sphinx default to non-interactive.
r10875
Jonathan Frederic
Added ExporterNameError to exported names
r11395
Paul Ivanov
added listing of known exporters on error
r11250 def get_export_names():
Jonathan Frederic
Added warnings
r11755 """Return a list of the currently supported export targets
WARNING: API WILL CHANGE IN FUTURE RELEASES OF NBCONVERT"""
MinRK
generate `export_foo` methods...
r11863 return sorted(exporter_map.keys())