##// END OF EJS Templates
Do not use NamedTemporaryFile in handle_image_tempfile...
Takafumi Arakaki -
Show More
@@ -0,0 +1,20 b''
1 #-----------------------------------------------------------------------------
2 # Copyright (C) 2012- The IPython Development Team
3 #
4 # Distributed under the terms of the BSD License. The full license is in
5 # the file COPYING, distributed as part of this software.
6 #-----------------------------------------------------------------------------
7
8 import os
9
10 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
11
12
13 def test_named_file_in_temporary_directory():
14 with NamedFileInTemporaryDirectory('filename') as file:
15 name = file.name
16 assert not file.closed
17 assert os.path.exists(name)
18 file.write('test')
19 assert file.closed
20 assert not os.path.exists(name)
@@ -22,7 +22,6 b' import signal'
22 22 import os
23 23 import sys
24 24 import time
25 import tempfile
26 25 import subprocess
27 26 from io import BytesIO
28 27 import base64
@@ -39,6 +38,7 b' from IPython.core import page'
39 38 from IPython.utils.warn import warn, error, fatal
40 39 from IPython.utils import io
41 40 from IPython.utils.traitlets import List, Enum, Any
41 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
42 42
43 43 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
44 44 from IPython.frontend.terminal.console.completer import ZMQCompleter
@@ -285,7 +285,7 b' class ZMQTerminalInteractiveShell(TerminalInteractiveShell):'
285 285 raw = base64.decodestring(data[mime])
286 286 imageformat = self._imagemime[mime]
287 287 ext = '.{0}'.format(imageformat)
288 with nested(tempfile.NamedTemporaryFile(suffix=ext),
288 with nested(NamedFileInTemporaryDirectory('tmp.{0}'.format(ext)),
289 289 open(os.devnull, 'w')) as (f, devnull):
290 290 f.write(raw)
291 291 f.flush()
@@ -3,14 +3,14 b''
3 3 This is copied from the stdlib and will be standard in Python 3.2 and onwards.
4 4 """
5 5
6 import os as _os
7
6 8 # This code should only be used in Python versions < 3.2, since after that we
7 9 # can rely on the stdlib itself.
8 10 try:
9 11 from tempfile import TemporaryDirectory
10 12
11 13 except ImportError:
12
13 import os as _os
14 14 from tempfile import mkdtemp, template
15 15
16 16 class TemporaryDirectory(object):
@@ -74,3 +74,33 b' except ImportError:'
74 74 self._rmdir(path)
75 75 except self._os_error:
76 76 pass
77
78
79 class NamedFileInTemporaryDirectory(object):
80
81 def __init__(self, filename, mode='w+b', bufsize=-1, **kwds):
82 """
83 Open a file named `filename` in a temporary directory.
84
85 This context manager is preferred over `NamedTemporaryFile` in
86 stdlib `tempfile` when one needs to reopen the file.
87
88 Arguments `mode` and `bufsize` are passed to `open`.
89 Rest of the arguments are passed to `TemporaryDirectory`.
90
91 """
92 self._tmpdir = TemporaryDirectory(**kwds)
93 path = _os.path.join(self._tmpdir.name, filename)
94 self.file = open(path, mode, bufsize)
95
96 def cleanup(self):
97 self.file.close()
98 self._tmpdir.cleanup()
99
100 __del__ = cleanup
101
102 def __enter__(self):
103 return self.file
104
105 def __exit__(self, type, value, traceback):
106 self.cleanup()
General Comments 0
You need to be logged in to leave comments. Login now