Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Ensured that the archive module consistantly explicitly closed all fi…

…les.
  • Loading branch information...
commit ea1e8b38b3bbf8f21f22028ac256ce62c40d1fc1 1 parent ca6015c
Alex Gaynor authored
Showing with 21 additions and 3 deletions.
  1. +17 −1 django/utils/archive.py
  2. +4 −2 tests/regressiontests/utils/archive.py
18 django/utils/archive.py
View
@@ -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 @@ def _archive_cls(file):
"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 @@ def extract(self, to_path):
if extracted:
extracted.close()
+ def close(self):
+ self._archive.close()
+
class ZipArchive(BaseArchive):
@@ -189,6 +202,9 @@ def extract(self, to_path):
with open(filename, 'wb') as outfile:
outfile.write(data)
+ def close(self):
+ self._archive.close()
+
extension_map = {
'.tar': TarArchive,
'.tar.bz2': TarArchive,
6 tests/regressiontests/utils/archive.py
View
@@ -27,12 +27,14 @@ def tearDown(self):
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):
Please sign in to comment.
Something went wrong with that request. Please try again.