Commit f5f18a38 authored by Alex Gaynor's avatar Alex Gaynor
Browse files

Fixed #14749 -- added support for using Django's file object as context...

Fixed #14749 -- added support for using Django's file object as context managers.  Thanks to Florian Apolloner for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14671 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 73cd9b61
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -101,6 +101,12 @@ class File(FileProxyMixin):
        if buffer_ is not None:
            yield buffer_

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, tb):
        self.close()

    def open(self, mode=None):
        if not self.closed:
            self.seek(0)
+3 −1
Original line number Diff line number Diff line
import shutil
import sys

from django.core.cache import cache
from django.core.files.base import ContentFile
@@ -6,6 +7,8 @@ from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase

from models import Storage, temp_storage, temp_storage_location
if sys.version_info >= (2, 5):
    from tests_25 import FileObjTests


class FileTests(TestCase):
@@ -97,4 +100,3 @@ class FileTests(TestCase):
        obj2.normal.delete()
        obj3.default.delete()
        obj4.random.delete()
+17 −0
Original line number Diff line number Diff line
from __future__ import with_statement

import tempfile

from django.core.files import File
from django.utils.unittest import TestCase


class FileObjTests(TestCase):
    def test_context_manager(self):
        orig_file = tempfile.TemporaryFile()
        base_file = File(orig_file)
        with base_file as f:
            self.assertIs(base_file, f)
            self.assertFalse(f.closed)
        self.assertTrue(f.closed)
        self.assertTrue(orig_file.closed)
+12 −6
Original line number Diff line number Diff line
@@ -4,8 +4,17 @@ import shutil
import sys
import tempfile
import time
from cStringIO import StringIO
from datetime import datetime, timedelta
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO

try:
    import threading
except ImportError:
    import dummy_threading as threading

from django.conf import settings
from django.core.exceptions import SuspiciousOperation
from django.core.files.base import ContentFile, File
@@ -15,11 +24,6 @@ from django.core.files.uploadedfile import UploadedFile
from django.core.exceptions import ImproperlyConfigured
from django.utils import unittest

try:
    import threading
except ImportError:
    import dummy_threading as threading

# Try to import PIL in either of the two ways it can end up installed.
# Checking for the existence of Image is enough for CPython, but
# for PyPy, you need to check for the underlying modules
@@ -31,6 +35,7 @@ except ImportError:
    except ImportError:
        Image = None


class GetStorageClassTests(unittest.TestCase):
    def assertRaisesErrorWithMessage(self, error, message, callable,
        *args, **kwargs):
@@ -430,6 +435,7 @@ class InconsistentGetImageDimensionsBug(unittest.TestCase):
        Multiple calls of get_image_dimensions() should return the same size.
        """
        from django.core.files.images import ImageFile

        img_path = os.path.join(os.path.dirname(__file__), "test.png")
        image = ImageFile(open(img_path, 'rb'))
        image_pil = Image.open(img_path)
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature


if sys.version_info >= (2, 5):
    from python_25 import AssertNumQueriesTests
    from tests_25 import AssertNumQueriesTests


class SkippingTestCase(TestCase):
Loading