mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Fix codecs.EncodedFile which did not use file_encoding in 2.5.0, and
fix all codecs file wrappers to work correctly with the "with" statement (bug #1586513).
This commit is contained in:
		
							parent
							
								
									4bb9b56501
								
							
						
					
					
						commit
						8f99f81dfc
					
				
					 3 changed files with 62 additions and 4 deletions
				
			
		|  | @ -329,6 +329,12 @@ def __getattr__(self, name, | ||||||
|         """ |         """ | ||||||
|         return getattr(self.stream, name) |         return getattr(self.stream, name) | ||||||
| 
 | 
 | ||||||
|  |     def __enter__(self): | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def __exit__(self, type, value, tb): | ||||||
|  |         self.stream.close() | ||||||
|  | 
 | ||||||
| ### | ### | ||||||
| 
 | 
 | ||||||
| class StreamReader(Codec): | class StreamReader(Codec): | ||||||
|  | @ -568,6 +574,12 @@ def __getattr__(self, name, | ||||||
|         """ |         """ | ||||||
|         return getattr(self.stream, name) |         return getattr(self.stream, name) | ||||||
| 
 | 
 | ||||||
|  |     def __enter__(self): | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def __exit__(self, type, value, tb): | ||||||
|  |         self.stream.close() | ||||||
|  | 
 | ||||||
| ### | ### | ||||||
| 
 | 
 | ||||||
| class StreamReaderWriter: | class StreamReaderWriter: | ||||||
|  | @ -641,6 +653,14 @@ def __getattr__(self, name, | ||||||
|         """ |         """ | ||||||
|         return getattr(self.stream, name) |         return getattr(self.stream, name) | ||||||
| 
 | 
 | ||||||
|  |     # these are needed to make "with codecs.open(...)" work properly | ||||||
|  | 
 | ||||||
|  |     def __enter__(self): | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def __exit__(self, type, value, tb): | ||||||
|  |         self.stream.close() | ||||||
|  | 
 | ||||||
| ### | ### | ||||||
| 
 | 
 | ||||||
| class StreamRecoder: | class StreamRecoder: | ||||||
|  | @ -751,6 +771,12 @@ def __getattr__(self, name, | ||||||
|         """ |         """ | ||||||
|         return getattr(self.stream, name) |         return getattr(self.stream, name) | ||||||
| 
 | 
 | ||||||
|  |     def __enter__(self): | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def __exit__(self, type, value, tb): | ||||||
|  |         self.stream.close() | ||||||
|  | 
 | ||||||
| ### Shortcuts | ### Shortcuts | ||||||
| 
 | 
 | ||||||
| def open(filename, mode='rb', encoding=None, errors='strict', buffering=1): | def open(filename, mode='rb', encoding=None, errors='strict', buffering=1): | ||||||
|  | @ -824,9 +850,10 @@ def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): | ||||||
|     """ |     """ | ||||||
|     if file_encoding is None: |     if file_encoding is None: | ||||||
|         file_encoding = data_encoding |         file_encoding = data_encoding | ||||||
|     info = lookup(data_encoding) |     data_info = lookup(data_encoding) | ||||||
|     sr = StreamRecoder(file, info.encode, info.decode, |     file_info = lookup(file_encoding) | ||||||
|                        info.streamreader, info.streamwriter, errors) |     sr = StreamRecoder(file, data_info.encode, data_info.decode, | ||||||
|  |                        file_info.streamreader, file_info.streamwriter, errors) | ||||||
|     # Add attributes to simplify introspection |     # Add attributes to simplify introspection | ||||||
|     sr.data_encoding = data_encoding |     sr.data_encoding = data_encoding | ||||||
|     sr.file_encoding = file_encoding |     sr.file_encoding = file_encoding | ||||||
|  |  | ||||||
|  | @ -910,6 +910,18 @@ def test_readlines(self): | ||||||
|         f = self.reader(self.stream) |         f = self.reader(self.stream) | ||||||
|         self.assertEquals(f.readlines(), [u'\ud55c\n', u'\uae00']) |         self.assertEquals(f.readlines(), [u'\ud55c\n', u'\uae00']) | ||||||
| 
 | 
 | ||||||
|  | class EncodedFileTest(unittest.TestCase): | ||||||
|  |      | ||||||
|  |     def test_basic(self): | ||||||
|  |         f = StringIO.StringIO('\xed\x95\x9c\n\xea\xb8\x80') | ||||||
|  |         ef = codecs.EncodedFile(f, 'utf-16', 'utf-8') | ||||||
|  |         self.assertEquals(ef.read(), '\xff\xfe\\\xd5\n\x00\x00\xae') | ||||||
|  | 
 | ||||||
|  |         f = StringIO.StringIO() | ||||||
|  |         ef = codecs.EncodedFile(f, 'utf-8', 'latin1') | ||||||
|  |         ef.write('\xc3\xbc') | ||||||
|  |         self.assertEquals(f.getvalue(), '\xfc') | ||||||
|  | 
 | ||||||
| class Str2StrTest(unittest.TestCase): | class Str2StrTest(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     def test_read(self): |     def test_read(self): | ||||||
|  | @ -1214,6 +1226,19 @@ def test_decode_with_string_map(self): | ||||||
|             (u"", len(allbytes)) |             (u"", len(allbytes)) | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  | class WithStmtTest(unittest.TestCase): | ||||||
|  |     def test_encodedfile(self): | ||||||
|  |         f = StringIO.StringIO("\xc3\xbc") | ||||||
|  |         with codecs.EncodedFile(f, "latin-1", "utf-8") as ef: | ||||||
|  |             self.assertEquals(ef.read(), "\xfc") | ||||||
|  | 
 | ||||||
|  |     def test_streamreaderwriter(self): | ||||||
|  |         f = StringIO.StringIO("\xc3\xbc") | ||||||
|  |         info = codecs.lookup("utf-8") | ||||||
|  |         with codecs.StreamReaderWriter(f, info.streamreader, | ||||||
|  |                                        info.streamwriter, 'strict') as srw: | ||||||
|  |             self.assertEquals(srw.read(), u"\xfc") | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def test_main(): | def test_main(): | ||||||
|     test_support.run_unittest( |     test_support.run_unittest( | ||||||
|  | @ -1234,10 +1259,12 @@ def test_main(): | ||||||
|         IDNACodecTest, |         IDNACodecTest, | ||||||
|         CodecsModuleTest, |         CodecsModuleTest, | ||||||
|         StreamReaderTest, |         StreamReaderTest, | ||||||
|  |         EncodedFileTest, | ||||||
|         Str2StrTest, |         Str2StrTest, | ||||||
|         BasicUnicodeTest, |         BasicUnicodeTest, | ||||||
|         BasicStrTest, |         BasicStrTest, | ||||||
|         CharmapTest |         CharmapTest, | ||||||
|  |         WithStmtTest, | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -89,6 +89,10 @@ Core and builtins | ||||||
| Library | Library | ||||||
| ------- | ------- | ||||||
| 
 | 
 | ||||||
|  | - Fix codecs.EncodedFile which did not use file_encoding in 2.5.0, and | ||||||
|  |   fix all codecs file wrappers to work correctly with the "with" | ||||||
|  |   statement (bug #1586513). | ||||||
|  | 
 | ||||||
| - Lib/modulefinder.py now handles absolute and relative imports | - Lib/modulefinder.py now handles absolute and relative imports | ||||||
|   correctly. |   correctly. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl