mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +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) | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         return self | ||||
| 
 | ||||
|     def __exit__(self, type, value, tb): | ||||
|         self.stream.close() | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| class StreamReader(Codec): | ||||
|  | @ -568,6 +574,12 @@ def __getattr__(self, name, | |||
|         """ | ||||
|         return getattr(self.stream, name) | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         return self | ||||
| 
 | ||||
|     def __exit__(self, type, value, tb): | ||||
|         self.stream.close() | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| class StreamReaderWriter: | ||||
|  | @ -641,6 +653,14 @@ def __getattr__(self, 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: | ||||
|  | @ -751,6 +771,12 @@ def __getattr__(self, name, | |||
|         """ | ||||
|         return getattr(self.stream, name) | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         return self | ||||
| 
 | ||||
|     def __exit__(self, type, value, tb): | ||||
|         self.stream.close() | ||||
| 
 | ||||
| ### Shortcuts | ||||
| 
 | ||||
| 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: | ||||
|         file_encoding = data_encoding | ||||
|     info = lookup(data_encoding) | ||||
|     sr = StreamRecoder(file, info.encode, info.decode, | ||||
|                        info.streamreader, info.streamwriter, errors) | ||||
|     data_info = lookup(data_encoding) | ||||
|     file_info = lookup(file_encoding) | ||||
|     sr = StreamRecoder(file, data_info.encode, data_info.decode, | ||||
|                        file_info.streamreader, file_info.streamwriter, errors) | ||||
|     # Add attributes to simplify introspection | ||||
|     sr.data_encoding = data_encoding | ||||
|     sr.file_encoding = file_encoding | ||||
|  |  | |||
|  | @ -910,6 +910,18 @@ def test_readlines(self): | |||
|         f = self.reader(self.stream) | ||||
|         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): | ||||
| 
 | ||||
|     def test_read(self): | ||||
|  | @ -1214,6 +1226,19 @@ def test_decode_with_string_map(self): | |||
|             (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(): | ||||
|     test_support.run_unittest( | ||||
|  | @ -1234,10 +1259,12 @@ def test_main(): | |||
|         IDNACodecTest, | ||||
|         CodecsModuleTest, | ||||
|         StreamReaderTest, | ||||
|         EncodedFileTest, | ||||
|         Str2StrTest, | ||||
|         BasicUnicodeTest, | ||||
|         BasicStrTest, | ||||
|         CharmapTest | ||||
|         CharmapTest, | ||||
|         WithStmtTest, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -89,6 +89,10 @@ Core and builtins | |||
| 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 | ||||
|   correctly. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl