##// 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:

r17566:b8a2d02c
r18548:61431d7d
Show More
mathjax.py
238 lines | 7.0 KiB | text/x-python | PythonLexer
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 #!/usr/bin/python
MinRK
Add utility function for installing mathjax for offline use...
r4652 """Utility function for installing MathJax javascript library into
MinRK
s/nb_extensions/nbextensions
r12811 your IPython nbextensions directory, for offline use.
MinRK
Add utility function for installing mathjax for offline use...
r4652
Matthias BUSSONNIER
a few fixes...
r8507 Authors:
* Min RK
* Mark Sienkiewicz
* Matthias Bussonnier
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 To download and install MathJax:
From Python:
>>> from IPython.external.mathjax import install_mathjax
>>> install_mathjax()
From the command line:
$ python -m IPython.external.mathjax
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 To a specific location:
Kyle Kelley
Made profile the default install option, install_dir the explicit
r12292
MinRK
alternate interpretation of mathjax install dir...
r12812 $ python -m IPython.external.mathjax -i /usr/share/
will install mathjax to /usr/share/mathjax
Kyle Kelley
Made profile the default install option, install_dir the explicit
r12292
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 To install MathJax from a file you have already downloaded:
$ python -m IPython.external.mathjax mathjax-xxx.tar.gz
$ python -m IPython.external.mathjax mathjax-xxx.zip
It will not install MathJax if it is already there. Use -r to
replace the existing copy of MathJax.
To find the directory where IPython would like MathJax installed:
$ python -m IPython.external.mathjax -d
MinRK
Add utility function for installing mathjax for offline use...
r4652
"""
Thomas Kluyver
Convert print statements to print function calls...
r13348 from __future__ import print_function
MinRK
Add utility function for installing mathjax for offline use...
r4652
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682
MinRK
Add utility function for installing mathjax for offline use...
r4652 #-----------------------------------------------------------------------------
MinRK
alternate interpretation of mathjax install dir...
r12812 # Copyright (C) 2011 The IPython Development Team
MinRK
Add utility function for installing mathjax for offline use...
r4652 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
Add utility function for installing mathjax for offline use...
r4652 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Thomas Kluyver
Import argparse directly from stdlib
r12547 import argparse
MinRK
Add utility function for installing mathjax for offline use...
r4652 import os
import shutil
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 import sys
MinRK
Add utility function for installing mathjax for offline use...
r4652 import tarfile
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 import zipfile
MinRK
Add utility function for installing mathjax for offline use...
r4652
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 from IPython.utils.path import get_ipython_dir
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682
Sean Vig
Fix Python 3 handling of urllib...
r13640 try:
from urllib.request import urlopen # Py 3
except ImportError:
from urllib2 import urlopen
MinRK
Add utility function for installing mathjax for offline use...
r4652 #-----------------------------------------------------------------------------
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 #
MinRK
Add utility function for installing mathjax for offline use...
r4652 #-----------------------------------------------------------------------------
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 # Where mathjax will be installed
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
alternate interpretation of mathjax install dir...
r12812 nbextensions = os.path.join(get_ipython_dir(), 'nbextensions')
default_dest = os.path.join(nbextensions, 'mathjax')
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 # Test for access to install mathjax
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 def prepare_dest(dest, replace=False):
"""prepare the destination folder for mathjax install
Returns False if mathjax appears to already be installed and there is nothing to do,
True otherwise.
"""
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parent = os.path.abspath(os.path.join(dest, os.path.pardir))
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 if not os.path.exists(parent):
os.makedirs(parent)
MinRK
alternate interpretation of mathjax install dir...
r12812
MinRK
Add utility function for installing mathjax for offline use...
r4652 if os.path.exists(dest):
if replace:
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("removing existing MathJax at %s" % dest)
MinRK
Add utility function for installing mathjax for offline use...
r4652 shutil.rmtree(dest)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 return True
MinRK
Add utility function for installing mathjax for offline use...
r4652 else:
MinRK
alternate interpretation of mathjax install dir...
r12812 mathjax_js = os.path.join(dest, 'MathJax.js')
if not os.path.exists(mathjax_js):
raise IOError("%s exists, but does not contain MathJax.js" % dest)
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("%s already exists" % mathjax_js)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 return False
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 else:
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 return True
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 def extract_tar(fd, dest):
"""extract a tarball from filelike `fd` to destination `dest`"""
MinRK
Add utility function for installing mathjax for offline use...
r4652 # use 'r|gz' stream mode, because socket file-like objects can't seek:
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 tar = tarfile.open(fileobj=fd, mode='r|gz')
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 # The first entry in the archive is the top-level dir
MinRK
Add utility function for installing mathjax for offline use...
r4652 topdir = tar.firstmember.path
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 # extract the archive (contains a single directory) to the destination directory
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parent = os.path.abspath(os.path.join(dest, os.path.pardir))
tar.extractall(parent)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
Add utility function for installing mathjax for offline use...
r4652 # it will be mathjax-MathJax-<sha>, rename to just mathjax
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 os.rename(os.path.join(parent, topdir), dest)
MinRK
Add utility function for installing mathjax for offline use...
r4652
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 def extract_zip(fd, dest):
"""extract a zip file from filelike `fd` to destination `dest`"""
z = zipfile.ZipFile(fd, 'r')
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 # The first entry in the archive is the top-level dir
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 topdir = z.namelist()[0]
# extract the archive (contains a single directory) to the static/ directory
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parent = os.path.abspath(os.path.join(dest, os.path.pardir))
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 z.extractall(parent)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
# it will be mathjax-MathJax-<sha>, rename to just mathjax
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 d = os.path.join(parent, topdir)
os.rename(os.path.join(parent, topdir), dest)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
Björn Grüning
Upgrade default mathjax version....
r17566 def install_mathjax(tag='2.4.0', dest=default_dest, replace=False, file=None, extractor=extract_tar):
Matthias BUSSONNIER
a few fixes...
r8507 """Download and/or install MathJax for offline use.
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
s/nb_extensions/nbextensions
r12811 This will install mathjax to the nbextensions dir in your IPYTHONDIR.
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MathJax is a ~15MB download, and ~150MB installed.
Parameters
----------
replace : bool [False]
Whether to remove and replace an existing install.
MinRK
alternate interpretation of mathjax install dir...
r12812 dest : str [IPYTHONDIR/nbextensions/mathjax]
Where to install mathjax
Björn Grüning
Upgrade default mathjax version....
r17566 tag : str ['2.4.0']
Which tag to download. Default is '2.4.0', the current stable release,
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 but alternatives include 'v1.1a' and 'master'.
Matthias BUSSONNIER
a few fixes...
r8507 file : file like object [ defualt to content of https://github.com/mathjax/MathJax/tarball/#{tag}]
File handle from which to untar/unzip/... mathjax
extractor : function
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 Method to use to untar/unzip/... `file`
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 """
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 try:
anything_to_do = prepare_dest(dest, replace)
except OSError as e:
Thomas Kluyver
Clean up converted code....
r13386 print("ERROR %s, require write access to %s" % (e, dest))
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 return 1
else:
if not anything_to_do:
return 0
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 if file is None:
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 # download mathjax
ahmadia
fix mathjax download url to new GitHub format
r12875 mathjax_url = "https://github.com/mathjax/MathJax/archive/%s.tar.gz" %tag
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("Downloading mathjax source from %s" % mathjax_url)
Sean Vig
Fix Python 3 handling of urllib...
r13640 response = urlopen(mathjax_url)
Matthias BUSSONNIER
a few fixes...
r8507 file = response.fp
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("Extracting to %s" % dest)
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 extractor(file, dest)
return 0
def main():
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parser = argparse.ArgumentParser(
description="""Install mathjax from internet or local archive""",
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 )
Kyle Kelley
Add way to install MathJax to a particular profile
r12287
parser.add_argument(
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 '-i',
'--install-dir',
MinRK
alternate interpretation of mathjax install dir...
r12812 default=nbextensions,
help='custom installation directory. Mathjax will be installed in here/mathjax')
Kyle Kelley
Make profile not set a default
r12291
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parser.add_argument(
'-d',
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 '--print-dest',
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 action='store_true',
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 help='print where mathjax would be installed and exit')
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 parser.add_argument(
'-r',
'--replace',
action='store_true',
Kyle Kelley
Add way to install MathJax to a particular profile
r12287 help='Whether to replace current mathjax if it already exists')
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 parser.add_argument('filename',
help="the local tar/zip-ball filename containing mathjax",
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 nargs='?',
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 metavar='filename')
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682
pargs = parser.parse_args()
MinRK
alternate interpretation of mathjax install dir...
r12812 dest = os.path.join(pargs.install_dir, 'mathjax')
Kyle Kelley
Add way to install MathJax to a particular profile
r12287
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 if pargs.print_dest:
Thomas Kluyver
Convert print statements to print function calls...
r13348 print(dest)
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 return
# remove/replace existing mathjax?
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 replace = pargs.replace
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
Matthias BUSSONNIER
a few fixes...
r8507 # do it
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 if pargs.filename:
fname = pargs.filename
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
# automatically detect zip/tar - could do something based
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 # on file content, but really not cost-effective here.
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 if fname.endswith('.zip'):
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154 extractor = extract_zip
else :
extractor = extract_tar
# do it
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 return install_mathjax(file=open(fname, "rb"), replace=replace, extractor=extractor, dest=dest)
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 else:
MinRK
install offline mathjax to nb_extensions instead of profile
r12809 return install_mathjax(replace=replace, dest=dest)
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682
Mark Sienkiewicz at STScI
mods to install mathjax from an explicitly downloaded tar or zip file
r8154
if __name__ == '__main__' :
Matthias BUSSONNIER
use argparse to make most of the parameters configurable
r8682 sys.exit(main())
MinRK
Add utility function for installing mathjax for offline use...
r4652
Paul Ivanov
fix bug in mathjax...
r12401 __all__ = ['install_mathjax', 'main', 'default_dest']