files.py
114 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
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
|
r11649 | from IPython.utils.path import link_or_copy | |
Jonathan Frederic
|
r11369 | ||
from .base import WriterBase | |||
#----------------------------------------------------------------------------- | |||
# Classes | |||
#----------------------------------------------------------------------------- | |||
class FilesWriter(WriterBase): | |||
"""Consumes nbconvert output and produces files.""" | |||
Paul Ivanov
|
r11982 | build_directory = Unicode("", config=True, | |
Jonathan Frederic
|
r11369 | help="""Directory to write output to. Leave blank | |
to output to the current directory""") | |||
Jonathan Frederic
|
r11632 | # Make sure that the output directory exists. | |
Jonathan Frederic
|
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
|
r11842 | ||
def _makedir(self, path): | |||
"""Make a directory if it doesn't already exist""" | |||
Jonathan Frederic
|
r12004 | if path and not os.path.isdir(path): | |
MinRK
|
r11842 | self.log.info("Making directory %s", path) | |
os.makedirs(path) | |||
Jonathan Frederic
|
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
|
r12005 | # Verify that a notebook name is provided. | |
if notebook_name is None: | |||
Jonathan Frederic
|
r12013 | raise TypeError('notebook_name') | |
Jonathan Frederic
|
r12005 | ||
Jonathan Frederic
|
r11632 | # Pull the extension and subdir from the resources dict. | |
Jonathan Frederic
|
r12006 | output_extension = resources.get('output_extension', None) | |
Jonathan Frederic
|
r11369 | ||
Jonathan Frederic
|
r11632 | # Write all of the extracted resources to the destination directory. | |
# NOTE: WE WRITE EVERYTHING AS-IF IT'S BINARY. THE EXTRACT FIG | |||
# TRANSFORMER SHOULD HANDLE UNIX/WINDOWS LINE ENDINGS... | |||
Jonathan Frederic
|
r11635 | for filename, data in resources.get('outputs', {}).items(): | |
Jonathan Frederic
|
r11369 | ||
Jonathan Frederic
|
r11632 | # Determine where to write the file to | |
Jonathan Frederic
|
r11369 | dest = os.path.join(self.build_directory, filename) | |
Jonathan Frederic
|
r11629 | path = os.path.dirname(dest) | |
MinRK
|
r11842 | self._makedir(path) | |
Jonathan Frederic
|
r11369 | ||
Jonathan Frederic
|
r11632 | # Write file | |
MinRK
|
r11847 | self.log.debug("Writing %i bytes to support file %s", len(data), dest) | |
Jonathan Frederic
|
r11369 | with io.open(dest, 'wb') as f: | |
f.write(data) | |||
Jonathan Frederic
|
r11632 | # Copy referenced files to output directory | |
Jonathan Frederic
|
r11369 | if self.build_directory: | |
for filename in self.files: | |||
Jonathan Frederic
|
r11632 | # Copy files that match search pattern | |
Jonathan Frederic
|
r11369 | for matching_filename in glob.glob(filename): | |
Jonathan Frederic
|
r11632 | # Make sure folder exists. | |
Jonathan Frederic
|
r11369 | dest = os.path.join(self.build_directory, filename) | |
path = os.path.dirname(dest) | |||
MinRK
|
r11842 | self._makedir(path) | |
Jonathan Frederic
|
r11369 | ||
Jonathan Frederic
|
r11632 | # Copy if destination is different. | |
Jonathan Frederic
|
r11630 | if not os.path.normpath(dest) == os.path.normpath(matching_filename): | |
MinRK
|
r11842 | self.log.info("Linking %s -> %s", matching_filename, dest) | |
David Wolever
|
r11649 | link_or_copy(matching_filename, dest) | |
Jonathan Frederic
|
r11369 | ||
Jonathan Frederic
|
r11632 | # Determine where to write conversion results. | |
Jonathan Frederic
|
r12006 | if output_extension is not None: | |
dest = notebook_name + '.' + output_extension | |||
else: | |||
dest = notebook_name | |||
Jonathan Frederic
|
r11369 | if self.build_directory: | |
dest = os.path.join(self.build_directory, dest) | |||
Jonathan Frederic
|
r11632 | # Write conversion results. | |
MinRK
|
r11853 | self.log.info("Writing %i bytes to %s", len(output), dest) | |
MinRK
|
r11950 | with io.open(dest, 'w', encoding='utf-8') as f: | |
f.write(output) | |||
damianavila
|
r11800 | return dest |