Merge branch '1.13'
This commit is contained in:
commit
c1434dbd24
|
@ -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).
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue