Skip to content
This repository was archived by the owner on Mar 18, 2019. It is now read-only.

Commit 2fa7826

Browse files
authored
Merge pull request #109 from core-api/namedtemporaryfile-fallback
Introduce a NamedTemporaryFile fallback.
2 parents 3b36ef0 + 0282988 commit 2fa7826

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

coreapi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from coreapi.document import Array, Document, Link, Object, Error, Field
55

66

7-
__version__ = '2.0.8'
7+
__version__ = '2.0.9'
88
__all__ = [
99
'Array', 'Document', 'Link', 'Object', 'Error', 'Field',
1010
'Client',

coreapi/compat.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,9 @@ def force_text(string):
5555
except ImportError:
5656
def console_style(text, **kwargs):
5757
return text
58+
59+
60+
try:
61+
from tempfile import _TemporaryFileWrapper
62+
except ImportError:
63+
_TemporaryFileWrapper = None

coreapi/utils.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from coreapi import exceptions
2-
from coreapi.compat import string_types, text_type, urlparse
2+
from coreapi.compat import string_types, text_type, urlparse, _TemporaryFileWrapper
33
from collections import namedtuple
44
import os
55
import tempfile
@@ -116,16 +116,23 @@ def guess_extension(content_type):
116116
}.get(content_type, '')
117117

118118

119-
class DownloadedFile(tempfile._TemporaryFileWrapper):
120-
basename = None
119+
if _TemporaryFileWrapper:
120+
# Ideally we subclass this so that we can present a custom representation.
121+
class DownloadedFile(_TemporaryFileWrapper):
122+
basename = None
121123

122-
def __repr__(self):
123-
state = "closed" if self.closed else "open"
124-
mode = "" if self.closed else " '%s'" % self.file.mode
125-
return "<DownloadedFile '%s', %s%s>" % (self.name, state, mode)
124+
def __repr__(self):
125+
state = "closed" if self.closed else "open"
126+
mode = "" if self.closed else " '%s'" % self.file.mode
127+
return "<DownloadedFile '%s', %s%s>" % (self.name, state, mode)
126128

127-
def __str__(self):
128-
return self.__repr__()
129+
def __str__(self):
130+
return self.__repr__()
131+
else:
132+
# On some platforms (eg GAE) the private _TemporaryFileWrapper may not be
133+
# available, just use the standard `NamedTemporaryFile` function
134+
# in this case.
135+
DownloadedFile = tempfile.NamedTemporaryFile
129136

130137

131138
# Negotiation utilities. USed to determine which codec or transport class

0 commit comments

Comments
 (0)