##// END OF EJS Templates
modified to join urls with '/'.join instead of os.path.join. @takluyver pointed out that while os.path.join does work for this on OS X and Linux, it's not meant for constructing URLs, so fails on Windows where paths are constructed using \ rather than /.
Greg Caporaso -
Show More
@@ -1,146 +1,146
1 1 """Various display related classes.
2 2
3 3 Authors : MinRK, gregcaporaso
4 4 """
5 5
6 6 from os import walk
7 from os.path import join, exists, isfile, splitext
7 from os.path import exists, isfile, splitext
8 8
9 9
10 10 class YouTubeVideo(object):
11 11 """Class for embedding a YouTube Video in an IPython session, based on its video id.
12 12
13 13 e.g. to embed the video on this page:
14 14
15 15 http://www.youtube.com/watch?v=foo
16 16
17 17 you would do:
18 18
19 19 vid = YouTubeVideo("foo")
20 20 display(vid)
21 21 """
22 22
23 23 def __init__(self, id, width=400, height=300):
24 24 self.id = id
25 25 self.width = width
26 26 self.height = height
27 27
28 28 def _repr_html_(self):
29 29 """return YouTube embed iframe for this video id"""
30 30 return """
31 31 <iframe
32 32 width="%i"
33 33 height="%i"
34 34 src="http://www.youtube.com/embed/%s"
35 35 frameborder="0"
36 36 allowfullscreen
37 37 ></iframe>
38 38 """%(self.width, self.height, self.id)
39 39
40 40 class FileLink(object):
41 41 """Class for embedding a local file link in an IPython session, based on path
42 42
43 43 e.g. to embed a link that was generated in the IPython notebook as my/data.txt
44 44
45 45 you would do:
46 46
47 47 local_file = FileLink("my/data.txt")
48 48 display(local_file)
49 49
50 50 or in the HTML notebook, just
51 51
52 52 FileLink("my/data.txt")
53 53 """
54 54
55 55 link_str = "<a href='%s' target='_blank'>%s</a>"
56 56
57 57 def __init__(self,
58 58 path,
59 59 url_prefix='files',
60 60 result_html_prefix='',
61 61 result_html_suffix='<br>'):
62 62 """
63 63 path : path to the file or directory that should be formatted
64 64 directory_prefix : prefix to be prepended to all files to form a
65 65 working link [default: 'files']
66 66 result_html_prefix : text to append to beginning to link
67 67 [default: none]
68 68 result_html_suffix : text to append at the end of link
69 69 [default: '<br>']
70 70 """
71 71 self.path = path
72 72 self.url_prefix = url_prefix
73 73 self.result_html_prefix = result_html_prefix
74 74 self.result_html_suffix = result_html_suffix
75 75
76 76 def _format_path(self):
77 fp = join(self.url_prefix,self.path)
77 fp = '/'.join([self.url_prefix,self.path])
78 78 return ''.join([self.result_html_prefix,
79 79 self.link_str % (fp, self.path),
80 80 self.result_html_suffix])
81 81
82 82 def _repr_html_(self):
83 83 """return link to local file
84 84 """
85 85 if not exists(self.path):
86 86 return ("Path (<tt>%s</tt>) doesn't exist. "
87 87 "It may still be in the process of "
88 88 "being generated, or you may have the "
89 89 "incorrect path." % self.path)
90 90
91 91 return self._format_path()
92 92
93 93 # Create an alias for formatting a single directory name as a link.
94 94 # Right now this is the same as a formatting for a single file, but
95 95 # we'll encorage users to reference these with a different class in
96 96 # case we want to change this in the future.
97 97 DirectoryLink = FileLink
98 98
99 99 class FileLinks(FileLink):
100 100 """Class for embedding local file links in an IPython session, based on path
101 101
102 102 e.g. to embed links to files that were generated in the IPython notebook under my/data
103 103
104 104 you would do:
105 105
106 106 local_files = FileLinks("my/data")
107 107 display(local_files)
108 108
109 109 or in the HTML notebook, just
110 110
111 111 FileLinks("my/data")
112 112
113 113 """
114 114 def __init__(self,
115 115 path,
116 116 url_prefix='files',
117 117 included_suffixes=None,
118 118 result_html_prefix='',
119 119 result_html_suffix='<br>'):
120 120 """
121 121 included_suffixes : list of filename suffixes to include when
122 122 formatting output [default: include all files]
123 123
124 124 See the FileLink (baseclass of LocalDirectory) docstring for
125 125 information on additional parameters.
126 126 """
127 127 self.included_suffixes = included_suffixes
128 128 FileLink.__init__(self,
129 129 path,
130 130 url_prefix,
131 131 result_html_prefix,
132 132 result_html_suffix)
133 133
134 134 def _format_path(self):
135 135 result_entries = []
136 136 for root, dirs, files in walk(self.path):
137 137 for fn in files:
138 138 fp = join(self.url_prefix,root,fn)
139 139 # if all files are being included, or fp has a suffix
140 140 # that is in included_suffix, create a link to fp
141 141 if self.included_suffixes == None or \
142 142 splitext(fn)[1] in self.included_suffixes:
143 143 result_entries.append(''.join([self.result_html_prefix,
144 144 self.link_str % (fp,fn),
145 145 self.result_html_suffix]))
146 146 return '\n'.join(result_entries)
@@ -1,112 +1,97
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
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 # Note: this is a bit awkward since tf.name has to be a full path
48 # for it to exist, but that won't happen in our applications. While
49 # in practice "files/" would be prepended to the href path, os.join
50 # doesn't do that if the second value is an absolute path. So, the
51 # expected here is slightly different than what we get in practice.
52 expected = "<a href='%s' target='_blank'>%s</a><br>" % (tf.name,tf.name)
47 expected = "<a href='files/%s' target='_blank'>%s</a><br>" % (tf.name,tf.name)
53 48 nt.assert_equal(actual,expected)
54 49
55 50 #--------------------------
56 51 # FileLinks tests
57 52 #--------------------------
58 53
59 54 def test_instantiation_FileLinks():
60 55 """Test classes can be instantiated"""
61 56 fls = display.FileLinks('example')
62 57
63 58 def test_warning_on_non_existant_path_FileLinks():
64 59 """Calling _repr_html_ on non-existant files returns a warning"""
65 60 fls = display.FileLinks('example')
66 61 nt.assert_true(fls._repr_html_().startswith('Path (<tt>example</tt>)'))
67 62
68 63 def test_existing_path_FileLinks():
69 64 """ Calling _repr_html_ functions as expected on existing directory """
70 65 td = mkdtemp()
71 66 tf1 = NamedTemporaryFile(dir=td)
72 67 tf2 = NamedTemporaryFile(dir=td)
73 68 fl = display.FileLinks(td)
74 69 actual = fl._repr_html_()
75 70 actual = actual.split('\n')
76 71 actual.sort()
77 # Note: this is a bit awkward since tf.name has to be a full path
78 # for it to exist, but that won't happen in our applications. While
79 # in practice "files/" would be prepended to the href path, os.join
80 # doesn't do that if the second value is an absolute path. So, the
81 # expected here is slightly different than what we get in practice.
82 expected = ["<a href='%s' target='_blank'>%s</a><br>" % (tf2.name,tf2.name.split('/')[-1]),
83 "<a href='%s' target='_blank'>%s</a><br>" % (tf1.name,tf1.name.split('/')[-1])]
72 expected = ["<a href='files/%s' target='_blank'>%s</a><br>" % (tf2.name,tf2.name),
73 "<a href='files/%s' target='_blank'>%s</a><br>" % (tf1.name,tf1.name)]
84 74 expected.sort()
85 75 # We compare the sorted list of links here as that's more reliable
86 76 nt.assert_equal(actual,expected)
87 77
88 78 #--------------------------
89 79 # DirectoryLink tests
90 80 #--------------------------
91 81
92 82 def test_instantiation_DirectoryLink():
93 83 """Test classes can be instantiated"""
94 84 dl = display.DirectoryLink('example')
95 85
96 86 def test_warning_on_non_existant_path_DirectoryLink():
97 87 """Calling _repr_html_ on non-existant files returns a warning"""
98 88 dl = display.DirectoryLink('example')
99 89 nt.assert_true(dl._repr_html_().startswith('Path (<tt>example</tt>)'))
100 90
101 91 def test_existing_path_FileLinks():
102 92 """ Calling _repr_html_ functions as expected on existing directory """
103 93 td = mkdtemp()
104 94 dl = display.DirectoryLink(td)
105 95 actual = dl._repr_html_()
106 # Note: this is a bit awkward since tf.name has to be a full path
107 # for it to exist, but that won't happen in our applications. While
108 # in practice "files/" would be prepended to the href path, os.join
109 # doesn't do that if the second value is an absolute path. So, the
110 # expected here is slightly different than what we get in practice.
111 expected = "<a href='%s' target='_blank'>%s</a><br>" % (td,td)
96 expected = "<a href='files/%s' target='_blank'>%s</a><br>" % (td,td)
112 97 nt.assert_equal(actual,expected)
General Comments 0
You need to be logged in to leave comments. Login now