##// END OF EJS Templates
cast writes to unicode before write
MinRK -
Show More
@@ -1,186 +1,182 b''
1 1 """The official API for working with notebooks in the current format version."""
2 2
3 3 # Copyright (c) IPython Development Team.
4 4 # Distributed under the terms of the Modified BSD License.
5 5
6 6 from __future__ import print_function
7 7
8 8 import re
9 9 import warnings
10 10
11 11 from IPython.nbformat.v3 import (
12 12 NotebookNode,
13 13 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
14 14 parse_filename, new_metadata, new_author, new_heading_cell, nbformat,
15 15 nbformat_minor, nbformat_schema, to_notebook_json,
16 16 )
17 17 from IPython.nbformat import v3 as _v_latest
18 18
19 19 from .reader import reads as reader_reads
20 20 from .reader import versions
21 21 from .convert import convert
22 22 from .validator import validate, ValidationError
23 23
24 24 from IPython.utils.log import get_logger
25 25
26 26 __all__ = ['NotebookNode', 'new_code_cell', 'new_text_cell', 'new_notebook',
27 27 'new_output', 'new_worksheet', 'parse_filename', 'new_metadata', 'new_author',
28 28 'new_heading_cell', 'nbformat', 'nbformat_minor', 'nbformat_schema',
29 29 'to_notebook_json', 'convert', 'validate', 'NBFormatError', 'parse_py',
30 30 'reads_json', 'writes_json', 'reads_py', 'writes_py', 'reads', 'writes', 'read',
31 31 'write']
32 32
33 33 current_nbformat = nbformat
34 34 current_nbformat_minor = nbformat_minor
35 35 current_nbformat_module = _v_latest.__name__
36 36
37 37
38 38 class NBFormatError(ValueError):
39 39 pass
40 40
41 41
42 42 def _warn_format():
43 43 warnings.warn("""Non-JSON file support in nbformat is deprecated.
44 44 Use nbconvert to create files of other formats.""")
45 45
46 46
47 47 def parse_py(s, **kwargs):
48 48 """Parse a string into a (nbformat, string) tuple."""
49 49 nbf = current_nbformat
50 50 nbm = current_nbformat_minor
51 51
52 52 pattern = r'# <nbformat>(?P<nbformat>\d+[\.\d+]*)</nbformat>'
53 53 m = re.search(pattern,s)
54 54 if m is not None:
55 55 digits = m.group('nbformat').split('.')
56 56 nbf = int(digits[0])
57 57 if len(digits) > 1:
58 58 nbm = int(digits[1])
59 59
60 60 return nbf, nbm, s
61 61
62 62
63 63 def reads_json(nbjson, **kwargs):
64 64 """DEPRECATED, use reads"""
65 65 warnings.warn("reads_json is deprecated, use reads")
66 66 return reads(nbjson)
67 67
68 68 def writes_json(nb, **kwargs):
69 69 """DEPRECATED, use writes"""
70 70 warnings.warn("writes_json is deprecated, use writes")
71 71 return writes(nb, **kwargs)
72 72
73 73 def reads_py(s, **kwargs):
74 74 """DEPRECATED: use nbconvert"""
75 75 _warn_format()
76 76 nbf, nbm, s = parse_py(s, **kwargs)
77 77 if nbf in (2, 3):
78 78 nb = versions[nbf].to_notebook_py(s, **kwargs)
79 79 else:
80 80 raise NBFormatError('Unsupported PY nbformat version: %i' % nbf)
81 81 return nb
82 82
83 83 def writes_py(nb, **kwargs):
84 84 """DEPRECATED: use nbconvert"""
85 85 _warn_format()
86 86 return versions[3].writes_py(nb, **kwargs)
87 87
88 88
89 89 # High level API
90 90
91 91
92 92 def reads(s, format='DEPRECATED', version=current_nbformat, **kwargs):
93 93 """Read a notebook from a string and return the NotebookNode object.
94 94
95 95 This function properly handles notebooks of any version. The notebook
96 96 returned will always be in the current version's format.
97 97
98 98 Parameters
99 99 ----------
100 100 s : unicode
101 101 The raw unicode string to read the notebook from.
102 102
103 103 Returns
104 104 -------
105 105 nb : NotebookNode
106 106 The notebook that was read.
107 107 """
108 108 if format not in {'DEPRECATED', 'json'}:
109 109 _warn_format()
110 110 nb = reader_reads(s, **kwargs)
111 111 nb = convert(nb, version)
112 112 try:
113 113 validate(nb)
114 114 except ValidationError as e:
115 115 get_logger().error("Notebook JSON is invalid: %s", e)
116 116 return nb
117 117
118 118
119 119 def writes(nb, format='DEPRECATED', version=current_nbformat, **kwargs):
120 120 """Write a notebook to a string in a given format in the current nbformat version.
121 121
122 122 This function always writes the notebook in the current nbformat version.
123 123
124 124 Parameters
125 125 ----------
126 126 nb : NotebookNode
127 127 The notebook to write.
128 128 version : int
129 129 The nbformat version to write.
130 130 Used for downgrading notebooks.
131 131
132 132 Returns
133 133 -------
134 134 s : unicode
135 135 The notebook string.
136 136 """
137 137 if format not in {'DEPRECATED', 'json'}:
138 138 _warn_format()
139 139 nb = convert(nb, version)
140 140 try:
141 141 validate(nb)
142 142 except ValidationError as e:
143 143 get_logger().error("Notebook JSON is invalid: %s", e)
144 144 return versions[version].writes_json(nb, **kwargs)
145 145
146 146
147 147 def read(fp, format='DEPRECATED', **kwargs):
148 148 """Read a notebook from a file and return the NotebookNode object.
149 149
150 150 This function properly handles notebooks of any version. The notebook
151 151 returned will always be in the current version's format.
152 152
153 153 Parameters
154 154 ----------
155 155 fp : file
156 156 Any file-like object with a read method.
157 157
158 158 Returns
159 159 -------
160 160 nb : NotebookNode
161 161 The notebook that was read.
162 162 """
163 163 return reads(fp.read(), **kwargs)
164 164
165 165
166 166 def write(nb, fp, format='DEPRECATED', **kwargs):
167 167 """Write a notebook to a file in a given format in the current nbformat version.
168 168
169 169 This function always writes the notebook in the current nbformat version.
170 170
171 171 Parameters
172 172 ----------
173 173 nb : NotebookNode
174 174 The notebook to write.
175 175 fp : file
176 176 Any file-like object with a write method.
177 format : (u'json', u'ipynb', u'py')
178 The format to write the notebook in.
179
180 Returns
181 -------
182 s : unicode
183 The notebook string.
184 177 """
185 return fp.write(writes(nb, **kwargs))
178 s = writes(nb, **kwargs)
179 if isinstance(s, bytes):
180 s = s.decode('utf8')
181 return fp.write(s)
186 182
General Comments 0
You need to be logged in to leave comments. Login now