From ea1e8b38b3bbf8f21f22028ac256ce62c40d1fc1 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Wed, 15 Aug 2012 02:53:40 -0700 Subject: [PATCH] Ensured that the archive module consistantly explicitly closed all files. --- django/utils/archive.py | 18 +++++++++++++++++- tests/regressiontests/utils/archive.py | 6 ++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/django/utils/archive.py b/django/utils/archive.py index 829b55dd28..0faf1fa781 100644 --- a/django/utils/archive.py +++ b/django/utils/archive.py @@ -46,7 +46,8 @@ def extract(path, to_path=''): Unpack the tar or zip file at the specified path to the directory specified by to_path. """ - Archive(path).extract(to_path) + with Archive(path) as archive: + archive.extract(to_path) class Archive(object): @@ -77,12 +78,21 @@ class Archive(object): "Path not a recognized archive format: %s" % filename) return cls + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + def extract(self, to_path=''): self._archive.extract(to_path) def list(self): self._archive.list() + def close(self): + self._archive.close() + class BaseArchive(object): """ @@ -161,6 +171,9 @@ class TarArchive(BaseArchive): if extracted: extracted.close() + def close(self): + self._archive.close() + class ZipArchive(BaseArchive): @@ -189,6 +202,9 @@ class ZipArchive(BaseArchive): with open(filename, 'wb') as outfile: outfile.write(data) + def close(self): + self._archive.close() + extension_map = { '.tar': TarArchive, '.tar.bz2': TarArchive, diff --git a/tests/regressiontests/utils/archive.py b/tests/regressiontests/utils/archive.py index 0927c624f3..5575f340f6 100644 --- a/tests/regressiontests/utils/archive.py +++ b/tests/regressiontests/utils/archive.py @@ -27,12 +27,14 @@ class ArchiveTester(object): os.chdir(self.old_cwd) def test_extract_method(self): - Archive(self.archive).extract(self.tmpdir) + with Archive(self.archive) as archive: + archive.extract(self.tmpdir) self.check_files(self.tmpdir) def test_extract_method_no_to_path(self): os.chdir(self.tmpdir) - Archive(self.archive_path).extract() + with Archive(self.archive_path) as archive: + archive.extract() self.check_files(self.tmpdir) def test_extract_function(self):