##// END OF EJS Templates
Merge pull request #4563 from takluyver/i4562...
Merge pull request #4563 from takluyver/i4562 Specify encoding for reading notebook file. and a few other calls to io.open with missing encoding

File last commit:

r12219:60e06808
r13662:6e2b5efc merge
Show More
files.py
115 lines | 4.4 KiB | text/x-python | PythonLexer
Jonathan Frederic
Added writer classes
r11369 """
Contains writer for writing nbconvert output to filesystem.
"""
#-----------------------------------------------------------------------------
#Copyright (c) 2013, the IPython Development Team.
#
#Distributed under the terms of the Modified BSD License.
#
#The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import io
import os
import glob
from IPython.utils.traitlets import Unicode
David Wolever
Use link(2) when possible in nbconvert
r11649 from IPython.utils.path import link_or_copy
Jonathan Frederic
Added writer classes
r11369
from .base import WriterBase
#-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
class FilesWriter(WriterBase):
"""Consumes nbconvert output and produces files."""
Paul Ivanov
don't force . relative path, fix #3897...
r11982 build_directory = Unicode("", config=True,
Jonathan Frederic
Added writer classes
r11369 help="""Directory to write output to. Leave blank
to output to the current directory""")
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Make sure that the output directory exists.
Jonathan Frederic
Added writer classes
r11369 def _build_directory_changed(self, name, old, new):
if new and not os.path.isdir(new):
os.makedirs(new)
def __init__(self, **kw):
super(FilesWriter, self).__init__(**kw)
self._build_directory_changed('build_directory', self.build_directory,
self.build_directory)
MinRK
add basic logging to NbConvert stages
r11842
def _makedir(self, path):
"""Make a directory if it doesn't already exist"""
Jonathan Frederic
Fix, don't try to create '' directories
r12004 if path and not os.path.isdir(path):
MinRK
add basic logging to NbConvert stages
r11842 self.log.info("Making directory %s", path)
os.makedirs(path)
Jonathan Frederic
Added writer classes
r11369
def write(self, output, resources, notebook_name=None, **kw):
"""
Consume and write Jinja output to the file system. Output directory
is set via the 'build_directory' variable of this instance (a
configurable).
See base for more...
"""
Jonathan Frederic
Make sure that a notebook_name is provided if writing to the filesystem
r12005 # Verify that a notebook name is provided.
if notebook_name is None:
Jonathan Frederic
s/AttributeError/TypeError
r12013 raise TypeError('notebook_name')
Jonathan Frederic
Make sure that a notebook_name is provided if writing to the filesystem
r12005
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Pull the extension and subdir from the resources dict.
Jonathan Frederic
Allow for files output without an extension
r12006 output_extension = resources.get('output_extension', None)
Jonathan Frederic
Added writer classes
r11369
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Write all of the extracted resources to the destination directory.
# NOTE: WE WRITE EVERYTHING AS-IF IT'S BINARY. THE EXTRACT FIG
Paul Ivanov
replace 'transformer' with 'preprocessor'
r12219 # PREPROCESSOR SHOULD HANDLE UNIX/WINDOWS LINE ENDINGS...
Jonathan Frederic
FilesWriter now reads key instead of
r11635 for filename, data in resources.get('outputs', {}).items():
Jonathan Frederic
Added writer classes
r11369
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Determine where to write the file to
Jonathan Frederic
Added writer classes
r11369 dest = os.path.join(self.build_directory, filename)
Jonathan Frederic
Make sure the path exists that the figures are to be written to.
r11629 path = os.path.dirname(dest)
MinRK
add basic logging to NbConvert stages
r11842 self._makedir(path)
Jonathan Frederic
Added writer classes
r11369
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Write file
MinRK
tweak support-file output...
r11847 self.log.debug("Writing %i bytes to support file %s", len(data), dest)
Jonathan Frederic
Added writer classes
r11369 with io.open(dest, 'wb') as f:
f.write(data)
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Copy referenced files to output directory
Jonathan Frederic
Added writer classes
r11369 if self.build_directory:
for filename in self.files:
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Copy files that match search pattern
Jonathan Frederic
Added writer classes
r11369 for matching_filename in glob.glob(filename):
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Make sure folder exists.
Jonathan Frederic
Added writer classes
r11369 dest = os.path.join(self.build_directory, filename)
path = os.path.dirname(dest)
MinRK
add basic logging to NbConvert stages
r11842 self._makedir(path)
Jonathan Frederic
Added writer classes
r11369
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Copy if destination is different.
Jonathan Frederic
Don't move the file if it doesn't need to be moved.
r11630 if not os.path.normpath(dest) == os.path.normpath(matching_filename):
MinRK
add basic logging to NbConvert stages
r11842 self.log.info("Linking %s -> %s", matching_filename, dest)
David Wolever
Use link(2) when possible in nbconvert
r11649 link_or_copy(matching_filename, dest)
Jonathan Frederic
Added writer classes
r11369
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Determine where to write conversion results.
Jonathan Frederic
Allow for files output without an extension
r12006 if output_extension is not None:
dest = notebook_name + '.' + output_extension
else:
dest = notebook_name
Jonathan Frederic
Added writer classes
r11369 if self.build_directory:
dest = os.path.join(self.build_directory, dest)
Jonathan Frederic
Added a space between pound and comments (@minrk request)
r11632 # Write conversion results.
MinRK
remove wrong support file log message
r11853 self.log.info("Writing %i bytes to %s", len(output), dest)
MinRK
specify encoding in io.open call
r11950 with io.open(dest, 'w', encoding='utf-8') as f:
f.write(output)
Paul Ivanov
replace 'transformer' with 'preprocessor'
r12219 return dest