From 602250fdf9515a8127cd567d79afa8134d4cf923 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 4 Jan 2013 23:39:48 +0000 Subject: [PATCH 1/3] Turn SFTPFile into a context manager --- paramiko/sftp_file.py | 6 ++++++ tests/test_sftp.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/paramiko/sftp_file.py b/paramiko/sftp_file.py index 8c5c7ac..c9fc76f 100644 --- a/paramiko/sftp_file.py +++ b/paramiko/sftp_file.py @@ -474,3 +474,9 @@ class SFTPFile (BufferedFile): x = self._saved_exception self._saved_exception = None raise x + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() diff --git a/tests/test_sftp.py b/tests/test_sftp.py index 2eadabc..39c8aa8 100755 --- a/tests/test_sftp.py +++ b/tests/test_sftp.py @@ -188,6 +188,17 @@ class SFTPTest (unittest.TestCase): finally: sftp.remove(FOLDER + '/duck.txt') + def test_3_sftp_file_can_be_used_as_context_manager(self): + """ + verify that an opened file can be used as a context manager + """ + try: + with sftp.open(FOLDER + '/duck.txt', 'w') as f: + f.write(ARTICLE) + self.assertEqual(sftp.stat(FOLDER + '/duck.txt').st_size, 1483) + finally: + sftp.remove(FOLDER + '/duck.txt') + def test_4_append(self): """ verify that a file can be opened for append, and tell() still works. From 0b6aebb8a95d44102968a3e0caf94cd234369e5d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 5 Jan 2013 00:05:58 +0000 Subject: [PATCH 2/3] Verify Python version >= 2.6 before running context manager test --- tests/test_sftp.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_sftp.py b/tests/test_sftp.py index 39c8aa8..7ce3e68 100755 --- a/tests/test_sftp.py +++ b/tests/test_sftp.py @@ -192,6 +192,10 @@ class SFTPTest (unittest.TestCase): """ verify that an opened file can be used as a context manager """ + major, minor, micro, releaselevel, serial = sys.version_info + if (major, minor) <= (2, 5): + return + try: with sftp.open(FOLDER + '/duck.txt', 'w') as f: f.write(ARTICLE) From 08109136b4217b3fc620436819f4c92434189955 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 5 Jan 2013 00:15:26 +0000 Subject: [PATCH 3/3] Replace useless version check with import from __future__ --- tests/test_sftp.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_sftp.py b/tests/test_sftp.py index 7ce3e68..f95da69 100755 --- a/tests/test_sftp.py +++ b/tests/test_sftp.py @@ -23,6 +23,8 @@ a real actual sftp server is contacted, and a new folder is created there to do test file operations in (so no existing files will be harmed). """ +from __future__ import with_statement + from binascii import hexlify import logging import os @@ -192,10 +194,6 @@ class SFTPTest (unittest.TestCase): """ verify that an opened file can be used as a context manager """ - major, minor, micro, releaselevel, serial = sys.version_info - if (major, minor) <= (2, 5): - return - try: with sftp.open(FOLDER + '/duck.txt', 'w') as f: f.write(ARTICLE)