##// END OF EJS Templates
updating to make interface more intuitive now that we're not using os.path.walk
Greg Caporaso -
Show More
@@ -1,267 +1,268 b''
1 1 """Various display related classes.
2 2
3 3 Authors : MinRK, gregcaporaso, dannystaple
4 4 """
5 5 import urllib
6 6
7 7 from os.path import exists, isfile, splitext, abspath, join, isdir
8 8 from os import walk
9 9
10 10
11 11 class YouTubeVideo(object):
12 12 """Class for embedding a YouTube Video in an IPython session, based on its video id.
13 13
14 14 e.g. to embed the video on this page:
15 15
16 16 http://www.youtube.com/watch?v=foo
17 17
18 18 you would do:
19 19
20 20 vid = YouTubeVideo("foo")
21 21 display(vid)
22 22
23 23 To start from 30 seconds:
24 24
25 25 vid = YouTubeVideo("abc", start=30)
26 26 display(vid)
27 27
28 28 To calculate seconds from time as hours, minutes, seconds use:
29 29 start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds())
30 30
31 31 Other parameters can be provided as documented at
32 32 https://developers.google.com/youtube/player_parameters#parameter-subheader
33 33 """
34 34
35 35 def __init__(self, id, width=400, height=300, **kwargs):
36 36 self.id = id
37 37 self.width = width
38 38 self.height = height
39 39 self.params = kwargs
40 40
41 41 def _repr_html_(self):
42 42 """return YouTube embed iframe for this video id"""
43 43 if self.params:
44 44 params = "?" + urllib.urlencode(self.params)
45 45 else:
46 46 params = ""
47 47 return """
48 48 <iframe
49 49 width="%i"
50 50 height="%i"
51 51 src="http://www.youtube.com/embed/%s%s"
52 52 frameborder="0"
53 53 allowfullscreen
54 54 ></iframe>
55 55 """ % (self.width, self.height, self.id, params)
56 56
57 57 class FileLink(object):
58 58 """Class for embedding a local file link in an IPython session, based on path
59 59
60 60 e.g. to embed a link that was generated in the IPython notebook as my/data.txt
61 61
62 62 you would do:
63 63
64 64 local_file = FileLink("my/data.txt")
65 65 display(local_file)
66 66
67 67 or in the HTML notebook, just
68 68
69 69 FileLink("my/data.txt")
70 70 """
71 71
72 72 html_link_str = "<a href='%s' target='_blank'>%s</a>"
73 73
74 74 def __init__(self,
75 75 path,
76 76 url_prefix='files/',
77 77 result_html_prefix='',
78 78 result_html_suffix='<br>'):
79 79 """
80 80 path : path to the file or directory that should be formatted
81 81 directory_prefix : prefix to be prepended to all files to form a
82 82 working link [default: 'files']
83 83 result_html_prefix : text to append to beginning to link
84 84 [default: none]
85 85 result_html_suffix : text to append at the end of link
86 86 [default: '<br>']
87 87 """
88 88 self.path = path
89 89 self.url_prefix = url_prefix
90 90 self.result_html_prefix = result_html_prefix
91 91 self.result_html_suffix = result_html_suffix
92 92
93 93 def _format_path(self):
94 94 fp = ''.join([self.url_prefix,self.path])
95 95 return ''.join([self.result_html_prefix,
96 96 self.html_link_str % (fp, self.path),
97 97 self.result_html_suffix])
98 98
99 99 def _repr_html_(self):
100 100 """return html link to file
101 101 """
102 102 if not exists(self.path):
103 103 return ("Path (<tt>%s</tt>) doesn't exist. "
104 104 "It may still be in the process of "
105 105 "being generated, or you may have the "
106 106 "incorrect path." % self.path)
107 107
108 108 return self._format_path()
109 109
110 110 def __repr__(self):
111 111 """return absolute path to file
112 112 """
113 113 return abspath(self.path)
114 114
115 115 # Create an alias for formatting a single directory name as a link.
116 116 # Right now this is the same as a formatting for a single file, but
117 117 # we'll encourage users to reference these with a different class in
118 118 # case we want to change this in the future.
119 119 DirectoryLink = FileLink
120 120
121 121 class FileLinks(FileLink):
122 122 """Class for embedding local file links in an IPython session, based on path
123 123
124 124 e.g. to embed links to files that were generated in the IPython notebook under my/data
125 125
126 126 you would do:
127 127
128 128 local_files = FileLinks("my/data")
129 129 display(local_files)
130 130
131 131 or in the HTML notebook, just
132 132
133 133 FileLinks("my/data")
134 134
135 135 """
136 136 def __init__(self,
137 137 path,
138 138 url_prefix='files/',
139 139 included_suffixes=None,
140 140 result_html_prefix='',
141 141 result_html_suffix='<br>',
142 142 notebook_display_formatter=None,
143 143 terminal_display_formatter=None):
144 144 """
145 145 included_suffixes : list of filename suffixes to include when
146 146 formatting output [default: include all files]
147 147
148 148 See the FileLink (baseclass of LocalDirectory) docstring for
149 149 information on additional parameters.
150 150
151 151 notebook_display_formatter : func passed to os.path.walk when
152 152 formatting links for display in the notebook
153 153
154 154 terminal_display_formatter : func passed to os.path.walk when
155 155 formatting links for display in the terminal
156 156
157 157 """
158 158 self.included_suffixes = included_suffixes
159 159 # remove trailing slashs for more consistent output formatting
160 160 path = path.rstrip('/')
161 161 FileLink.__init__(self,
162 162 path,
163 163 url_prefix,
164 164 result_html_prefix,
165 165 result_html_suffix)
166 166
167 167 self.notebook_display_formatter = \
168 168 notebook_display_formatter or self._get_notebook_display_formatter()
169 169 self.terminal_display_formatter = \
170 170 terminal_display_formatter or self._get_terminal_display_formatter()
171 171
172 172 def _get_display_formatter(self,
173 173 dirname_output_format,
174 174 fname_output_format,
175 175 fp_format):
176 """ generate func to pass to os.path.walk
176 """ generate function to format output- the resulting function will
177 take a list to be populated with the output lines to print,
177 178
178 179 dirname_output_format: string to use for formatting directory
179 180 names, dirname will be substituted for a single "%s" which
180 181 must appear in this string
181 182 fname_output_format: string to use for formatting file names,
182 183 if a single "%s" appears in the string, fname will be substituted
183 184 if two "%s" appear in the string, the path to fname will be
184 185 substituted for the first and fname will be substituted for the
185 186 second
186 187 fp_format: string to use for formatting filepaths, must contain
187 188 exactly two "%s" and the dirname will be subsituted for the first
188 189 and fname will be substituted for the second
189 190 """
190 191
191 192 included_suffixes = self.included_suffixes
192 193
193 def f(output_lines, dirname, fnames):
194 """ func to be passed to os.path.walk """
194 def f(dirname, fnames):
195 result = []
195 196 # begin by figuring out which filenames, if any,
196 197 # are going to be displayed
197 198 display_fnames = []
198 199 for fname in fnames:
199 200 if (isfile(join(dirname,fname)) and
200 201 (included_suffixes == None or
201 202 splitext(fname)[1] in included_suffixes)):
202 203 display_fnames.append(fname)
203 204
204 205 if len(display_fnames) == 0:
205 206 # if there are no filenames to display, don't print anything
206 207 # (not even the directory name)
207 208 pass
208 209 else:
209 210 # otherwise print the formatted directory name followed by
210 211 # the formatted filenames
211 212 dirname_output_line = dirname_output_format % dirname
212 output_lines.append(dirname_output_line)
213 result.append(dirname_output_line)
213 214 for fname in display_fnames:
214 215 fp = fp_format % (dirname,fname)
215 216 try:
216 217 # output can include both a filepath and a filename...
217 218 fname_output_line = fname_output_format % (fp, fname)
218 219 except TypeError:
219 220 # ... or just a single filepath
220 221 fname_output_line = fname_output_format % fname
221 output_lines.append(fname_output_line)
222 return
222 result.append(fname_output_line)
223 return result
223 224 return f
224 225
225 226 def _get_notebook_display_formatter(self,
226 227 spacer="&nbsp;&nbsp;"):
227 228 """ generate func to pass to os.path.walk for notebook formatting
228 229 """
229 230 dirname_output_format = \
230 231 self.result_html_prefix + "%s/" + self.result_html_suffix
231 232 fname_output_format = \
232 233 self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix
233 234 fp_format = self.url_prefix + '%s/%s'
234 235
235 236 return self._get_display_formatter(dirname_output_format,
236 237 fname_output_format,
237 238 fp_format)
238 239
239 240 def _get_terminal_display_formatter(self,
240 241 spacer=" "):
241 242 """ generate func to pass to os.path.walk for terminal formatting
242 243 """
243 244 dirname_output_format = "%s/"
244 245 fname_output_format = spacer + "%s"
245 246 fp_format = '%s/%s'
246 247
247 248 return self._get_display_formatter(dirname_output_format,
248 249 fname_output_format,
249 250 fp_format)
250 251
251 252 def _format_path(self):
252 253 result_lines = []
253 254 walked_dir = list(walk(self.path))
254 255 walked_dir.sort()
255 256 for dirname, subdirs, fnames in walked_dir:
256 self.notebook_display_formatter(result_lines,dirname, fnames)
257 result_lines += self.notebook_display_formatter(dirname, fnames)
257 258 return '\n'.join(result_lines)
258 259
259 260 def __repr__(self):
260 261 """return newline-separated absolute paths
261 262 """
262 263 result_lines = []
263 264 walked_dir = list(walk(self.path))
264 265 walked_dir.sort()
265 266 for dirname, subdirs, fnames in walked_dir:
266 self.terminal_display_formatter(result_lines, dirname, fnames)
267 result_lines += self.terminal_display_formatter(dirname, fnames)
267 268 return '\n'.join(result_lines)
@@ -1,156 +1,154 b''
1 1 """Tests for IPython.lib.display.
2 2
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (c) 2012, the IPython Development Team.
6 6 #
7 7 # Distributed under the terms of the Modified BSD License.
8 8 #
9 9 # The full license is in the file COPYING.txt, distributed with this software.
10 10 #-----------------------------------------------------------------------------
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Imports
14 14 #-----------------------------------------------------------------------------
15 15 from __future__ import print_function
16 16 from tempfile import NamedTemporaryFile, mkdtemp
17 17 from os.path import split
18 18
19 19 # Third-party imports
20 20 import nose.tools as nt
21 21
22 22 # Our own imports
23 23 from IPython.lib import display
24 24
25 25 #-----------------------------------------------------------------------------
26 26 # Classes and functions
27 27 #-----------------------------------------------------------------------------
28 28
29 29 #--------------------------
30 30 # FileLink tests
31 31 #--------------------------
32 32
33 33 def test_instantiation_FileLink():
34 34 """Test classes can be instantiated"""
35 35 fl = display.FileLink('example.txt')
36 36
37 37 def test_warning_on_non_existant_path_FileLink():
38 38 """Calling _repr_html_ on non-existant files returns a warning"""
39 39 fl = display.FileLink('example.txt')
40 40 nt.assert_true(fl._repr_html_().startswith('Path (<tt>example.txt</tt>)'))
41 41
42 42 def test_existing_path_FileLink():
43 43 """ Calling _repr_html_ functions as expected on existing filepath """
44 44 tf = NamedTemporaryFile()
45 45 fl = display.FileLink(tf.name)
46 46 actual = fl._repr_html_()
47 47 expected = "<a href='files/%s' target='_blank'>%s</a><br>" % (tf.name,tf.name)
48 48 nt.assert_equal(actual,expected)
49 49
50 50 def test_existing_path_FileLink_repr():
51 51 """ Calling repr() functions as expected on existing filepath """
52 52 tf = NamedTemporaryFile()
53 53 fl = display.FileLink(tf.name)
54 54 actual = repr(fl)
55 55 expected = tf.name
56 56 nt.assert_equal(actual,expected)
57 57
58 58 #--------------------------
59 59 # FileLinks tests
60 60 #--------------------------
61 61
62 62 def test_instantiation_FileLinks():
63 63 """Test classes can be instantiated"""
64 64 fls = display.FileLinks('example')
65 65
66 66 def test_warning_on_non_existant_path_FileLinks():
67 67 """Calling _repr_html_ on non-existant files returns a warning"""
68 68 fls = display.FileLinks('example')
69 69 nt.assert_true(fls._repr_html_().startswith('Path (<tt>example</tt>)'))
70 70
71 71 def test_existing_path_FileLinks():
72 72 """ Calling _repr_html_ functions as expected on existing directory """
73 73 td = mkdtemp()
74 74 tf1 = NamedTemporaryFile(dir=td)
75 75 tf2 = NamedTemporaryFile(dir=td)
76 76 fl = display.FileLinks(td)
77 77 actual = fl._repr_html_()
78 78 actual = actual.split('\n')
79 79 actual.sort()
80 80 expected = ["%s/<br>" % td,
81 81 "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" % (tf2.name,split(tf2.name)[1]),
82 82 "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" % (tf1.name,split(tf1.name)[1])]
83 83 expected.sort()
84 84 # We compare the sorted list of links here as that's more reliable
85 85 nt.assert_equal(actual,expected)
86 86
87 87 def test_existing_path_FileLinks_alt_formatter():
88 88 """ Calling _repr_html_ functions as expected with an alternative formatter
89 89 """
90 90 td = mkdtemp()
91 91 tf1 = NamedTemporaryFile(dir=td)
92 92 tf2 = NamedTemporaryFile(dir=td)
93 def fake_formatter(output_lines,dirname,fnames):
94 output_lines.extend(["hello","world"])
95 return
93 def fake_formatter(dirname,fnames):
94 return ["hello","world"]
96 95 fl = display.FileLinks(td,notebook_display_formatter=fake_formatter)
97 96 actual = fl._repr_html_()
98 97 actual = actual.split('\n')
99 98 actual.sort()
100 99 expected = ["hello","world"]
101 100 expected.sort()
102 101 # We compare the sorted list of links here as that's more reliable
103 102 nt.assert_equal(actual,expected)
104 103
105 104 def test_existing_path_FileLinks_repr():
106 105 """ Calling repr() functions as expected on existing directory """
107 106 td = mkdtemp()
108 107 tf1 = NamedTemporaryFile(dir=td)
109 108 tf2 = NamedTemporaryFile(dir=td)
110 109 fl = display.FileLinks(td)
111 110 actual = repr(fl)
112 111 actual = actual.split('\n')
113 112 actual.sort()
114 113 expected = ['%s/' % td, ' %s' % split(tf1.name)[1],' %s' % split(tf2.name)[1]]
115 114 expected.sort()
116 115 # We compare the sorted list of links here as that's more reliable
117 116 nt.assert_equal(actual,expected)
118 117
119 118 def test_existing_path_FileLinks_repr_alt_formatter():
120 119 """ Calling repr() functions as expected with an alternative formatter
121 120 """
122 121 td = mkdtemp()
123 122 tf1 = NamedTemporaryFile(dir=td)
124 123 tf2 = NamedTemporaryFile(dir=td)
125 def fake_formatter(output_lines,dirname,fnames):
126 output_lines.extend(["hello","world"])
127 return
124 def fake_formatter(dirname,fnames):
125 return ["hello","world"]
128 126 fl = display.FileLinks(td,terminal_display_formatter=fake_formatter)
129 127 actual = repr(fl)
130 128 actual = actual.split('\n')
131 129 actual.sort()
132 130 expected = ["hello","world"]
133 131 expected.sort()
134 132 # We compare the sorted list of links here as that's more reliable
135 133 nt.assert_equal(actual,expected)
136 134
137 135 #--------------------------
138 136 # DirectoryLink tests
139 137 #--------------------------
140 138
141 139 def test_instantiation_DirectoryLink():
142 140 """Test classes can be instantiated"""
143 141 dl = display.DirectoryLink('example')
144 142
145 143 def test_warning_on_non_existant_path_DirectoryLink():
146 144 """Calling _repr_html_ on non-existant files returns a warning"""
147 145 dl = display.DirectoryLink('example')
148 146 nt.assert_true(dl._repr_html_().startswith('Path (<tt>example</tt>)'))
149 147
150 148 def test_existing_path_DirectoryLink():
151 149 """ Calling _repr_html_ functions as expected on existing directory """
152 150 td = mkdtemp()
153 151 dl = display.DirectoryLink(td)
154 152 actual = dl._repr_html_()
155 153 expected = "<a href='files/%s' target='_blank'>%s</a><br>" % (td,td)
156 154 nt.assert_equal(actual,expected)
General Comments 0
You need to be logged in to leave comments. Login now