Merge branch '1.13'

This commit is contained in:
Jeff Forcier 2014-04-24 11:06:02 -07:00
commit c1434dbd24
2 changed files with 37 additions and 5 deletions

View File

@ -124,9 +124,11 @@ class BufferedFile (object):
file first). If the ``size`` argument is negative or omitted, read all file first). If the ``size`` argument is negative or omitted, read all
the remaining data in the file. the remaining data in the file.
``'b'`` mode flag is ignored (``self.FLAG_BINARY`` in ``self._flags``), .. note::
because SSH treats all files as binary, since we have no idea what ``'b'`` mode flag is ignored (``self.FLAG_BINARY`` in
encoding the file is in, or even if the file is text data. ``self._flags``), because SSH treats all files as binary, since we
have no idea what encoding the file is in, or even if the file is
text data.
:param int size: maximum number of bytes to read :param int size: maximum number of bytes to read
:return: :return:
@ -285,7 +287,8 @@ class BufferedFile (object):
Set the file's current position, like stdio's ``fseek``. Not all file Set the file's current position, like stdio's ``fseek``. Not all file
objects support seeking. objects support seeking.
.. note:: If a file is opened in append mode (``'a'`` or ``'a+'``), any seek .. note::
If a file is opened in append mode (``'a'`` or ``'a+'``), any seek
operations will be undone at the next write (as the file position operations will be undone at the next write (as the file position
will move back to the end of the file). will move back to the end of the file).

View File

@ -67,6 +67,18 @@ liver insulin receptors. Their sensitivity to insulin is, however, similarly
decreased compared with chicken. decreased compared with chicken.
''' '''
# Here is how unicode characters are encoded over 1 to 6 bytes in utf-8
# U-00000000 - U-0000007F: 0xxxxxxx
# U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
# U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
# U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
# U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
# U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
# Note that: hex(int('11000011',2)) == '0xc3'
# Thus, the following 2-bytes sequence is not valid utf8: "invalid continuation byte"
NON_UTF8_DATA = b'\xC3\xC3'
FOLDER = os.environ.get('TEST_FOLDER', 'temp-testing000') FOLDER = os.environ.get('TEST_FOLDER', 'temp-testing000')
sftp = None sftp = None
@ -466,7 +478,7 @@ class SFTPTest (unittest.TestCase):
f.write('?\n') f.write('?\n')
with sftp.open(FOLDER + '/happy.txt', 'r') as f: with sftp.open(FOLDER + '/happy.txt', 'r') as f:
self.assertEqual(f.readline(), u'full line?\n') self.assertEqual(f.readline(), u('full line?\n'))
self.assertEqual(f.read(7), b'partial') self.assertEqual(f.read(7), b'partial')
finally: finally:
try: try:
@ -747,6 +759,23 @@ class SFTPTest (unittest.TestCase):
sftp.remove(FOLDER + '/test%file') sftp.remove(FOLDER + '/test%file')
def test_O_non_utf8_data(self):
"""Test write() and read() of non utf8 data"""
try:
with sftp.open('%s/nonutf8data' % FOLDER, 'w') as f:
f.write(NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'r') as f:
data = f.read()
self.assertEqual(data, NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'wb') as f:
f.write(NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'rb') as f:
data = f.read()
self.assertEqual(data, NON_UTF8_DATA)
finally:
sftp.remove('%s/nonutf8data' % FOLDER)
if __name__ == '__main__': if __name__ == '__main__':
SFTPTest.init_loopback() SFTPTest.init_loopback()
# logging is required by test_N_file_with_percent # logging is required by test_N_file_with_percent